@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.ee13359

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 (571) hide show
  1. package/README.md +114 -76
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/build.doc.mjs +4 -3
  4. package/api/build/build.test.mjs +14 -3
  5. package/api/build/build.type.d.mts +36 -2
  6. package/api/build/build.type.mjs +25 -4
  7. package/api/build/help/help.d.mts +8 -5
  8. package/api/build/help/help.mjs +56 -6
  9. package/api/component/_adapter.d.mts +6 -12
  10. package/api/component/_adapter.mjs +20 -10
  11. package/api/component/component.doc.mjs +13 -3
  12. package/api/component/component.mjs +91 -14
  13. package/api/component/component.test.mjs +38 -0
  14. package/api/component/component.type.d.mts +22 -11
  15. package/api/component/component.type.mjs +32 -24
  16. package/api/component/detail/blocks/blocks.d.mts +2 -1
  17. package/api/component/detail/blocks/blocks.mjs +4 -3
  18. package/api/component/list/list.d.mts +0 -5
  19. package/api/component/list/list.mjs +40 -11
  20. package/api/discover/discover.doc.mjs +2 -1
  21. package/api/discover/discover.type.d.mts +4 -4
  22. package/api/discover/discover.type.mjs +10 -10
  23. package/api/docs/_adapter.d.mts +230 -41
  24. package/api/docs/_adapter.mjs +734 -108
  25. package/api/docs/compiled-topics.test.mjs +78 -0
  26. package/api/docs/detail/detail.mjs +22 -63
  27. package/api/docs/detail/section/section.d.mts +1 -1
  28. package/api/docs/detail/section/section.mjs +54 -19
  29. package/api/docs/detail/section/section.test.mjs +50 -0
  30. package/api/docs/docs.d.mts +10 -3
  31. package/api/docs/docs.doc.mjs +54 -16
  32. package/api/docs/docs.mjs +53 -10
  33. package/api/docs/docs.test.mjs +164 -4
  34. package/api/docs/docs.type.d.mts +205 -5
  35. package/api/docs/docs.type.mjs +137 -11
  36. package/api/docs/index/index.d.mts +18 -0
  37. package/api/docs/index/index.mjs +40 -0
  38. package/api/docs/index/index.test.mjs +62 -0
  39. package/api/docs/integration-tree.test.mjs +547 -0
  40. package/api/docs/integrationDocs.test.mjs +114 -8
  41. package/api/docs/list/list.mjs +28 -12
  42. package/api/docs/node/node.d.mts +43 -0
  43. package/api/docs/node/node.mjs +192 -0
  44. package/api/doctor/doctor.d.mts +99 -1
  45. package/api/doctor/doctor.doc.mjs +1 -0
  46. package/api/doctor/doctor.mjs +544 -1
  47. package/api/doctor/doctor.test.mjs +610 -1
  48. package/api/gap-report/gap-report.doc.mjs +8 -4
  49. package/api/hook/_adapter.mjs +19 -5
  50. package/api/hook/hook.doc.mjs +1 -0
  51. package/api/hook/hook.type.d.mts +3 -3
  52. package/api/hook/hook.type.mjs +11 -11
  53. package/api/hook/list/list.d.mts +2 -2
  54. package/api/hook/list/list.mjs +69 -17
  55. package/api/index.d.mts +1 -1
  56. package/api/index.mjs +1 -0
  57. package/api/init/init.doc.mjs +6 -1
  58. package/api/init/init.test.mjs +41 -1
  59. package/api/init/remove/remove.mjs +1 -1
  60. package/api/init/run/run.mjs +20 -10
  61. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  62. package/api/integration/add-contribution.d.mts +2 -1
  63. package/api/integration/add-contribution.mjs +130 -15
  64. package/api/integration/add-contribution.test.mjs +258 -7
  65. package/api/integration/add-theme.mjs +34 -64
  66. package/api/integration/add-theme.test.mjs +105 -21
  67. package/api/integration/authoring-checks.mjs +108 -31
  68. package/api/integration/authoring-checks.test.mjs +171 -6
  69. package/api/integration/authoring-checks.type.d.mts +3 -1
  70. package/api/integration/authoring-checks.type.mjs +3 -1
  71. package/api/integration/integration-authoring.type.d.mts +3 -1
  72. package/api/integration/integration-authoring.type.mjs +2 -0
  73. package/api/integration/integration-block-exports.test.mjs +10 -6
  74. package/api/integration/integrationAdd.doc.mjs +14 -4
  75. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  76. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  77. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  78. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  79. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  80. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  81. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  82. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  83. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  84. package/api/integration/integrationTemplateConflicts.doc.mjs +7 -5
  85. package/api/integration/pack-check.mjs +83 -7
  86. package/api/integration/pack-check.test.mjs +387 -47
  87. package/api/integration/pack-check.type.d.mts +26 -2
  88. package/api/integration/pack-check.type.mjs +14 -1
  89. package/api/integration/summarizeIssues.doc.mjs +1 -0
  90. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  91. package/api/integration/validate-integration.mjs +52 -102
  92. package/api/integration/validate-integration.test.mjs +179 -26
  93. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  94. package/api/integration/validateIntegration.doc.mjs +3 -2
  95. package/api/json/assertResponse.doc.mjs +1 -0
  96. package/api/json/envelope-types.test.mjs +76 -0
  97. package/api/json/index.ts +2 -0
  98. package/api/json/isError.doc.mjs +1 -0
  99. package/api/json/parseResponse.doc.mjs +3 -2
  100. package/api/layout/_adapter.mjs +20 -5
  101. package/api/layout/expand/expand.mjs +7 -5
  102. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  103. package/api/layout/grammar/grammar.mjs +2 -1
  104. package/api/layout/layoutCheck.doc.mjs +1 -0
  105. package/api/layout/layoutExpand.doc.mjs +2 -1
  106. package/api/layout/layoutGrammar.doc.mjs +1 -0
  107. package/api/search/search-return-type.test.mjs +54 -0
  108. package/api/search/search.d.mts +29 -11
  109. package/api/search/search.doc.mjs +8 -2
  110. package/api/search/search.mjs +337 -41
  111. package/api/search/search.test.mjs +124 -1
  112. package/api/search/search.type.d.mts +15 -3
  113. package/api/search/search.type.mjs +5 -2
  114. package/api/swizzle/copy/copy.mjs +28 -11
  115. package/api/swizzle/swizzle.doc.mjs +2 -1
  116. package/api/swizzle/swizzle.type.d.mts +2 -2
  117. package/api/swizzle/swizzle.type.mjs +2 -2
  118. package/api/template/copy/copy.mjs +17 -23
  119. package/api/template/copy/copy.test.mjs +17 -0
  120. package/api/template/list/list.mjs +1 -0
  121. package/api/template/template-integration.test.mjs +1022 -3
  122. package/api/template/template-suffix.test.mjs +41 -21
  123. package/api/template/template.d.mts +1 -1
  124. package/api/template/template.doc.mjs +30 -8
  125. package/api/template/template.mjs +45 -8
  126. package/api/template/template.type.d.mts +12 -14
  127. package/api/template/template.type.mjs +15 -14
  128. package/api/theme/_adapter.d.mts +2 -3
  129. package/api/theme/_adapter.mjs +4 -5
  130. package/api/theme/add/add.binary.test.mjs +84 -0
  131. package/api/theme/add/add.mjs +20 -3
  132. package/api/theme/add/add.staging.test.mjs +66 -0
  133. package/api/theme/add/add.test.mjs +14 -1
  134. package/api/theme/build/build.mjs +133 -42
  135. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  136. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  137. package/api/theme/build/build.test.mjs +127 -0
  138. package/api/theme/build/font-warning.mjs +3 -3
  139. package/api/theme/build/font-warning.test.mjs +5 -2
  140. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  141. package/api/theme/integration-themes.test.mjs +39 -28
  142. package/api/theme/list/list.test.mjs +19 -20
  143. package/api/theme/listThemes.doc.mjs +6 -5
  144. package/api/theme/palette/generate/generate.mjs +8 -3
  145. package/api/theme/palette/generate/generate.test.mjs +96 -0
  146. package/api/theme/palette/generate/generator.d.mts +10 -13
  147. package/api/theme/palette/generate/generator.mjs +15 -4
  148. package/api/theme/palette/generate/generator.test.mjs +10 -0
  149. package/api/theme/template/template.mjs +11 -2
  150. package/api/theme/template/template.test.mjs +20 -0
  151. package/api/theme/theme.type.d.mts +170 -11
  152. package/api/theme/theme.type.mjs +94 -27
  153. package/api/theme/themeAdd.doc.mjs +4 -3
  154. package/api/theme/themeBuild.doc.mjs +8 -4
  155. package/api/theme/themeList.doc.mjs +6 -3
  156. package/api/theme/themeListAvailable.doc.mjs +5 -3
  157. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  158. package/api/theme/themeTargets.doc.mjs +1 -0
  159. package/api/theme/themeTemplate.doc.mjs +6 -2
  160. package/api/upgrade/_adapter.d.mts +32 -5
  161. package/api/upgrade/_adapter.mjs +139 -22
  162. package/api/upgrade/list/list.mjs +2 -1
  163. package/api/upgrade/list/list.test.mjs +73 -0
  164. package/api/upgrade/project-context.test.mjs +272 -0
  165. package/api/upgrade/provider-agreement.test.mjs +152 -0
  166. package/api/upgrade/run/run.mjs +356 -59
  167. package/api/upgrade/status/status.mjs +2 -2
  168. package/api/upgrade/upgrade.doc.mjs +12 -5
  169. package/api/upgrade/upgrade.type.d.mts +43 -5
  170. package/api/upgrade/upgrade.type.mjs +27 -11
  171. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  172. package/assets/codemods/integration-discovery.mjs +48 -4
  173. package/assets/codemods/integration-discovery.test.mjs +73 -0
  174. package/assets/codemods/integration-runner.mjs +56 -4
  175. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  176. package/assets/codemods/run-codemod.mjs +177 -34
  177. package/assets/codemods/runner.mjs +350 -102
  178. package/assets/codemods/term-log.mjs +32 -8
  179. package/assets/codemods/term-log.test.mjs +19 -1
  180. package/assets/codemods/transform-prop.mjs +109 -0
  181. package/assets/codemods/transform-prop.test.mjs +95 -0
  182. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  183. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  184. package/assets/codemods/transforms/next/index.mjs +19 -1
  185. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  186. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  187. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  188. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  189. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  190. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  191. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  192. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  193. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  194. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  195. package/assets/docs/README.md +9 -0
  196. package/assets/docs/authoring.doc.mjs +14 -0
  197. package/assets/docs/getting-started.doc.mjs +2 -2
  198. package/assets/docs/principles.doc.mjs +6 -6
  199. package/assets/docs/styling-libraries.doc.mjs +3 -3
  200. package/assets/docs/styling.doc.mjs +4 -4
  201. package/assets/docs/theme.doc.mjs +4 -4
  202. package/assets/docs/tokens.doc.mjs +1 -1
  203. package/assets/docs/tree/api.doc.mjs +30 -0
  204. package/assets/docs/tree/cli.doc.mjs +23 -0
  205. package/assets/docs/tree/commands.doc.mjs +25 -0
  206. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +124 -25
  207. package/assets/docs/tree/integrations.test.mjs +62 -0
  208. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  209. package/assets/docs/working-with-ai.doc.mjs +1 -1
  210. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  211. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  212. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  213. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  214. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  215. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  216. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  217. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  218. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  219. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  220. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  221. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  222. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  223. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  224. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  225. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  226. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  227. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  228. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  229. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  230. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  231. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  232. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  233. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  234. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  235. package/authoring/_shared/contract.ts +22 -0
  236. package/authoring/codemod/codemod.doc.mjs +7 -2
  237. package/authoring/codemod/parse.d.mts +8 -8
  238. package/authoring/codemod/parse.mjs +8 -6
  239. package/authoring/codemod/type.ts +12 -0
  240. package/authoring/config/config.doc.mjs +2 -2
  241. package/authoring/config/debug-composition.test.mjs +92 -0
  242. package/authoring/config/parse.d.mts +13 -13
  243. package/authoring/config/parse.mjs +8 -8
  244. package/authoring/config/type.ts +18 -6
  245. package/authoring/debug/debug.doc.d.mts +11 -0
  246. package/authoring/debug/debug.doc.mjs +182 -0
  247. package/authoring/debug/parse.d.mts +8 -8
  248. package/authoring/debug/parse.mjs +3 -3
  249. package/authoring/doctypes/_schema.d.mts +718 -23
  250. package/authoring/doctypes/_schema.mjs +519 -39
  251. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  252. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  253. package/authoring/doctypes/base/type.ts +41 -0
  254. package/authoring/doctypes/command/command.doc.mjs +4 -3
  255. package/authoring/doctypes/command/parse.d.mts +2 -2
  256. package/authoring/doctypes/command/parse.mjs +1 -1
  257. package/authoring/doctypes/command/type.ts +5 -4
  258. package/authoring/doctypes/component/component.doc.mjs +6 -3
  259. package/authoring/doctypes/component/parse.d.mts +2 -2
  260. package/authoring/doctypes/component/parse.mjs +1 -1
  261. package/authoring/doctypes/component/type.ts +6 -5
  262. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  263. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  264. package/authoring/doctypes/enum/parse.d.mts +2 -2
  265. package/authoring/doctypes/enum/parse.mjs +1 -1
  266. package/authoring/doctypes/enum/type.ts +4 -2
  267. package/authoring/doctypes/function/function.doc.mjs +7 -2
  268. package/authoring/doctypes/function/parse.d.mts +2 -2
  269. package/authoring/doctypes/function/parse.mjs +1 -1
  270. package/authoring/doctypes/function/type.ts +9 -4
  271. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  272. package/authoring/doctypes/hook/parse.d.mts +2 -2
  273. package/authoring/doctypes/hook/parse.mjs +1 -1
  274. package/authoring/doctypes/hook/type.ts +5 -4
  275. package/authoring/doctypes/legacy.d.mts +8 -6
  276. package/authoring/doctypes/legacy.mjs +5 -4
  277. package/authoring/doctypes/load-contract.test.mjs +208 -0
  278. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  279. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  280. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  281. package/authoring/doctypes/namespace/parse.mjs +25 -0
  282. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  283. package/authoring/doctypes/namespace/type.ts +74 -0
  284. package/authoring/doctypes/parse.d.mts +22 -18
  285. package/authoring/doctypes/parse.mjs +22 -11
  286. package/authoring/doctypes/parse.test.mjs +77 -3
  287. package/authoring/doctypes/reference/parse.d.mts +2 -2
  288. package/authoring/doctypes/reference/parse.mjs +8 -5
  289. package/authoring/doctypes/reference/reference.doc.mjs +20 -5
  290. package/authoring/doctypes/reference/type.ts +53 -5
  291. package/authoring/doctypes/schema/parse.d.mts +2 -2
  292. package/authoring/doctypes/schema/parse.mjs +1 -1
  293. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  294. package/authoring/doctypes/schema/type.ts +4 -4
  295. package/authoring/doctypes/template/parse.d.mts +94 -1
  296. package/authoring/doctypes/template/parse.mjs +40 -2
  297. package/authoring/doctypes/template/parse.test.mjs +26 -2
  298. package/authoring/doctypes/template/template.doc.mjs +13 -3
  299. package/authoring/doctypes/template/type.ts +13 -2
  300. package/authoring/doctypes/theme/parse.d.mts +35 -0
  301. package/authoring/doctypes/theme/parse.mjs +76 -0
  302. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  303. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  304. package/authoring/doctypes/theme/type.ts +42 -0
  305. package/authoring/doctypes/types.ts +12 -10
  306. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  307. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  308. package/authoring/gap-report/parse.d.mts +10 -10
  309. package/authoring/gap-report/parse.mjs +6 -6
  310. package/authoring/gap-report/type.ts +1 -1
  311. package/authoring/identity/identity.doc.d.mts +9 -0
  312. package/authoring/identity/identity.doc.mjs +61 -0
  313. package/authoring/identity/type.ts +132 -0
  314. package/authoring/index.d.mts +2 -0
  315. package/authoring/index.d.ts +52 -17
  316. package/authoring/index.mjs +3 -1
  317. package/authoring/integration/integration.doc.mjs +15 -8
  318. package/authoring/integration/parse.d.mts +2 -2
  319. package/authoring/integration/parse.mjs +1 -1
  320. package/authoring/integration/parse.test.mjs +10 -1
  321. package/authoring/integration/schema.d.mts +6 -4
  322. package/authoring/integration/schema.mjs +9 -3
  323. package/authoring/integration/type.ts +19 -8
  324. package/authoring/shadcn/receipt.d.mts +6 -6
  325. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  326. package/clients/cli/command-load-failure.test.mjs +83 -0
  327. package/clients/cli/commands/blog.doc.mjs +1 -1
  328. package/clients/cli/commands/blog.mjs +23 -8
  329. package/clients/cli/commands/blog.test.mjs +42 -1
  330. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  331. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  332. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  333. package/clients/cli/commands/build-theme.mjs +16 -50
  334. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  335. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  336. package/clients/cli/commands/build.doc.mjs +5 -2
  337. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  338. package/clients/cli/commands/build.mjs +37 -49
  339. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  340. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  341. package/clients/cli/commands/component/index.mjs +3 -8
  342. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  343. package/clients/cli/commands/component-package.test.mjs +46 -0
  344. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  345. package/clients/cli/commands/component.doc.mjs +1 -1
  346. package/clients/cli/commands/component.test.mjs +19 -0
  347. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  348. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  349. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  350. package/clients/cli/commands/discover.doc.mjs +5 -3
  351. package/clients/cli/commands/discover.mjs +4 -4
  352. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  353. package/clients/cli/commands/docs.doc.mjs +28 -6
  354. package/clients/cli/commands/docs.mjs +238 -24
  355. package/clients/cli/commands/docs.test.mjs +193 -1
  356. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  357. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  358. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  359. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  360. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  361. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  362. package/clients/cli/commands/doctor-integration.test.mjs +83 -8
  363. package/clients/cli/commands/doctor.doc.mjs +1 -1
  364. package/clients/cli/commands/doctor.mjs +30 -25
  365. package/clients/cli/commands/doctor.test.mjs +42 -0
  366. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  367. package/clients/cli/commands/gap-report.test.mjs +72 -0
  368. package/clients/cli/commands/hook/index.mjs +7 -17
  369. package/clients/cli/commands/hook.doc.mjs +1 -1
  370. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  371. package/clients/cli/commands/init.doc.mjs +20 -9
  372. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  373. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  374. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  375. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  376. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  377. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  378. package/clients/cli/commands/integration.doc.mjs +1 -1
  379. package/clients/cli/commands/integration.mjs +1 -0
  380. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  381. package/clients/cli/commands/json-contract.test.mjs +33 -0
  382. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  383. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  384. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  385. package/clients/cli/commands/layout.doc.mjs +3 -3
  386. package/clients/cli/commands/layout.mjs +21 -9
  387. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  388. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  389. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  390. package/clients/cli/commands/manifest.doc.mjs +1 -1
  391. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  392. package/clients/cli/commands/search.doc.mjs +7 -4
  393. package/clients/cli/commands/search.mjs +28 -9
  394. package/clients/cli/commands/search.test.mjs +75 -0
  395. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  396. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  397. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  398. package/clients/cli/commands/template.doc.mjs +52 -13
  399. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  400. package/clients/cli/commands/template.mjs +4 -91
  401. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  402. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  403. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  404. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  405. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  406. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  407. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  408. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  409. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  410. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  411. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  412. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  413. package/clients/cli/commands/theme.doc.mjs +1 -1
  414. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  415. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  416. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  417. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  418. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  419. package/clients/cli/commands/upgrade.mjs +29 -7
  420. package/clients/cli/formatters/index.mjs +164 -1
  421. package/clients/cli/formatters/index.test.mjs +97 -0
  422. package/clients/cli/index.mjs +21 -30
  423. package/clients/cli/latest-version-env.test.mjs +50 -0
  424. package/clients/cli/lib/cli-error.test.mjs +7 -0
  425. package/clients/cli/lib/component-format.mjs +9 -9
  426. package/clients/cli/lib/component-format.test.mjs +1 -1
  427. package/clients/cli/lib/define-command.mjs +32 -6
  428. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  429. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  430. package/clients/cli/lib/hook-format.mjs +19 -10
  431. package/clients/cli/lib/json-shim.mjs +38 -2
  432. package/clients/cli/lib/json-shim.test.mjs +83 -0
  433. package/clients/cli/lib/manifest.d.ts +2 -0
  434. package/clients/cli/lib/manifest.mjs +36 -2
  435. package/clients/cli/lib/manifest.test.mjs +17 -0
  436. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  437. package/foundation/agent-docs/agent-docs.mjs +70 -3
  438. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  439. package/foundation/agent-docs/agent-docs.test.mjs +10 -1
  440. package/foundation/config/integration-debug.test.mjs +28 -3
  441. package/foundation/config/project-themes.test.mjs +11 -19
  442. package/foundation/config/project.d.mts +20 -11
  443. package/foundation/config/project.mjs +263 -91
  444. package/foundation/config/project.test.mjs +270 -21
  445. package/foundation/discovery/authoring-self-docs.d.mts +75 -0
  446. package/foundation/discovery/authoring-self-docs.mjs +224 -0
  447. package/foundation/discovery/authoring-self-docs.test.mjs +165 -0
  448. package/foundation/discovery/authoring-surface.d.mts +74 -0
  449. package/foundation/discovery/authoring-surface.mjs +525 -0
  450. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  451. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  452. package/foundation/discovery/cli-self-docs.mjs +490 -0
  453. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  454. package/foundation/discovery/component-discovery.d.mts +39 -1
  455. package/foundation/discovery/component-discovery.mjs +50 -1
  456. package/foundation/discovery/component-loader.d.mts +35 -38
  457. package/foundation/discovery/component-loader.mjs +53 -222
  458. package/foundation/discovery/docs-discovery.d.mts +116 -11
  459. package/foundation/discovery/docs-discovery.mjs +389 -108
  460. package/foundation/discovery/docs-discovery.test.mjs +325 -20
  461. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  462. package/foundation/discovery/docs-output-budget.mjs +50 -0
  463. package/foundation/discovery/docs-section-key.d.mts +116 -0
  464. package/foundation/discovery/docs-section-key.mjs +322 -0
  465. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  466. package/foundation/discovery/template-adapter.d.mts +113 -11
  467. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  468. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  469. package/foundation/discovery/template-adapter.mjs +774 -83
  470. package/foundation/discovery/template-adapter.test.mjs +57 -0
  471. package/foundation/discovery/theme-discovery.d.mts +67 -7
  472. package/foundation/discovery/theme-discovery.mjs +916 -186
  473. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  474. package/foundation/discovery/theming-targets.test.mjs +4 -0
  475. package/foundation/doc-compiler/bundle.d.mts +47 -0
  476. package/foundation/doc-compiler/bundle.mjs +278 -0
  477. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  478. package/foundation/doc-compiler/compile.d.mts +343 -0
  479. package/foundation/doc-compiler/compile.mjs +558 -0
  480. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  481. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  482. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  483. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  484. package/foundation/doc-compiler/import.d.mts +24 -0
  485. package/foundation/doc-compiler/import.mjs +59 -0
  486. package/foundation/doc-compiler/inputs.d.mts +102 -0
  487. package/foundation/doc-compiler/inputs.mjs +291 -0
  488. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  489. package/foundation/doc-compiler/ir.d.mts +22 -0
  490. package/foundation/doc-compiler/ir.mjs +471 -0
  491. package/foundation/doc-compiler/lenses.d.mts +34 -0
  492. package/foundation/doc-compiler/lenses.mjs +128 -0
  493. package/foundation/doc-compiler/links.d.mts +135 -0
  494. package/foundation/doc-compiler/links.mjs +253 -0
  495. package/foundation/doc-compiler/links.test.mjs +139 -0
  496. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  497. package/foundation/doc-compiler/overlays.d.mts +37 -0
  498. package/foundation/doc-compiler/overlays.mjs +206 -0
  499. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  500. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  501. package/foundation/doc-compiler/read.d.mts +127 -0
  502. package/foundation/doc-compiler/read.mjs +325 -0
  503. package/foundation/doc-compiler/read.test.mjs +313 -0
  504. package/foundation/doc-compiler/source.d.mts +33 -0
  505. package/foundation/doc-compiler/source.mjs +128 -0
  506. package/foundation/doc-compiler/tree.d.mts +288 -0
  507. package/foundation/doc-compiler/tree.mjs +876 -0
  508. package/foundation/doc-compiler/tree.test.mjs +598 -0
  509. package/foundation/fs/file-protection.d.mts +33 -0
  510. package/foundation/fs/file-protection.mjs +825 -0
  511. package/foundation/fs/file-protection.test.mjs +250 -0
  512. package/foundation/fs/module-loader.d.mts +1 -0
  513. package/foundation/fs/module-loader.mjs +50 -1
  514. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  515. package/foundation/fs/path-safety.d.mts +3 -2
  516. package/foundation/fs/path-safety.mjs +49 -19
  517. package/foundation/fs/path-safety.test.mjs +50 -0
  518. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  519. package/foundation/identity/provider-identity.d.mts +90 -0
  520. package/foundation/identity/provider-identity.mjs +320 -0
  521. package/foundation/identity/provider-identity.test.mjs +254 -0
  522. package/foundation/identity/providers.d.mts +7 -0
  523. package/foundation/identity/providers.mjs +16 -0
  524. package/foundation/integrations/autolink.d.mts +58 -1
  525. package/foundation/integrations/autolink.mjs +143 -45
  526. package/foundation/integrations/autolink.test.mjs +1 -1
  527. package/foundation/integrations/cli-requirement.d.mts +45 -0
  528. package/foundation/integrations/cli-requirement.mjs +154 -0
  529. package/foundation/integrations/cli-requirement.test.mjs +109 -0
  530. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  531. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  532. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  533. package/foundation/integrations/contribution-inventory.mjs +27 -24
  534. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  535. package/foundation/integrations/integration-warnings.d.mts +9 -2
  536. package/foundation/integrations/integration-warnings.mjs +52 -21
  537. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  538. package/foundation/integrations/integrations.d.mts +49 -2
  539. package/foundation/integrations/integrations.mjs +81 -8
  540. package/foundation/integrations/integrations.test.mjs +384 -1
  541. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  542. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  543. package/foundation/integrations/provider-resolution.d.mts +152 -0
  544. package/foundation/integrations/provider-resolution.mjs +576 -0
  545. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  546. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  547. package/foundation/integrations/theme-descriptor.mjs +44 -0
  548. package/foundation/integrations/validate-contributions.d.mts +2 -0
  549. package/foundation/integrations/validate-contributions.mjs +131 -29
  550. package/foundation/response/base.d.ts +8 -4
  551. package/foundation/response/error-codes.d.mts +3 -1
  552. package/foundation/response/error-codes.d.ts +2 -0
  553. package/foundation/response/error-codes.doc.mjs +13 -4
  554. package/foundation/response/error-codes.mjs +8 -2
  555. package/foundation/response/error-codes.test.mjs +137 -10
  556. package/foundation/response/json-contract.test.mjs +57 -17
  557. package/foundation/response/json.d.mts +4 -2
  558. package/foundation/response/json.mjs +8 -10
  559. package/foundation/response/response-types.doc.mjs +26 -16
  560. package/foundation/response/response-types.doc.test.mjs +158 -0
  561. package/foundation/response/response.doc.mjs +1 -1
  562. package/foundation/text/string-utils.mjs +22 -10
  563. package/foundation/xle/expand.d.mts +2 -0
  564. package/foundation/xle/expand.mjs +4 -3
  565. package/foundation/xle/expand.test.mjs +54 -0
  566. package/foundation/xle/xle.test.mjs +13 -0
  567. package/package.json +10 -11
  568. package/assets/templates/themes/manifest.json +0 -95
  569. package/clients/cli/lib/update-check.mjs +0 -83
  570. package/clients/cli/lib/update-check.test.mjs +0 -137
  571. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -1,15 +1,17 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
