@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db52d98

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 (397) hide show
  1. package/README.md +38 -15
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +14 -7
  6. package/api/build/build.test.mjs +184 -6
  7. package/api/build/build.type.d.mts +57 -2
  8. package/api/build/build.type.mjs +30 -7
  9. package/api/build/help/help.d.mts +4 -0
  10. package/api/build/help/help.mjs +24 -11
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +1 -0
  19. package/api/component/component.mjs +60 -12
  20. package/api/component/list/list.mjs +3 -2
  21. package/api/discover/discover.doc.mjs +1 -0
  22. package/api/docs/_adapter.d.mts +252 -34
  23. package/api/docs/_adapter.mjs +923 -132
  24. package/api/docs/detail/detail.mjs +11 -3
  25. package/api/docs/detail/section/section.mjs +24 -13
  26. package/api/docs/detail/section/section.test.mjs +15 -6
  27. package/api/docs/docs.d.mts +5 -3
  28. package/api/docs/docs.doc.mjs +39 -17
  29. package/api/docs/docs.mjs +44 -8
  30. package/api/docs/docs.test.mjs +158 -4
  31. package/api/docs/docs.type.d.mts +181 -2
  32. package/api/docs/docs.type.mjs +117 -3
  33. package/api/docs/index/index.mjs +11 -3
  34. package/api/docs/index/index.test.mjs +1 -1
  35. package/api/docs/integration-tree.test.mjs +555 -0
  36. package/api/docs/integrationDocs.test.mjs +14 -14
  37. package/api/docs/list/list.mjs +28 -12
  38. package/api/docs/node/node.d.mts +43 -0
  39. package/api/docs/node/node.mjs +192 -0
  40. package/api/docs/reference-blocks.test.mjs +406 -0
  41. package/api/doctor/doctor.d.mts +54 -4
  42. package/api/doctor/doctor.doc.mjs +1 -0
  43. package/api/doctor/doctor.mjs +331 -16
  44. package/api/doctor/doctor.test.mjs +420 -7
  45. package/api/gap-report/gap-report.doc.mjs +1 -0
  46. package/api/hook/_adapter.mjs +19 -5
  47. package/api/hook/hook.doc.mjs +1 -0
  48. package/api/hook/list/list.d.mts +1 -1
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/index.d.mts +1 -1
  51. package/api/index.mjs +1 -0
  52. package/api/init/init.doc.mjs +2 -1
  53. package/api/integration/add-contribution.d.mts +2 -1
  54. package/api/integration/add-contribution.mjs +114 -12
  55. package/api/integration/add-contribution.test.mjs +174 -3
  56. package/api/integration/add-theme.mjs +34 -64
  57. package/api/integration/add-theme.test.mjs +105 -21
  58. package/api/integration/authoring-checks.mjs +138 -28
  59. package/api/integration/authoring-checks.test.mjs +179 -7
  60. package/api/integration/authoring-checks.type.mjs +6 -1
  61. package/api/integration/integration-authoring.type.d.mts +2 -0
  62. package/api/integration/integration-authoring.type.mjs +2 -0
  63. package/api/integration/integration-block-exports.test.mjs +10 -6
  64. package/api/integration/integrationAdd.doc.mjs +7 -0
  65. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  66. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  67. package/api/integration/integrationAddComponent.doc.mjs +1 -0
  68. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  69. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  70. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  71. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  72. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  73. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  74. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  75. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  76. package/api/integration/pack-check.mjs +34 -0
  77. package/api/integration/pack-check.test.mjs +138 -47
  78. package/api/integration/pack-check.type.d.mts +26 -2
  79. package/api/integration/pack-check.type.mjs +14 -1
  80. package/api/integration/summarizeIssues.doc.mjs +1 -0
  81. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  82. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  83. package/api/integration/validate-integration.mjs +50 -102
  84. package/api/integration/validate-integration.test.mjs +88 -26
  85. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  86. package/api/integration/validateIntegration.doc.mjs +2 -1
  87. package/api/json/assertResponse.doc.mjs +1 -0
  88. package/api/json/index.ts +2 -0
  89. package/api/json/isError.doc.mjs +1 -0
  90. package/api/json/parseResponse.doc.mjs +1 -0
  91. package/api/layout/_adapter.mjs +20 -5
  92. package/api/layout/layoutCheck.doc.mjs +1 -0
  93. package/api/layout/layoutExpand.doc.mjs +1 -0
  94. package/api/layout/layoutGrammar.doc.mjs +1 -0
  95. package/api/search/search.d.mts +59 -1
  96. package/api/search/search.doc.mjs +5 -3
  97. package/api/search/search.mjs +458 -77
  98. package/api/search/search.test.mjs +91 -2
  99. package/api/search/search.type.d.mts +13 -1
  100. package/api/search/search.type.mjs +4 -1
  101. package/api/swizzle/swizzle.doc.mjs +1 -0
  102. package/api/template/list/list.mjs +1 -0
  103. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  104. package/api/template/template-integration.test.mjs +1072 -3
  105. package/api/template/template-suffix.test.mjs +41 -21
  106. package/api/template/template.doc.mjs +28 -7
  107. package/api/template/template.mjs +45 -8
  108. package/api/template/template.type.d.mts +6 -8
  109. package/api/template/template.type.mjs +3 -2
  110. package/api/theme/_adapter.d.mts +2 -3
  111. package/api/theme/_adapter.mjs +4 -5
  112. package/api/theme/add/add.binary.test.mjs +10 -17
  113. package/api/theme/add/add.test.mjs +14 -1
  114. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  115. package/api/theme/integration-themes.test.mjs +39 -28
  116. package/api/theme/list/list.test.mjs +19 -20
  117. package/api/theme/listThemes.doc.mjs +6 -5
  118. package/api/theme/template/template.test.mjs +5 -0
  119. package/api/theme/themeAdd.doc.mjs +4 -3
  120. package/api/theme/themeBuild.doc.mjs +1 -0
  121. package/api/theme/themeList.doc.mjs +6 -3
  122. package/api/theme/themeListAvailable.doc.mjs +5 -3
  123. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  124. package/api/theme/themeTargets.doc.mjs +1 -0
  125. package/api/theme/themeTemplate.doc.mjs +2 -1
  126. package/api/upgrade/_adapter.d.mts +32 -5
  127. package/api/upgrade/_adapter.mjs +97 -69
  128. package/api/upgrade/provider-agreement.test.mjs +152 -0
  129. package/api/upgrade/run/run.mjs +356 -59
  130. package/api/upgrade/upgrade.doc.mjs +6 -1
  131. package/api/upgrade/upgrade.type.d.mts +34 -0
  132. package/api/upgrade/upgrade.type.mjs +15 -0
  133. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  134. package/assets/codemods/integration-discovery.mjs +8 -2
  135. package/assets/codemods/integration-discovery.test.mjs +15 -0
  136. package/assets/codemods/integration-runner.mjs +56 -4
  137. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  138. package/assets/codemods/run-codemod.mjs +177 -34
  139. package/assets/codemods/runner.mjs +350 -102
  140. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  141. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  142. package/assets/codemods/transforms/next/index.mjs +19 -1
  143. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  144. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  145. package/assets/docs/getting-started.doc.mjs +2 -2
  146. package/assets/docs/layout.doc.dense.mjs +2 -2
  147. package/assets/docs/layout.doc.mjs +1 -1
  148. package/assets/docs/principles.doc.mjs +6 -6
  149. package/assets/docs/styling-libraries.doc.mjs +3 -3
  150. package/assets/docs/styling.doc.mjs +4 -4
  151. package/assets/docs/theme.doc.mjs +5 -5
  152. package/assets/docs/tokens.doc.mjs +1 -1
  153. package/assets/docs/tree/api.doc.mjs +30 -0
  154. package/assets/docs/tree/cli.doc.mjs +23 -0
  155. package/assets/docs/tree/commands.doc.mjs +25 -0
  156. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  157. package/assets/docs/tree/integrations.test.mjs +62 -0
  158. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  159. package/assets/docs/working-with-ai.doc.mjs +3 -3
  160. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  161. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  162. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  163. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  164. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  165. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  166. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  167. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  168. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  169. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  170. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  171. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  172. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  173. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  174. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  175. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  176. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  177. package/authoring/codemod/codemod.doc.mjs +1 -1
  178. package/authoring/codemod/type.ts +12 -0
  179. package/authoring/config/config.doc.mjs +1 -1
  180. package/authoring/debug/debug.doc.d.mts +11 -0
  181. package/authoring/debug/debug.doc.mjs +182 -0
  182. package/authoring/debug/parse.d.mts +3 -3
  183. package/authoring/doctypes/_schema.d.mts +119 -117
  184. package/authoring/doctypes/_schema.mjs +54 -3
  185. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  186. package/authoring/doctypes/base/type.ts +6 -5
  187. package/authoring/doctypes/command/command.doc.mjs +1 -1
  188. package/authoring/doctypes/command/type.ts +2 -2
  189. package/authoring/doctypes/component/type.ts +2 -2
  190. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  191. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  192. package/authoring/doctypes/enum/type.ts +1 -1
  193. package/authoring/doctypes/function/function.doc.mjs +3 -2
  194. package/authoring/doctypes/function/type.ts +3 -2
  195. package/authoring/doctypes/hook/type.ts +2 -2
  196. package/authoring/doctypes/load-contract.test.mjs +28 -2
  197. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  198. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  199. package/authoring/doctypes/namespace/type.ts +5 -2
  200. package/authoring/doctypes/parse.d.mts +4 -2
  201. package/authoring/doctypes/parse.mjs +10 -5
  202. package/authoring/doctypes/reference/reference.doc.mjs +35 -6
  203. package/authoring/doctypes/reference/type.ts +30 -13
  204. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  205. package/authoring/doctypes/schema/type.ts +1 -2
  206. package/authoring/doctypes/template/parse.d.mts +2 -0
  207. package/authoring/doctypes/template/parse.mjs +4 -0
  208. package/authoring/doctypes/template/parse.test.mjs +18 -0
  209. package/authoring/doctypes/template/template.doc.mjs +9 -3
  210. package/authoring/doctypes/template/type.ts +8 -0
  211. package/authoring/doctypes/theme/parse.d.mts +35 -0
  212. package/authoring/doctypes/theme/parse.mjs +76 -0
  213. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  214. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  215. package/authoring/doctypes/theme/type.ts +42 -0
  216. package/authoring/doctypes/types.ts +2 -1
  217. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  218. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  219. package/authoring/identity/identity.doc.mjs +2 -2
  220. package/authoring/index.d.mts +1 -0
  221. package/authoring/index.d.ts +7 -4
  222. package/authoring/index.mjs +2 -1
  223. package/authoring/integration/integration.doc.mjs +2 -2
  224. package/authoring/integration/type.ts +4 -10
  225. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  226. package/clients/cli/commands/blog.doc.mjs +1 -1
  227. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  228. package/clients/cli/commands/build-theme.mjs +11 -45
  229. package/clients/cli/commands/build.doc.mjs +12 -7
  230. package/clients/cli/commands/build.mjs +105 -67
  231. package/clients/cli/commands/build.text-fields.test.mjs +41 -0
  232. package/clients/cli/commands/component/index.mjs +1 -1
  233. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  234. package/clients/cli/commands/component.doc.mjs +1 -1
  235. package/clients/cli/commands/discover.broken-integration.test.mjs +7 -8
  236. package/clients/cli/commands/discover.doc.mjs +1 -1
  237. package/clients/cli/commands/discover.mjs +1 -1
  238. package/clients/cli/commands/docs.doc.mjs +21 -9
  239. package/clients/cli/commands/docs.mjs +184 -70
  240. package/clients/cli/commands/docs.test.mjs +120 -16
  241. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  242. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  243. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  244. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  245. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  246. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  247. package/clients/cli/commands/doctor.doc.mjs +1 -1
  248. package/clients/cli/commands/doctor.mjs +53 -16
  249. package/clients/cli/commands/gap-report.doc.mjs +1 -1
  250. package/clients/cli/commands/hook.doc.mjs +1 -1
  251. package/clients/cli/commands/init.doc.mjs +1 -1
  252. package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
  253. package/clients/cli/commands/integration-add.doc.mjs +11 -1
  254. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  255. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  256. package/clients/cli/commands/integration.doc.mjs +1 -1
  257. package/clients/cli/commands/integration.mjs +1 -0
  258. package/clients/cli/commands/layout-check.doc.mjs +1 -1
  259. package/clients/cli/commands/layout-expand.doc.mjs +1 -1
  260. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  261. package/clients/cli/commands/layout.doc.mjs +1 -1
  262. package/clients/cli/commands/manifest.doc.mjs +1 -1
  263. package/clients/cli/commands/search.doc.mjs +1 -1
  264. package/clients/cli/commands/search.mjs +11 -2
  265. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  266. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  267. package/clients/cli/commands/template.doc.mjs +24 -7
  268. package/clients/cli/commands/template.mjs +4 -91
  269. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  270. package/clients/cli/commands/theme-add.doc.mjs +2 -2
  271. package/clients/cli/commands/theme-build.doc.mjs +1 -1
  272. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  273. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  274. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  275. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  276. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  277. package/clients/cli/commands/theme-template.doc.mjs +1 -1
  278. package/clients/cli/commands/theme.doc.mjs +1 -1
  279. package/clients/cli/commands/upgrade.doc.mjs +3 -2
  280. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  281. package/clients/cli/commands/upgrade.mjs +29 -7
  282. package/clients/cli/formatters/index.mjs +2 -0
  283. package/clients/cli/formatters/index.test.mjs +6 -0
  284. package/clients/cli/index.mjs +8 -0
  285. package/clients/cli/lib/hook-format.mjs +14 -5
  286. package/clients/cli/lib/manifest.mjs +9 -2
  287. package/foundation/agent-docs/agent-docs.d.mts +3 -2
  288. package/foundation/agent-docs/agent-docs.mjs +13 -9
  289. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  290. package/foundation/config/project-themes.test.mjs +11 -19
  291. package/foundation/config/project.d.mts +20 -11
  292. package/foundation/config/project.mjs +123 -80
  293. package/foundation/config/project.test.mjs +144 -21
  294. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  295. package/foundation/discovery/authoring-self-docs.mjs +37 -15
  296. package/foundation/discovery/authoring-self-docs.test.mjs +25 -9
  297. package/foundation/discovery/authoring-surface.d.mts +74 -0
  298. package/foundation/discovery/authoring-surface.mjs +525 -0
  299. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  300. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  301. package/foundation/discovery/cli-self-docs.mjs +490 -0
  302. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  303. package/foundation/discovery/component-discovery.d.mts +38 -0
  304. package/foundation/discovery/component-discovery.mjs +48 -0
  305. package/foundation/discovery/component-loader.d.mts +35 -38
  306. package/foundation/discovery/component-loader.mjs +53 -222
  307. package/foundation/discovery/docs-discovery.d.mts +112 -11
  308. package/foundation/discovery/docs-discovery.mjs +231 -36
  309. package/foundation/discovery/docs-discovery.test.mjs +111 -32
  310. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  311. package/foundation/discovery/docs-output-budget.mjs +1 -1
  312. package/foundation/discovery/docs-section-key.d.mts +28 -10
  313. package/foundation/discovery/docs-section-key.mjs +134 -33
  314. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  315. package/foundation/discovery/template-adapter.d.mts +99 -6
  316. package/foundation/discovery/template-adapter.mjs +480 -57
  317. package/foundation/discovery/template-adapter.test.mjs +57 -0
  318. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  319. package/foundation/discovery/template-conflict-release.mjs +40 -0
  320. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  321. package/foundation/discovery/theme-discovery.d.mts +67 -7
  322. package/foundation/discovery/theme-discovery.mjs +916 -186
  323. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  324. package/foundation/doc-compiler/bundle.d.mts +47 -0
  325. package/foundation/doc-compiler/bundle.mjs +278 -0
  326. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  327. package/foundation/doc-compiler/compile.d.mts +220 -39
  328. package/foundation/doc-compiler/compile.mjs +311 -15
  329. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  330. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  331. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  332. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  333. package/foundation/doc-compiler/import.d.mts +24 -0
  334. package/foundation/doc-compiler/import.mjs +59 -0
  335. package/foundation/doc-compiler/inputs.d.mts +102 -0
  336. package/foundation/doc-compiler/inputs.mjs +291 -0
  337. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  338. package/foundation/doc-compiler/ir.d.mts +13 -0
  339. package/foundation/doc-compiler/ir.mjs +196 -12
  340. package/foundation/doc-compiler/lenses.d.mts +8 -5
  341. package/foundation/doc-compiler/lenses.mjs +50 -4
  342. package/foundation/doc-compiler/links.d.mts +162 -0
  343. package/foundation/doc-compiler/links.mjs +294 -0
  344. package/foundation/doc-compiler/links.test.mjs +192 -0
  345. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  346. package/foundation/doc-compiler/overlays.d.mts +37 -0
  347. package/foundation/doc-compiler/overlays.mjs +206 -0
  348. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  349. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  350. package/foundation/doc-compiler/read.d.mts +127 -0
  351. package/foundation/doc-compiler/read.mjs +325 -0
  352. package/foundation/doc-compiler/read.test.mjs +313 -0
  353. package/foundation/doc-compiler/source.d.mts +33 -0
  354. package/foundation/doc-compiler/source.mjs +128 -0
  355. package/foundation/doc-compiler/tree.d.mts +288 -0
  356. package/foundation/doc-compiler/tree.mjs +876 -0
  357. package/foundation/doc-compiler/tree.test.mjs +598 -0
  358. package/foundation/fs/file-protection.d.mts +33 -0
  359. package/foundation/fs/file-protection.mjs +825 -0
  360. package/foundation/fs/file-protection.test.mjs +250 -0
  361. package/foundation/integrations/autolink.d.mts +58 -1
  362. package/foundation/integrations/autolink.mjs +143 -57
  363. package/foundation/integrations/autolink.test.mjs +1 -1
  364. package/foundation/integrations/cli-requirement.d.mts +45 -0
  365. package/foundation/integrations/cli-requirement.mjs +154 -0
  366. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  367. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  368. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  369. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  370. package/foundation/integrations/contribution-inventory.mjs +27 -24
  371. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  372. package/foundation/integrations/integration-warnings.d.mts +9 -2
  373. package/foundation/integrations/integration-warnings.mjs +51 -26
  374. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  375. package/foundation/integrations/integrations.d.mts +3 -0
  376. package/foundation/integrations/integrations.mjs +11 -97
  377. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  378. package/foundation/integrations/provider-resolution.d.mts +152 -0
  379. package/foundation/integrations/provider-resolution.mjs +576 -0
  380. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  381. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  382. package/foundation/integrations/theme-descriptor.mjs +44 -0
  383. package/foundation/integrations/validate-contributions.mjs +121 -29
  384. package/foundation/response/error-codes.d.mts +3 -1
  385. package/foundation/response/error-codes.d.ts +2 -0
  386. package/foundation/response/error-codes.doc.mjs +12 -2
  387. package/foundation/response/error-codes.mjs +7 -1
  388. package/foundation/response/error-codes.test.mjs +55 -11
  389. package/foundation/response/response-types.doc.d.mts +5 -1
  390. package/foundation/response/response-types.doc.mjs +20 -11
  391. package/foundation/response/response.doc.mjs +1 -1
  392. package/foundation/text/string-utils.d.mts +8 -0
  393. package/foundation/text/string-utils.mjs +40 -10
  394. package/foundation/xle/expand.mjs +1 -1
  395. package/foundation/xle/xle.test.mjs +13 -0
  396. package/package.json +10 -9
  397. package/assets/templates/themes/manifest.json +0 -95
