@astryxdesign/cli 0.6.4-canary.f0355e3 → 0.6.4

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 (331) hide show
  1. package/README.md +96 -99
  2. package/api/build/build.doc.mjs +1 -6
  3. package/api/build/build.test.mjs +0 -22
  4. package/api/build/kit/kit.mjs +5 -44
  5. package/api/component/_adapter.d.mts +0 -25
  6. package/api/component/_adapter.mjs +5 -59
  7. package/api/component/component.d.mts +3 -6
  8. package/api/component/component.doc.mjs +17 -37
  9. package/api/component/component.mjs +9 -249
  10. package/api/component/component.type.d.mts +0 -25
  11. package/api/component/component.type.mjs +0 -44
  12. package/api/discover/_adapter.d.mts +6 -114
  13. package/api/discover/_adapter.mjs +17 -372
  14. package/api/discover/detail/detail.d.mts +6 -18
  15. package/api/discover/detail/detail.mjs +13 -67
  16. package/api/discover/detail/detail.test.mjs +0 -85
  17. package/api/discover/discover.d.mts +9 -3
  18. package/api/discover/discover.doc.mjs +18 -61
  19. package/api/discover/discover.mjs +36 -220
  20. package/api/discover/discover.test.mjs +2 -11
  21. package/api/discover/discover.type.d.mts +8 -147
  22. package/api/discover/discover.type.mjs +12 -102
  23. package/api/discover/list/list.d.mts +6 -20
  24. package/api/discover/list/list.mjs +12 -45
  25. package/api/discover/list/list.test.mjs +0 -46
  26. package/api/discover/search/search.d.mts +16 -18
  27. package/api/discover/search/search.mjs +56 -102
  28. package/api/discover/search/search.test.mjs +10 -144
  29. package/api/docs/_adapter.d.mts +3 -8
  30. package/api/docs/_adapter.mjs +6 -14
  31. package/api/docs/docOverlays.test.mjs +1 -27
  32. package/api/docs/docs.doc.mjs +2 -2
  33. package/api/docs/docs.test.mjs +243 -0
  34. package/api/docs/integration-tree.test.mjs +555 -0
  35. package/api/docs/integrationDocs.test.mjs +314 -0
  36. package/api/doctor/doctor.d.mts +3 -8
  37. package/api/doctor/doctor.doc.mjs +8 -17
  38. package/api/doctor/doctor.mjs +9 -90
  39. package/api/doctor/doctor.test.mjs +10 -122
  40. package/api/doctor/doctor.type.d.mts +1 -1
  41. package/api/doctor/doctor.type.mjs +1 -1
  42. package/api/gap-report/gap-report.doc.mjs +10 -19
  43. package/api/hook/hook.doc.mjs +3 -6
  44. package/api/index.d.mts +2 -1
  45. package/api/index.mjs +5 -5
  46. package/api/init/init.doc.mjs +12 -17
  47. package/api/integration/add-helpers.d.mts +2 -5
  48. package/api/integration/add-helpers.mjs +9 -36
  49. package/api/integration/add-theme.mjs +1 -22
  50. package/api/integration/add-theme.test.mjs +0 -34
  51. package/api/integration/authoring-checks.mjs +2 -2
  52. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  53. package/api/integration/pack-check.mjs +9 -82
  54. package/api/integration/pack-check.test.mjs +0 -90
  55. package/api/integration/pack-check.type.mjs +1 -1
  56. package/api/json/assertResponse.doc.mjs +1 -1
  57. package/api/json/index.ts +1 -0
  58. package/api/json/isError.doc.mjs +1 -1
  59. package/api/layout/_adapter.d.mts +34 -0
  60. package/api/layout/_adapter.mjs +148 -0
  61. package/api/layout/check/check.d.mts +16 -0
  62. package/api/layout/check/check.mjs +40 -0
  63. package/api/layout/expand/expand.d.mts +22 -0
  64. package/api/layout/expand/expand.mjs +155 -0
  65. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  66. package/api/layout/grammar/grammar.d.mts +13 -0
  67. package/api/layout/grammar/grammar.mjs +87 -0
  68. package/api/layout/layout.d.mts +6 -0
  69. package/api/layout/layout.mjs +17 -0
  70. package/api/layout/layout.test.mjs +297 -0
  71. package/api/layout/layout.type.d.mts +89 -0
  72. package/api/layout/layout.type.mjs +103 -0
  73. package/api/layout/layoutCheck.doc.d.mts +11 -0
  74. package/api/layout/layoutCheck.doc.mjs +85 -0
  75. package/api/layout/layoutExpand.doc.d.mts +11 -0
  76. package/api/layout/layoutExpand.doc.mjs +107 -0
  77. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  78. package/api/layout/layoutGrammar.doc.mjs +57 -0
  79. package/api/search/search.d.mts +1 -27
  80. package/api/search/search.doc.mjs +2 -2
  81. package/api/search/search.mjs +16 -228
  82. package/api/search/search.test.mjs +512 -0
  83. package/api/swizzle/swizzle.doc.mjs +5 -7
  84. package/api/template/copy/copy.mjs +1 -1
  85. package/api/template/copy/copy.test.mjs +0 -9
  86. package/api/template/template-integration.test.mjs +65 -1
  87. package/api/template/template.doc.mjs +1 -2
  88. package/api/template/template.mjs +1 -1
  89. package/api/theme/add/add.mjs +25 -17
  90. package/api/theme/add/add.staging.test.mjs +23 -40
  91. package/api/theme/build/build.family.test.mjs +12 -7
  92. package/api/theme/build/build.mjs +18 -8
  93. package/api/theme/generateTonalPalette.doc.mjs +2 -1
  94. package/api/theme/listThemes.doc.mjs +1 -1
  95. package/api/theme/themeAdd.doc.mjs +10 -9
  96. package/api/theme/themeBuild.doc.mjs +13 -13
  97. package/api/theme/themeList.doc.mjs +1 -1
  98. package/api/theme/themeListAvailable.doc.mjs +1 -2
  99. package/api/theme/themePaletteGenerate.doc.mjs +8 -15
  100. package/api/theme/themeTargets.doc.mjs +2 -3
  101. package/api/theme/themeTemplate.doc.mjs +1 -2
  102. package/api/upgrade/run/run.mjs +4 -6
  103. package/api/upgrade/upgrade.doc.mjs +22 -24
  104. package/api/upgrade/upgrade.type.mjs +2 -2
  105. package/assets/codemods/__tests__/runner.test.mjs +1 -3
  106. package/assets/codemods/integration-runner.mjs +3 -3
  107. package/assets/codemods/runner.mjs +4 -5
  108. package/assets/docs/README.md +2 -4
  109. package/assets/docs/browser-support.doc.mjs +11 -11
  110. package/assets/docs/color.doc.mjs +2 -8
  111. package/assets/docs/elevation.doc.mjs +4 -6
  112. package/assets/docs/getting-started.doc.mjs +16 -5
  113. package/assets/docs/icons.doc.mjs +21 -2
  114. package/assets/docs/illustrations.doc.mjs +15 -7
  115. package/assets/docs/internationalization.doc.mjs +5 -7
  116. package/assets/docs/layout.doc.dense.mjs +82 -130
  117. package/assets/docs/layout.doc.mjs +77 -133
  118. package/assets/docs/migration.doc.mjs +21 -19
  119. package/assets/docs/motion.doc.mjs +3 -16
  120. package/assets/docs/principles.doc.dense.mjs +5 -5
  121. package/assets/docs/principles.doc.mjs +0 -8
  122. package/assets/docs/principles.doc.zh.mjs +6 -6
  123. package/assets/docs/shape.doc.mjs +3 -8
  124. package/assets/docs/spacing.doc.mjs +2 -7
  125. package/assets/docs/styling-libraries.doc.mjs +2 -6
  126. package/assets/docs/styling.doc.mjs +23 -19
  127. package/assets/docs/theme.doc.dense.mjs +18 -58
  128. package/assets/docs/theme.doc.mjs +46 -56
  129. package/assets/docs/theme.doc.zh.mjs +8 -9
  130. package/assets/docs/tokens.doc.dense.mjs +2 -2
  131. package/assets/docs/tokens.doc.mjs +8 -389
  132. package/assets/docs/tokens.doc.zh.mjs +2 -2
  133. package/assets/docs/tree/integrations.doc.mjs +451 -25
  134. package/assets/docs/tree/integrations.test.mjs +62 -0
  135. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  136. package/assets/docs/typography.doc.mjs +4 -24
  137. package/assets/docs/working-with-ai.doc.mjs +22 -30
  138. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  139. package/authoring/config/config.doc.mjs +2 -10
  140. package/authoring/config/parse.d.mts +0 -2
  141. package/authoring/config/parse.mjs +0 -19
  142. package/authoring/config/parse.test.mjs +0 -8
  143. package/authoring/config/type.ts +2 -13
  144. package/authoring/doctypes/_schema.d.mts +2 -3
  145. package/authoring/doctypes/_schema.mjs +0 -6
  146. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  147. package/authoring/doctypes/base/type.ts +2 -4
  148. package/authoring/doctypes/command/command.doc.mjs +1 -1
  149. package/authoring/doctypes/command/type.ts +1 -1
  150. package/authoring/doctypes/component/component.doc.mjs +0 -6
  151. package/authoring/doctypes/component/type.ts +0 -8
  152. package/authoring/doctypes/reference/reference.doc.mjs +0 -7
  153. package/authoring/doctypes/reference/type.ts +0 -5
  154. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  155. package/authoring/doctypes/template/template.doc.mjs +1 -1
  156. package/authoring/doctypes/template/type.ts +2 -2
  157. package/authoring/index.d.mts +0 -1
  158. package/authoring/index.d.ts +0 -10
  159. package/authoring/index.mjs +0 -1
  160. package/authoring/integration/integration.doc.mjs +10 -12
  161. package/clients/cli/command-result-coverage.test.mjs +7 -7
  162. package/clients/cli/commands/component/index.mjs +55 -152
  163. package/clients/cli/commands/component-ownership.test.mjs +0 -89
  164. package/clients/cli/commands/component.doc.mjs +9 -27
  165. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  166. package/clients/cli/commands/discover.doc.mjs +9 -53
  167. package/clients/cli/commands/discover.mjs +118 -393
  168. package/clients/cli/commands/docs.doc.mjs +1 -1
  169. package/clients/cli/commands/docs.mjs +17 -60
  170. package/clients/cli/commands/docs.test.mjs +294 -0
  171. package/clients/cli/commands/doctor-integration-docs.doc.mjs +2 -3
  172. package/clients/cli/commands/doctor-integration.test.mjs +0 -53
  173. package/clients/cli/commands/doctor.doc.mjs +1 -3
  174. package/clients/cli/commands/doctor.mjs +5 -49
  175. package/clients/cli/commands/gap-report.doc.mjs +9 -10
  176. package/clients/cli/commands/init.doc.mjs +6 -9
  177. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  178. package/clients/cli/commands/integration-authoring.test.mjs +10 -61
  179. package/clients/cli/commands/integration-pack.doc.mjs +9 -5
  180. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  181. package/clients/cli/commands/integration.doc.mjs +4 -4
  182. package/clients/cli/commands/integration.mjs +43 -74
  183. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  184. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  185. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  186. package/clients/cli/commands/layout.doc.mjs +34 -0
  187. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  188. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  189. package/clients/cli/commands/layout.mjs +275 -0
  190. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  191. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  192. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  193. package/clients/cli/commands/manifest.doc.mjs +1 -1
  194. package/clients/cli/commands/search.doc.mjs +3 -10
  195. package/clients/cli/commands/search.mjs +2 -21
  196. package/clients/cli/commands/search.test.mjs +4 -21
  197. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  198. package/clients/cli/commands/template.doc.mjs +1 -1
  199. package/clients/cli/commands/text-json-parity.test.mjs +16 -5
  200. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  201. package/clients/cli/commands/theme-palette-generate.doc.mjs +2 -3
  202. package/clients/cli/commands/theme-palette.doc.mjs +2 -1
  203. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  204. package/clients/cli/commands/theme.doc.mjs +1 -2
  205. package/clients/cli/commands/upgrade.doc.mjs +3 -62
  206. package/clients/cli/index.mjs +10 -28
  207. package/clients/cli/lib/define-command.mjs +4 -28
  208. package/clients/cli/lib/define-command.test.mjs +0 -54
  209. package/clients/cli/lib/exit-codes.test.mjs +9 -18
  210. package/clients/cli/lib/json-shim.mjs +14 -24
  211. package/clients/cli/lib/json-shim.test.mjs +20 -6
  212. package/clients/cli/lib/manifest.mjs +13 -18
  213. package/clients/cli/lib/manifest.test.mjs +2 -5
  214. package/foundation/agent-docs/agent-docs.mjs +1 -1
  215. package/foundation/agent-docs/agent-docs.test.mjs +1159 -0
  216. package/foundation/discovery/authoring-self-docs.mjs +0 -1
  217. package/foundation/discovery/authoring-self-docs.test.mjs +2 -6
  218. package/foundation/discovery/cli-self-docs.mjs +2 -16
  219. package/foundation/discovery/cli-self-docs.test.mjs +0 -20
  220. package/foundation/discovery/docs-discovery.mjs +1 -5
  221. package/foundation/discovery/docs-discovery.test.mjs +0 -21
  222. package/foundation/discovery/docs-section-key.d.mts +1 -1
  223. package/foundation/discovery/docs-section-key.mjs +1 -1
  224. package/foundation/discovery/template-adapter.mjs +1 -1
  225. package/foundation/doc-compiler/doc-loads.test.mjs +14 -3
  226. package/foundation/doc-compiler/tree.d.mts +0 -4
  227. package/foundation/doc-compiler/tree.mjs +1 -6
  228. package/foundation/doc-compiler/tree.test.mjs +598 -0
  229. package/foundation/integrations/cli-requirement.d.mts +6 -26
  230. package/foundation/integrations/cli-requirement.mjs +11 -46
  231. package/foundation/integrations/cli-requirement.test.mjs +2 -7
  232. package/foundation/integrations/contribution-inventory.mjs +1 -1
  233. package/foundation/integrations/integrations.d.mts +1 -14
  234. package/foundation/integrations/integrations.mjs +1 -41
  235. package/foundation/integrations/integrations.test.mjs +0 -31
  236. package/foundation/response/error-codes.doc.mjs +8 -6
  237. package/foundation/response/error-codes.test.mjs +5 -30
  238. package/foundation/response/response-types.doc.d.mts +3 -4
  239. package/foundation/response/response-types.doc.mjs +27 -40
  240. package/foundation/response/response-types.doc.test.mjs +0 -23
  241. package/foundation/response/response.doc.mjs +10 -11
  242. package/foundation/xle/browser.d.mts +3 -3
  243. package/foundation/xle/browser.mjs +3 -3
  244. package/foundation/xle/expand.mjs +2 -2
  245. package/foundation/xle/parse.mjs +1 -1
  246. package/foundation/xle/print.mjs +2 -2
  247. package/foundation/xle/splice.mjs +1 -1
  248. package/package.json +9 -9
  249. package/api/discover/_adapter.test.mjs +0 -215
  250. package/api/discover/_catalog-view.d.mts +0 -115
  251. package/api/discover/_catalog-view.mjs +0 -203
  252. package/api/discover/_catalog-view.test.mjs +0 -128
  253. package/api/discover/detail/item/item.d.mts +0 -26
  254. package/api/discover/detail/item/item.mjs +0 -78
  255. package/api/discover/detail/item/item.test.mjs +0 -73
  256. package/api/integration/pack-check.lifecycle-output.test.mjs +0 -107
  257. package/api/theme/add/add.rollback.test.mjs +0 -158
  258. package/api/theme/build/build.rollback.test.mjs +0 -148
  259. package/api/upgrade/run/files-changed.test.mjs +0 -111
  260. package/assets/codemods/file-count.test.mjs +0 -163
  261. package/assets/docs/tree/add-a-component.doc.mjs +0 -75
  262. package/assets/docs/tree/add-a-theme.doc.mjs +0 -85
  263. package/assets/docs/tree/add-a-topic.doc.mjs +0 -144
  264. package/assets/docs/tree/agent-guidance.doc.mjs +0 -138
  265. package/assets/docs/tree/block-template.doc.mjs +0 -130
  266. package/assets/docs/tree/build-the-template.doc.mjs +0 -28
  267. package/assets/docs/tree/building-blocks.doc.mjs +0 -46
  268. package/assets/docs/tree/check-your-docs.doc.mjs +0 -137
  269. package/assets/docs/tree/checks.doc.mjs +0 -119
  270. package/assets/docs/tree/codemods.doc.mjs +0 -147
  271. package/assets/docs/tree/component-family.doc.mjs +0 -113
  272. package/assets/docs/tree/component-imports.doc.mjs +0 -69
  273. package/assets/docs/tree/component-lookups.doc.mjs +0 -149
  274. package/assets/docs/tree/components.doc.mjs +0 -23
  275. package/assets/docs/tree/configuration.doc.mjs +0 -23
  276. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +0 -182
  277. package/assets/docs/tree/define-the-theme.doc.mjs +0 -118
  278. package/assets/docs/tree/describe-the-component.doc.mjs +0 -57
  279. package/assets/docs/tree/docs.doc.mjs +0 -21
  280. package/assets/docs/tree/document-the-template.doc.mjs +0 -28
  281. package/assets/docs/tree/document-the-theme.doc.mjs +0 -68
  282. package/assets/docs/tree/export-template-assets.doc.mjs +0 -147
  283. package/assets/docs/tree/extend-or-replace.doc.mjs +0 -103
  284. package/assets/docs/tree/fonts-and-assets.doc.mjs +0 -106
  285. package/assets/docs/tree/generate-a-palette.doc.mjs +0 -66
  286. package/assets/docs/tree/grade-template-with-agent.doc.mjs +0 -105
  287. package/assets/docs/tree/help.doc.mjs +0 -16
  288. package/assets/docs/tree/links.doc.mjs +0 -98
  289. package/assets/docs/tree/package-and-test.doc.mjs +0 -32
  290. package/assets/docs/tree/page-template.doc.mjs +0 -71
  291. package/assets/docs/tree/publishing.doc.mjs +0 -111
  292. package/assets/docs/tree/quick-start.doc.mjs +0 -272
  293. package/assets/docs/tree/replace-a-core-component.doc.mjs +0 -104
  294. package/assets/docs/tree/replace-a-core-template.doc.mjs +0 -172
  295. package/assets/docs/tree/sections-and-placement.doc.mjs +0 -108
  296. package/assets/docs/tree/see-it-in-an-app.doc.mjs +0 -59
  297. package/assets/docs/tree/ship.doc.mjs +0 -16
  298. package/assets/docs/tree/short-and-findable.doc.mjs +0 -108
  299. package/assets/docs/tree/single-component.doc.mjs +0 -165
  300. package/assets/docs/tree/start-a-template.doc.mjs +0 -143
  301. package/assets/docs/tree/subcomponent.doc.mjs +0 -115
  302. package/assets/docs/tree/template-assets.doc.mjs +0 -64
  303. package/assets/docs/tree/template-doc-overview.doc.mjs +0 -109
  304. package/assets/docs/tree/template-fonts.doc.mjs +0 -102
  305. package/assets/docs/tree/template-grading-rubric.doc.mjs +0 -452
  306. package/assets/docs/tree/template-icons.doc.mjs +0 -97
  307. package/assets/docs/tree/template-images-media.doc.mjs +0 -127
  308. package/assets/docs/tree/template-styles.doc.mjs +0 -93
  309. package/assets/docs/tree/templates.doc.mjs +0 -34
  310. package/assets/docs/tree/test-in-an-app.doc.mjs +0 -115
  311. package/assets/docs/tree/test-template-in-app.doc.mjs +0 -128
  312. package/assets/docs/tree/themes.doc.mjs +0 -39
  313. package/assets/docs/tree/troubleshooting.doc.mjs +0 -149
  314. package/assets/docs/tree/upgrading.doc.mjs +0 -103
  315. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +0 -51
  316. package/assets/docs/tree/verify-packed-template.doc.mjs +0 -77
  317. package/assets/docs/tree/versioning.doc.mjs +0 -161
  318. package/assets/docs/tree/write-good-templates.doc.mjs +0 -64
  319. package/assets/docs/tree/write-the-template-file.doc.mjs +0 -154
  320. package/authoring/discover/discover.doc.d.mts +0 -13
  321. package/authoring/discover/discover.doc.mjs +0 -138
  322. package/authoring/discover/parse.d.mts +0 -24
  323. package/authoring/discover/parse.mjs +0 -128
  324. package/authoring/discover/parse.test.mjs +0 -124
  325. package/authoring/discover/type.ts +0 -87
  326. package/clients/cli/commands/component-batch.test.mjs +0 -341
  327. package/clients/cli/commands/discover.sources.test.mjs +0 -267
  328. package/clients/cli/commands/integration-verify.doc.mjs +0 -22
  329. package/clients/cli/lib/parse-error-format.test.mjs +0 -81
  330. package/foundation/response/batch.type.d.mts +0 -33
  331. package/foundation/response/batch.type.mjs +0 -34