- /** @typedef {import('./types').ComponentDoc} ComponentDoc */
5
- /** @typedef {import('./types').HookDoc} HookDoc */
4
+ /** @typedef {import('./types.js').ComponentDoc} ComponentDoc */
5
+ /** @typedef {import('./types.js').HookDoc} HookDoc */
6
+ /** @typedef {import('./types.js').ReferenceDoc} ReferenceDoc */
6
7
  /**
7
8
  * Validate an unknown value as a legacy (unstamped) doc, or throw.
8
9
  *
9
10
  * @param {unknown} input
10
11
  * @param {string} [label]
11
- * @returns {ComponentDoc | HookDoc}
12
+ * @returns {ComponentDoc | HookDoc | ReferenceDoc}
12
13
  */
13
- export function parseLegacyDoc(input: unknown, label?: string): ComponentDoc | HookDoc;
14
- export type ComponentDoc = import("./types").ComponentDoc;
15
- export type HookDoc = import("./types").HookDoc;
14
+ export function parseLegacyDoc(input: unknown, label?: string): ComponentDoc | HookDoc | ReferenceDoc;
15
+ export type ComponentDoc = import("./types.js").ComponentDoc;
16
+ export type HookDoc = import("./types.js").HookDoc;
17
+ export type ReferenceDoc = import("./types.js").ReferenceDoc;
@@ -10,20 +10,21 @@
10
10
  import {LegacyDocSchema} from './_schema.mjs';
