@astryxdesign/cli 0.6.4-canary.06c8fa3 → 0.6.4-canary.0e1fbdb

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 (254) hide show
  1. package/README.md +49 -40
  2. package/api/build/build.doc.mjs +6 -1
  3. package/api/build/build.test.mjs +22 -0
  4. package/api/build/kit/kit.mjs +44 -5
  5. package/api/component/component.doc.mjs +14 -7
  6. package/api/docs/_adapter.d.mts +8 -3
  7. package/api/docs/_adapter.mjs +14 -6
  8. package/api/docs/docOverlays.test.mjs +27 -1
  9. package/api/docs/docs.doc.mjs +2 -2
  10. package/api/doctor/doctor.doc.mjs +17 -8
  11. package/api/doctor/doctor.type.d.mts +1 -1
  12. package/api/doctor/doctor.type.mjs +1 -1
  13. package/api/gap-report/gap-report.doc.mjs +19 -10
  14. package/api/hook/hook.doc.mjs +6 -3
  15. package/api/index.d.mts +2 -0
  16. package/api/index.mjs +3 -1
  17. package/api/init/init.doc.mjs +17 -12
  18. package/api/integration/add-theme.mjs +22 -1
  19. package/api/integration/add-theme.test.mjs +34 -0
  20. package/api/integration/authoring-checks.mjs +2 -2
  21. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  22. package/api/integration/pack-check.lifecycle-output.test.mjs +2 -0
  23. package/api/integration/pack-check.mjs +54 -6
  24. package/api/integration/pack-check.test.mjs +90 -0
  25. package/api/integration/pack-check.type.mjs +1 -1
  26. package/api/json/assertResponse.doc.mjs +1 -1
  27. package/api/json/index.ts +1 -0
  28. package/api/json/isError.doc.mjs +1 -1
  29. package/api/layout/_adapter.d.mts +34 -0
  30. package/api/layout/_adapter.mjs +148 -0
  31. package/api/layout/check/check.d.mts +16 -0
  32. package/api/layout/check/check.mjs +40 -0
  33. package/api/layout/expand/expand.d.mts +22 -0
  34. package/api/layout/expand/expand.mjs +155 -0
  35. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  36. package/api/layout/grammar/grammar.d.mts +13 -0
  37. package/api/layout/grammar/grammar.mjs +87 -0
  38. package/api/layout/layout.d.mts +6 -0
  39. package/api/layout/layout.mjs +17 -0
  40. package/api/layout/layout.test.mjs +297 -0
  41. package/api/layout/layout.type.d.mts +89 -0
  42. package/api/layout/layout.type.mjs +103 -0
  43. package/api/layout/layoutCheck.doc.d.mts +11 -0
  44. package/api/layout/layoutCheck.doc.mjs +85 -0
  45. package/api/layout/layoutExpand.doc.d.mts +11 -0
  46. package/api/layout/layoutExpand.doc.mjs +107 -0
  47. package/api/layout/layoutGrammar.doc.d.mts +11 -0
  48. package/api/layout/layoutGrammar.doc.mjs +57 -0
  49. package/api/search/search.d.mts +27 -1
  50. package/api/search/search.doc.mjs +2 -2
  51. package/api/search/search.mjs +228 -16
  52. package/api/swizzle/swizzle.doc.mjs +7 -5
  53. package/api/template/copy/copy.mjs +1 -1
  54. package/api/template/copy/copy.test.mjs +9 -0
  55. package/api/template/template-integration.test.mjs +65 -1
  56. package/api/template/template.doc.mjs +2 -1
  57. package/api/template/template.mjs +1 -1
  58. package/api/theme/generateTonalPalette.doc.mjs +1 -2
  59. package/api/theme/listThemes.doc.mjs +1 -1
  60. package/api/theme/themeAdd.doc.mjs +9 -10
  61. package/api/theme/themeBuild.doc.mjs +13 -13
  62. package/api/theme/themeList.doc.mjs +1 -1
  63. package/api/theme/themeListAvailable.doc.mjs +2 -1
  64. package/api/theme/themePaletteGenerate.doc.mjs +15 -8
  65. package/api/theme/themeTargets.doc.mjs +3 -2
  66. package/api/theme/themeTemplate.doc.mjs +2 -1
  67. package/api/upgrade/run/run.mjs +1 -1
  68. package/api/upgrade/upgrade.doc.mjs +24 -22
  69. package/assets/docs/README.md +4 -2
  70. package/assets/docs/browser-support.doc.mjs +11 -11
  71. package/assets/docs/color.doc.mjs +8 -2
  72. package/assets/docs/elevation.doc.mjs +6 -4
  73. package/assets/docs/getting-started.doc.mjs +5 -16
  74. package/assets/docs/icons.doc.mjs +2 -21
  75. package/assets/docs/illustrations.doc.mjs +7 -15
  76. package/assets/docs/layout.doc.dense.mjs +130 -82
  77. package/assets/docs/layout.doc.mjs +133 -77
  78. package/assets/docs/migration.doc.mjs +19 -21
  79. package/assets/docs/motion.doc.mjs +16 -3
  80. package/assets/docs/principles.doc.dense.mjs +5 -5
  81. package/assets/docs/principles.doc.mjs +8 -0
  82. package/assets/docs/principles.doc.zh.mjs +6 -6
  83. package/assets/docs/shape.doc.mjs +8 -3
  84. package/assets/docs/spacing.doc.mjs +7 -2
  85. package/assets/docs/styling-libraries.doc.mjs +6 -2
  86. package/assets/docs/styling.doc.mjs +19 -23
  87. package/assets/docs/theme.doc.dense.mjs +58 -18
  88. package/assets/docs/theme.doc.mjs +56 -46
  89. package/assets/docs/theme.doc.zh.mjs +9 -8
  90. package/assets/docs/tokens.doc.dense.mjs +2 -2
  91. package/assets/docs/tokens.doc.mjs +389 -8
  92. package/assets/docs/tokens.doc.zh.mjs +2 -2
  93. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  94. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  95. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  96. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  97. package/assets/docs/tree/block-template.doc.mjs +130 -0
  98. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  99. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  100. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  101. package/assets/docs/tree/checks.doc.mjs +119 -0
  102. package/assets/docs/tree/codemods.doc.mjs +147 -0
  103. package/assets/docs/tree/component-family.doc.mjs +113 -0
  104. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  105. package/assets/docs/tree/components.doc.mjs +23 -0
  106. package/assets/docs/tree/configuration.doc.mjs +23 -0
  107. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  108. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  109. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  110. package/assets/docs/tree/docs.doc.mjs +21 -0
  111. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  112. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  113. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  114. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  115. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  116. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  117. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  118. package/assets/docs/tree/help.doc.mjs +16 -0
  119. package/assets/docs/tree/integrations.doc.mjs +25 -470
  120. package/assets/docs/tree/links.doc.mjs +98 -0
  121. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  122. package/assets/docs/tree/page-template.doc.mjs +71 -0
  123. package/assets/docs/tree/publishing.doc.mjs +111 -0
  124. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  125. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  126. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  127. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  128. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  129. package/assets/docs/tree/ship.doc.mjs +16 -0
  130. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  131. package/assets/docs/tree/single-component.doc.mjs +165 -0
  132. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  133. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  134. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  135. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  136. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  137. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  138. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  139. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  140. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  141. package/assets/docs/tree/templates.doc.mjs +34 -0
  142. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  143. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  144. package/assets/docs/tree/themes.doc.mjs +39 -0
  145. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  146. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  147. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  148. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  149. package/assets/docs/tree/versioning.doc.mjs +161 -0
  150. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  151. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  152. package/assets/docs/typography.doc.mjs +24 -4
  153. package/assets/docs/working-with-ai.doc.mjs +30 -22
  154. package/authoring/config/config.doc.mjs +2 -2
  155. package/authoring/config/type.ts +2 -2
  156. package/authoring/doctypes/_schema.d.mts +3 -2
  157. package/authoring/doctypes/_schema.mjs +6 -0
  158. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  159. package/authoring/doctypes/base/type.ts +4 -2
  160. package/authoring/doctypes/command/command.doc.mjs +1 -1
  161. package/authoring/doctypes/command/type.ts +1 -1
  162. package/authoring/doctypes/component/component.doc.mjs +6 -0
  163. package/authoring/doctypes/component/type.ts +8 -0
  164. package/authoring/doctypes/reference/reference.doc.mjs +7 -0
  165. package/authoring/doctypes/reference/type.ts +5 -0
  166. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  167. package/authoring/doctypes/template/template.doc.mjs +1 -1
  168. package/authoring/doctypes/template/type.ts +2 -2
  169. package/authoring/integration/integration.doc.mjs +12 -10
  170. package/clients/cli/command-result-coverage.test.mjs +7 -7
  171. package/clients/cli/commands/component.doc.mjs +4 -3
  172. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  173. package/clients/cli/commands/docs.doc.mjs +1 -1
  174. package/clients/cli/commands/docs.mjs +60 -17
  175. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -2
  176. package/clients/cli/commands/doctor-integration.test.mjs +53 -0
  177. package/clients/cli/commands/doctor.doc.mjs +3 -1
  178. package/clients/cli/commands/doctor.mjs +49 -5
  179. package/clients/cli/commands/gap-report.doc.mjs +10 -9
  180. package/clients/cli/commands/init.doc.mjs +9 -6
  181. package/clients/cli/commands/integration-add.doc.mjs +9 -9
  182. package/clients/cli/commands/integration-authoring.test.mjs +61 -10
  183. package/clients/cli/commands/integration-pack.doc.mjs +5 -9
  184. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  185. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  186. package/clients/cli/commands/integration.doc.mjs +4 -4
  187. package/clients/cli/commands/integration.mjs +74 -43
  188. package/clients/cli/commands/layout-check.doc.mjs +65 -0
  189. package/clients/cli/commands/layout-expand.doc.mjs +83 -0
  190. package/clients/cli/commands/layout-grammar.doc.mjs +30 -0
  191. package/clients/cli/commands/layout.doc.mjs +34 -0
  192. package/clients/cli/commands/layout.error-codes.test.mjs +66 -0
  193. package/clients/cli/commands/layout.exit-parity.test.mjs +41 -0
  194. package/clients/cli/commands/layout.mjs +275 -0
  195. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  196. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  197. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  198. package/clients/cli/commands/manifest.doc.mjs +1 -1
  199. package/clients/cli/commands/search.doc.mjs +10 -3
  200. package/clients/cli/commands/search.mjs +21 -2
  201. package/clients/cli/commands/search.test.mjs +21 -4
  202. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  203. package/clients/cli/commands/template.doc.mjs +1 -1
  204. package/clients/cli/commands/text-json-parity.test.mjs +24 -1
  205. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  206. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -2
  207. package/clients/cli/commands/theme-palette.doc.mjs +1 -2
  208. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  209. package/clients/cli/commands/theme.doc.mjs +2 -1
  210. package/clients/cli/commands/upgrade.doc.mjs +62 -3
  211. package/clients/cli/index.mjs +32 -6
  212. package/clients/cli/lib/define-command.mjs +28 -4
  213. package/clients/cli/lib/define-command.test.mjs +54 -0
  214. package/clients/cli/lib/exit-codes.test.mjs +25 -2
  215. package/clients/cli/lib/json-shim.test.mjs +20 -6
  216. package/clients/cli/lib/manifest.mjs +23 -5
  217. package/foundation/agent-docs/agent-docs.mjs +1 -1
  218. package/foundation/discovery/authoring-self-docs.test.mjs +6 -2
  219. package/foundation/discovery/cli-self-docs.mjs +16 -2
  220. package/foundation/discovery/cli-self-docs.test.mjs +20 -0
  221. package/foundation/discovery/docs-discovery.mjs +5 -1
  222. package/foundation/discovery/docs-discovery.test.mjs +21 -0
  223. package/foundation/discovery/docs-section-key.d.mts +1 -1
  224. package/foundation/discovery/docs-section-key.mjs +1 -1
  225. package/foundation/discovery/template-adapter.mjs +1 -1
  226. package/foundation/doc-compiler/doc-loads.test.mjs +15 -2
  227. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  228. package/foundation/doc-compiler/tree.d.mts +4 -0
  229. package/foundation/doc-compiler/tree.mjs +6 -1
  230. package/foundation/integrations/cli-requirement.d.mts +26 -6
  231. package/foundation/integrations/cli-requirement.mjs +46 -11
  232. package/foundation/integrations/cli-requirement.test.mjs +7 -2
  233. package/foundation/integrations/contribution-inventory.mjs +1 -1
  234. package/foundation/response/error-codes.doc.mjs +6 -8
  235. package/foundation/response/error-codes.test.mjs +30 -5
  236. package/foundation/response/response-types.doc.d.mts +4 -3
  237. package/foundation/response/response-types.doc.mjs +42 -6
  238. package/foundation/response/response.doc.mjs +11 -10
  239. package/foundation/xle/browser.d.mts +3 -3
  240. package/foundation/xle/browser.mjs +3 -3
  241. package/foundation/xle/expand.mjs +2 -2
  242. package/foundation/xle/parse.mjs +1 -1
  243. package/foundation/xle/print.mjs +2 -2
  244. package/foundation/xle/splice.mjs +1 -1
  245. package/package.json +9 -9
  246. package/api/docs/docs.test.mjs +0 -245
  247. package/api/docs/integration-tree.test.mjs +0 -555
  248. package/api/docs/integrationDocs.test.mjs +0 -314
  249. package/api/search/search.test.mjs +0 -530
  250. package/assets/docs/tree/integrations.test.mjs +0 -62
  251. package/assets/docs/tree/writing-docs.doc.mjs +0 -286
  252. package/clients/cli/commands/docs.test.mjs +0 -323
  253. package/foundation/agent-docs/agent-docs.test.mjs +0 -1159
  254. package/foundation/doc-compiler/tree.test.mjs +0 -606
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/cli",
3
- "version": "0.6.4-canary.06c8fa3",
3
+ "version": "0.6.4-canary.0e1fbdb",
4
4
  "displayName": "CLI",
