@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -0,0 +1,576 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Provider resolution — one resolver and one package identity for every
5
+ * path that decides which integration package contributes under a provider ID.
6
+ *
7
+ * Project resolves configured, then autolinked, then local packages here.
8
+ * `upgrade` resolves the same set plus its own candidates here, under the
9
+ * codemod policy. `markProviderConflicts` is a wrapper over the same conflict
10
+ * pass. Besides the resolved list, every resolution returns a ledger with
11
+ * exactly one outcome for every package directory it was handed, so no
12
+ * candidate can leave the list without a record.
13
+ *
14
+ * Identity is the real package directory. `name@version` labels an entry for
15
+ * display. It also decides whether two DIFFERENT directories hold one published
16
+ * package (an npm alias installed as a copy), because precedence has always
17
+ * treated those as one package, but it never keys the ledger.
18
+ *
19
+ * @input Candidates in precedence order, each a loaded integration record or a
20
+ * load failure, tagged with the source that reached it; a policy.
21
+ * @output The resolved LoadedIntegration list, and the ledger keyed by real
22
+ * package directory.
23
+ * @position foundation/integrations — the only place precedence is decided;
24
+ * callers load packages, this module picks winners.
25
+ */
26
+
27
+ import * as fs from 'node:fs';
28
+ import * as path from 'node:path';
29
+
30
+ /**
31
+ * @typedef {import('./integrations.mjs').LoadedIntegration} LoadedIntegration
32
+ */
33
+
34
+ /**
35
+ * Where a candidate came from. Precedence follows candidate order; the source
36
+ * selects which rules apply.
37
+ * - `configured`: named by astryx.config; listed even when its manifest fails
38
+ * - `autolinked`: a declared dependency that ships one root manifest
39
+ * - `local`: the package being authored, loaded from its working bytes
40
+ * - `installed`: codemod policy — the installed copy of a package being
41
+ * authored that lists itself
42
+ * - `extra`: codemod policy — a package named with `upgrade --integration`
43
+ * @typedef {'configured' | 'autolinked' | 'local' | 'installed' | 'extra'} CandidateSource
44
+ */
45
+
46
+ /**
47
+ * One package reached by one input. A candidate without `integration` failed
48
+ * to load (`error`) or reached a directory an earlier candidate already
49
+ * reached (`repeat`).
50
+ * @typedef {object} ProviderCandidate
51
+ * @property {CandidateSource} source
52
+ * @property {LoadedIntegration} [integration]
53
+ * @property {string} [spec] the input that reached the package
54
+ * @property {string} [packageDir] required when `integration` is absent
55
+ * @property {string} [error] why loading threw
56
+ * @property {boolean} [repeat] another input for a directory already reached
57
+ */
58
+
59
+ /**
60
+ * @typedef {'contributes' | 'set-aside' | 'load-failed' | 'alias-of'} ProviderOutcome
61
+ */
62
+
63
+ /**
64
+ * Why a package is set aside.
65
+ * - `claimed-earlier`: a package earlier in precedence claims its provider ID
66
+ * - `authored-claims`: the package being authored claims its provider ID
67
+ * - `replaced-by-authored`: it is the installed copy of the package being
68
+ * authored, whose working bytes are used instead
69
+ * - `installed-stands-in`: codemod policy — the package being authored is
70
+ * represented by its installed copy
71
+ * @typedef {'claimed-earlier' | 'authored-claims' | 'replaced-by-authored' | 'installed-stands-in'} SetAsideReason
72
+ */
73
+
74
+ /**
75
+ * The one outcome for one real package directory.
76
+ * @typedef {object} ProviderLedgerEntry
77
+ * @property {string} key real package directory
78
+ * @property {string} label `name@version`, for display only
79
+ * @property {ProviderOutcome} outcome
80
+ * @property {ProviderCandidate} candidate the candidate this outcome belongs to
81
+ * @property {ProviderCandidate[]} refs every candidate that reached this
82
+ * directory, in order
83
+ * @property {string} [providerId]
84
+ * @property {string} [winner] set-aside: key of the package used instead
85
+ * @property {SetAsideReason} [reason] set-aside: why
86
+ * @property {string} [aliasOf] alias-of: key of the package this one repeats
87
+ * @property {LoadedIntegration} [integration] the record this package left in
88
+ * the resolved list, when it left one
89
+ * @property {string} [error] load-failed: the load error
90
+ */
91
+
92
+ /** @typedef {Map<string, ProviderLedgerEntry>} ProviderLedger */
93
+
94
+ /**
95
+ * @typedef {object} ProviderPolicy
96
+ * @property {boolean} [codemods] upgrade's codemod rule. Candidates are an
97
+ * already resolved Project list plus `installed` and `extra` candidates. The
98
+ * installed copy stands in for a package being authored that lists itself or
99
+ * is named as an extra, and an extra stands in for the autolinked package it
100
+ * repeats. Autolinked and local packages still claim provider IDs, but they
101
+ * are not listed: upgrade has never run their codemods.
102
+ * @property {ProviderLedger} [prior] the ledger this resolution builds on. A
103
+ * record it already set aside keeps that winner, and its entries this
104
+ * resolution never reaches are carried over unchanged.
105
+ */
106
+
107
+ /**
108
+ * @typedef {object} CandidateState
109
+ * @property {ProviderCandidate} candidate
110
+ * @property {LoadedIntegration | undefined} record
111
+ * @property {string} key
112
+ * @property {ProviderOutcome} [outcome]
113
+ * @property {CandidateState} [winner]
114
+ * @property {SetAsideReason} [reason]
115
+ * @property {CandidateState} [aliasOf]
116
+ * @property {LoadedIntegration} [listed]
117
+ */
118
+
119
+ /**
120
+ * @typedef {object} Slot
121
+ * @property {CandidateState} state
122
+ * @property {LoadedIntegration} record
123
+ */
124
+
125
+ /** Lower wins when several candidates reach one directory. */
126
+ const OUTCOME_RANK = /** @type {const} */ ({
127
+ contributes: 0,
128
+ 'set-aside': 1,
129
+ 'load-failed': 2,
130
+ 'alias-of': 3,
131
+ });
132
+
133
+ /**
134
+ * The identity of a package directory: its real path, so every symlinked
135
+ * spelling of one pnpm store entry is one package.
136
+ * @param {string} packageDir
137
+ * @returns {string}
138
+ */
139
+ export function packageKey(packageDir) {
140
+ try {
141
+ return fs.realpathSync(packageDir);
142
+ } catch {
143
+ return path.resolve(packageDir);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * @param {ProviderCandidate} candidate
149
+ * @param {number} index
150
+ * @returns {string}
151
+ */
152
+ function candidateKey(candidate, index) {
153
+ const dir = candidate.integration?.__packageDir ?? candidate.packageDir;
154
+ // Only a hand-built record lacks a directory; it is its own package.
155
+ return typeof dir === 'string' && dir.length > 0
156
+ ? packageKey(dir)
157
+ : `#${index}`;
158
+ }
159
+
160
+ /**
161
+ * Whether an entry contributes under its provider ID: it has one, its manifest
162
+ * loaded, and it has not already been set aside.
163
+ * @param {LoadedIntegration | undefined} integration
164
+ * @returns {boolean}
165
+ */
166
+ function claimsProvider(integration) {
167
+ return (
168
+ integration?.providerId != null &&
169
+ integration.__loadError == null &&
170
+ integration.__providerConflict == null
171
+ );
172
+ }
173
+
174
+ /**
175
+ * The display label of a package: `name@version`, plus the spec that reached
176
+ * it when that differs from the name.
177
+ * @param {LoadedIntegration} integration
178
+ * @returns {string}
179
+ */
180
+ function describeIntegration(integration) {
181
+ const id = integration.version
182
+ ? `${integration.name}@${integration.version}`
183
+ : integration.name;
184
+ return integration.__spec && integration.__spec !== integration.name
185
+ ? `${id} (from "${integration.__spec}")`
186
+ : id;
187
+ }
188
+
189
+ /**
190
+ * An inert record for a package whose provider ID is already claimed. It keeps
191
+ * the package's identity and location for reporting, and drops every
192
+ * contribution root and handler.
193
+ * @param {LoadedIntegration} integration
194
+ * @param {LoadedIntegration} claimant
195
+ * @returns {LoadedIntegration}
196
+ */
197
+ function providerConflict(integration, claimant) {
198
+ const providerId =
199
+ /** @type {import('../../authoring/identity/type').ProviderId} */ (
200
+ integration.providerId
201
+ );
202
+ const winner = describeIntegration(claimant);
203
+ const setAside = describeIntegration(integration);
204
+ const reason = claimant.__local
205
+ ? 'is the package being authored, so it is used'
206
+ : 'loads first and is used';
207
+ return {
208
+ name: integration.name,
209
+ providerId,
210
+ version: integration.version,
211
+ __spec: integration.__spec,
212
+ __packageDir: integration.__packageDir,
213
+ __manifestFile: integration.__manifestFile,
214
+ ...(integration.__local ? {__local: true} : {}),
215
+ ...(integration.__autolinked
216
+ ? {__autolinked: true, __dependencyField: integration.__dependencyField}
217
+ : {}),
218
+ __providerConflict: {
219
+ providerId,
220
+ claimedBy: claimant.name,
221
+ message:
222
+ `${setAside} and ${winner} both claim provider ID "${providerId}". ` +
223
+ `${winner} ${reason}; ${setAside} contributes nothing ` +
224
+ 'until one package changes its providerId.',
225
+ },
226
+ };
227
+ }
228
+
229
+ /**
230
+ * `name@version`, the display label of a package.
231
+ * @param {LoadedIntegration} integration
232
+ * @returns {string}
233
+ */
234
+ function packageLabel(integration) {
235
+ return integration.version
236
+ ? `${integration.name}@${integration.version}`
237
+ : integration.name;
238
+ }
239
+
240
+ /**
241
+ * One published package at one version. Two directories that share it hold
242
+ * the same package; it never keys the ledger.
243
+ * @param {LoadedIntegration} integration
244
+ * @returns {string}
245
+ */
246
+ function publishedIdentity(integration) {
247
+ return `${integration.name}\u0000${integration.version ?? ''}`;
248
+ }
249
+
250
+ /**
251
+ * @param {CandidateState} state
252
+ * @param {ProviderOutcome} outcome
253
+ * @param {Partial<Pick<CandidateState, 'winner' | 'reason' | 'aliasOf' | 'listed'>>} [detail]
254
+ */
255
+ function settle(state, outcome, detail = {}) {
256
+ state.outcome = outcome;
257
+ state.winner = detail.winner;
258
+ state.reason = detail.reason;
259
+ state.aliasOf = detail.aliasOf;
260
+ state.listed = detail.listed;
261
+ }
262
+
263
+ /**
264
+ * Project precedence: configured packages in config order, then autolinked
265
+ * packages that do not repeat one already loaded, then the package being
266
+ * authored, which replaces the first entry with its name.
267
+ * @param {CandidateState[]} states
268
+ * @returns {Slot[]}
269
+ */
270
+ function assembleProject(states) {
271
+ /** @type {Slot[]} */
272
+ const slots = [];
273
+ // Published identities of configured entries and of kept autolinked ones.
274
+ /** @type {Map<string, CandidateState>} */
275
+ const loaded = new Map();
276
+ for (const state of states) {
277
+ const {candidate, record} = state;
278
+ if (candidate.repeat) {
279
+ settle(state, 'alias-of');
280
+ continue;
281
+ }
282
+ if (candidate.source === 'autolinked') {
283
+ // A dependency the project never named cannot fail its load, so a
284
+ // broken one is recorded here and listed nowhere.
285
+ if (record == null || record.__loadError != null) {
286
+ settle(state, 'load-failed');
287
+ continue;
288
+ }
289
+ const repeated = loaded.get(publishedIdentity(record));
290
+ if (repeated != null) {
291
+ settle(state, 'alias-of', {aliasOf: repeated});
292
+ continue;
293
+ }
294
+ loaded.set(publishedIdentity(record), state);
295
+ slots.push({state, record});
296
+ continue;
297
+ }
298
+ if (candidate.source === 'local' && record != null) {
299
+ const replaced = slots.findIndex(
300
+ slot => slot.record?.name === record.name,
301
+ );
302
+ if (replaced === -1) {
303
+ slots.push({state, record});
304
+ } else {
305
+ settle(slots[replaced].state, 'set-aside', {
306
+ winner: state,
307
+ reason: 'replaced-by-authored',
308
+ });
309
+ slots[replaced] = {state, record};
310
+ }
311
+ continue;
312
+ }
313
+ if (record != null && typeof record === 'object') {
314
+ const identity = publishedIdentity(record);
315
+ if (!loaded.has(identity)) loaded.set(identity, state);
316
+ }
317
+ slots.push({state, record: /** @type {LoadedIntegration} */ (record)});
318
+ }
319
+ return slots;
320
+ }
321
+
322
+ /**
323
+ * Upgrade precedence under the codemod policy, over an already resolved
324
+ * Project list: configured packages (the installed copy in place of a package
325
+ * being authored that lists itself), then claimants, then extras.
326
+ * @param {CandidateState[]} states
327
+ * @returns {{slots: Slot[], claimants: CandidateState[]}}
328
+ */
329
+ function assembleCodemods(states) {
330
+ const configured = states.filter(
331
+ state => state.candidate.source === 'configured' && !state.candidate.repeat,
332
+ );
333
+ const installed = states.filter(
334
+ state => state.candidate.source === 'installed',
335
+ );
336
+ const extras = states.filter(state => state.candidate.source === 'extra');
337
+ const local = states.find(
338
+ state => state.record?.__local && !state.candidate.repeat,
339
+ );
340
+ const selfListed = local != null && configured.includes(local);
341
+
342
+ /** @type {CandidateState[]} */
343
+ const participants = [...configured];
344
+ if (local != null && selfListed && installed.length > 0) {
345
+ participants.splice(participants.indexOf(local), 1, ...installed);
346
+ settle(local, 'set-aside', {
347
+ winner: installed[0],
348
+ reason: 'installed-stands-in',
349
+ });
350
+ }
351
+ const namedLocal =
352
+ local == null
353
+ ? undefined
354
+ : extras.find(extra => extra.record?.name === local.record?.name);
355
+ const localStandsIn = local != null && (selfListed || namedLocal != null);
356
+ if (local != null && !selfListed && namedLocal != null) {
357
+ settle(local, 'set-aside', {
358
+ winner: namedLocal,
359
+ reason: 'installed-stands-in',
360
+ });
361
+ }
362
+
363
+ /** @type {Map<string, CandidateState>} */
364
+ const extraIdentities = new Map();
365
+ for (const extra of extras) {
366
+ if (extra.record == null) continue;
367
+ const identity = publishedIdentity(extra.record);
368
+ if (!extraIdentities.has(identity)) extraIdentities.set(identity, extra);
369
+ }
370
+ /** @type {CandidateState[]} */
371
+ const claimants = [];
372
+ for (const state of states) {
373
+ const {candidate, record} = state;
374
+ if (candidate.repeat || record == null) continue;
375
+ const claimant =
376
+ candidate.source === 'autolinked' ||
377
+ (candidate.source === 'local' && !localStandsIn);
378
+ if (!claimant) continue;
379
+ const named = extraIdentities.get(publishedIdentity(record));
380
+ if (named != null) {
381
+ settle(state, 'alias-of', {aliasOf: named});
382
+ continue;
383
+ }
384
+ claimants.push(state);
385
+ }
386
+
387
+ for (const state of states) {
388
+ if (state.candidate.repeat) settle(state, 'alias-of');
389
+ }
390
+
391
+ const slots = [...participants, ...claimants, ...extras].map(state => ({
392
+ state,
393
+ record: /** @type {LoadedIntegration} */ (state.record),
394
+ }));
395
+ return {slots, claimants};
396
+ }
397
+
398
+ /**
399
+ * The provider-ID pass over assembled entries. The package being authored
400
+ * claims first; everything else claims in order. A later claimant that is the
401
+ * same published package as the winner is the same package reached twice and
402
+ * loads once; any other later claimant becomes an inert conflict record.
403
+ * @param {Slot[]} slots
404
+ * @returns {LoadedIntegration[]}
405
+ */
406
+ function markConflicts(slots) {
407
+ /** @type {Map<string, Slot>} */
408
+ const claims = new Map();
409
+ for (const slot of slots) {
410
+ if (slot.record?.__local && claimsProvider(slot.record)) {
411
+ const providerId = /** @type {string} */ (slot.record.providerId);
412
+ if (!claims.has(providerId)) claims.set(providerId, slot);
413
+ }
414
+ }
415
+ /** @type {LoadedIntegration[]} */
416
+ const resolved = [];
417
+ for (const slot of slots) {
418
+ const {state, record} = slot;
419
+ if (!claimsProvider(record)) {
420
+ resolved.push(record);
421
+ if (record?.__providerConflict != null) {
422
+ settle(state, 'set-aside', {listed: record});
423
+ } else if (record == null || record.__loadError != null) {
424
+ settle(state, 'load-failed', {listed: record});
425
+ } else {
426
+ settle(state, 'contributes', {listed: record});
427
+ }
428
+ continue;
429
+ }
430
+ const providerId = /** @type {string} */ (record.providerId);
431
+ const claimant = claims.get(providerId);
432
+ if (claimant == null) {
433
+ claims.set(providerId, slot);
434
+ resolved.push(record);
435
+ settle(state, 'contributes', {listed: record});
436
+ } else if (claimant.record === record) {
437
+ resolved.push(record);
438
+ settle(state, 'contributes', {listed: record});
439
+ } else if (
440
+ claimant.record.name !== record.name ||
441
+ claimant.record.version !== record.version
442
+ ) {
443
+ const conflict = providerConflict(record, claimant.record);
444
+ resolved.push(conflict);
445
+ settle(state, 'set-aside', {
446
+ winner: claimant.state,
447
+ reason: claimant.record.__local ? 'authored-claims' : 'claimed-earlier',
448
+ listed: conflict,
449
+ });
450
+ } else {
451
+ settle(state, 'alias-of', {aliasOf: claimant.state});
452
+ }
453
+ }
454
+ return resolved;
455
+ }
456
+
457
+ /**
458
+ * Fold candidate outcomes into one entry per real package directory. A
459
+ * directory reached by several candidates keeps the strongest outcome among
460
+ * them; every candidate stays listed in `refs`.
461
+ * @param {CandidateState[]} states
462
+ * @param {ProviderLedger | undefined} prior
463
+ * @param {Set<LoadedIntegration>} listed records in the final list
464
+ * @returns {ProviderLedger}
465
+ */
466
+ function buildLedger(states, prior, listed) {
467
+ /** @type {Map<string, CandidateState>} */
468
+ const chosen = new Map();
469
+ /** @type {Map<string, ProviderCandidate[]>} */
470
+ const refs = new Map();
471
+ for (const state of states) {
472
+ const current = chosen.get(state.key);
473
+ const outcome = state.outcome ?? 'load-failed';
474
+ if (
475
+ current == null ||
476
+ OUTCOME_RANK[outcome] < OUTCOME_RANK[current.outcome ?? 'load-failed']
477
+ ) {
478
+ chosen.set(state.key, state);
479
+ }
480
+ const list = refs.get(state.key) ?? [];
481
+ list.push(state.candidate);
482
+ refs.set(state.key, list);
483
+ }
484
+
485
+ /** @type {ProviderLedger} */
486
+ const ledger = new Map();
487
+ for (const [key, state] of chosen) {
488
+ const {candidate, record} = state;
489
+ const outcome = state.outcome ?? 'load-failed';
490
+ const previous = prior?.get(key);
491
+ /** @type {ProviderLedgerEntry} */
492
+ const entry = {
493
+ key,
494
+ label:
495
+ record != null && typeof record === 'object' && record.name
496
+ ? packageLabel(record)
497
+ : (candidate.spec ?? key),
498
+ outcome,
499
+ candidate,
500
+ // A resolution on top of a prior ledger re-reads that ledger's records;
501
+ // only its own new inputs join the inputs already recorded there.
502
+ refs:
503
+ previous == null
504
+ ? (refs.get(key) ?? [candidate])
505
+ : [
506
+ ...previous.refs,
507
+ ...(refs.get(key) ?? []).filter(
508
+ ref => ref.source === 'installed' || ref.source === 'extra',
509
+ ),
510
+ ],
511
+ };
512
+ if (record?.providerId != null) entry.providerId = record.providerId;
513
+ if (outcome === 'set-aside') {
514
+ const winner = state.winner?.key ?? previous?.winner;
515
+ if (winner != null) entry.winner = winner;
516
+ const reason = state.reason ?? previous?.reason;
517
+ if (reason != null) entry.reason = reason;
518
+ }
519
+ if (outcome === 'alias-of') entry.aliasOf = state.aliasOf?.key ?? key;
520
+ if (state.listed != null && listed.has(state.listed)) {
521
+ entry.integration = state.listed;
522
+ }
523
+ const error = record?.__loadError ?? candidate.error;
524
+ if (outcome === 'load-failed' && error != null) entry.error = error;
525
+ ledger.set(key, entry);
526
+ }
527
+ for (const [key, entry] of prior ?? []) {
528
+ if (!ledger.has(key)) ledger.set(key, entry);
529
+ }
530
+ return ledger;
531
+ }
532
+
533
+ /**
534
+ * Resolve provider identity over candidates in precedence order.
535
+ *
536
+ * Returns the resolved integration list every command reads, and a ledger
537
+ * with one outcome for every real package directory among the candidates:
538
+ * `contributes`, `set-aside` (with the winner and a reason), `load-failed`, or
539
+ * `alias-of` (the same published package already loaded from another
540
+ * directory, or another input for a directory already reached).
541
+ *
542
+ * @param {ProviderCandidate[]} candidates in precedence order
543
+ * @param {ProviderPolicy} [policy]
544
+ * @returns {{integrations: LoadedIntegration[], ledger: ProviderLedger}}
545
+ */
546
+ export function resolveProviders(candidates, policy = {}) {
547
+ /** @type {CandidateState[]} */
548
+ const states = candidates.map((candidate, index) => ({
549
+ candidate,
550
+ record: candidate.integration,
551
+ key: candidateKey(candidate, index),
552
+ }));
553
+
554
+ /** @type {LoadedIntegration[]} */
555
+ let integrations;
556
+ if (policy.codemods) {
557
+ const {slots, claimants} = assembleCodemods(states);
558
+ const resolved = markConflicts(slots);
559
+ // Claimants leave by package directory: the pass can hand one back as a
560
+ // new conflict record, and upgrade must not report a package every other
561
+ // command uses as set aside.
562
+ const claimantDirs = new Set(
563
+ claimants.map(state => state.record?.__packageDir),
564
+ );
565
+ integrations = resolved.filter(
566
+ integration =>
567
+ integration.__packageDir == null ||
568
+ !claimantDirs.has(integration.__packageDir),
569
+ );
570
+ } else {
571
+ integrations = markConflicts(assembleProject(states));
572
+ }
573
+
574
+ const ledger = buildLedger(states, policy.prior, new Set(integrations));
575
+ return {integrations, ledger};
576
+ }