@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
@@ -1,314 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- /**
4
- * @file End-to-end tests for integration-contributed doc topics: a scaffolded
5
- * consumer project whose configured integration ships a `docs` root, read back
6
- * through the public surfaces — `docs()`, `search()`, and the agent-docs block.
7
- *
8
- * The unit-level rules (what a docs root contributes, what the catalog does
9
- * with `replaces`/`extends`) are covered in
10
- * foundation/discovery/docs-discovery.test.mjs. What is pinned here is that a
11
- * contributed topic is indistinguishable from a built-in one at the surfaces
12
- * an agent actually reads.
13
- *
14
- * Fixtures live under a repo-local temp dir, not /tmp, because Vite refuses to
15
- * dynamically import a module from outside the project root.
16
- */
17
-
18
- import {afterEach, beforeEach, describe, expect, it} from 'vitest';
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import {docs} from './docs.mjs';
22
- import {search} from '../search/search.mjs';
23
- import {loadDocsCatalog} from './_adapter.mjs';
24
- import {AstryxError} from '../error.mjs';
25
-
26
- const SLOW = 30_000;
27
-
28
- let tmpDir;
29
-
30
- /** A minimal, valid topic. */
31
- function topic(fields) {
32
- return {
33
- type: 'generic',
34
- name: 'deploying',
35
- title: 'Deploying',
36
- description: 'How to ship an app built with Acme widgets.',
37
- category: 'guide',
38
- sections: [
39
- {title: 'Overview', content: [{type: 'prose', text: 'Push the button.'}]},
40
- ],
41
- ...fields,
42
- };
43
- }
44
-
45
- /**
46
- * A consumer project that configures one integration, optionally with a docs
47
- * root holding the given topics.
48
- * @param {Record<string, object|string>} [topics] file name → doc
49
- * @param {{config?: string}} [options]
50
- */
51
- function scaffold(topics, {config} = {}) {
52
- fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'consumer'}));
53
- fs.writeFileSync(
54
- path.join(tmpDir, 'astryx.config.mjs'),
55
- config ?? "export default {integrations: ['@acme/widgets']};\n",
56
- );
57
-
58
- const pkgDir = path.join(tmpDir, 'node_modules', '@acme', 'widgets');
59
- fs.mkdirSync(pkgDir, {recursive: true});
60
- fs.writeFileSync(
61
- path.join(pkgDir, 'package.json'),
62
- JSON.stringify({name: '@acme/widgets', version: '1.0.0'}),
63
- );
64
- fs.writeFileSync(
65
- path.join(pkgDir, 'astryx.integration.mjs'),
66
- `export default ${JSON.stringify(topics ? {docs: './docs'} : {})};\n`,
67
- );
68
-
69
- if (topics) {
70
- const docsDir = path.join(pkgDir, 'docs');
71
- fs.mkdirSync(docsDir, {recursive: true});
72
- for (const [file, doc] of Object.entries(topics)) {
73
- fs.writeFileSync(
74
- path.join(docsDir, file),
75
- typeof doc === 'string'
76
- ? doc
77
- : `export const docs = ${JSON.stringify(doc, null, 2)};\n`,
78
- );
79
- }
80
- }
81
- }
82
-
83
- beforeEach(() => {
84
- tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-integration-docs-test-'));
85
- });
86
-
87
- afterEach(() => {
88
- fs.rmSync(tmpDir, {recursive: true, force: true});
89
- });
90
-
91
- describe('integration-contributed topics', () => {
92
- it('lists and reads like a built-in topic, naming its owner', async () => {
93
- scaffold({'deploying.doc.mjs': topic()});
94
-
95
- const listed = await docs(undefined, undefined, {cwd: tmpDir});
96
- const entry = listed.data.find(t => t.topic === 'deploying');
97
- expect(entry).toMatchObject({
98
- topic: 'deploying',
99
- description: 'How to ship an app built with Acme widgets.',
100
- package: '@acme/widgets',
101
- });
102
- // The built-in topics keep their own owner.
103
- expect(listed.data.find(t => t.topic === 'tokens').package).toBe('@astryxdesign/cli');
104
-
105
- const detail = await docs('deploying', undefined, {cwd: tmpDir, full: true});
106
- expect(detail.type).toBe('docs.detail');
107
- expect(detail.data.sections[0].content[0].text).toBe('Push the button.');
108
-
109
- const section = await docs('deploying', 'overview', {cwd: tmpDir});
110
- expect(section.data.title).toBe('Overview');
111
- }, SLOW);
112
-
113
- it('is invisible to a project that does not configure the integration', async () => {
114
- scaffold({'deploying.doc.mjs': topic()}, {config: 'export default {};\n'});
115
- const listed = await docs(undefined, undefined, {cwd: tmpDir});
116
- expect(listed.data.some(t => t.topic === 'deploying')).toBe(false);
117
- }, SLOW);
118
-
119
- it('serves the replacement of a built-in topic, and says what it replaced', async () => {
120
- scaffold({
121
- 'getting-started.doc.mjs': topic({
122
- name: 'getting-started',
123
- replaces: 'getting-started',
124
- title: 'Getting started',
125
- description: 'Install Acme widgets.',
126
- sections: [
127
- {title: 'Install', content: [{type: 'prose', text: 'yarn add @acme/widgets'}]},
128
- ],
129
- }),
130
- });
131
-
132
- const detail = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
133
- expect(detail.data.sections.map(s => s.title)).toEqual(['Install']);
134
- expect(detail.data.sections[0].content[0].text).toBe('yarn add @acme/widgets');
135
-
136
- const listed = await docs(undefined, undefined, {cwd: tmpDir});
137
- const entries = listed.data.filter(t => t.topic === 'getting-started');
138
- expect(entries).toHaveLength(1);
139
- expect(entries[0]).toMatchObject({
140
- package: '@acme/widgets',
141
- replaces: 'getting-started',
142
- });
143
- }, SLOW);
144
-
145
- it('keeps the replaced name resolving when the replacement renames it', async () => {
146
- scaffold({
147
- 'setup.doc.mjs': topic({name: 'setup', replaces: 'getting-started'}),
148
- });
149
- const byOldName = await docs('getting-started', undefined, {cwd: tmpDir, full: true});
150
- const byNewName = await docs('setup', undefined, {cwd: tmpDir, full: true});
151
- expect(byOldName.data.name).toBe('setup');
152
- expect(byNewName.data.name).toBe('setup');
153
- }, SLOW);
154
-
155
- it('merges an extension into the topic it extends', async () => {
156
- const builtin = await docs('theme', undefined, {full: true});
157
- const baseSectionTitle = builtin.data.sections[0].title;
158
- scaffold({
159
- 'theme-internal.doc.mjs': topic({
160
- name: 'theme-internal',
161
- extends: 'theme',
162
- sections: [
163
- {title: baseSectionTitle, content: [{type: 'prose', text: 'Use the Acme theme.'}]},
164
- {title: 'Acme themes', content: [{type: 'prose', text: 'Three of them.'}]},
165
- ],
166
- }),
167
- });
168
-
169
- const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
170
- // The extension is not a topic of its own.
171
- expect((await docs(undefined, undefined, {cwd: tmpDir})).data.some(
172
- t => t.topic === 'theme-internal',
173
- )).toBe(false);
174
- expect(extended.data.sections[0].content[0].text).toBe('Use the Acme theme.');
175
- expect(extended.data.sections.at(-1).title).toBe('Acme themes');
176
- // Everything the extension did not name is still the base doc's.
177
- expect(extended.data.sections.length).toBe(builtin.data.sections.length + 1);
178
- }, SLOW);
179
-
180
- it('migrates a real built-in section to a stable ID without duplicating it', async () => {
181
- const builtin = await docs('theme', undefined, {full: true});
182
- // Readers see a key on every section; the migration case is one whose
183
- // source authors no id.
184
- const {docs: authored} = await import('../../assets/docs/theme.doc.mjs');
185
- const target = authored.sections.find(section => section.id == null);
186
- expect(target).toBeDefined();
187
- scaffold({
188
- 'theme-internal.doc.mjs': topic({
189
- name: 'theme-internal',
190
- extends: 'theme',
191
- sections: [
192
- {
193
- id: 'acme-theme-setup',
194
- title: target.title,
195
- content: [{type: 'prose', text: 'Use the Acme theme.'}],
196
- },
197
- ],
198
- }),
199
- });
200
-
201
- const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
202
- expect(extended.data.sections).toHaveLength(builtin.data.sections.length);
203
- const matches = extended.data.sections.filter(
204
- section => section.title === target.title,
205
- );
206
- expect(matches).toEqual([
207
- expect.objectContaining({
208
- id: 'acme-theme-setup',
209
- content: [{type: 'prose', text: 'Use the Acme theme.'}],
210
- }),
211
- ]);
212
- }, SLOW);
213
-
214
- it('replaces a real built-in section by the key its index shows', async () => {
215
- const index = await docs('theme', undefined, {index: true});
216
- const target = index.data.sections[0];
217
- scaffold({
218
- 'theme-internal.doc.mjs': topic({
219
- name: 'theme-internal',
220
- extends: 'theme',
221
- sections: [
222
- {
223
- id: target.id,
224
- title: `${target.title} with Acme`,
225
- content: [{type: 'prose', text: 'Acme first.'}],
226
- },
227
- ],
228
- }),
229
- });
230
-
231
- const extended = await docs('theme', undefined, {cwd: tmpDir, full: true});
232
- expect(extended.data.sections).toHaveLength(index.data.sections.length);
233
- expect(extended.data.sections.filter(s => s.id === target.id)).toEqual([
234
- expect.objectContaining({content: [{type: 'prose', text: 'Acme first.'}]}),
235
- ]);
236
- const read = await docs('theme', target.id, {cwd: tmpDir});
237
- expect(read.data.title).toBe(`${target.title} with Acme`);
238
- }, SLOW);
239
-
240
- it.each(['zh', 'dense'])(
241
- 'replaces translated real sections by their authored titles under --%s',
242
- async lang => {
243
- const english = await docs('theme', undefined, {full: true});
244
- const englishTitles = english.data.sections.map(section => section.title);
245
- expect(englishTitles).toEqual(
246
- expect.arrayContaining(['Quick Start', 'Theme Props']),
247
- );
248
- scaffold({
249
- 'theme-internal.doc.mjs': topic({
250
- name: 'theme-internal',
251
- extends: 'theme',
252
- sections: [
253
- {
254
- id: 'acme-quick-start',
255
- title: 'Quick Start',
256
- content: [{type: 'prose', text: 'Acme quick start.'}],
257
- },
258
- {
259
- title: 'Theme Props',
260
- content: [{type: 'prose', text: 'Acme props.'}],
261
- },
262
- ],
263
- }),
264
- });
265
-
266
- const base = await docs('theme', undefined, {lang, full: true});
267
- expect(base.data.sections.map(section => section.title)).not.toEqual(
268
- englishTitles,
269
- );
270
- const extended = await docs('theme', undefined, {cwd: tmpDir, lang, full: true});
271
- expect(extended.data.sections).toHaveLength(base.data.sections.length);
272
- expect(
273
- extended.data.sections.filter(
274
- section => section.id === 'acme-quick-start',
275
- ),
276
- ).toHaveLength(1);
277
- expect(
278
- extended.data.sections.filter(
279
- section => section.content[0]?.text === 'Acme props.',
280
- ),
281
- ).toHaveLength(1);
282
- },
283
- SLOW,
284
- );
285
-
286
- it('offers the contributed topics as suggestions on an unknown one', async () => {
287
- scaffold({'deploying.doc.mjs': topic()});
288
- await expect(docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true})).rejects.toBeInstanceOf(
289
- AstryxError,
290
- );
291
- try {
292
- await docs('nope-not-a-topic', undefined, {cwd: tmpDir, full: true});
293
- } catch (err) {
294
- expect(err.suggestions.map(s => s.name)).toContain('deploying');
295
- }
296
- }, SLOW);
297
-
298
- it('indexes a contributed topic in search', async () => {
299
- scaffold({'deploying.doc.mjs': topic()});
300
- const {data} = await search('deploying', {cwd: tmpDir, type: 'doc'});
301
- expect(data.results[0]).toMatchObject({
302
- domain: 'doc',
303
- name: 'deploying',
304
- command: 'astryx docs deploying',
305
- });
306
- }, SLOW);
307
-
308
- it("falls back to the CLI's own topics when the project config is unreadable", async () => {
309
- scaffold({'deploying.doc.mjs': topic()}, {config: 'export default {integrations: 42};\n'});
310
- const catalog = await loadDocsCatalog(tmpDir);
311
- expect(catalog.resolve('tokens')).toBeTruthy();
312
- expect(catalog.resolve('deploying')).toBeUndefined();
313
- }, SLOW);
314
- });