5
5
  "description": "Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.",
6
6
  "author": "Meta Open Source",
@@ -101,10 +101,10 @@
101
101
  "zod": "^4.4.3"
102
102
  },
103
103
  "peerDependencies": {
104
- "@astryxdesign/charts": "0.6.4-canary.06c8fa3",
105
- "@astryxdesign/core": "0.6.4-canary.06c8fa3",
106
- "@astryxdesign/lab": "0.6.4-canary.06c8fa3",
107
- "@astryxdesign/theme-neutral": "0.6.4-canary.06c8fa3"
104
+ "@astryxdesign/charts": "0.6.4-canary.0e1fbdb",
105
+ "@astryxdesign/core": "0.6.4-canary.0e1fbdb",
106
+ "@astryxdesign/lab": "0.6.4-canary.0e1fbdb",
107
+ "@astryxdesign/theme-neutral": "0.6.4-canary.0e1fbdb"
108
108
  },
109
109
  "peerDependenciesMeta": {
110
110
  "@astryxdesign/charts": {
@@ -121,10 +121,10 @@
121
121
  }
122
122
  },
123
123
  "devDependencies": {
124
- "@astryxdesign/charts": "0.6.4-canary.06c8fa3",
125
- "@astryxdesign/core": "0.6.4-canary.06c8fa3",
126
- "@astryxdesign/lab": "0.6.4-canary.06c8fa3",
127
- "@astryxdesign/theme-neutral": "0.6.4-canary.06c8fa3",
124
+ "@astryxdesign/charts": "0.6.4-canary.0e1fbdb",
125
+ "@astryxdesign/core": "0.6.4-canary.0e1fbdb",
126
+ "@astryxdesign/lab": "0.6.4-canary.0e1fbdb",
127
+ "@astryxdesign/theme-neutral": "0.6.4-canary.0e1fbdb",
128
128
  "@heroicons/react": "^2.2.0",
129
129
  "@stylexjs/stylex": "^0.19.0",
130
130
  "@types/babel__core": "^7.20.5",
@@ -1,245 +0,0 @@
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
- previous: 'astryx docs cli/component-lookups',
150
- next: 'astryx docs cli/writing-docs',
151
- });
152
- const first = (await docs('cli/integrations', index.data.sections[0].id)).data;
153
- expect(first.links).toEqual({
154
- up: 'astryx docs cli/integrations --index',
155
- next: `astryx docs cli/integrations ${index.data.sections[1].id}`,
156
- });
157
- const last = index.data.sections.at(-1).id;
158
- const end = (await docs('cli/integrations', last)).data;
159
- expect(end.links.next).toBeUndefined();
160
- expect(end.links.previous).toBe(
161
- `astryx docs cli/integrations ${index.data.sections.at(-2).id}`,
162
- );
163
- // A flat topic's home is the Unorganized level, and it moves across it.
164
- const flat = (await docs('principles')).data.links;
165
- expect(flat.up).toBe('astryx docs unorganized');
166
- expect(flat.previous).toMatch(/^astryx docs [a-z-]+$/);
167
- expect(flat.next).toMatch(/^astryx docs [a-z-]+$/);
168
- const home = (await docs('unorganized')).data;
169
- expect(home).toMatchObject({id: null, kind: 'namespace', links: {up: 'astryx docs'}});
170
- expect(home.slots[0].children.map(child => child.route)).toEqual(
171
- (await docs()).data.map(entry => entry.topic),
172
- );
173
- }, SLOW);
174
-
175
- it('names a node by its doc identity; a generated level has id null', async () => {
176
- const level = (await docs('cli/api/functions')).data;
177
- expect(level).toHaveProperty('id', null);
178
- expect(level.route).toBe('cli/api/functions');
179
- }, SLOW);
180
-
181
- it("offers a typed doc's related docs as moves", async () => {
182
- const fn = (await docs('cli/api/functions/search')).data;
183
- expect(fn.links.related).toContain('astryx docs cli/commands/search');
184
- const cmd = (await docs('cli/commands/search')).data;
185
- expect(cmd.links.related).toContain('astryx docs cli/api/functions/search');
186
- }, SLOW);
187
-
188
- it('a topic read returns the whole doc; index returns its sections', async () => {
189
- expect((await docs('principles')).type).toBe('docs.detail');
190
- const index = await docs('principles', undefined, {index: true});
191
- expect(index.type).toBe('docs.index');
192
- expect(index.data.sections.length).toBeGreaterThan(1);
193
- expect((await docs('principles', undefined, {dense: true})).type).toBe(
194
- 'docs.detail',
195
- );
196
- }, SLOW);
197
-
198
- it("the guide's old flat name is gone, and its error names the new route", async () => {
199
- await expect(docs('cli-integrations')).rejects.toMatchObject({
200
- code: 'ERR_UNKNOWN_TOPIC',
201
- suggestions: [expect.objectContaining({name: 'cli/integrations'})],
202
- });
203
- expect((await docs()).data.map(entry => entry.topic)).not.toContain(
204
- 'cli-integrations',
205
- );
206
- }, SLOW);
207
-
208
- it('a section of a namespace -> ERR_UNKNOWN_SECTION, naming its children', async () => {
209
- const err = await docs('cli', 'commands').catch(e => e);
210
- expect(err).toBeInstanceOf(AstryxError);
211
- expect(err.code).toBe('ERR_UNKNOWN_SECTION');
212
- expect(err.suggestions.map(s => s.name)).toEqual([
213
- 'cli/component-lookups',
214
- 'cli/integrations',
215
- 'cli/writing-docs',
216
- 'cli/commands',
217
- 'cli/api',
218
- ]);
219
- }, SLOW);
220
-
221
- it('an unknown route suggests the children of the deepest namespace it reaches', async () => {
222
- const err = await docs('cli/api/functions/serch').catch(e => e);
223
- expect(err.code).toBe('ERR_UNKNOWN_TOPIC');
224
- expect(err.suggestions.map(s => s.name)).toContain('cli/api/functions/search');
225
- expect(err.suggestions.every(s => s.name.startsWith('cli/api/functions/'))).toBe(true);
226
- }, SLOW);
227
-
228
- it('non-string topic -> ERR_UNKNOWN_TOPIC (not a raw TypeError)', async () => {
229
- for (const bad of [123, {}, ['tokens'], true]) {
230
- const err = await docs(/** @type {any} */ (bad)).catch(e => e);
231
- expect(err).toBeInstanceOf(AstryxError);
232
- expect(err.code).toBe('ERR_UNKNOWN_TOPIC');
233
- }
234
- }, SLOW);
235
-
236
- it('non-string section -> ERR_UNKNOWN_SECTION (not a raw TypeError)', async () => {
237
- const {data} = await docs();
238
- const topic = data[0].topic;
239
- for (const bad of [456, {}, ['x']]) {
240
- const err = await docs(topic, /** @type {any} */ (bad)).catch(e => e);
241
- expect(err).toBeInstanceOf(AstryxError);
242
- expect(err.code).toBe('ERR_UNKNOWN_SECTION');
243
- }
244
- }, SLOW);
245
- });