11
11
  import {formatZodError} from '../_shared/errors.mjs';
12
12
 
13
- /** @typedef {import('./types').ComponentDoc} ComponentDoc */
14
- /** @typedef {import('./types').HookDoc} HookDoc */
13
+ /** @typedef {import('./types.js').ComponentDoc} ComponentDoc */
14
+ /** @typedef {import('./types.js').HookDoc} HookDoc */
15
+ /** @typedef {import('./types.js').ReferenceDoc} ReferenceDoc */
15
16
 
16
17
  /**
17
18
  * Validate an unknown value as a legacy (unstamped) doc, or throw.
18
19
  *
19
20
  * @param {unknown} input
20
21
  * @param {string} [label]
21
- * @returns {ComponentDoc | HookDoc}
22
+ * @returns {ComponentDoc | HookDoc | ReferenceDoc}
22
23
  */
23
24
  export function parseLegacyDoc(input, label = 'doc') {
24
25
  const result = LegacyDocSchema.safeParse(input);
25
26
  if (!result.success) {
26
27
  throw new Error(formatZodError(label, result.error));
27
28
  }
28
- return /** @type {ComponentDoc | HookDoc} */ (result.data);
29
+ return /** @type {ComponentDoc | HookDoc | ReferenceDoc} */ (result.data);
29
30
  }
