@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.2

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 (509) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +175 -154
  3. package/api/build/_adapter.d.mts +8 -0
  4. package/api/build/_adapter.mjs +12 -1
  5. package/api/build/build.doc.mjs +4 -0
  6. package/api/build/help/help.mjs +1 -1
  7. package/api/build/kit/kit.mjs +3 -11
  8. package/api/component/_adapter.d.mts +72 -1
  9. package/api/component/_adapter.mjs +212 -18
  10. package/api/component/component.doc.mjs +6 -1
  11. package/api/component/component.mjs +82 -15
  12. package/api/component/component.test.mjs +80 -0
  13. package/api/component/doc-links.test.mjs +386 -0
  14. package/api/component/integration-export-name.test.mjs +644 -0
  15. package/api/component/list/list.mjs +42 -4
  16. package/api/discover/_adapter.d.mts +132 -12
  17. package/api/discover/_adapter.mjs +488 -27
  18. package/api/discover/_adapter.test.mjs +599 -17
  19. package/api/discover/_catalog-view.d.mts +16 -5
  20. package/api/discover/_catalog-view.mjs +32 -8
  21. package/api/discover/detail/doc/doc.mjs +9 -1
  22. package/api/discover/discover.d.mts +11 -0
  23. package/api/discover/discover.doc.mjs +9 -7
  24. package/api/discover/discover.mjs +121 -19
  25. package/api/discover/discover.type.d.mts +20 -7
  26. package/api/discover/discover.type.mjs +17 -7
  27. package/api/discover/list/list.d.mts +4 -3
  28. package/api/discover/list/list.mjs +17 -10
  29. package/api/docs/_adapter.d.mts +74 -0
  30. package/api/docs/_adapter.mjs +553 -16
  31. package/api/docs/docs.doc.mjs +2 -1
  32. package/api/docs/docs.mjs +2 -1
  33. package/api/docs/docs.test.mjs +5 -2
  34. package/api/docs/integration-tree.test.mjs +22 -0
  35. package/api/docs/integrationDocs.test.mjs +124 -0
  36. package/api/docs/list/list.mjs +12 -2
  37. package/api/docs/reference-blocks.test.mjs +1 -3
  38. package/api/doctor/_adapter.d.mts +108 -0
  39. package/api/doctor/_adapter.mjs +223 -4
  40. package/api/doctor/doctor.d.mts +199 -0
  41. package/api/doctor/doctor.doc.mjs +3 -2
  42. package/api/doctor/doctor.mjs +530 -34
  43. package/api/doctor/doctor.test.mjs +180 -14
  44. package/api/doctor/release-checks.test.mjs +156 -0
  45. package/api/doctor/theme-checks.mjs +17 -4
  46. package/api/doctor/theme-checks.test.mjs +223 -7
  47. package/api/error.d.mts +10 -0
  48. package/api/error.mjs +25 -0
  49. package/api/gap-report/gap-report.d.mts +3 -0
  50. package/api/gap-report/gap-report.doc.mjs +11 -3
  51. package/api/gap-report/gap-report.mjs +219 -52
  52. package/api/gap-report/gap-report.test.mjs +233 -0
  53. package/api/gap-report/gap-report.type.d.mts +41 -0
  54. package/api/gap-report/gap-report.type.mjs +18 -0
  55. package/api/hook/_adapter.mjs +3 -11
  56. package/api/hook/hook.doc.mjs +4 -0
  57. package/api/hook/list/list.d.mts +1 -1
  58. package/api/index.d.mts +2 -0
  59. package/api/index.mjs +2 -0
  60. package/api/init/_adapter.d.mts +22 -0
  61. package/api/init/_adapter.mjs +59 -0
  62. package/api/init/init.d.mts +7 -5
  63. package/api/init/init.doc.mjs +28 -7
  64. package/api/init/init.mjs +28 -4
  65. package/api/init/init.type.d.mts +48 -3
  66. package/api/init/init.type.mjs +37 -3
  67. package/api/init/run/run.d.mts +1 -1
  68. package/api/init/run/run.mjs +17 -6
  69. package/api/init/user/user.d.mts +14 -0
  70. package/api/init/user/user.mjs +87 -0
  71. package/api/init/user/user.test.mjs +232 -0
  72. package/api/integration/_adapter.d.mts +45 -0
  73. package/api/integration/_adapter.mjs +112 -0
  74. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  75. package/api/integration/add-contribution.mjs +8 -4
  76. package/api/integration/add-contribution.test.mjs +4 -2
  77. package/api/integration/authoring-checks.mjs +110 -6
  78. package/api/integration/authoring-checks.test.mjs +808 -0
  79. package/api/integration/authoring-checks.type.d.mts +143 -0
  80. package/api/integration/authoring-checks.type.mjs +74 -2
  81. package/api/integration/check/check.d.mts +96 -0
  82. package/api/integration/check/check.mjs +357 -0
  83. package/api/integration/check/check.test.mjs +489 -0
  84. package/api/integration/integration-check.type.d.mts +118 -0
  85. package/api/integration/integration-check.type.mjs +84 -0
  86. package/api/integration/integrationCheck.doc.d.mts +10 -0
  87. package/api/integration/integrationCheck.doc.mjs +73 -0
  88. package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
  89. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  90. package/api/integration/pack-check.mjs +364 -120
  91. package/api/integration/pack-check.test.mjs +730 -10
  92. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  93. package/api/integration/validate-integration.d.mts +8 -0
  94. package/api/integration/validate-integration.mjs +63 -9
  95. package/api/integration/validate-integration.test.mjs +88 -8
  96. package/api/integration/validate-integration.type.d.mts +16 -0
  97. package/api/integration/validate-integration.type.mjs +14 -1
  98. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  99. package/api/integration/validateIntegration.doc.mjs +19 -3
  100. package/api/search/_adapter.d.mts +11 -0
  101. package/api/search/_adapter.mjs +25 -0
  102. package/api/search/search.d.mts +82 -13
  103. package/api/search/search.doc.mjs +8 -3
  104. package/api/search/search.domain-priority.test.mjs +108 -18
  105. package/api/search/search.integration-check.test.mjs +24 -0
  106. package/api/search/search.mjs +645 -64
  107. package/api/search/search.test.mjs +179 -1
  108. package/api/search/search.type.d.mts +14 -1
  109. package/api/search/search.type.mjs +6 -1
  110. package/api/swizzle/_adapter.mjs +2 -2
  111. package/api/swizzle/copy/copy.mjs +29 -15
  112. package/api/template/template-integration.test.mjs +1 -1
  113. package/api/template/template.test.mjs +120 -3
  114. package/api/theme/_adapter.d.mts +16 -0
  115. package/api/theme/_adapter.mjs +32 -5
  116. package/api/theme/build/build.d.mts +2 -1
  117. package/api/theme/build/build.family.test.mjs +64 -0
  118. package/api/theme/build/build.mjs +250 -38
  119. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  120. package/api/theme/build/font-warning.mjs +5 -3
  121. package/api/theme/build/font-warning.test.mjs +2 -1
  122. package/api/theme/remove/remove.test.mjs +2 -2
  123. package/api/theme/targets/targets.mjs +3 -10
  124. package/api/theme/themeBuild.doc.mjs +4 -4
  125. package/api/theme/themeTargets.doc.mjs +4 -0
  126. package/api/theme/use/use.test.mjs +1 -1
  127. package/api/upgrade/_adapter.d.mts +40 -2
  128. package/api/upgrade/_adapter.mjs +118 -5
  129. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  130. package/api/upgrade/run/run.mjs +35 -2
  131. package/api/upgrade/status/status.d.mts +21 -5
  132. package/api/upgrade/status/status.mjs +45 -8
  133. package/api/upgrade/upgrade.doc.mjs +6 -3
  134. package/api/upgrade/upgrade.mjs +5 -1
  135. package/api/upgrade/upgrade.type.d.mts +23 -0
  136. package/api/upgrade/upgrade.type.mjs +16 -1
  137. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  138. package/assets/codemods/registry.mjs +1 -0
  139. package/assets/codemods/runner.mjs +7 -1
  140. package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  141. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  142. package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
  143. package/assets/discover/official-packages.json +367 -0
  144. package/assets/docs/README.md +10 -0
  145. package/assets/docs/author-a-theme.doc.mjs +3 -3
  146. package/assets/docs/browser-support.doc.mjs +1 -1
  147. package/assets/docs/getting-started.doc.mjs +26 -6
  148. package/assets/docs/styling-overview.doc.mjs +1 -1
  149. package/assets/docs/theme.doc.dense.mjs +1 -1
  150. package/assets/docs/theme.doc.mjs +2 -2
  151. package/assets/docs/theme.doc.zh.mjs +1 -1
  152. package/assets/docs/tree/add-a-component.doc.mjs +22 -2
  153. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  154. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  155. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  156. package/assets/docs/tree/block-template.doc.mjs +8 -20
  157. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  158. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  159. package/assets/docs/tree/check-the-props.doc.mjs +201 -0
  160. package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
  161. package/assets/docs/tree/checks.doc.mjs +32 -24
  162. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  163. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  164. package/assets/docs/tree/cli.doc.mjs +6 -0
  165. package/assets/docs/tree/codemods.doc.mjs +17 -7
  166. package/assets/docs/tree/commands.doc.mjs +7 -1
  167. package/assets/docs/tree/component-family.doc.mjs +8 -6
  168. package/assets/docs/tree/component-imports.doc.mjs +21 -3
  169. package/assets/docs/tree/components.doc.mjs +7 -1
  170. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  171. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  172. package/assets/docs/tree/configuration.doc.mjs +7 -3
  173. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  174. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  175. package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
  176. package/assets/docs/tree/docs.doc.mjs +9 -3
  177. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  178. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  179. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  180. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  181. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  182. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  183. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  184. package/assets/docs/tree/global.doc.mjs +131 -0
  185. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  186. package/assets/docs/tree/install-once.doc.mjs +105 -0
  187. package/assets/docs/tree/integrations.doc.mjs +13 -1
  188. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  189. package/assets/docs/tree/layout.doc.mjs +6 -6
  190. package/assets/docs/tree/links.doc.mjs +7 -6
  191. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  192. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  193. package/assets/docs/tree/migration.doc.mjs +0 -1
  194. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  195. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  196. package/assets/docs/tree/page-template.doc.mjs +4 -8
  197. package/assets/docs/tree/problems.doc.mjs +205 -0
  198. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  199. package/assets/docs/tree/publishing.doc.mjs +6 -6
  200. package/assets/docs/tree/quick-start.doc.mjs +53 -27
  201. package/assets/docs/tree/reference.doc.mjs +192 -0
  202. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  203. package/assets/docs/tree/replace-a-core-template.doc.mjs +10 -12
  204. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  205. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  206. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  207. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  208. package/assets/docs/tree/single-component.doc.mjs +15 -6
  209. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  210. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  211. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  212. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  213. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  214. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  215. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  216. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  217. package/assets/docs/tree/templates.doc.mjs +7 -1
  218. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  219. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  220. package/assets/docs/tree/themes.doc.mjs +4 -0
  221. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  222. package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
  223. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  224. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  225. package/assets/docs/tree/updates.doc.mjs +92 -0
  226. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  227. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  228. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  229. package/assets/docs/tree/versioning.doc.mjs +10 -9
  230. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  231. package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
  232. package/assets/docs/use-a-theme.doc.mjs +2 -2
  233. package/assets/docs/working-with-ai.doc.mjs +66 -13
  234. package/assets/theme.template.ts +1 -1
  235. package/authoring/codemod/codemod.doc.mjs +7 -3
  236. package/authoring/config/config.doc.mjs +9 -6
  237. package/authoring/config/type.ts +4 -2
  238. package/authoring/debug/parse.d.mts +5 -5
  239. package/authoring/discover/discover.doc.mjs +7 -1
  240. package/authoring/doctypes/_schema.d.mts +8 -3
  241. package/authoring/doctypes/_schema.mjs +1 -0
  242. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  243. package/authoring/doctypes/command/command.doc.mjs +20 -12
  244. package/authoring/doctypes/command/type.ts +14 -0
  245. package/authoring/doctypes/component/component.doc.mjs +30 -27
  246. package/authoring/doctypes/component/type.ts +21 -8
  247. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  248. package/authoring/doctypes/function/function.doc.mjs +9 -8
  249. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  250. package/authoring/doctypes/hook/type.ts +4 -0
  251. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  252. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  253. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  254. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  255. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  256. package/authoring/doctypes/template/parse.d.mts +6 -2
  257. package/authoring/doctypes/template/parse.mjs +3 -1
  258. package/authoring/doctypes/template/template.doc.mjs +3 -3
  259. package/authoring/doctypes/template/type.ts +22 -0
  260. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  261. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  262. package/authoring/identity/identity.doc.mjs +3 -3
  263. package/authoring/index.d.ts +2 -0
  264. package/authoring/integration/integration.doc.mjs +30 -6
  265. package/authoring/integration/parse.test.mjs +21 -0
  266. package/authoring/integration/schema.d.mts +16 -3
  267. package/authoring/integration/schema.mjs +34 -2
  268. package/authoring/integration/type.ts +12 -0
  269. package/clients/cli/bin/astryx.mjs +20 -3
  270. package/clients/cli/cli-command.test.mjs +166 -0
  271. package/clients/cli/commands/blog.doc.mjs +1 -0
  272. package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
  273. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  274. package/clients/cli/commands/build-theme.mjs +26 -13
  275. package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
  276. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  277. package/clients/cli/commands/build.doc.mjs +1 -0
  278. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  279. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  280. package/clients/cli/commands/component.doc.mjs +1 -0
  281. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  282. package/clients/cli/commands/discover.doc.mjs +9 -1
  283. package/clients/cli/commands/discover.mjs +144 -93
  284. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  285. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  286. package/clients/cli/commands/docs.doc.mjs +1 -0
  287. package/clients/cli/commands/docs.mjs +49 -19
  288. package/clients/cli/commands/docs.test.mjs +2 -2
  289. package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
  290. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  291. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  292. package/clients/cli/commands/doctor-integration-validate.doc.mjs +22 -2
  293. package/clients/cli/commands/doctor-integration.test.mjs +888 -3
  294. package/clients/cli/commands/doctor.doc.mjs +12 -2
  295. package/clients/cli/commands/doctor.mjs +292 -7
  296. package/clients/cli/commands/doctor.test.mjs +10 -4
  297. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  298. package/clients/cli/commands/gap-report.mjs +24 -2
  299. package/clients/cli/commands/gap-report.test.mjs +79 -0
  300. package/clients/cli/commands/hook.doc.mjs +1 -0
  301. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  302. package/clients/cli/commands/init.doc.mjs +29 -3
  303. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  304. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  305. package/clients/cli/commands/integration-check.doc.mjs +93 -0
  306. package/clients/cli/commands/integration-check.test.mjs +441 -0
  307. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  308. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  309. package/clients/cli/commands/integration.doc.mjs +6 -2
  310. package/clients/cli/commands/integration.mjs +119 -7
  311. package/clients/cli/commands/json-contract.test.mjs +11 -2
  312. package/clients/cli/commands/manifest.doc.mjs +1 -0
  313. package/clients/cli/commands/outside-project.test.mjs +774 -0
  314. package/clients/cli/commands/search.doc.mjs +1 -0
  315. package/clients/cli/commands/search.mjs +16 -11
  316. package/clients/cli/commands/search.test.mjs +429 -296
  317. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  318. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  319. package/clients/cli/commands/swizzle.mjs +5 -3
  320. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  321. package/clients/cli/commands/template.doc.mjs +1 -0
  322. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  323. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  324. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  325. package/clients/cli/commands/theme-build.doc.mjs +3 -2
  326. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  327. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  328. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  329. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  330. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  331. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  332. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  333. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  334. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  335. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  336. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  337. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  338. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  339. package/clients/cli/index.mjs +112 -16
  340. package/clients/cli/lib/cli-error.mjs +4 -1
  341. package/clients/cli/lib/component-format.test.mjs +1 -1
  342. package/clients/cli/lib/define-command.mjs +2 -2
  343. package/clients/cli/lib/json-shim.mjs +3 -1
  344. package/clients/cli/lib/manifest.d.ts +9 -0
  345. package/clients/cli/lib/manifest.mjs +17 -1
  346. package/clients/cli/lib/manifest.test.mjs +25 -0
  347. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  348. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  349. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  350. package/foundation/agent-docs/agent-docs.mjs +11 -9
  351. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  352. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  353. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  354. package/foundation/config/project.d.mts +35 -3
  355. package/foundation/config/project.mjs +226 -7
  356. package/foundation/config/project.test.mjs +66 -0
  357. package/foundation/config/theme-state.mjs +5 -4
  358. package/foundation/discovery/authoring-self-docs.mjs +2 -1
  359. package/foundation/discovery/cli-self-docs.mjs +20 -3
  360. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  361. package/foundation/discovery/component-discovery.d.mts +190 -10
  362. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  363. package/foundation/discovery/component-discovery.mjs +864 -56
  364. package/foundation/discovery/component-discovery.test.mjs +96 -0
  365. package/foundation/discovery/component-replacement.mjs +20 -1
  366. package/foundation/discovery/component-replacement.test.mjs +40 -0
  367. package/foundation/discovery/copied-passages.d.mts +216 -0
  368. package/foundation/discovery/copied-passages.mjs +720 -0
  369. package/foundation/discovery/copied-passages.test.mjs +124 -0
  370. package/foundation/discovery/doc-consistency.d.mts +34 -0
  371. package/foundation/discovery/doc-consistency.mjs +513 -0
  372. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  373. package/foundation/discovery/doc-fluff.d.mts +112 -0
  374. package/foundation/discovery/doc-fluff.mjs +328 -0
  375. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  376. package/foundation/discovery/doc-types.d.mts +157 -0
  377. package/foundation/discovery/doc-types.mjs +1231 -0
  378. package/foundation/discovery/doc-types.test.mjs +744 -0
  379. package/foundation/discovery/docs-discovery.d.mts +88 -0
  380. package/foundation/discovery/docs-discovery.mjs +83 -2
  381. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  382. package/foundation/discovery/integration-doc-files.mjs +231 -0
  383. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  384. package/foundation/discovery/module-exports.d.mts +27 -0
  385. package/foundation/discovery/module-exports.mjs +356 -31
  386. package/foundation/discovery/module-exports.test.mjs +172 -0
  387. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  388. package/foundation/discovery/package-tsconfig.mjs +228 -0
  389. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  390. package/foundation/discovery/project-typescript.d.mts +32 -0
  391. package/foundation/discovery/project-typescript.mjs +89 -0
  392. package/foundation/discovery/prop-drift.d.mts +297 -0
  393. package/foundation/discovery/prop-drift.mjs +2428 -0
  394. package/foundation/discovery/prop-drift.test.mjs +2337 -0
  395. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  396. package/foundation/discovery/runner-allowlist.mjs +53 -0
  397. package/foundation/discovery/stray-pointers.d.mts +52 -0
  398. package/foundation/discovery/stray-pointers.mjs +293 -0
  399. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  400. package/foundation/discovery/template-adapter.mjs +74 -5
  401. package/foundation/discovery/template-needs.mjs +5 -2
  402. package/foundation/discovery/theme-imports.mjs +8 -4
  403. package/foundation/discovery/theme-imports.test.mjs +1 -1
  404. package/foundation/discovery/type-match.d.mts +53 -0
  405. package/foundation/discovery/type-match.mjs +660 -0
  406. package/foundation/discovery/type-match.test.mjs +169 -0
  407. package/foundation/discovery/type-text.d.mts +68 -0
  408. package/foundation/discovery/type-text.mjs +658 -0
  409. package/foundation/discovery/type-text.test.mjs +196 -0
  410. package/foundation/discovery/unresolved-references.d.mts +62 -0
  411. package/foundation/discovery/unresolved-references.mjs +790 -0
  412. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  413. package/foundation/doc-compiler/doc-loads.test.mjs +51 -1
  414. package/foundation/doc-compiler/inputs.mjs +27 -1
  415. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  416. package/foundation/doc-compiler/links.d.mts +41 -5
  417. package/foundation/doc-compiler/links.mjs +167 -28
  418. package/foundation/doc-compiler/links.test.mjs +97 -4
  419. package/foundation/doc-compiler/read.d.mts +1 -1
  420. package/foundation/doc-compiler/tree.mjs +30 -1
  421. package/foundation/doc-compiler/tree.test.mjs +8 -1
  422. package/foundation/env/cli-command.d.mts +83 -0
  423. package/foundation/env/cli-command.mjs +152 -0
  424. package/foundation/env/cli-command.test.mjs +129 -0
  425. package/foundation/env/node-version.test.mjs +15 -3
  426. package/foundation/env/package-manager.d.mts +93 -9
  427. package/foundation/env/package-manager.global.test.mjs +66 -0
  428. package/foundation/env/package-manager.mjs +184 -13
  429. package/foundation/env/package-manager.test.mjs +341 -15
  430. package/foundation/env/project-scope.d.mts +9 -0
  431. package/foundation/env/project-scope.mjs +33 -0
  432. package/foundation/env/search-path.d.mts +42 -0
  433. package/foundation/env/search-path.mjs +205 -0
  434. package/foundation/env/search-path.test.mjs +122 -0
  435. package/foundation/env/user-dirs.d.mts +39 -0
  436. package/foundation/env/user-dirs.mjs +93 -0
  437. package/foundation/env/user-dirs.test.mjs +72 -0
  438. package/foundation/env/user-settings.d.mts +46 -0
  439. package/foundation/env/user-settings.mjs +106 -0
  440. package/foundation/env/user-settings.test.mjs +64 -0
  441. package/foundation/fs/file-protection.mjs +15 -1
  442. package/foundation/fs/module-loader.d.mts +2 -1
  443. package/foundation/fs/module-loader.mjs +60 -4
  444. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  445. package/foundation/fs/module-loader.test.mjs +194 -0
  446. package/foundation/fs/path-compare.d.mts +33 -0
  447. package/foundation/fs/path-compare.mjs +73 -0
  448. package/foundation/fs/paths.d.mts +57 -1
  449. package/foundation/fs/paths.mjs +131 -3
  450. package/foundation/fs/paths.test.mjs +10 -1
  451. package/foundation/integrations/computer-integrations.d.mts +78 -0
  452. package/foundation/integrations/computer-integrations.mjs +316 -0
  453. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  454. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  455. package/foundation/integrations/contribution-inventory.mjs +56 -3
  456. package/foundation/integrations/integration-warnings.mjs +3 -2
  457. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  458. package/foundation/integrations/integrations.d.mts +25 -1
  459. package/foundation/integrations/integrations.mjs +46 -3
  460. package/foundation/integrations/issue.ts +6 -0
  461. package/foundation/integrations/validate-contributions.d.mts +2 -0
  462. package/foundation/integrations/validate-contributions.mjs +41 -1
  463. package/foundation/release/agent-text-worker.d.mts +4 -0
  464. package/foundation/release/agent-text-worker.mjs +52 -0
  465. package/foundation/release/cache.d.mts +310 -0
  466. package/foundation/release/cache.mjs +1216 -0
  467. package/foundation/release/cache.test.mjs +920 -0
  468. package/foundation/release/choose.d.mts +207 -0
  469. package/foundation/release/choose.mjs +677 -0
  470. package/foundation/release/choose.test.mjs +427 -0
  471. package/foundation/release/core-worker.d.mts +4 -0
  472. package/foundation/release/core-worker.mjs +38 -0
  473. package/foundation/release/global-state.d.mts +259 -0
  474. package/foundation/release/global-state.mjs +472 -0
  475. package/foundation/release/global-state.test.mjs +381 -0
  476. package/foundation/release/handoff.d.mts +60 -0
  477. package/foundation/release/handoff.e2e.test.mjs +278 -0
  478. package/foundation/release/handoff.mjs +357 -0
  479. package/foundation/release/lock-lease.d.mts +23 -0
  480. package/foundation/release/lock-lease.mjs +80 -0
  481. package/foundation/release/notices.d.mts +253 -0
  482. package/foundation/release/notices.mjs +596 -0
  483. package/foundation/release/notices.test.mjs +565 -0
  484. package/foundation/release/npm-guard.d.mts +4 -0
  485. package/foundation/release/npm-guard.mjs +126 -0
  486. package/foundation/release/project.d.mts +141 -0
  487. package/foundation/release/project.mjs +466 -0
  488. package/foundation/release/project.test.mjs +288 -0
  489. package/foundation/release/refresh-worker.d.mts +4 -0
  490. package/foundation/release/refresh-worker.mjs +27 -0
  491. package/foundation/release/run-context.d.mts +47 -0
  492. package/foundation/release/run-context.mjs +149 -0
  493. package/foundation/release/update-notice-env.d.mts +28 -0
  494. package/foundation/release/update-notice-env.mjs +39 -0
  495. package/foundation/response/base.d.ts +26 -3
  496. package/foundation/response/error-codes.d.mts +3 -1
  497. package/foundation/response/error-codes.doc.mjs +12 -0
  498. package/foundation/response/error-codes.mjs +17 -0
  499. package/foundation/response/error-codes.test.mjs +2 -0
  500. package/foundation/response/json-contract.test.mjs +7 -2
  501. package/foundation/response/json.mjs +4 -1
  502. package/foundation/response/response-types.doc.mjs +22 -11
  503. package/foundation/response/response-types.doc.test.mjs +46 -0
  504. package/foundation/response/response.doc.mjs +3 -3
  505. package/foundation/xle/browser-imports.test.mjs +74 -0
  506. package/foundation/xle/registry.mjs +4 -0
  507. package/foundation/xle/registry.test.mjs +28 -0
  508. package/package.json +11 -11
  509. package/scripts/postinstall.mjs +24 -5
