@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
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file Doc compiler — authored reference topics in, compiled nodes out.
4
+ * @file Doc compiler — authored docs in, compiled nodes out.
5
5
  *
6
6
  * @input A {@link ReferenceTopicInput}: one topic's own file and the files of
7
7
  * the extensions merged onto it, each already through the authored-doc parser
@@ -16,21 +16,70 @@
16
16
  * JSON form, the one `--json` output has always shown.
17
17
  * @position The one step between authored docs and every docs reader. The docs
18
18
  * API, doctor and search read compiled nodes, and ./lenses.mjs turns them into
19
- * response shapes. Internal to the CLI: the public way in is `docs()`.
19
+ * response shapes. Every other doc kind (components, hooks, templates, themes,
20
+ * and the CLI's self-docs) lowers through {@link lowerDoc}, which ./read.mjs
21
+ * feeds. Internal to the CLI: the public way in is the docs API.
20
22
  */
21
23
 
24
+ import {parseTemplate} from '../../authoring/doctypes/template/parse.mjs';
25
+ import {parseTheme} from '../../authoring/doctypes/theme/parse.mjs';
22
26
  import {mergeTopic, problemsInTopic} from '../discovery/docs-discovery.mjs';
23
27
  import {
24
28
  sectionKey,
25
- sectionKeyProblems,
29
+ sectionKeyErrors,
26
30
  sourceTitle,
27
31
  withSectionKeys,
28
32
  withSourceTitle,
29
33
  } from '../discovery/docs-section-key.mjs';
34
+ import {diagnostic as rawDiagnostic} from './diagnostics.mjs';
35
+ import {scrubPaths} from './source.mjs';
36
+ import {overlayAuthoredDoc} from './overlays.mjs';
37
+ import {parseReadableDoc} from './parse-readable.mjs';
38
+
39
+ /**
40
+ * A compiler diagnostic whose message names files by package, never by their
41
+ * location on this machine.
42
+ * @param {string} code
43
+ * @param {Parameters<typeof rawDiagnostic>[1]} at
44
+ */
45
+ function diagnostic(code, at) {
46
+ return rawDiagnostic(code, {
47
+ ...at,
48
+ message: scrubPaths(at.message) || '(the error had no message)',
49
+ });
50
+ }
30
51
 
31
52
  /** Bumped whenever the shape of a compiled node changes. */
32
53
  export const COMPILED_DOC_SCHEMA_VERSION = 1;
33
54
 
55
+ /** Every kind a compiled node has: one per authored doc kind a root reads. */
56
+ export const COMPILED_DOC_KINDS = /** @type {const} */ ([
57
+ 'component',
58
+ 'function',
59
+ 'reference',
60
+ 'page',
61
+ 'block',
62
+ 'schema',
63
+ 'command',
64
+ 'enum',
65
+ 'theme',
66
+ 'namespace',
67
+ ]);
68
+
69
+ /**
70
+ * The roots that read docs, and the kinds each may hold. A doc without a
71
+ * stamped `type` (the legacy form) takes its root's first kind.
72
+ * @type {Readonly<Record<string, readonly string[]>>}
73
+ */
74
+ export const ROOT_KINDS = Object.freeze({
75
+ components: ['component'],
76
+ hooks: ['function'],
77
+ templates: ['page', 'block'],
78
+ themes: ['theme'],
79
+ 'self-docs': ['command', 'function', 'schema', 'enum'],
80
+ tree: ['namespace', 'generic'],
81
+ });
82
+
34
83
  /**
35
84
  * One authored file, as discovery loaded it.
36
85
  * @typedef {object} AuthoredFile
@@ -47,8 +96,14 @@ export const COMPILED_DOC_SCHEMA_VERSION = 1;
47
96
  * @property {string} provider the package that owns the topic
48
97
  * @property {string | null} replaces the topic it took the place of
49
98
  * @property {string | null} lang the overlay language, or null for authored text
99
+ * @property {string} [providerId] the owner's provider id; the package name
100
+ * when absent. The base file's sections resolve their links against it.
50
101
  * @property {AuthoredFile} base
51
- * @property {Array<AuthoredFile & {provider: string}>} extensions in merge order
102
+ * @property {Array<AuthoredFile & {provider: string, providerId?: string}>} extensions
103
+ * in merge order; each extension's sections resolve their links against its
104
+ * own provider id
105
+ * @property {boolean} [tree] a guide the docs tree places: its `placement` is
106
+ * read by the tree, so the topic reader accepts it
52
107
  */
53
108
 
54
109
  /**
@@ -69,10 +124,33 @@ export const COMPILED_DOC_SCHEMA_VERSION = 1;
69
124
  * @property {string | null} lang
70
125
  * @property {{provider: string, replaces: string | null, extensions: string[]}} provenance
71
126
  * @property {Record<string, string>} sourceTitles section key -> authored title
127
+ * @property {Record<string, string>} sectionProviders section key -> the
128
+ * provider id that wrote the section: a topic merges sections from its base
129
+ * and its extensions, and each section's links resolve against its own
130
+ * provider (spec:AST-047 FR9)
72
131
  * @property {any} doc the topic: authored fields in authored order, every
73
132
  * section keyed; a linked node's token references carry `resolved`
74
133
  */
75
134
 
135
+ /** Which provider wrote a section, until lowering records it by key. */
136
+ const SECTION_PROVIDER = Symbol('astryx.docs.sectionProvider');
137
+
138
+ /**
139
+ * Mark each section of one authored file with the provider that wrote it. The
140
+ * overlay, the merge, and the key stamp copy the mark with the section.
141
+ * @param {any} doc
142
+ * @param {string} provider
143
+ * @returns {any}
144
+ */
145
+ function markProvider(doc, provider) {
146
+ return {
147
+ ...doc,
148
+ sections: doc.sections.map((/** @type {any} */ section) =>
149
+ withSourceTitle({...section, [SECTION_PROVIDER]: provider}, sourceTitle(section)),
150
+ ),
151
+ };
152
+ }
153
+
76
154
  /**
77
155
  * Lower one topic: overlay each file, merge the extensions in order, and stamp
78
156
  * every section with its key.
@@ -80,14 +158,24 @@ export const COMPILED_DOC_SCHEMA_VERSION = 1;
80
158
  * @returns {CompiledReferenceNode}
81
159
  */
82
160
  export function lowerReferenceTopic(input) {
83
- let doc = readAuthoredFile(input.base);
161
+ let doc = markProvider(
162
+ readAuthoredFile(input.base, {placement: input.tree === true}),
163
+ input.providerId ?? input.provider,
164
+ );
84
165
  for (const extension of input.extensions) {
85
- doc = mergeTopic(doc, readAuthoredFile(extension));
86
- // Merging matches on keys, so this holds unless merge itself regresses.
87
- const problems = sectionKeyProblems(doc.sections);
166
+ doc = mergeTopic(
167
+ doc,
168
+ markProvider(
169
+ readAuthoredFile(extension),
170
+ extension.providerId ?? extension.provider,
171
+ ),
172
+ );
173
+ // Explicit authored IDs remain strict. Legacy title-derived collisions are
174
+ // assigned deterministic compatibility keys after every extension merges.
175
+ const problems = sectionKeyErrors(doc.sections);
88
176
  if (problems.length > 0) {
89
177
  throw new Error(
90
- `${extension.file}, extending ${input.id}, leaves two sections with one key: ${problems.join('; ')}`,
178
+ `${extension.file}, extending ${input.id}, leaves duplicate authored section IDs: ${problems.join('; ')}`,
91
179
  );
92
180
  }
93
181
  }
@@ -95,8 +183,12 @@ export function lowerReferenceTopic(input) {
95
183
  const keyed = withSectionKeys(doc);
96
184
  /** @type {Record<string, string>} */
97
185
  const sourceTitles = {};
186
+ /** @type {Record<string, string>} */
187
+ const sectionProviders = {};
98
188
  for (const section of keyed.sections) {
99
189
  sourceTitles[section.id] = sourceTitle(section);
190
+ sectionProviders[section.id] =
191
+ section[SECTION_PROVIDER] ?? input.providerId ?? input.provider;
100
192
  }
101
193
  return {
102
194
  schemaVersion: COMPILED_DOC_SCHEMA_VERSION,
@@ -110,7 +202,9 @@ export function lowerReferenceTopic(input) {
110
202
  extensions: input.extensions.map(extension => extension.provider),
111
203
  },
112
204
  sourceTitles,
113
- // The authored title travels in sourceTitles; JSON drops the symbol.
205
+ sectionProviders,
206
+ // The authored title and provider travel in sourceTitles and
207
+ // sectionProviders; JSON drops the symbols.
114
208
  doc: asJson(keyed, input.id),
115
209
  };
116
210
  }
@@ -191,9 +285,12 @@ function asJson(value, topic) {
191
285
  try {
192
286
  return JSON.parse(JSON.stringify(value));
193
287
  } catch (err) {
194
- throw new Error(
195
- `${topic} cannot be compiled: ${err instanceof Error ? err.message : String(err)}`,
196
- {cause: err},
288
+ throw Object.assign(
289
+ new Error(
290
+ `${topic} cannot be compiled: ${err instanceof Error ? err.message : String(err)}`,
291
+ {cause: err},
292
+ ),
293
+ {compilerCode: 'not_json'},
197
294
  );
198
295
  }
199
296
  }
@@ -204,13 +301,13 @@ function asJson(value, topic) {
204
301
  * @param {AuthoredFile} file
205
302
  * @returns {any}
206
303
  */
207
- function readAuthoredFile(file) {
304
+ function readAuthoredFile(file, {placement = false} = {}) {
208
305
  if ('error' in file) throw file.error;
209
306
  const parsed = file.doc;
210
307
  if (!('sections' in parsed)) {
211
308
  throw new Error(`${file.file} is not a reference document.`);
212
309
  }
213
- const problems = problemsInTopic(parsed);
310
+ const problems = problemsInTopic(parsed, {placement});
214
311
  if (problems.length > 0) {
215
312
  throw new Error(`${file.file} is invalid: ${problems.join('; ')}`);
216
313
  }
@@ -260,3 +357,202 @@ function applyOverlay(docs, translation) {
260
357
  }),
261
358
  };
262
359
  }
360
+
361
+ /**
362
+ * @typedef {import('./diagnostics.mjs').CompilerDiagnostic} CompilerDiagnostic
363
+ */
364
+
365
+ /**
366
+ * One authored doc of any kind but a reference topic, as its root loaded it.
367
+ * @typedef {object} DocFileInput
368
+ * @property {string} id the input's id: provider, root, and name
369
+ * @property {keyof typeof ROOT_KINDS} root
370
+ * @property {string} provider the package that contributes it
371
+ * @property {string} source `<package>/<path>` of the file
372
+ * @property {string | null} lang the overlay language, or null
373
+ * @property {AuthoredFile} file `doc` is the authored export, not a parse
374
+ * result; `overlay` is the translation the module exports for `lang`
375
+ * @property {string} [label] how a parse error names the file (default: its
376
+ * file name)
377
+ * @property {boolean} [useParsed] carry the parser's result instead of the
378
+ * authored export, for a reader that has always read the checked value
379
+ */
380
+
381
+ /**
382
+ * The parser that checks a root's docs. Templates and themes have their own;
383
+ * every other root dispatches on the stamped type.
384
+ * @param {string} root
385
+ * @returns {(input: unknown, label?: string) => any}
386
+ */
387
+ export function parserFor(root) {
388
+ if (root === 'themes') return parseTheme;
389
+ if (root === 'templates') return parseTemplate;
390
+ return parseReadableDoc;
391
+ }
392
+
393
+ /**
394
+ * A compiled node for any kind but a reference topic.
395
+ * @typedef {object} CompiledDocNode
396
+ * @property {number} schemaVersion
397
+ * @property {Exclude<typeof COMPILED_DOC_KINDS[number], 'reference'>} kind
398
+ * @property {'lowered'} stage
399
+ * @property {string} id
400
+ * @property {string | null} lang
401
+ * @property {{provider: string, source: string}} provenance
402
+ * @property {any} doc the authored doc, overlaid for `lang`, as JSON carries
403
+ * it: key order kept, `undefined` and functions dropped
404
+ */
405
+
406
+ /**
407
+ * The result of lowering one doc.
408
+ *
409
+ * `view` is the doc as readers have always read it: the authored export (or,
410
+ * where a reader has always read it, the parser's result), with its
411
+ * translation laid over it, not copied and not converted. Readers print from
412
+ * the view, so nothing they print depends on JSON. `node` is the sealed,
413
+ * JSON-only form a whole-project compile collects.
414
+ *
415
+ * @typedef {object} LoweredDoc
416
+ * @property {any} [view] absent when the file could not be read
417
+ * @property {CompiledDocNode | null} node null when not asked for, or when a
418
+ * problem is fatal to the node
419
+ * @property {CompilerDiagnostic[]} diagnostics
420
+ * @property {boolean} [loadFailed] importing the file threw
421
+ * @property {unknown} [loadFailure] what importing the file threw (any value,
422
+ * `undefined` included)
423
+ * @property {boolean} [missing] the file exports no doc
424
+ * @property {null | undefined} [missingValue] the empty export, as the reader
425
+ * picked it
426
+ * @property {boolean} [failed] the kind's parser threw
427
+ * @property {unknown} [failure] what the kind's parser threw
428
+ * @property {boolean} [overlayFailed] laying the translation over threw
429
+ * @property {unknown} [overlayFailure] what laying the translation over threw
430
+ */
431
+
432
+ /**
433
+ * Lower one doc of any kind but a reference topic.
434
+ *
435
+ * With `check`, the doc is held to its kind's parser, and a failure is
436
+ * recorded, not fatal: readers that never checked docs keep reading it, and a
437
+ * checked reader turns it into the error it has always thrown. A doc stamped
438
+ * with a kind its root does not read keeps its root's kind and carries a
439
+ * `wrong_kind` diagnostic. With `node`, the view is also carried as JSON; a
440
+ * value JSON cannot hold withdraws the node, never the view.
441
+ *
442
+ * @param {DocFileInput} input
443
+ * @param {{check?: boolean, node?: boolean}} [options]
444
+ * @returns {LoweredDoc}
445
+ */
446
+ export function lowerDoc(input, {check = true, node: wantNode = true} = {}) {
447
+ const {file} = input;
448
+ const at = {provider: input.provider, source: input.source};
449
+ /** @type {CompilerDiagnostic[]} */
450
+ const diagnostics = [];
451
+ if ('error' in file) {
452
+ diagnostics.push(
453
+ diagnostic('load_failed', {
454
+ ...at,
455
+ message: `${file.file} could not be loaded: ${messageOf(file.error)}`,
456
+ }),
457
+ );
458
+ return {node: null, diagnostics, loadFailed: true, loadFailure: file.error};
459
+ }
460
+ if (file.doc == null) {
461
+ diagnostics.push(
462
+ diagnostic('missing_export', {
463
+ ...at,
464
+ message: `${file.file} exports no doc.`,
465
+ }),
466
+ );
467
+ return {node: null, diagnostics, missing: true, missingValue: file.doc};
468
+ }
469
+ const allowed = ROOT_KINDS[input.root];
470
+ if (!allowed) throw new Error(`No doc root is named "${input.root}".`);
471
+ const stamped =
472
+ typeof file.doc === 'object' && 'type' in file.doc
473
+ ? file.doc.type
474
+ : undefined;
475
+ const kindFits = stamped === undefined || allowed.includes(stamped);
476
+ if (!kindFits) {
477
+ diagnostics.push(
478
+ diagnostic('wrong_kind', {
479
+ ...at,
480
+ message: `${file.file} is stamped type ${JSON.stringify(stamped)}, which the ${input.root} root does not read (it reads ${allowed.join(', ')}).`,
481
+ }),
482
+ );
483
+ }
484
+ /** @type {LoweredDoc} */
485
+ const result = {node: null, diagnostics};
486
+ let view = file.doc;
487
+ // A theme descriptor is read statically; its parse result is the doc.
488
+ if (check || input.root === 'themes') {
489
+ try {
490
+ const parsed = parserFor(input.root)(file.doc, input.label ?? file.file);
491
+ if (input.useParsed || input.root === 'themes') view = parsed;
492
+ } catch (error) {
493
+ result.failed = true;
494
+ result.failure = error;
495
+ diagnostics.push(
496
+ diagnostic('invalid_doc', {...at, message: messageOf(error)}),
497
+ );
498
+ }
499
+ }
500
+ if ('overlayError' in file) {
501
+ result.overlayFailed = true;
502
+ result.overlayFailure = file.overlayError;
503
+ } else if (file.overlay) {
504
+ try {
505
+ view = overlayAuthoredDoc(view, file.overlay);
506
+ } catch (error) {
507
+ result.overlayFailed = true;
508
+ result.overlayFailure = error;
509
+ }
510
+ }
511
+ if (result.overlayFailed) {
512
+ diagnostics.push(
513
+ diagnostic('overlay_failed', {
514
+ ...at,
515
+ message: `${file.file}'s translation could not be applied: ${messageOf(result.overlayFailure)}`,
516
+ }),
517
+ );
518
+ return result;
519
+ }
520
+ result.view = view;
521
+ if (!wantNode) return result;
522
+ let json;
523
+ try {
524
+ const text = JSON.stringify(view);
525
+ if (text === undefined) throw new TypeError('the doc is not a JSON value');
526
+ json = JSON.parse(text);
527
+ } catch (error) {
528
+ diagnostics.push(
529
+ diagnostic('not_json', {
530
+ ...at,
531
+ message: `${file.file} cannot be compiled: ${messageOf(error)}`,
532
+ }),
533
+ );
534
+ return result;
535
+ }
536
+ result.node = {
537
+ schemaVersion: COMPILED_DOC_SCHEMA_VERSION,
538
+ kind: /** @type {CompiledDocNode['kind']} */ (
539
+ kindFits && stamped !== undefined ? stamped : allowed[0]
540
+ ),
541
+ stage: 'lowered',
542
+ id: input.id,
543
+ lang: input.lang,
544
+ provenance: {provider: input.provider, source: input.source},
545
+ doc: json,
546
+ };
547
+ return result;
548
+ }
549
+
550
+ /** @param {unknown} error */
551
+ function messageOf(error) {
552
+ // Any value can be thrown; describing one must never throw in its place.
553
+ try {
554
+ return error instanceof Error ? String(error.message) : String(error);
555
+ } catch {
556
+ return Object.prototype.toString.call(error);
557
+ }
558
+ }
@@ -0,0 +1,126 @@
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
+ * @param {string} code
6
+ * @param {object} at
7
+ * @param {string | null} [at.provider]
8
+ * @param {string | null} [at.source]
9
+ * @param {string | null} [at.field]
10
+ * @param {string} at.message
11
+ * @returns {CompilerDiagnostic}
12
+ */
13
+ export function diagnostic(code: string, { provider, source, field, message }: {
14
+ provider?: string | null | undefined;
15
+ source?: string | null | undefined;
16
+ field?: string | null | undefined;
17
+ message: string;
18
+ }): CompilerDiagnostic;
19
+ /**
20
+ * Diagnostics in one order, whatever order the phases found them in: by
21
+ * source, then phase, then code, field, and message.
22
+ * @param {CompilerDiagnostic[]} list
23
+ * @returns {CompilerDiagnostic[]} a new array
24
+ */
25
+ export function sortDiagnostics(list: CompilerDiagnostic[]): CompilerDiagnostic[];
26
+ /**
27
+ * What is wrong with a value that claims to be a diagnostic, or null. A known
28
+ * code must carry its own phase, severity, scope, and remediation: a reader
29
+ * never reinterprets them.
30
+ * @param {unknown} value
31
+ * @returns {string | null}
32
+ */
33
+ export function diagnosticProblem(value: unknown): string | null;
34
+ /**
35
+ * A `<package>/<path>` that names no location on one machine: not absolute,
36
+ * no drive letter or URL scheme, no backslash, no `..` segment.
37
+ * @param {string} source
38
+ * @returns {boolean}
39
+ */
40
+ export function isPortableSource(source: string): boolean;
41
+ /**
42
+ * @file Compiler diagnostics — one shape for every problem the doc compiler
43
+ * finds.
44
+ *
45
+ * @input A diagnostic code, the package and file it concerns, and a message.
46
+ * @output A plain-JSON diagnostic: a stable code, the phase that found it,
47
+ * severity, provider, source, field, message, remediation, and the scope of
48
+ * what it invalidates. Lists sort into one deterministic order.
49
+ * @position Shared by every compiler phase: listing inputs, loading, parsing,
50
+ * overlaying, lowering, linking, serializing, and reading a bundle back. A
51
+ * code fixes its phase, severity, scope, and remediation, so no phase or
52
+ * reader can report the same problem two ways or downgrade it.
53
+ */
54
+ /** Compiler phases, in the order a descriptor passes through them. */
55
+ export const DIAGNOSTIC_PHASES: readonly ["discover", "load", "parse", "overlay", "lower", "link", "serialize", "bundle"];
56
+ /**
57
+ * What a failure invalidates: the one node it concerns, or the whole
58
+ * compilation (a bundle that cannot be read at all).
59
+ * @typedef {'node' | 'compilation'} DiagnosticScope
60
+ */
61
+ /**
62
+ * @typedef {typeof DIAGNOSTIC_PHASES[number]} DiagnosticPhase
63
+ * @typedef {'error' | 'warning'} DiagnosticSeverity
64
+ */
65
+ /**
66
+ * @typedef {object} CompilerDiagnostic
67
+ * @property {string} code stable; one of {@link DIAGNOSTIC_CODES}
68
+ * @property {DiagnosticPhase} phase
69
+ * @property {DiagnosticSeverity} severity
70
+ * @property {DiagnosticScope} scope
71
+ * @property {string | null} provider the package the problem is in
72
+ * @property {string | null} source `<package>/<path>` of the file, never a
73
+ * machine path
74
+ * @property {string | null} field the field or reference at fault, when known
75
+ * @property {string} message
76
+ * @property {string} remediation what to do about it
77
+ */
78
+ /**
79
+ * @typedef {object} DiagnosticRule
80
+ * @property {DiagnosticPhase} phase
81
+ * @property {DiagnosticSeverity} severity
82
+ * @property {DiagnosticScope} scope
83
+ * @property {string} remediation
84
+ */
85
+ /** Every code the compiler emits, with the facts it fixes. */
86
+ export const DIAGNOSTIC_CODES: Readonly<Record<string, DiagnosticRule>>;
87
+ /**
88
+ * What a failure invalidates: the one node it concerns, or the whole
89
+ * compilation (a bundle that cannot be read at all).
90
+ */
91
+ export type DiagnosticScope = "node" | "compilation";
92
+ export type DiagnosticPhase = (typeof DIAGNOSTIC_PHASES)[number];
93
+ export type DiagnosticSeverity = "error" | "warning";
94
+ export type CompilerDiagnostic = {
95
+ /**
96
+ * stable; one of {@link DIAGNOSTIC_CODES}
97
+ */
98
+ code: string;
99
+ phase: DiagnosticPhase;
100
+ severity: DiagnosticSeverity;
101
+ scope: DiagnosticScope;
102
+ /**
103
+ * the package the problem is in
104
+ */
105
+ provider: string | null;
106
+ /**
107
+ * `<package>/<path>` of the file, never a
108
+ * machine path
109
+ */
110
+ source: string | null;
111
+ /**
112
+ * the field or reference at fault, when known
113
+ */
114
+ field: string | null;
115
+ message: string;
116
+ /**
117
+ * what to do about it
118
+ */
119
+ remediation: string;
120
+ };
121
+ export type DiagnosticRule = {
122
+ phase: DiagnosticPhase;
123
+ severity: DiagnosticSeverity;
124
+ scope: DiagnosticScope;
125
+ remediation: string;
126
+ };