@@ -0,0 +1,208 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Every authored doc kind has a compile-time lock between its load check
5
+ * and its published type: the `_*DriftLock` typedefs in `_schema.mjs` and
6
+ * `template/parse.mjs`, which the strict typecheck evaluates. A lock names each
7
+ * place the loader is deliberately looser than the type. These tests pin that
8
+ * looser behavior and the published unknown-field policy, so tightening a load
9
+ * check is a reviewed change rather than a silent one.
10
+ */
11
+
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import {fileURLToPath, pathToFileURL} from 'node:url';
15
+ import {describe, expect, it} from 'vitest';
16
+ import {parseDoc} from './parse.mjs';
17
+ import {AuthoredDocKindSchema} from './_schema.mjs';
18
+ import {doc as graphFieldsDoc} from './base/graph-fields.doc.mjs';
19
+ import {problemsInTopic} from '../../foundation/discovery/docs-discovery.mjs';
20
+
21
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
22
+ const KINDS = AuthoredDocKindSchema.options;
23
+
24
+ /** The lock that pins each kind's load check to its published type. */
25
+ const LOCKS = {
26
+ component: '_ComponentDocDriftLock',
27
+ function: '_FunctionDocDriftLock',
28
+ generic: '_ReferenceDocDriftLock',
29
+ page: '_PageTemplateDocDriftLock',
30
+ block: '_BlockTemplateDocDriftLock',
31
+ schema: '_SchemaDocDriftLock',
32
+ command: '_CommandDocDriftLock',
33
+ enum: '_EnumDocDriftLock',
34
+ namespace: '_NamespaceDocDriftLock',
35
+ };
36
+
37
+ /** One valid example doc per kind, from the typed examples. */
38
+ const EXAMPLES = Object.fromEntries(
39
+ await Promise.all(
40
+ KINDS.map(async kind => {
41
+ const file = {generic: 'reference', function: 'function'}[kind] ?? kind;
42
+ const url = pathToFileURL(
43
+ path.join(HERE, '../../test/authoring-types', `${file}.doc.mjs`),
44
+ );
45
+ return [kind, (await import(url.href)).docs];
46
+ }),
47
+ ),
48
+ );
49
+
50
+ describe('load check vs published type', () => {
51
+ it('locks every doc kind', () => {
52
+ const source = ['_schema.mjs', 'template/parse.mjs', 'theme/parse.mjs']
53
+ .map(file => fs.readFileSync(path.join(HERE, file), 'utf8'))
54
+ .join('\n');
55
+ expect(Object.keys(LOCKS).sort()).toEqual([...KINDS].sort());
56
+ const locks = [
57
+ ...Object.values(LOCKS),
58
+ '_AuthoredDocKindDriftLock',
59
+ '_HookDocIsFunctionDocLock',
60
+ '_ThemeDocDriftLock',
61
+ ];
62
+ for (const lock of locks) {
63
+ expect(source, `${lock} is missing`).toMatch(
64
+ new RegExp(`\\}\\s*${lock}\\b`),
65
+ );
66
+ }
67
+ });
68
+
69
+ it('dispatches every doc kind and refuses any other', () => {
70
+ for (const kind of KINDS) {
71
+ expect(() => parseDoc(EXAMPLES[kind], `${kind}.doc.mjs`)).not.toThrow();
72
+ }
73
+ expect(() => parseDoc({type: 'widget', name: 'x'}, 'x.doc.mjs')).toThrow(
74
+ /x\.doc\.mjs is invalid/u,
75
+ );
76
+ });
77
+ });
78
+
79
+ describe('where loading is deliberately looser than the type', () => {
80
+ it('a stamped component needs no displayName; usage, theming and examples are unchecked', () => {
81
+ expect(() =>
82
+ parseDoc(
83
+ {
84
+ type: 'component',
85
+ name: 'Badge',
86
+ category: 'badges',
87
+ props: [],
88
+ usage: 'free text',
89
+ theming: 5,
90
+ examples: [{title: 'Basic'}],
91
+ },
92
+ 'Badge.doc.mjs',
93
+ ),
94
+ ).not.toThrow();
95
+ });
96
+
97
+ it('each entry of a stamped group doc needs a name, and nothing more', () => {
98
+ const group = (/** @type {unknown[]} */ components) => ({
99
+ type: 'component',
100
+ name: 'Tabs',
101
+ components,
102
+ });
103
+ expect(() =>
104
+ parseDoc(
105
+ group([{name: 'Tab'}, {name: 'TabPanel', description: 'x'}]),
106
+ 'Tabs.doc.mjs',
107
+ ),
108
+ ).not.toThrow();
109
+ for (const bad of [null, 5, 'Tab', {}, {name: ''}, {displayName: 'Tab'}]) {
110
+ expect(() => parseDoc(group([bad]), 'Tabs.doc.mjs')).toThrow(
111
+ /components\.0/,
112
+ );
113
+ }
114
+ });
115
+
116
+ it('a stamped function needs no displayName; usage is unchecked', () => {
117
+ expect(() =>
118
+ parseDoc(
119
+ {type: 'function', name: 'useX', params: [], returns: [], usage: 5},
120
+ 'useX.doc.mjs',
121
+ ),
122
+ ).not.toThrow();
123
+ });
124
+
125
+ it('a stamped generic doc loads without title, description or sections, but is no topic', () => {
126
+ const doc = parseDoc({type: 'generic', name: 'notes'}, 'notes.doc.mjs');
127
+ expect(doc.title).toBe('notes');
128
+ expect(problemsInTopic(doc)).toEqual([
129
+ 'description: expected a non-empty string',
130
+ 'sections: expected at least one section',
131
+ ]);
132
+ });
133
+
134
+ it('a template needs no displayName or aspectRatio and may use its own category', () => {
135
+ expect(() =>
136
+ parseDoc(
137
+ {type: 'block', name: 'widget-demo', category: 'components/Widget'},
138
+ 'widget-demo.doc.mjs',
139
+ ),
140
+ ).not.toThrow();
141
+ expect(() =>
142
+ parseDoc(
143
+ {type: 'page', name: 'widget-page', category: 'Widgets'},
144
+ 'widget-page.doc.mjs',
145
+ ),
146
+ ).not.toThrow();
147
+ });
148
+
149
+ it('schema, command and enum docs load only as their type allows', () => {
150
+ const {fields, ...schemaDoc} = EXAMPLES.schema;
151
+ const {summary, ...commandDoc} = EXAMPLES.command;
152
+ const {members, ...enumDoc} = EXAMPLES.enum;
153
+ expect(() => parseDoc(schemaDoc, 's.doc.mjs')).toThrow(/fields/);
154
+ expect(() => parseDoc(commandDoc, 'c.doc.mjs')).toThrow(/summary/);
155
+ expect(() => parseDoc(enumDoc, 'e.doc.mjs')).toThrow(/members/);
156
+ });
157
+ });
158
+
159
+ describe('unknown fields', () => {
160
+ const keeps = KINDS.filter(kind => {
161
+ try {
162
+ parseDoc({...EXAMPLES[kind], notAField: true}, `${kind}.doc.mjs`);
163
+ return true;
164
+ } catch {
165
+ return false;
166
+ }
167
+ });
168
+
169
+ it('match the published policy', () => {
170
+ const policy = graphFieldsDoc.notes
171
+ .map(note => ('text' in note ? note.text : ''))
172
+ .find(text => text.startsWith('Unknown fields'));
173
+ expect(policy, 'graph-fields.doc.mjs states the policy').toBeDefined();
174
+ const [kept, refused] = /** @type {string} */ (policy).split(
175
+ ' docs accept',
176
+ );
177
+ const named = (/** @type {string} */ text) =>
178
+ [...text.matchAll(/`([a-z]+)`/g)].map(match => match[1]).sort();
179
+ expect(named(kept)).toEqual([...keeps].sort());
180
+ expect(named(refused).filter(kind => KINDS.includes(kind))).toEqual(
181
+ KINDS.filter(kind => !keeps.includes(kind)).sort(),
182
+ );
183
+ });
184
+
185
+ it('are refused inside sections and content blocks', () => {
186
+ const [section] = EXAMPLES.generic.sections;
187
+ expect(() =>
188
+ parseDoc(
189
+ {...EXAMPLES.generic, sections: [{...section, notAField: true}]},
190
+ 'r.doc.mjs',
191
+ ),
192
+ ).toThrow();
193
+ expect(() =>
194
+ parseDoc(
195
+ {
196
+ ...EXAMPLES.generic,
197
+ sections: [
198
+ {
199
+ ...section,
200
+ content: [{type: 'prose', text: 'x', notAField: true}],
201
+ },
202
+ ],
203
+ },
204
+ 'r.doc.mjs',
205
+ ),
206
+ ).toThrow();
207
+ });
208
+ });
@@ -0,0 +1,9 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * @file SchemaDoc for NamespaceDoc, the authored hierarchy and layout owner.
6
+ * @position packages/cli/authoring/doctypes/namespace — doc-type documentation
7
+ */
8
+ /** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
9
+ export const doc: import("@astryxdesign/cli/authoring").SchemaDoc;
@@ -0,0 +1,128 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SchemaDoc for NamespaceDoc, the authored hierarchy and layout owner.
5
+ * @position packages/cli/authoring/doctypes/namespace — doc-type documentation
6
+ */
7
+
8
+ /** @type {import('@astryxdesign/cli/authoring').SchemaDoc} */
9
+ export const doc = {
10
+ type: 'schema',
11
+ name: 'namespace-doc',
12
+ displayName: 'NamespaceDoc',
13
+ namespace: 'authoring',
14
+ description:
15
+ "Declares one level of the docs tree: named slots, and adoption rules for already-discovered docs. It never scans folders, lists its children, or copies child documents: a child names its parent with `placement`, or a namespace adopts a discovery group. `astryx docs <route>` lists each slot's children one level down. The CLI keeps its namespace docs in its docs tree directory; an integration ships its own in its docs directory, and they appear in `astryx docs` beside the CLI's.",
16
+ appliesTo: '<namespace>.doc.mjs',
17
+ fields: [
18
+ {
19
+ name: 'type',
20
+ type: "'namespace'",
21
+ description: 'Doc-kind discriminant.',
22
+ required: true,
23
+ },
24
+ {
25
+ name: 'name',
26
+ type: 'string',
27
+ description:
28
+ 'Stable provider-local identity. Moving the namespace does not change this value.',
29
+ required: true,
30
+ },
31
+ {
32
+ name: 'title',
33
+ type: 'string',
34
+ description: 'Human-readable page title.',
35
+ required: true,
36
+ },
37
+ {
38
+ name: 'summary',
39
+ type: 'string',
40
+ description: 'One-line summary used in listings and search results.',
41
+ required: true,
42
+ },
43
+ {
44
+ name: 'placement',
45
+ type: 'DocPlacement',
46
+ description:
47
+ 'Optional canonical parent: {parent, slot?, order?}. `parent` names a namespace of the same package as `namespace:<name>`. An invalid placement withdraws the namespace with a diagnostic; it never falls back.',
48
+ },
49
+ {
50
+ name: 'aliases',
51
+ type: 'string[]',
52
+ description:
53
+ 'Prior names or routes the docs tree will keep resolving to this doc. Not read yet.',
54
+ },
55
+ {
56
+ name: 'audience',
57
+ type: "'public' | 'internal'",
58
+ description: "Bundle audience. Defaults to 'public'.",
59
+ default: "'public'",
60
+ },
61
+ {
62
+ name: 'keywords',
63
+ type: 'string[]',
64
+ description: 'Search terms not already present in the title or summary.',
65
+ },
66
+ {
67
+ name: 'slots',
68
+ type: 'Record<string, NamespaceSlot>',
69
+ description:
70
+ 'Named placement and collection targets. Each slot declares a title and accepted doc kinds; configured providers require an explicit extension slot.',
71
+ required: true,
72
+ },
73
+ {
74
+ name: 'adopts',
75
+ type: 'NamespaceAdoptionRule[]',
76
+ description:
77
+ 'Provider-local rules that adopt otherwise-unplaced docs from a logical discovery group. They never scan a folder.',
78
+ },
79
+ {
80
+ name: 'blocks',
81
+ type: '(ReferenceContentBlock | GraphContentBlock)[]',
82
+ description:
83
+ 'Ordered layout content for the namespace page. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers. Not rendered yet: `astryx docs <route>` lists every slot and its children in order.',
84
+ },
85
+ ],
86
+ examples: [
87
+ {
88
+ label: 'A CLI namespace with one adopted source group',
89
+ code: `/** @type {import('@astryxdesign/cli/authoring').NamespaceDoc} */
90
+ export const docs = {
91
+ type: 'namespace',
92
+ name: 'cli',
93
+ title: 'Astryx CLI',
94
+ summary: 'Commands, APIs, and integration authoring.',
95
+ slots: {
96
+ guides: {title: 'Guides', accepts: {kinds: ['namespace', 'generic']}},
97
+ reference: {
98
+ title: 'Reference',
99
+ accepts: {kinds: ['namespace', 'command']},
100
+ },
101
+ },
102
+ adopts: [{
103
+ source: {group: 'cli-commands', kinds: ['command']},
104
+ into: 'reference',
105
+ }],
106
+ };`,
107
+ },
108
+ ],
109
+ notes: [
110
+ {
111
+ type: 'prose',
112
+ text: "The docs tree reads namespace docs from the CLI and from every configured integration. An integration's namespace doc is a top-level level of the tree, and its guides name it with `placement`; a doc can be placed only in a namespace of its own package. When two packages claim one route, the CLI's own docs win, then integrations in configured order, and `astryx doctor` names the loser.",
113
+ },
114
+ {
115
+ type: 'prose',
116
+ text: 'Child docs request one canonical home with placement. Collections store and render stable references to those docs; they never create a second identity or parent.',
117
+ },
118
+ {
119
+ type: 'list',
120
+ style: 'dont',
121
+ items: [
122
+ 'Use a directory as implicit navigation.',
123
+ 'Put JSX, HTML, ANSI, callbacks, or custom renderer code in a doc.',
124
+ 'Use choice, callout, or checklist blocks before the full block-extension contract exists.',
125
+ ],
126
+ },
127
+ ],
128
+ };
@@ -0,0 +1,12 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /** @typedef {import('../types.js').NamespaceDoc} NamespaceDoc */
5
+ /**
6
+ * Validate an unknown value as a NamespaceDoc, or throw a readable error.
7
+ * @param {unknown} input
8
+ * @param {string} [label]
9
+ * @returns {NamespaceDoc}
10
+ */
11
+ export function parseNamespace(input: unknown, label?: string): NamespaceDoc;
12
+ export type NamespaceDoc = import("../types.js").NamespaceDoc;
@@ -0,0 +1,25 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Namespace doc parser. Zod is sealed in `../_schema.mjs`; consumers call
5
+ * `parseNamespace` or use `parseDoc`.
6
+ */
7
+
8
+ import {NamespaceDocKindSchema} from '../_schema.mjs';
9
+ import {formatZodError} from '../../_shared/errors.mjs';
10
+
11
+ /** @typedef {import('../types.js').NamespaceDoc} NamespaceDoc */
12
+
13
+ /**
14
+ * Validate an unknown value as a NamespaceDoc, or throw a readable error.
15
+ * @param {unknown} input
16
+ * @param {string} [label]
17
+ * @returns {NamespaceDoc}
18
+ */
19
+ export function parseNamespace(input, label = 'namespace doc') {
20
+ const result = NamespaceDocKindSchema.safeParse(input);
21
+ if (!result.success) {
22
+ throw new Error(formatZodError(label, result.error));
23
+ }
24
+ return result.data;
25
+ }
@@ -0,0 +1,163 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {parseDoc, parseNamespace, parseReference} from '../../index.mjs';
5
+
6
+ const namespaceDoc = {
7
+ type: 'namespace',
8
+ name: 'integrations',
9
+ title: 'Author integrations',
10
+ summary: 'Publish reusable Astryx packages.',
11
+ aliases: ['cli-integrations'],
12
+ placement: {parent: 'namespace:cli', slot: 'guides', order: 10},
13
+ slots: {
14
+ contributions: {
15
+ title: 'What do you want to publish?',
16
+ accepts: {kinds: ['namespace']},
17
+ },
18
+ providerGuides: {
19
+ title: 'Provider guidance',
20
+ accepts: {providers: 'configured', kinds: ['generic', 'schema']},
21
+ },
22
+ },
23
+ adopts: [
24
+ {
25
+ source: {group: 'cli-api', kinds: ['function', 'schema', 'enum']},
26
+ into: 'contributions',
27
+ groupBy: 'kind',
28
+ },
29
+ ],
30
+ blocks: [
31
+ {
32
+ type: 'workflow',
33
+ title: 'Package lifecycle',
34
+ steps: [
35
+ {title: 'Add', references: ['command:integration-add']},
36
+ {
37
+ title: 'Validate',
38
+ references: ['command:doctor-integration-validate'],
39
+ },
40
+ ],
41
+ },
42
+ {
43
+ type: 'collection',
44
+ source: {slot: 'contributions'},
45
+ presentation: 'cards',
46
+ },
47
+ {
48
+ type: 'reference',
49
+ target: 'schema:integration',
50
+ projection: {fields: ['components', 'docs']},
51
+ },
52
+ ],
53
+ };
54
+
55
+ describe('NamespaceDoc', () => {
56
+ it('accepts the reviewed plain-object shape through both parsers', () => {
57
+ expect(parseNamespace(namespaceDoc)).toEqual(namespaceDoc);
58
+ expect(parseDoc(namespaceDoc)).toEqual(namespaceDoc);
59
+ });
60
+
61
+ it('reports stable nested field paths', () => {
62
+ expect(() =>
63
+ parseNamespace({
64
+ ...namespaceDoc,
65
+ blocks: [{type: 'workflow', steps: [{title: ''}]}],
66
+ }),
67
+ ).toThrow(/blocks\.0\.steps\.0\.title/u);
68
+ });
69
+
70
+ it.each(['choice', 'callout', 'checklist'])(
71
+ 'rejects unsupported %s blocks',
72
+ type => {
73
+ expect(() => parseNamespace({...namespaceDoc, blocks: [{type}]})).toThrow(
74
+ /blocks\.0\.type/u,
75
+ );
76
+ },
77
+ );
78
+
79
+ it('rejects misspelled fields instead of silently dropping them', () => {
80
+ expect(() =>
81
+ parseNamespace({...namespaceDoc, summmary: 'misspelled'}),
82
+ ).toThrow(/summmary/u);
83
+ });
84
+
85
+ it('requires at least one declared slot', () => {
86
+ expect(() => parseNamespace({...namespaceDoc, slots: {}})).toThrow(
87
+ /at least one slot is required/u,
88
+ );
89
+ });
90
+
91
+ it('rejects a collection that names an undeclared slot', () => {
92
+ expect(() =>
93
+ parseNamespace({
94
+ ...namespaceDoc,
95
+ blocks: [{type: 'collection', source: {slot: 'missing'}}],
96
+ }),
97
+ ).toThrow(/blocks\.0\.source\.slot.*declared slot/u);
98
+ });
99
+
100
+ it('rejects an adoption rule that names an undeclared slot', () => {
101
+ expect(() =>
102
+ parseNamespace({
103
+ ...namespaceDoc,
104
+ adopts: [{source: {group: 'cli-api'}, into: 'missing'}],
105
+ }),
106
+ ).toThrow(/adopts\.0\.into.*declared slot/u);
107
+ });
108
+
109
+ it('rejects an adoption rule whose generated kind is not accepted', () => {
110
+ expect(() =>
111
+ parseNamespace({
112
+ ...namespaceDoc,
113
+ adopts: [
114
+ {
115
+ source: {group: 'cli-api', kinds: ['command']},
116
+ into: 'providerGuides',
117
+ groupBy: 'kind',
118
+ },
119
+ ],
120
+ }),
121
+ ).toThrow(/does not accept adopted kind "namespace"/u);
122
+
123
+ expect(() =>
124
+ parseNamespace({
125
+ ...namespaceDoc,
126
+ adopts: [
127
+ {
128
+ source: {group: 'cli-api', kinds: ['command']},
129
+ into: 'providerGuides',
130
+ },
131
+ ],
132
+ }),
133
+ ).toThrow(/does not accept adopted kind "command"/u);
134
+ });
135
+ });
136
+
137
+ describe('semantic graph blocks', () => {
138
+ it('keeps graph-only blocks out of the stable ReferenceDoc section union', () => {
139
+ expect(() =>
140
+ parseReference({
141
+ type: 'generic',
142
+ name: 'publishing',
143
+ title: 'Publishing',
144
+ description: 'Publish an integration.',
145
+ sections: [
146
+ {
147
+ id: 'start',
148
+ title: 'Start',
149
+ content: namespaceDoc.blocks,
150
+ },
151
+ ],
152
+ }),
153
+ ).toThrow(/Invalid discriminator value/u);
154
+ });
155
+
156
+ it('keeps shape-sniffing an unknown stamp for 0.6.x compatibility', () => {
157
+ expect(parseDoc({type: 'choice', name: 'x', props: []})).toMatchObject({
158
+ type: 'choice',
159
+ name: 'x',
160
+ props: [],
161
+ });
162
+ });
163
+ });
@@ -0,0 +1,74 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Namespace doc types. A namespace owns navigation slots and a
5
+ * renderer-neutral layout over already-discovered docs. It never scans files
6
+ * or copies child documents.
7
+ */
8
+
9
+ import type {AuthoredDocGraphFields, AuthoredDocKind} from '../base/type.js';
10
+ import type {
11
+ GraphContentBlock,
12
+ ReferenceContentBlock,
13
+ } from '../reference/type.js';
14
+
15
+ /** Which providers may contribute appearances to a namespace slot. */
16
+ export type NamespaceProviderScope = 'same' | 'configured';
17
+
18
+ /** Constraints declared by the namespace that owns a slot. */
19
+ export interface NamespaceSlotAcceptance {
20
+ /** Authored doc kinds accepted by this slot. */
21
+ kinds: AuthoredDocKind[];
22
+ /** Omit for the namespace provider; `configured` admits provider appearances. */
23
+ providers?: NamespaceProviderScope;
24
+ }
25
+
26
+ /** One named placement and collection target owned by a NamespaceDoc. */
27
+ export interface NamespaceSlot {
28
+ /** Human-readable heading for children in this slot. */
29
+ title: string;
30
+ /** Which docs may be placed or shown in this slot. */
31
+ accepts: NamespaceSlotAcceptance;
32
+ }
33
+
34
+ /** One logical source group that a namespace may adopt. */
35
+ export interface NamespaceAdoptionSource {
36
+ /** Provider-local discovery group, such as `cli-commands`. */
37
+ group: string;
38
+ /** Optional subset of authored kinds from the group. */
39
+ kinds?: AuthoredDocKind[];
40
+ }
41
+
42
+ /**
43
+ * Assigns otherwise-unplaced docs from one provider-local source group to a
44
+ * child namespace. Discovery defines groups; this rule never scans a folder.
45
+ */
46
+ export interface NamespaceAdoptionRule {
47
+ source: NamespaceAdoptionSource;
48
+ /** Slot owned by this namespace that becomes the canonical destination. */
49
+ into: string;
50
+ /** Generate one child namespace per authored kind. */
51
+ groupBy?: 'kind';
52
+ }
53
+
54
+ /**
55
+ * An authored documentation namespace. Its ordered blocks control layout while
56
+ * slots and adoption rules describe where already-discovered docs may appear.
57
+ */
58
+ export interface NamespaceDoc extends AuthoredDocGraphFields {
59
+ type: 'namespace';
60
+ /** Stable provider-local name. Navigation changes do not change this value. */
61
+ name: string;
62
+ /** Human-readable page title. */
63
+ title: string;
64
+ /** One-line summary shown in listings and search results. */
65
+ summary: string;
66
+ /** Search terms that are not already present in the title or summary. */
67
+ keywords?: string[];
68
+ /** Named child-placement and collection targets. */
69
+ slots: Record<string, NamespaceSlot>;
70
+ /** Optional source-adoption rules for otherwise-unplaced docs. */
71
+ adopts?: NamespaceAdoptionRule[];
72
+ /** Ordered renderer-neutral content and collection blocks. */
73
+ blocks?: (ReferenceContentBlock | GraphContentBlock)[];
74
+ }