@@ -39,6 +39,13 @@
39
39
  * @returns {Record<string, string>} topic name → absolute doc path
40
40
  */
41
41
  export function discoverBuiltinTopics(): Record<string, string>;
42
+ /**
43
+ * The CLI's own guide files: every flat topic and every doc in its docs tree,
44
+ * without the dense, translated, and draft variants.
45
+ *
46
+ * @returns {string[]}
47
+ */
48
+ export function builtinGuideFiles(): string[];
42
49
  /**
43
50
  * Load a topic doc from disk. A `.ts` doc is loaded through jiti, the rest
44
51
  * natively; both the historical `export const docs` and the stamped
@@ -132,6 +139,35 @@ export const GRAPH_BLOCK_TYPES: Set<string>;
132
139
  * load; a guide the tree places may set `placement` (spec:AST-046).
133
140
  */
134
141
  export const GRAPH_ONLY_FIELDS: string[];
142
+ /**
143
+ * A component a link can name: its owner's provider id, package, and name,
144
+ * and the doc file that describes it.
145
+ * @typedef {object} LinkableComponent
146
+ * @property {string} providerId
147
+ * @property {string} package
148
+ * @property {string} name
149
+ * @property {string | null} docPath
150
+ * @property {string} [replaces] the Core component whose name it answers to
151
+ * in unqualified lookups (spec:AST-035 FR11)
152
+ */
153
+ /**
154
+ * A page or block template a link can name, by the id `astryx template` takes.
155
+ * @typedef {object} LinkableTemplate
156
+ * @property {string} providerId
157
+ * @property {string} package
158
+ * @property {'page' | 'block'} type
159
+ * @property {string} id
160
+ * @property {string} name
161
+ * @property {string} [displayName]
162
+ * @property {string} [description]
163
+ * @property {string} [replaces] the Core template id it answers to in
164
+ * unqualified lookups
165
+ */
166
+ /**
167
+ * The component and template docs links can name (spec:AST-047 FR9). No docs
168
+ * tree holds them, so a catalog carries the records the project reads.
169
+ * @typedef {{components: LinkableComponent[], templates: LinkableTemplate[]}} LinkableContributions
170
+ */
135
171
  /**
136
172
  * Every topic a project can read, and the relationships between them.
137
173
  *
@@ -181,6 +217,18 @@ export class DocsCatalog {
181
217
  namespaces: import("../doc-compiler/tree.mjs").TreeNamespaceInput[];
182
218
  guides: import("../doc-compiler/tree.mjs").TreeDocInput[];
183
219
  }>;
220
+ /**
221
+ * Say where links find component, page, and block docs: the records
222
+ * `astryx component` and `astryx template` read, loaded on first use.
223
+ * @param {() => Promise<LinkableContributions>} load
224
+ */
225
+ setContributions(load: () => Promise<LinkableContributions>): void;
226
+ /**
227
+ * The component and template docs links can name, or null when nothing set
228
+ * them, so no link to one resolves.
229
+ * @returns {Promise<LinkableContributions | null>}
230
+ */
231
+ contributions(): Promise<LinkableContributions | null>;
184
232
  /**
185
233
  * Add one integration-contributed doc, honoring what it declares. Returns
186
234
  * the issue it caused, or null when it applied cleanly — the caller owns
@@ -290,4 +338,44 @@ export type DocsTopicEntry = {
290
338
  */