@@ -0,0 +1,243 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Dispatcher-level tests for docs() — the argument-shape routing that
5
+ * sits above the list/detail/section leaves. The leaves have their own tests;
6
+ * this pins the router: docs() -> list, docs(topic) -> detail,
7
+ * docs(topic, section) -> section, plus the unknown-topic/section error codes.
8
+ * Runs against the real CLI-bundled docs (no cwd/project needed).
9
+ */
10
+
11
+ import {describe, it, expect} from 'vitest';
12
+ import {docs} from './docs.mjs';
13
+ import {AstryxError} from '../error.mjs';
14
+
15
+ const SLOW = 30_000;
16
+
17
+ describe('docs() dispatcher routing', () => {
18
+ it('no topic -> docs.list', async () => {
19
+ const r = await docs();
20
+ expect(r.type).toBe('docs.list');
21
+ expect(Array.isArray(r.data)).toBe(true);
22
+ expect(r.data.length).toBeGreaterThan(0);
23
+ }, SLOW);
24
+
25
+ it('empty topic -> docs.list (falsy topic routes to list)', async () => {
26
+ expect((await docs('')).type).toBe('docs.list');
27
+ }, SLOW);
28
+
29
+ it('topic only -> docs.detail, the whole doc', async () => {
30
+ const {data} = await docs();
31
+ expect((await docs(data[0].topic)).type).toBe('docs.detail');
32
+ }, SLOW);
33
+
34
+ it('topic + index -> docs.index', async () => {
35
+ const {data} = await docs();
36
+ const r = await docs(data[0].topic, undefined, {index: true});
37
+ expect(r.type).toBe('docs.index');
38
+ }, SLOW);
39
+
40
+ it('topic + section -> docs.detail.section', async () => {
41
+ const {data} = await docs();
42
+ let routed = null;
43
+ for (const {topic} of data) {
44
+ const detail = await docs(topic);
45
+ const sections = detail.data.sections;
46
+ if (Array.isArray(sections) && sections.length > 0) {
47
+ routed = await docs(topic, sections[0].title);
48
+ break;
49
+ }
50
+ }
51
+ expect(routed).not.toBeNull();
52
+ expect(routed.type).toBe('docs.detail.section');
53
+ }, SLOW);
54
+
55
+ it('unknown topic -> ERR_UNKNOWN_TOPIC', async () => {
56
+ await expect(docs('zzz-not-a-real-topic')).rejects.toBeInstanceOf(AstryxError);
57
+ await expect(docs('zzz-not-a-real-topic')).rejects.toMatchObject({
58
+ code: 'ERR_UNKNOWN_TOPIC',
59
+ });
60
+ }, SLOW);
61
+
62
+ it('known topic + unknown section -> ERR_UNKNOWN_SECTION', async () => {
63
+ const {data} = await docs();
64
+ const topic = data[0].topic;
65
+ await expect(docs(topic, 'zzz-not-a-real-section')).rejects.toMatchObject({
66
+ code: 'ERR_UNKNOWN_SECTION',
67
+ });
68
+ }, SLOW);
69
+
70
+ it("lists the docs tree's namespaces in meta, so every data entry reads as a topic", async () => {
71
+ const res = await docs();
72
+ expect(res.meta.namespaces.map(entry => entry.topic)).toEqual(['cli', 'unorganized']);
73
+ for (const entry of res.data) {
74
+ expect((await docs(entry.topic)).type).toBe('docs.detail');
75
+ }
76
+ }, SLOW);
77
+
78
+ it('opens a route typed in another case', async () => {
79
+ const r = await docs('CLI/API');
80
+ expect(r.type).toBe('docs.node');
81
+ expect(r.data).toMatchObject({route: 'cli/api', links: {up: 'astryx docs cli'}});
82
+ }, SLOW);
83
+
84
+ it('a section of a typed doc -> ERR_UNKNOWN_SECTION, suggesting the doc itself', async () => {
85
+ const err = await docs('cli/api/functions/search', 'x').catch(e => e);
86
+ expect(err.code).toBe('ERR_UNKNOWN_SECTION');
87
+ expect(err.message).toContain('astryx docs cli/api/functions/search');
88
+ expect(err.suggestions.map(s => s.name)).toEqual(['cli/api/functions/search']);
89
+ }, SLOW);
90
+
91
+ it('a namespace route -> docs.node, one level of children', async () => {
92
+ const r = await docs('cli/api');
93
+ expect(r.type).toBe('docs.node');
94
+ expect(r.data).toMatchObject({
95
+ id: 'astryx:artifact:v1/%40astryxdesign%2Fcli/namespace/api',
96
+ route: 'cli/api',
97
+ kind: 'namespace',
98
+ package: '@astryxdesign/cli',
99
+ breadcrumb: [{route: 'cli', title: 'Astryx CLI'}],
100
+ content: [],
101
+ });
102
+ expect(r.data.slots.flatMap(slot => slot.children.map(c => c.route))).toEqual([
103
+ 'cli/api/functions',
104
+ 'cli/api/schemas',
105
+ 'cli/api/enums',
106
+ ]);
107
+ }, SLOW);
108
+
109
+ it('a typed doc route -> docs.node with its content', async () => {
110
+ const r = await docs('cli/api/functions/search');
111
+ expect(r.type).toBe('docs.node');
112
+ expect(r.data).toMatchObject({
113
+ id: 'astryx:artifact:v1/%40astryxdesign%2Fcli/function/search',
114
+ kind: 'function',
115
+ title: 'search()',
116
+ slots: [],
117
+ });
118
+ expect(r.data.breadcrumb.map(link => link.route)).toEqual([
119
+ 'cli',
120
+ 'cli/api',
121
+ 'cli/api/functions',
122
+ ]);
123
+ expect(JSON.stringify(r.data.content)).toContain(
124
+ '`astryx search` runs it. Read it with `astryx docs cli/commands/search`.',
125
+ );
126
+ }, SLOW);
127
+
128
+ it('a guide the tree places reads like a topic: the whole doc, its index, a section', async () => {
129
+ expect((await docs('cli/integrations')).type).toBe('docs.detail');
130
+ const index = await docs('cli/integrations', undefined, {index: true});
131
+ expect(index).toMatchObject({type: 'docs.index', data: {name: 'cli/integrations'}});
132
+ expect(index.data.sections.length).toBeGreaterThan(1);
133
+ expect((await docs('cli/integrations', 'components')).type).toBe(
134
+ 'docs.detail.section',
135
+ );
136
+ }, SLOW);
137
+
138
+ it('every read carries its moves (spec:AST-047)', async () => {
139
+ const root = (await docs('cli')).data;
140
+ expect(root.links).toEqual({up: 'astryx docs'});
141
+ const leaf = (await docs('cli/api/functions/search')).data;
142
+ expect(leaf.links.up).toBe('astryx docs cli/api/functions');
143
+ expect(leaf.links.previous).toMatch(/^astryx docs cli\/api\/functions\/[a-z-]+$/);
144
+ expect(leaf.links.next).toMatch(/^astryx docs cli\/api\/functions\/[a-z-]+$/);
145
+ const index = await docs('cli/integrations', undefined, {index: true});
146
+ // A guide moves across its namespace's slot, as any tree node does.
147
+ expect(index.data.links).toEqual({
148
+ up: 'astryx docs cli',
149
+ next: 'astryx docs cli/writing-docs',
150
+ });
151
+ const first = (await docs('cli/integrations', index.data.sections[0].id)).data;
152
+ expect(first.links).toEqual({
153
+ up: 'astryx docs cli/integrations --index',
154
+ next: `astryx docs cli/integrations ${index.data.sections[1].id}`,
155
+ });
156
+ const last = index.data.sections.at(-1).id;
157
+ const end = (await docs('cli/integrations', last)).data;
158
+ expect(end.links.next).toBeUndefined();
159
+ expect(end.links.previous).toBe(
160
+ `astryx docs cli/integrations ${index.data.sections.at(-2).id}`,
161
+ );
162
+ // A flat topic's home is the Unorganized level, and it moves across it.
163
+ const flat = (await docs('principles')).data.links;
164
+ expect(flat.up).toBe('astryx docs unorganized');
165
+ expect(flat.previous).toMatch(/^astryx docs [a-z-]+$/);
166
+ expect(flat.next).toMatch(/^astryx docs [a-z-]+$/);
167
+ const home = (await docs('unorganized')).data;
168
+ expect(home).toMatchObject({id: null, kind: 'namespace', links: {up: 'astryx docs'}});
169
+ expect(home.slots[0].children.map(child => child.route)).toEqual(
170
+ (await docs()).data.map(entry => entry.topic),
171
+ );
172
+ }, SLOW);
173
+
174
+ it('names a node by its doc identity; a generated level has id null', async () => {
175
+ const level = (await docs('cli/api/functions')).data;
176
+ expect(level).toHaveProperty('id', null);
177
+ expect(level.route).toBe('cli/api/functions');
178
+ }, SLOW);
179
+
180
+ it("offers a typed doc's related docs as moves", async () => {
181
+ const fn = (await docs('cli/api/functions/search')).data;
182
+ expect(fn.links.related).toContain('astryx docs cli/commands/search');
183
+ const cmd = (await docs('cli/commands/search')).data;
184
+ expect(cmd.links.related).toContain('astryx docs cli/api/functions/search');
185
+ }, SLOW);
186
+
187
+ it('a topic read returns the whole doc; index returns its sections', async () => {
188
+ expect((await docs('principles')).type).toBe('docs.detail');
189
+ const index = await docs('principles', undefined, {index: true});
190
+ expect(index.type).toBe('docs.index');
191
+ expect(index.data.sections.length).toBeGreaterThan(1);
192
+ expect((await docs('principles', undefined, {dense: true})).type).toBe(
193
+ 'docs.detail',
194
+ );
195
+ }, SLOW);
196
+
197
+ it("the guide's old flat name is gone, and its error names the new route", async () => {
198
+ await expect(docs('cli-integrations')).rejects.toMatchObject({
199
+ code: 'ERR_UNKNOWN_TOPIC',
200
+ suggestions: [expect.objectContaining({name: 'cli/integrations'})],
201
+ });
202
+ expect((await docs()).data.map(entry => entry.topic)).not.toContain(
203
+ 'cli-integrations',
204
+ );
205
+ }, SLOW);
206
+
207
+ it('a section of a namespace -> ERR_UNKNOWN_SECTION, naming its children', async () => {
208
+ const err = await docs('cli', 'commands').catch(e => e);
209
+ expect(err).toBeInstanceOf(AstryxError);
210
+ expect(err.code).toBe('ERR_UNKNOWN_SECTION');
211
+ expect(err.suggestions.map(s => s.name)).toEqual([
212
+ 'cli/integrations',
213
+ 'cli/writing-docs',
214
+ 'cli/commands',
215
+ 'cli/api',
216
+ ]);
217
+ }, SLOW);
218
+
219
+ it('an unknown route suggests the children of the deepest namespace it reaches', async () => {
220
+ const err = await docs('cli/api/functions/serch').catch(e => e);
221
+ expect(err.code).toBe('ERR_UNKNOWN_TOPIC');
222
+ expect(err.suggestions.map(s => s.name)).toContain('cli/api/functions/search');
223
+ expect(err.suggestions.every(s => s.name.startsWith('cli/api/functions/'))).toBe(true);
224
+ }, SLOW);
225
+
226
+ it('non-string topic -> ERR_UNKNOWN_TOPIC (not a raw TypeError)', async () => {
227
+ for (const bad of [123, {}, ['tokens'], true]) {
228
+ const err = await docs(/** @type {any} */ (bad)).catch(e => e);
229
+ expect(err).toBeInstanceOf(AstryxError);
230
+ expect(err.code).toBe('ERR_UNKNOWN_TOPIC');
231
+ }
232
+ }, SLOW);
233
+
234
+ it('non-string section -> ERR_UNKNOWN_SECTION (not a raw TypeError)', async () => {
235
+ const {data} = await docs();
236
+ const topic = data[0].topic;
237
+ for (const bad of [456, {}, ['x']]) {
238
+ const err = await docs(topic, /** @type {any} */ (bad)).catch(e => e);
239
+ expect(err).toBeInstanceOf(AstryxError);
240
+ expect(err.code).toBe('ERR_UNKNOWN_SECTION');
241
+ }
242
+ }, SLOW);
243
+ });