@@ -0,0 +1,495 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file lowerDoc, the compiled-node parsers, and diagnostics: every doc kind
5
+ * lowers into one sealed node shape, and every failure has one diagnostic.
6
+ */
7
+
8
+ import {describe, expect, it} from 'vitest';
9
+ import {
10
+ COMPILED_DOC_KINDS,
11
+ COMPILED_DOC_SCHEMA_VERSION,
12
+ lowerDoc,
13
+ } from './compile.mjs';
14
+ import {
15
+ DIAGNOSTIC_CODES,
16
+ diagnostic,
17
+ diagnosticProblem,
18
+ sortDiagnostics,
19
+ } from './diagnostics.mjs';
20
+ import {parseCompiledDocNode, parseCompiledDocsBundle} from './ir.mjs';
21
+
22
+ /**
23
+ * @param {any} doc
24
+ * @param {object} [more]
25
+ * @returns {any}
26
+ */
27
+ const input = (doc, more = {}) => ({
28
+ id: '@acme/kit:components:Card',
29
+ root: 'components',
30
+ provider: '@acme/kit',
31
+ source: '@acme/kit/src/Card.doc.mjs',
32
+ lang: null,
33
+ file: {file: 'Card.doc.mjs', doc},
34
+ ...more,
35
+ });
36
+
37
+ const card = {
38
+ type: 'component',
39
+ name: 'Card',
40
+ displayName: 'Card',
41
+ usage: {description: 'A card.'},
42
+ props: [{name: 'title', type: 'string', description: 'The title.'}],
43
+ };
44
+
45
+ describe('lowerDoc', () => {
46
+ it('lowers each root into its kind, with package provenance and JSON doc', () => {
47
+ const cases = [
48
+ ['components', card, 'component'],
49
+ [
50
+ 'components',
51
+ {name: 'Old', description: 'Legacy.', props: []},
52
+ 'component',
53
+ ],
54
+ [
55
+ 'hooks',
56
+ {
57
+ type: 'function',
58
+ kind: 'hook',
59
+ name: 'useThing',
60
+ displayName: 'useThing',
61
+ description: 'Does a thing.',
62
+ params: [],
63
+ returns: [],
64
+ },
65
+ 'function',
66
+ ],
67
+ [
68
+ 'templates',
69
+ {type: 'page', name: 'Home', description: 'A page.'},
70
+ 'page',
71
+ ],
72
+ [
73
+ 'templates',
74
+ {type: 'block', name: 'Hero', description: 'A block.'},
75
+ 'block',
76
+ ],
77
+ [
78
+ 'themes',
79
+ {
80
+ type: 'theme',
81
+ name: 'ocean',
82
+ displayName: 'Ocean',
83
+ description: 'Blue.',
84
+ maintained: true,
85
+ },
86
+ 'theme',
87
+ ],
88
+ [
89
+ 'self-docs',
90
+ {type: 'enum', name: 'codes', description: 'Codes.', values: []},
91
+ 'enum',
92
+ ],
93
+ ];
94
+ for (const [root, doc, kind] of cases) {
95
+ const {node, diagnostics} = lowerDoc(input(doc, {root}));
96
+ expect({root, kind: node?.kind}).toEqual({root, kind});
97
+ expect(node?.provenance).toEqual({
98
+ provider: '@acme/kit',
99
+ source: '@acme/kit/src/Card.doc.mjs',
100
+ });
101
+ expect(node?.schemaVersion).toBe(COMPILED_DOC_SCHEMA_VERSION);
102
+ expect(() => parseCompiledDocNode(node)).not.toThrow();
103
+ // Legacy and stamped docs parse cleanly; nothing to report.
104
+ expect(diagnostics.filter(d => d.code !== 'invalid_doc')).toEqual([]);
105
+ }
106
+ });
107
+
108
+ it('carries the authored doc as JSON: key order kept, undefined dropped', () => {
109
+ const {node} = lowerDoc(
110
+ input({
111
+ ...card,
112
+ playground: {defaults: {onOpenChange: undefined, size: 'md'}},
113
+ }),
114
+ );
115
+ expect(Object.keys(node?.doc)).toEqual([
116
+ 'type',
117
+ 'name',
118
+ 'displayName',
119
+ 'usage',
120
+ 'props',
121
+ 'playground',
122
+ ]);
123
+ expect(node?.doc.playground).toEqual({defaults: {size: 'md'}});
124
+ });
125
+
126
+ it('lays the translation for the reading language over the doc', () => {
127
+ const {node} = lowerDoc(
128
+ input(card, {
129
+ lang: 'zh',
130
+ file: {
131
+ file: 'Card.doc.mjs',
132
+ doc: card,
133
+ overlay: {
134
+ usage: {description: '卡片。'},
135
+ propDescriptions: {title: '标题。'},
136
+ },
137
+ },
138
+ }),
139
+ );
140
+ expect(node?.lang).toBe('zh');
141
+ expect(node?.doc.usage.description).toBe('卡片。');
142
+ expect(node?.doc.props[0]).toEqual({
143
+ name: 'title',
144
+ type: 'string',
145
+ description: '标题。',
146
+ });
147
+ });
148
+
149
+ it('keeps a doc that fails its parser, and reports why', () => {
150
+ const {node, diagnostics, failure} = lowerDoc(
151
+ input({type: 'component', name: 'Card'}),
152
+ );
153
+ expect(node?.doc).toEqual({type: 'component', name: 'Card'});
154
+ expect(diagnostics.map(d => d.code)).toEqual(['invalid_doc']);
155
+ expect(failure).toBeInstanceOf(Error);
156
+ expect(diagnostics[0].message).toBe(/** @type {Error} */ (failure).message);
157
+ });
158
+
159
+ it("keeps a doc of another kind, in its root's kind, and names the mismatch", () => {
160
+ const {node, diagnostics} = lowerDoc(
161
+ input({type: 'page', name: 'Home', description: 'A page.'}),
162
+ );
163
+ expect(node?.kind).toBe('component');
164
+ expect(diagnostics.map(d => d.code)).toEqual(['wrong_kind']);
165
+ });
166
+
167
+ it('yields no node, and records what failed, when the file cannot be read', () => {
168
+ const thrown = new SyntaxError('Unexpected token');
169
+ const loaded = lowerDoc(
170
+ input(card, {file: {file: 'Card.doc.mjs', error: thrown}}),
171
+ );
172
+ expect(loaded.node).toBeNull();
173
+ expect(loaded.loadFailure).toBe(thrown);
174
+ expect(loaded.diagnostics.map(d => d.code)).toEqual(['load_failed']);
175
+ const empty = lowerDoc(
176
+ input(card, {file: {file: 'Card.doc.mjs', doc: null}}),
177
+ );
178
+ expect(empty).toMatchObject({
179
+ node: null,
180
+ missing: true,
181
+ missingValue: null,
182
+ });
183
+ expect(empty.diagnostics.map(d => d.code)).toEqual(['missing_export']);
184
+ const overlaid = lowerDoc(
185
+ input(card, {
186
+ file: {file: 'Card.doc.mjs', doc: card, overlayError: thrown},
187
+ }),
188
+ );
189
+ expect(overlaid).toMatchObject({node: null, overlayFailure: thrown});
190
+ expect(overlaid.view).toBeUndefined();
191
+ expect(overlaid.diagnostics.map(d => d.code)).toEqual(['overlay_failed']);
192
+ });
193
+
194
+ it('keeps the parse failure first when the translation also breaks', () => {
195
+ const {failure, overlayFailure, diagnostics} = lowerDoc(
196
+ input(
197
+ {type: 'component', name: 'Card'},
198
+ {
199
+ lang: 'zh',
200
+ file: {
201
+ file: 'Card.doc.mjs',
202
+ doc: {type: 'component', name: 'Card'},
203
+ overlay: {
204
+ get props() {
205
+ throw new TypeError('bad translation');
206
+ },
207
+ },
208
+ },
209
+ },
210
+ ),
211
+ );
212
+ expect(/** @type {Error} */ (failure).message).toMatch(
213
+ /Card\.doc\.mjs is invalid/,
214
+ );
215
+ expect(overlayFailure).toBeInstanceOf(TypeError);
216
+ expect(diagnostics.map(d => d.code)).toEqual([
217
+ 'invalid_doc',
218
+ 'overlay_failed',
219
+ ]);
220
+ });
221
+
222
+ it('refuses a theme descriptor outside the themes root, as readers always did', () => {
223
+ const theme = {
224
+ type: 'theme',
225
+ name: 'ocean',
226
+ displayName: 'Ocean',
227
+ description: 'd',
228
+ maintained: true,
229
+ };
230
+ for (const root of ['components', 'hooks', 'self-docs']) {
231
+ const {failure} = lowerDoc(
232
+ input(theme, {root, label: '/x/Ocean.doc.mjs'}),
233
+ );
234
+ expect(/** @type {Error} */ (failure).message).toBe(
235
+ '/x/Ocean.doc.mjs has unsupported type "theme".',
236
+ );
237
+ }
238
+ });
239
+
240
+ it('hands readers the authored value, and only the node goes through JSON', () => {
241
+ const cyclic = /** @type {any} */ ({
242
+ ...card,
243
+ big: 10n,
244
+ when: new Date(0),
245
+ fn() {},
246
+ });
247
+ cyclic.self = cyclic;
248
+ cyclic.gone = undefined;
249
+ const {view, node, diagnostics} = lowerDoc(input(cyclic));
250
+ expect(view).toBe(cyclic);
251
+ expect(node).toBeNull();
252
+ expect(diagnostics.at(-1)?.code).toBe('not_json');
253
+ expect(diagnostics.at(-1)?.message).not.toMatch(/^\//);
254
+ const read = lowerDoc(input(cyclic), {check: false, node: false});
255
+ expect(read).toEqual({node: null, diagnostics: [], view: cyclic});
256
+ });
257
+
258
+ it('never puts a machine path in a diagnostic', () => {
259
+ const {diagnostics} = lowerDoc(
260
+ input(
261
+ {type: 'component', name: 'Card'},
262
+ {label: '/home/someone/kit/Card.doc.mjs'},
263
+ ),
264
+ );
265
+ expect(diagnostics[0].message).not.toContain('/home/someone');
266
+ });
267
+
268
+ it('refuses a value JSON cannot hold', () => {
269
+ const cyclic = /** @type {any} */ ({...card});
270
+ cyclic.self = cyclic;
271
+ for (const doc of [cyclic, {...card, big: 1n}]) {
272
+ const {node, diagnostics} = lowerDoc(input(doc));
273
+ expect(node).toBeNull();
274
+ expect(diagnostics.at(-1)?.code).toBe('not_json');
275
+ }
276
+ });
277
+
278
+ it("carries the parser's result only when asked to", () => {
279
+ const block = {
280
+ type: 'block',
281
+ name: 'Hero',
282
+ description: 'A block.',
283
+ extra: 1,
284
+ };
285
+ const authored = lowerDoc(input(block, {root: 'templates'}));
286
+ const parsed = lowerDoc(input(block, {root: 'templates', useParsed: true}));
287
+ expect(authored.node?.doc.extra).toBe(1);
288
+ expect(parsed.node?.doc).toEqual(
289
+ expect.objectContaining({type: 'block', name: 'Hero'}),
290
+ );
291
+ });
292
+ });
293
+
294
+ describe('diagnostics', () => {
295
+ it('fixes phase, severity, scope, and remediation per code', () => {
296
+ for (const [code, rule] of Object.entries(DIAGNOSTIC_CODES)) {
297
+ const d = diagnostic(code, {message: 'x'});
298
+ expect(d).toEqual({
299
+ code,
300
+ phase: rule.phase,
301
+ severity: rule.severity,
302
+ scope: rule.scope,
303
+ provider: null,
304
+ source: null,
305
+ field: null,
306
+ message: 'x',
307
+ remediation: rule.remediation,
308
+ });
309
+ expect(diagnosticProblem(d)).toBeNull();
310
+ }
311
+ expect(() => diagnostic('nope', {message: 'x'})).toThrow(/Unknown/);
312
+ for (const name of [
313
+ 'toString',
314
+ 'constructor',
315
+ '__proto__',
316
+ 'hasOwnProperty',
317
+ ]) {
318
+ expect(() => diagnostic(name, {message: 'x'})).toThrow(/Unknown/);
319
+ expect(
320
+ diagnosticProblem({
321
+ ...diagnostic('invalid_doc', {message: 'x'}),
322
+ code: name,
323
+ }),
324
+ ).toMatch(/not a compiler diagnostic code/);
325
+ }
326
+ });
327
+
328
+ it('rejects a diagnostic a reader reinterpreted', () => {
329
+ const d = diagnostic('invalid_doc', {message: 'x'});
330
+ expect(diagnosticProblem({...d, severity: 'warning'})).toMatch(
331
+ /always has severity/,
332
+ );
333
+ expect(diagnosticProblem({...d, code: 'made_up'})).toMatch(
334
+ /not a compiler diagnostic code/,
335
+ );
336
+ expect(diagnosticProblem({...d, extra: 1})).toMatch(/unknown fields/);
337
+ expect(diagnosticProblem({...d, source: ''})).toMatch(/source/);
338
+ for (const source of [
339
+ '/tmp/x/Card.doc.mjs',
340
+ 'C:\\x\\Card.doc.mjs',
341
+ '@acme/kit/../x',
342
+ ]) {
343
+ expect(diagnosticProblem({...d, source})).toMatch(
344
+ /not a location on one machine/,
345
+ );
346
+ }
347
+ });
348
+
349
+ it('sorts by source, then phase, code, field, and message', () => {
350
+ const at = (
351
+ /** @type {string} */ code,
352
+ /** @type {string|null} */ source,
353
+ field = null,
354
+ ) => diagnostic(code, {source, field, message: `${code} ${field}`});
355
+ const list = [
356
+ at('unresolved_reference', 'b/x', 'sections.b'),
357
+ at('invalid_doc', 'b/x'),
358
+ at('load_failed', 'b/x'),
359
+ at('unresolved_reference', 'b/x', 'sections.a'),
360
+ at('invalid_doc', null),
361
+ at('duplicate_id', 'a/x'),
362
+ ];
363
+ const sorted = sortDiagnostics(list);
364
+ expect(sorted.map(d => `${d.source}:${d.code}:${d.field}`)).toEqual([
365
+ 'a/x:duplicate_id:null',
366
+ 'b/x:load_failed:null',
367
+ 'b/x:invalid_doc:null',
368
+ 'b/x:unresolved_reference:sections.a',
369
+ 'b/x:unresolved_reference:sections.b',
370
+ 'null:invalid_doc:null',
371
+ ]);
372
+ expect(sortDiagnostics([...list].reverse())).toEqual(sorted);
373
+ });
374
+ });
375
+
376
+ describe('parseCompiledDocNode and parseCompiledDocsBundle', () => {
377
+ const node = () =>
378
+ /** @type {any} */ (structuredClone(lowerDoc(input(card)).node));
379
+ const bundle = () => ({
380
+ schemaVersion: COMPILED_DOC_SCHEMA_VERSION,
381
+ lang: null,
382
+ nodes: [node()],
383
+ diagnostics: [diagnostic('unresolved_reference', {message: 'x'})],
384
+ });
385
+
386
+ it('accepts a node of every kind and a bundle, as given', () => {
387
+ const value = bundle();
388
+ expect(parseCompiledDocsBundle(value)).toBe(value);
389
+ expect(COMPILED_DOC_KINDS).toHaveLength(10);
390
+ // A namespace doc, which the docs tree reads, lowers to a node too.
391
+ const namespace = {...node(), kind: 'namespace'};
392
+ expect(parseCompiledDocNode(namespace)).toBe(namespace);
393
+ });
394
+
395
+ it('names schema skew with its own diagnostic, before anything else', () => {
396
+ for (const parse of [parseCompiledDocNode, parseCompiledDocsBundle]) {
397
+ try {
398
+ parse({schemaVersion: 99, nope: true});
399
+ throw new Error('expected a throw');
400
+ } catch (error) {
401
+ expect(/** @type {any} */ (error).message).toMatch(
402
+ /schema version 99 is not supported/,
403
+ );
404
+ expect(/** @type {any} */ (error).diagnostic.code).toBe(
405
+ 'unsupported_schema',
406
+ );
407
+ }
408
+ }
409
+ });
410
+
411
+ it.each([
412
+ [
413
+ 'an unknown field',
414
+ (/** @type {any} */ n) => (n.extra = 1),
415
+ /unknown fields: extra/,
416
+ ],
417
+ [
418
+ 'an unknown kind',
419
+ (/** @type {any} */ n) => (n.kind = 'workflow'),
420
+ /not a compiled doc kind/,
421
+ ],
422
+ [
423
+ 'a machine path as provider',
424
+ (/** @type {any} */ n) => (n.provenance.provider = '/home/x'),
425
+ /not a machine path/,
426
+ ],
427
+ [
428
+ 'a machine path as source',
429
+ (/** @type {any} */ n) => (n.provenance.source = 'C:\\x\\Card.doc.mjs'),
430
+ /not a machine path/,
431
+ ],
432
+ [
433
+ 'a source that climbs out of its package',
434
+ (/** @type {any} */ n) => (n.provenance.source = '@acme/kit/../x'),
435
+ /not a machine path/,
436
+ ],
437
+ [
438
+ 'a stage other than lowered',
439
+ (/** @type {any} */ n) => (n.stage = 'linked'),
440
+ /stage/,
441
+ ],
442
+ [
443
+ 'a doc without a name',
444
+ (/** @type {any} */ n) => delete n.doc.name,
445
+ /doc with a name/,
446
+ ],
447
+ [
448
+ 'a page node without a page doc',
449
+ (/** @type {any} */ n) => {
450
+ n.kind = 'page';
451
+ n.doc.type = 'block';
452
+ },
453
+ /a page node holds a page doc/,
454
+ ],
455
+ [
456
+ 'a function in the doc',
457
+ (/** @type {any} */ n) => (n.doc.render = () => null),
458
+ /is not JSON/,
459
+ ],
460
+ [
461
+ 'undefined in the doc',
462
+ (/** @type {any} */ n) => (n.doc.gone = undefined),
463
+ /undefined is not JSON/,
464
+ ],
465
+ ])('rejects %s', (_name, mutate, message) => {
466
+ const value = node();
467
+ mutate(value);
468
+ expect(() => parseCompiledDocNode(value)).toThrow(message);
469
+ try {
470
+ parseCompiledDocNode(value);
471
+ } catch (error) {
472
+ expect(/** @type {any} */ (error).diagnostic.code).toBe('invalid_bundle');
473
+ }
474
+ });
475
+
476
+ it('rejects a bundle with a duplicate id, a bad node, or a reinterpreted diagnostic', () => {
477
+ const twice = bundle();
478
+ twice.nodes.push(node());
479
+ expect(() => parseCompiledDocsBundle(twice)).toThrow(/appears twice/);
480
+ const bad = bundle();
481
+ bad.nodes[0].kind = 'nope';
482
+ expect(() => parseCompiledDocsBundle(bad)).toThrow(/nodes\[0\]\.kind/);
483
+ const reinterpreted = bundle();
484
+ reinterpreted.diagnostics[0] = {
485
+ ...reinterpreted.diagnostics[0],
486
+ severity: 'error',
487
+ };
488
+ expect(() => parseCompiledDocsBundle(reinterpreted)).toThrow(
489
+ /diagnostics\[0\]/,
490
+ );
491
+ expect(() => parseCompiledDocsBundle({...bundle(), extra: 1})).toThrow(
492
+ /unknown fields/,
493
+ );
494
+ });
495
+ });
@@ -0,0 +1,37 @@
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
+ /**
5
+ * @file Translation overlays for component and hook docs.
6
+ *
7
+ * @input An authored component or hook doc and the translation its module
8
+ * exports for the reading language (`docsZh`, `docsDense`).
9
+ * @output The doc in that language: translated text laid over the authored
10
+ * doc, never dropping a prop, param, or field the translation has not
11
+ * caught up with.
12
+ * @position Used by ./compile.mjs when it lowers a component or hook doc, so
13
+ * every reader sees one overlay rule. Reference topics overlay by section in
14
+ * ./compile.mjs instead.
15
+ */
16
+ /**
17
+ * The translation a doc module exports for `lang`, or null.
18
+ * @param {Record<string, any>} mod
19
+ * @param {string | null} lang
20
+ * @returns {any}
21
+ */
22
+ export function translationFor(mod: Record<string, any>, lang: string | null): any;
23
+ /**
24
+ * Lay a translation over an authored component or hook doc. A translation
25
+ * that carries props is a full translated doc, overlaid prop by prop; any other
26
+ * is a set of translated strings merged onto the doc.
27
+ * @param {any} docs
28
+ * @param {any} translation
29
+ * @returns {any}
30
+ */
31
+ export function overlayAuthoredDoc(docs: any, translation: any): any;
32
+ /**
33
+ * @param {any} docs
34
+ * @param {any} translation
35
+ * @returns {any}
36
+ */
37
+ export function mergeTranslation(docs: any, translation: any): any;