291
339
  tree?: boolean | undefined;
292
340
  };
341
+ /**
342
+ * A component a link can name: its owner's provider id, package, and name,
343
+ * and the doc file that describes it.
344
+ */
345
+ export type LinkableComponent = {
346
+ providerId: string;
347
+ package: string;
348
+ name: string;
349
+ docPath: string | null;
350
+ /**
351
+ * the Core component whose name it answers to
352
+ * in unqualified lookups (spec:AST-035 FR11)
353
+ */
354
+ replaces?: string | undefined;
355
+ };
356
+ /**
357
+ * A page or block template a link can name, by the id `astryx template` takes.
358
+ */
359
+ export type LinkableTemplate = {
360
+ providerId: string;
361
+ package: string;
362
+ type: "page" | "block";
363
+ id: string;
364
+ name: string;
365
+ displayName?: string | undefined;
366
+ description?: string | undefined;
367
+ /**
368
+ * the Core template id it answers to in
369
+ * unqualified lookups
370
+ */
371
+ replaces?: string | undefined;
372
+ };
373
+ /**
374
+ * The component and template docs links can name (spec:AST-047 FR9). No docs
375
+ * tree holds them, so a catalog carries the records the project reads.
376
+ */
377
+ export type LinkableContributions = {
378
+ components: LinkableComponent[];
379
+ templates: LinkableTemplate[];
380
+ };
293
381
  import { withSourceTitle } from './docs-section-key.mjs';
@@ -117,6 +117,23 @@ export function discoverBuiltinTopics() {
117
117
  return topics;
118
118
  }
119
119
 
120
+ /**
121
+ * The CLI's own guide files: every flat topic and every doc in its docs tree,
122
+ * without the dense, translated, and draft variants.
123
+ *
124
+ * @returns {string[]}
125
+ */
126
+ export function builtinGuideFiles() {
127
+ const files = Object.values(discoverBuiltinTopics());
128
+ const tree = path.join(BUILTIN_DOCS_DIR, 'tree');
129
+ if (fs.existsSync(tree)) {
130
+ for (const file of fs.readdirSync(tree).sort()) {
131
+ if (BUILTIN_TOPIC_FILE_RE.test(file)) files.push(path.join(tree, file));
132
+ }
133
+ }
134
+ return files;
135
+ }
136
+
120
137
  /**
121
138
  * Load a topic doc from disk. A `.ts` doc is loaded through jiti, the rest
122
139
  * natively; both the historical `export const docs` and the stamped
@@ -384,7 +401,11 @@ export function problemsInNamespace(doc) {
384
401
  }
385
402
  }
386
403
  const slots = doc?.slots;
387
- if (slots == null || typeof slots !== 'object' || Object.keys(slots).length === 0) {
404
+ if (
405
+ slots == null ||
406
+ typeof slots !== 'object' ||
407
+ Object.keys(slots).length === 0
408
+ ) {
388
409
  problems.push('slots: expected at least one slot');
389
410
  return problems;
390
411
  }
@@ -392,7 +413,10 @@ export function problemsInNamespace(doc) {
392
413
  if (typeof slot?.title !== 'string' || slot.title === '') {
393
414
  problems.push(`slots.${name}.title: expected a non-empty string`);
394
415
  }
395
- if (!Array.isArray(slot?.accepts?.kinds) || slot.accepts.kinds.length === 0) {
416
+ if (
417
+ !Array.isArray(slot?.accepts?.kinds) ||
418
+ slot.accepts.kinds.length === 0
419
+ ) {
396
420
  problems.push(`slots.${name}.accepts.kinds: expected at least one kind`);
397
421
  }
398
422
  }
@@ -633,6 +657,38 @@ function findMergeTarget(sections, section) {
633
657
  return sections.findIndex(candidate => candidate.id === key);
634
658
  }
635
659
 
660
+ /**
661
+ * A component a link can name: its owner's provider id, package, and name,
662
+ * and the doc file that describes it.
663
+ * @typedef {object} LinkableComponent
664
+ * @property {string} providerId
665
+ * @property {string} package
666
+ * @property {string} name
667
+ * @property {string | null} docPath
668
+ * @property {string} [replaces] the Core component whose name it answers to
669
+ * in unqualified lookups (spec:AST-035 FR11)
670
+ */
671
+
672
+ /**
673
+ * A page or block template a link can name, by the id `astryx template` takes.
674
+ * @typedef {object} LinkableTemplate
675
+ * @property {string} providerId
676
+ * @property {string} package
677
+ * @property {'page' | 'block'} type
678
+ * @property {string} id
679
+ * @property {string} name
680
+ * @property {string} [displayName]
681
+ * @property {string} [description]
682
+ * @property {string} [replaces] the Core template id it answers to in
683
+ * unqualified lookups
684
+ */
685
+
686
+ /**
687
+ * The component and template docs links can name (spec:AST-047 FR9). No docs
688
+ * tree holds them, so a catalog carries the records the project reads.
689
+ * @typedef {{components: LinkableComponent[], templates: LinkableTemplate[]}} LinkableContributions
690
+ */
691
+
636
692
  /**
637
693
  * Every topic a project can read, and the relationships between them.
638
694
  *
@@ -644,6 +700,10 @@ function findMergeTarget(sections, section) {
644
700
  export class DocsCatalog {
645
701
  /** @type {Map<string, DocsTopicEntry>} */
646
702
  #topics = new Map();
703
+ /** @type {(() => Promise<LinkableContributions>) | null} */
704
+ #contributions = null;
705
+ /** @type {Promise<LinkableContributions> | null} */
706
+ #contributionsLoaded = null;
647
707
  /** @type {Map<string, string>} old topic name → the name that replaced it */
648
708
  #aliases = new Map();
649
709
  /** @type {Array<{namespaces: import('../doc-compiler/tree.mjs').TreeNamespaceInput[], guides: import('../doc-compiler/tree.mjs').TreeDocInput[]}>} */
@@ -687,6 +747,27 @@ export class DocsCatalog {
687
747
  return this.#treeInputs;
688
748
  }
689
749
 
750
+ /**
751
+ * Say where links find component, page, and block docs: the records
752
+ * `astryx component` and `astryx template` read, loaded on first use.
753
+ * @param {() => Promise<LinkableContributions>} load
754
+ */
755
+ setContributions(load) {
756
+ this.#contributions = load;
757
+ this.#contributionsLoaded = null;
758
+ }
759
+
760
+ /**
761
+ * The component and template docs links can name, or null when nothing set
762
+ * them, so no link to one resolves.
763
+ * @returns {Promise<LinkableContributions | null>}
764
+ */
765
+ contributions() {
766
+ if (!this.#contributions) return Promise.resolve(null);
767
+ this.#contributionsLoaded ??= this.#contributions();
768
+ return this.#contributionsLoaded;
769
+ }
770
+
690
771
  /**
691
772
  * Seed a catalog with the CLI's own topics.
692
773
  * @param {Record<string, string>} [builtins] topic name → absolute path
@@ -0,0 +1,22 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /** @typedef {import('./doc-types.mjs').DocFile} DocFile */
5
+ /** @typedef {import('./doc-types.mjs').DocRoot} DocRoot */
6
+ /**
7
+ * Every doc file an integration's roots hold, each assigned to the deepest
8
+ * root that holds it, each root a reader could not read, and how many test
9
+ * fixtures no reader serves.
10
+ * @param {any} integration a loaded integration
11
+ * @returns {Promise<{files: DocFile[], unread: Array<{path: string, reason: string}>, fixtures: number}>}
12
+ */
13
+ export function integrationDocFiles(integration: any): Promise<{
14
+ files: DocFile[];
15
+ unread: Array<{
16
+ path: string;
17
+ reason: string;
18
+ }>;
19
+ fixtures: number;
20
+ }>;
21
+ export type DocFile = import("./doc-types.mjs").DocFile;
22
+ export type DocRoot = import("./doc-types.mjs").DocRoot;
@@ -0,0 +1,231 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The doc files an integration package ships, by root: every doc its
5
+ * roots hold, so the doc type check covers each one an agent can open.
6
+ *
7
+ * Each root's reader names the docs it serves, with the kind it reads each
8
+ * as:
9
+ * - components: the doc each component discovery records;
10
+ * - templates: the doc of each template template discovery serves;
11
+ * - docs: the file of each topic, namespace and placed guide docs discovery
12
+ * serves, and each topic's and guide's `zh` and `dense` overlay that a docs
13
+ * read applies;
14
+ * - themes: each theme's descriptor, as theme discovery resolves it. A themes
15
+ * root that discovery cannot read serves no theme, and is listed with the
16
+ * reason.
17
+ * A doc no reader serves still ships: a `hidden` one, a second doc for one
18
+ * name, an overlay without its topic. It goes to its root's kind. A test
19
+ * fixture does not ship as a doc, and is only counted: a doc under
20
+ * `__tests__` in the components or docs root, which those readers skip.
21
+ * A file two roots hold goes to the deepest.
22
+ *
23
+ * @input A loaded integration and its resolved roots.
24
+ * @output DocFile entries for checkDocTypes, each with the root it belongs to,
25
+ * the roots a reader could not read, and how many test fixtures it left
26
+ * out.
27
+ * @position Read by `astryx doctor integration validate` before it checks
28
+ * each doc against its authoring type.
29
+ */
30
+
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+ import {OVERLAY_LANGUAGES, overlayPath} from '../doc-compiler/read.mjs';
34
+ import {discoverIntegrationComponents} from './component-discovery.mjs';
35
+ import {discoverIntegrationDocs} from './docs-discovery.mjs';
36
+ import {discoverIntegrationTemplatesForOne} from './template-adapter.mjs';
37
+ import {discoverThemeDirectory} from './theme-discovery.mjs';
38
+ import {rootProblem} from '../integrations/validate-contributions.mjs';
39
+
40
+ /** @typedef {import('./doc-types.mjs').DocFile} DocFile */
41
+ /** @typedef {import('./doc-types.mjs').DocRoot} DocRoot */
42
+
43
+ /**
44
+ * Every doc file an integration's roots hold, each assigned to the deepest
45
+ * root that holds it, each root a reader could not read, and how many test
46
+ * fixtures no reader serves.
47
+ * @param {any} integration a loaded integration
48
+ * @returns {Promise<{files: DocFile[], unread: Array<{path: string, reason: string}>, fixtures: number}>}
49
+ */
50
+ export async function integrationDocFiles(integration) {
51
+ const {components, templates, docs, themes} = integration ?? {};
52
+ /** @type {Array<[DocRoot, string, string[]]>} */
53
+ const read = [];
54
+ /** @type {Array<{path: string, reason: string}>} */
55
+ const unread = [];
56
+ // A root `validate` already reports (missing, a file, unreadable) is left
57
+ // to that issue. A reader that fails inside a root, such as on a folder it
58
+ // cannot read, leaves the root listed with the reason.
59
+ /** @type {(root: string | undefined, label: string, files: () => Promise<Array<[DocRoot, string[]]>>) => Promise<void>} */
60
+ const take = async (root, label, files) => {
61
+ if (!root || rootProblem(root)) return;
62
+ try {
63
+ for (const [kind, list] of await files()) read.push([kind, root, list]);
64
+ } catch (err) {
65
+ unread.push({
66
+ path: root,
67
+ reason: `the ${label} root does not load, so no doc in it was checked: ${err instanceof Error ? err.message : String(err)}`,
68
+ });
69
+ }
70
+ };
71
+ await take(components, 'components', async () => [
72
+ [
73
+ 'components',
74
+ discoverIntegrationComponents(integration).map(c => c.docPath),
75
+ ],
76
+ ]);
77
+ await take(templates, 'templates', async () => [
78
+ [
79
+ 'templates',
80
+ (await discoverIntegrationTemplatesForOne(integration)).templates.map(
81
+ t => t.docPath,
82
+ ),
83
+ ],
84
+ ]);
85
+ await take(docs, 'docs', async () => {
86
+ const found = await discoverIntegrationDocs(integration);
87
+ // Topics and placed guides are read with their overlays; a namespace
88
+ // names its file `<package name>/<path in the root>`.
89
+ const withOverlays = [
90
+ ...found.records.map(record => record.path),
91
+ ...found.guides.map(guide => guide.ref.topicFile),
92
+ ];
93
+ const prefix = `${integration.name}/`;
94
+ const namespaces = found.namespaces.map(entry =>
95
+ path.join(
96
+ /** @type {string} */ (docs),
97
+ ...(entry.source.startsWith(prefix)
98
+ ? entry.source.slice(prefix.length)
99
+ : entry.source
100
+ ).split('/'),
101
+ ),
102
+ );
103
+ return [
104
+ ['docs', [...withOverlays, ...namespaces]],
105
+ [
106
+ 'docs-overlay',
107
+ withOverlays.flatMap(file =>
108
+ OVERLAY_LANGUAGES.map(lang => overlayPath(file, lang)).filter(
109
+ overlay => fs.existsSync(overlay),
110
+ ),
111
+ ),
112
+ ],
113
+ ];
114
+ });
115
+ await take(themes, 'themes', async () => [
116
+ [
117
+ 'themes',
118
+ discoverThemeDirectory(
119
+ /** @type {string} */ (themes),
120
+ integration?.name ?? 'the package',
121
+ ).map(theme => theme.docPath),
122
+ ],
123
+ ]);
124
+ /** @type {Map<string, {root: DocRoot, dir: string}>} */
125
+ const owners = new Map();
126
+ /** @type {(table: Map<string, {root: DocRoot, dir: string}>, root: DocRoot, dir: string, file: string) => void} */
127
+ const own = (table, root, dir, file) => {
128
+ const owner = table.get(file);
129
+ if (!owner || dir.length > owner.dir.length) table.set(file, {root, dir});
130
+ };
131
+ for (const [root, dir, files] of read) {
132
+ for (const file of files) own(owners, root, dir, file);
133
+ }
134
+ // The docs no reader serves, in each root a reader could read.
135
+ /** @type {Map<string, {root: DocRoot, dir: string}>} */
136
+ const shipped = new Map();
137
+ const readable = new Set(read.map(([, dir]) => dir));
138
+ for (const [
139
+ kind,
140
+ dir,
141
+ ] of /** @type {Array<[DocRoot, string | undefined]>} */ ([
142
+ ['components', components],
143
+ ['templates', templates],
144
+ ['docs', docs],
145
+ ['themes', themes],
146
+ ])) {
147
+ if (!dir || !readable.has(dir)) continue;
148
+ for (const file of docFilesUnder(dir)) {
149
+ const overlay = OVERLAY_LANGUAGES.some(lang =>
150
+ file.endsWith(`.doc.${lang}.mjs`),
151
+ );
152
+ if (overlay && kind !== 'docs') continue;
153
+ own(shipped, overlay ? 'docs-overlay' : kind, dir, file);
154
+ }
155
+ }
156
+ let fixtures = 0;
157
+ for (const [file, owner] of shipped) {
158
+ if (owners.has(file)) continue;
159
+ if (isFixture(path.relative(owner.dir, file), owner.root)) fixtures++;
160
+ else owners.set(file, owner);
161
+ }
162
+ return {
163
+ files: [...owners]
164
+ .map(([file, {root}]) => ({path: file, root}))
165
+ .sort((a, b) => a.path.localeCompare(b.path)),
166
+ unread,
167
+ fixtures,
168
+ };
169
+ }
170
+
171
+ /**
172
+ * Whether a doc file is a test fixture: under `__tests__` in a root whose
173
+ * reader skips that folder (components and docs). The template reader reads
174
+ * it, so a template doc there is the package's like any other.
175
+ * @param {string} file its path relative to its root
176
+ * @param {DocRoot} root
177
+ */
178
+ function isFixture(file, root) {
179
+ return (
180
+ root !== 'templates' &&
181
+ root !== 'themes' &&
182
+ file.split(path.sep).includes('__tests__')
183
+ );
184
+ }
185
+
186
+ /**
187
+ * Every doc file under a folder: a `.doc.ts`, `.doc.mjs` or `.doc.js` file,
188
+ * or a `zh` or `dense` overlay, through its folders and linked files, but not
189
+ * `node_modules`, `.git` or a linked folder.
190
+ * @param {string} dir
191
+ * @returns {string[]}
192
+ */
193
+ function docFilesUnder(dir) {
194
+ /** @type {string[]} */
195
+ const found = [];
196
+ /** @type {(folder: string) => void} */
197
+ const walk = folder => {
198
+ /** @type {fs.Dirent[]} */
199
+ let entries;
200
+ try {
201
+ entries = fs.readdirSync(folder, {withFileTypes: true});
202
+ } catch {
203
+ return;
204
+ }
205
+ for (const entry of entries) {
206
+ if (entry.name === 'node_modules' || entry.name === '.git') continue;
207
+ const full = path.join(folder, entry.name);
208
+ if (entry.isDirectory()) {
209
+ walk(full);
210
+ continue;
211
+ }
212
+ if (entry.isSymbolicLink()) {
213
+ try {
214
+ if (!fs.statSync(full).isFile()) continue;
215
+ } catch {
216
+ continue;
217
+ }
218
+ } else if (!entry.isFile()) {
219
+ continue;
220
+ }
221
+ if (
222
+ /\.doc\.(ts|mjs|js)$/.test(entry.name) ||
223
+ OVERLAY_LANGUAGES.some(lang => entry.name.endsWith(`.doc.${lang}.mjs`))
224
+ ) {
225
+ found.push(full);
226
+ }
227
+ }
228
+ };
229
+ walk(dir);
230
+ return found;
231
+ }