@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3

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 (670) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +121 -85
  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 +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +36 -13
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +272 -41
  54. package/api/docs/_adapter.mjs +985 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docs.d.mts +10 -3
  61. package/api/docs/docs.doc.mjs +55 -16
  62. package/api/docs/docs.mjs +53 -10
  63. package/api/docs/docs.test.mjs +166 -4
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/integration-tree.test.mjs +555 -0
  70. package/api/docs/integrationDocs.test.mjs +114 -8
  71. package/api/docs/list/list.mjs +28 -12
  72. package/api/docs/node/node.d.mts +43 -0
  73. package/api/docs/node/node.mjs +192 -0
  74. package/api/docs/reference-blocks.test.mjs +406 -0
  75. package/api/doctor/doctor.d.mts +104 -1
  76. package/api/doctor/doctor.doc.mjs +1 -0
  77. package/api/doctor/doctor.mjs +635 -7
  78. package/api/doctor/doctor.test.mjs +732 -11
  79. package/api/gap-report/gap-report.doc.mjs +8 -4
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +1 -0
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -3
  87. package/api/index.mjs +5 -4
  88. package/api/init/init.doc.mjs +6 -1
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +34 -64
  99. package/api/integration/add-theme.test.mjs +105 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
  119. package/api/integration/pack-check.mjs +111 -10
  120. package/api/integration/pack-check.test.mjs +387 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +14 -1
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +1 -0
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -1
  133. package/api/json/isError.doc.mjs +1 -0
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/search/search-return-type.test.mjs +54 -0
  136. package/api/search/search.d.mts +62 -11
  137. package/api/search/search.doc.mjs +8 -2
  138. package/api/search/search.mjs +471 -83
  139. package/api/search/search.test.mjs +142 -1
  140. package/api/search/search.type.d.mts +15 -3
  141. package/api/search/search.type.mjs +5 -2
  142. package/api/swizzle/copy/copy.mjs +28 -11
  143. package/api/swizzle/swizzle.doc.mjs +2 -1
  144. package/api/swizzle/swizzle.type.d.mts +2 -2
  145. package/api/swizzle/swizzle.type.mjs +2 -2
  146. package/api/template/copy/copy.mjs +17 -23
  147. package/api/template/copy/copy.test.mjs +17 -0
  148. package/api/template/list/list.mjs +1 -0
  149. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  150. package/api/template/template-integration.test.mjs +1008 -3
  151. package/api/template/template-suffix.test.mjs +41 -21
  152. package/api/template/template.d.mts +1 -1
  153. package/api/template/template.doc.mjs +30 -8
  154. package/api/template/template.mjs +46 -9
  155. package/api/template/template.type.d.mts +12 -14
  156. package/api/template/template.type.mjs +15 -14
  157. package/api/theme/_adapter.d.mts +2 -3
  158. package/api/theme/_adapter.mjs +4 -5
  159. package/api/theme/add/add.binary.test.mjs +84 -0
  160. package/api/theme/add/add.mjs +31 -22
  161. package/api/theme/add/add.rollback.test.mjs +158 -0
  162. package/api/theme/add/add.staging.test.mjs +83 -0
  163. package/api/theme/add/add.test.mjs +14 -1
  164. package/api/theme/build/build.family.test.mjs +7 -12
  165. package/api/theme/build/build.mjs +140 -59
  166. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  167. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  168. package/api/theme/build/build.rollback.test.mjs +148 -0
  169. package/api/theme/build/build.test.mjs +127 -0
  170. package/api/theme/build/font-warning.mjs +3 -3
  171. package/api/theme/build/font-warning.test.mjs +5 -2
  172. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  173. package/api/theme/integration-themes.test.mjs +39 -28
  174. package/api/theme/list/list.test.mjs +19 -20
  175. package/api/theme/listThemes.doc.mjs +6 -5
  176. package/api/theme/palette/generate/generate.mjs +8 -3
  177. package/api/theme/palette/generate/generate.test.mjs +96 -0
  178. package/api/theme/palette/generate/generator.d.mts +10 -13
  179. package/api/theme/palette/generate/generator.mjs +15 -4
  180. package/api/theme/palette/generate/generator.test.mjs +10 -0
  181. package/api/theme/template/template.mjs +11 -2
  182. package/api/theme/template/template.test.mjs +20 -0
  183. package/api/theme/theme.type.d.mts +170 -11
  184. package/api/theme/theme.type.mjs +94 -27
  185. package/api/theme/themeAdd.doc.mjs +4 -3
  186. package/api/theme/themeBuild.doc.mjs +8 -4
  187. package/api/theme/themeList.doc.mjs +6 -3
  188. package/api/theme/themeListAvailable.doc.mjs +5 -3
  189. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  190. package/api/theme/themeTargets.doc.mjs +1 -0
  191. package/api/theme/themeTemplate.doc.mjs +6 -2
  192. package/api/upgrade/_adapter.d.mts +32 -5
  193. package/api/upgrade/_adapter.mjs +139 -22
  194. package/api/upgrade/list/list.mjs +2 -1
  195. package/api/upgrade/list/list.test.mjs +73 -0
  196. package/api/upgrade/project-context.test.mjs +272 -0
  197. package/api/upgrade/provider-agreement.test.mjs +152 -0
  198. package/api/upgrade/run/files-changed.test.mjs +111 -0
  199. package/api/upgrade/run/run.mjs +359 -60
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +12 -5
  202. package/api/upgrade/upgrade.type.d.mts +43 -5
  203. package/api/upgrade/upgrade.type.mjs +29 -13
  204. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  205. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  206. package/assets/codemods/file-count.test.mjs +163 -0
  207. package/assets/codemods/integration-discovery.mjs +48 -4
  208. package/assets/codemods/integration-discovery.test.mjs +73 -0
  209. package/assets/codemods/integration-runner.mjs +59 -7
  210. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  211. package/assets/codemods/registry.mjs +1 -0
  212. package/assets/codemods/run-codemod.mjs +177 -34
  213. package/assets/codemods/runner.mjs +353 -104
  214. package/assets/codemods/term-log.mjs +32 -8
  215. package/assets/codemods/term-log.test.mjs +19 -1
  216. package/assets/codemods/transform-prop.mjs +109 -0
  217. package/assets/codemods/transform-prop.test.mjs +95 -0
  218. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  219. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  220. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  221. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  222. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  223. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  224. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  225. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  226. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  227. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  228. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  229. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  230. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  231. package/assets/docs/README.md +9 -0
  232. package/assets/docs/authoring.doc.mjs +14 -0
  233. package/assets/docs/getting-started.doc.mjs +2 -2
  234. package/assets/docs/internationalization.doc.mjs +7 -5
  235. package/assets/docs/layout.doc.dense.mjs +2 -2
  236. package/assets/docs/layout.doc.mjs +1 -1
  237. package/assets/docs/principles.doc.mjs +6 -6
  238. package/assets/docs/styling-libraries.doc.mjs +4 -4
  239. package/assets/docs/styling.doc.mjs +4 -4
  240. package/assets/docs/theme.doc.mjs +5 -5
  241. package/assets/docs/tokens.doc.mjs +1 -1
  242. package/assets/docs/tree/api.doc.mjs +30 -0
  243. package/assets/docs/tree/cli.doc.mjs +23 -0
  244. package/assets/docs/tree/commands.doc.mjs +25 -0
  245. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  246. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  247. package/assets/docs/tree/integrations.test.mjs +62 -0
  248. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  249. package/assets/docs/working-with-ai.doc.mjs +4 -4
  250. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  251. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  252. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  253. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  254. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  255. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  268. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  270. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  271. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  272. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  273. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  274. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  275. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  277. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  278. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  279. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  280. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  281. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  282. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  283. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  284. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  285. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  286. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  287. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  292. package/authoring/_shared/contract.ts +22 -0
  293. package/authoring/codemod/codemod.doc.mjs +7 -2
  294. package/authoring/codemod/parse.d.mts +8 -8
  295. package/authoring/codemod/parse.mjs +8 -6
  296. package/authoring/codemod/type.ts +12 -0
  297. package/authoring/config/config.doc.mjs +11 -3
  298. package/authoring/config/debug-composition.test.mjs +92 -0
  299. package/authoring/config/parse.d.mts +15 -13
  300. package/authoring/config/parse.mjs +27 -8
  301. package/authoring/config/parse.test.mjs +8 -0
  302. package/authoring/config/type.ts +31 -8
  303. package/authoring/debug/debug.doc.d.mts +11 -0
  304. package/authoring/debug/debug.doc.mjs +182 -0
  305. package/authoring/debug/parse.d.mts +8 -8
  306. package/authoring/debug/parse.mjs +3 -3
  307. package/authoring/discover/discover.doc.d.mts +13 -0
  308. package/authoring/discover/discover.doc.mjs +138 -0
  309. package/authoring/discover/parse.d.mts +24 -0
  310. package/authoring/discover/parse.mjs +128 -0
  311. package/authoring/discover/parse.test.mjs +124 -0
  312. package/authoring/discover/type.ts +87 -0
  313. package/authoring/doctypes/_schema.d.mts +790 -23
  314. package/authoring/doctypes/_schema.mjs +543 -39
  315. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  316. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  317. package/authoring/doctypes/base/type.ts +41 -0
  318. package/authoring/doctypes/command/command.doc.mjs +5 -4
  319. package/authoring/doctypes/command/parse.d.mts +2 -2
  320. package/authoring/doctypes/command/parse.mjs +1 -1
  321. package/authoring/doctypes/command/type.ts +6 -5
  322. package/authoring/doctypes/component/component.doc.mjs +6 -3
  323. package/authoring/doctypes/component/parse.d.mts +2 -2
  324. package/authoring/doctypes/component/parse.mjs +1 -1
  325. package/authoring/doctypes/component/type.ts +6 -5
  326. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  327. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  328. package/authoring/doctypes/enum/parse.d.mts +2 -2
  329. package/authoring/doctypes/enum/parse.mjs +1 -1
  330. package/authoring/doctypes/enum/type.ts +4 -2
  331. package/authoring/doctypes/function/function.doc.mjs +7 -2
  332. package/authoring/doctypes/function/parse.d.mts +2 -2
  333. package/authoring/doctypes/function/parse.mjs +1 -1
  334. package/authoring/doctypes/function/type.ts +9 -4
  335. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  336. package/authoring/doctypes/hook/parse.d.mts +2 -2
  337. package/authoring/doctypes/hook/parse.mjs +1 -1
  338. package/authoring/doctypes/hook/type.ts +5 -4
  339. package/authoring/doctypes/legacy.d.mts +8 -6
  340. package/authoring/doctypes/legacy.mjs +5 -4
  341. package/authoring/doctypes/load-contract.test.mjs +233 -0
  342. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  343. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  344. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  345. package/authoring/doctypes/namespace/parse.mjs +25 -0
  346. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  347. package/authoring/doctypes/namespace/type.ts +74 -0
  348. package/authoring/doctypes/parse.d.mts +22 -18
  349. package/authoring/doctypes/parse.mjs +22 -11
  350. package/authoring/doctypes/parse.test.mjs +77 -3
  351. package/authoring/doctypes/reference/parse.d.mts +2 -2
  352. package/authoring/doctypes/reference/parse.mjs +8 -5
  353. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  354. package/authoring/doctypes/reference/type.ts +70 -7
  355. package/authoring/doctypes/schema/parse.d.mts +2 -2
  356. package/authoring/doctypes/schema/parse.mjs +1 -1
  357. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  358. package/authoring/doctypes/schema/type.ts +4 -4
  359. package/authoring/doctypes/template/parse.d.mts +94 -1
  360. package/authoring/doctypes/template/parse.mjs +40 -2
  361. package/authoring/doctypes/template/parse.test.mjs +26 -2
  362. package/authoring/doctypes/template/template.doc.mjs +13 -3
  363. package/authoring/doctypes/template/type.ts +13 -2
  364. package/authoring/doctypes/theme/parse.d.mts +35 -0
  365. package/authoring/doctypes/theme/parse.mjs +76 -0
  366. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  367. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  368. package/authoring/doctypes/theme/type.ts +42 -0
  369. package/authoring/doctypes/types.ts +12 -10
  370. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  371. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  372. package/authoring/gap-report/parse.d.mts +10 -10
  373. package/authoring/gap-report/parse.mjs +6 -6
  374. package/authoring/gap-report/type.ts +1 -1
  375. package/authoring/identity/identity.doc.d.mts +9 -0
  376. package/authoring/identity/identity.doc.mjs +61 -0
  377. package/authoring/identity/type.ts +132 -0
  378. package/authoring/index.d.mts +3 -0
  379. package/authoring/index.d.ts +62 -17
  380. package/authoring/index.mjs +4 -1
  381. package/authoring/integration/integration.doc.mjs +15 -8
  382. package/authoring/integration/parse.d.mts +2 -2
  383. package/authoring/integration/parse.mjs +1 -1
  384. package/authoring/integration/parse.test.mjs +10 -1
  385. package/authoring/integration/schema.d.mts +6 -4
  386. package/authoring/integration/schema.mjs +9 -3
  387. package/authoring/integration/type.ts +19 -8
  388. package/authoring/shadcn/receipt.d.mts +6 -6
  389. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  390. package/clients/cli/command-load-failure.test.mjs +83 -0
  391. package/clients/cli/command-result-coverage.test.mjs +7 -7
  392. package/clients/cli/commands/blog.doc.mjs +1 -1
  393. package/clients/cli/commands/blog.mjs +23 -8
  394. package/clients/cli/commands/blog.test.mjs +42 -1
  395. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  396. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  397. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  398. package/clients/cli/commands/build-theme.mjs +16 -50
  399. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  400. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  401. package/clients/cli/commands/build.doc.mjs +16 -8
  402. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  403. package/clients/cli/commands/build.mjs +137 -114
  404. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  405. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  406. package/clients/cli/commands/component/index.mjs +153 -61
  407. package/clients/cli/commands/component-batch.test.mjs +341 -0
  408. package/clients/cli/commands/component-ownership.test.mjs +92 -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 +24 -7
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  414. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  415. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  416. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  417. package/clients/cli/commands/discover.doc.mjs +55 -9
  418. package/clients/cli/commands/discover.mjs +393 -118
  419. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  420. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  421. package/clients/cli/commands/docs.doc.mjs +28 -6
  422. package/clients/cli/commands/docs.mjs +240 -26
  423. package/clients/cli/commands/docs.test.mjs +222 -1
  424. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  425. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  426. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  427. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  429. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  430. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  431. package/clients/cli/commands/doctor.doc.mjs +1 -1
  432. package/clients/cli/commands/doctor.mjs +59 -32
  433. package/clients/cli/commands/doctor.test.mjs +42 -0
  434. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  435. package/clients/cli/commands/gap-report.test.mjs +72 -0
  436. package/clients/cli/commands/hook/index.mjs +7 -17
  437. package/clients/cli/commands/hook.doc.mjs +1 -1
  438. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  439. package/clients/cli/commands/init.doc.mjs +20 -9
  440. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  441. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  442. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  443. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  444. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  445. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  446. package/clients/cli/commands/integration.doc.mjs +1 -1
  447. package/clients/cli/commands/integration.mjs +1 -0
  448. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  449. package/clients/cli/commands/json-contract.test.mjs +33 -0
  450. package/clients/cli/commands/manifest.doc.mjs +1 -1
  451. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  452. package/clients/cli/commands/search.doc.mjs +7 -4
  453. package/clients/cli/commands/search.mjs +28 -9
  454. package/clients/cli/commands/search.test.mjs +75 -0
  455. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  456. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  457. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  458. package/clients/cli/commands/template.doc.mjs +52 -13
  459. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  460. package/clients/cli/commands/template.mjs +4 -91
  461. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  462. package/clients/cli/commands/text-json-parity.test.mjs +702 -0
  463. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  464. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  465. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  466. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  467. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  468. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  469. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  470. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  471. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  472. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  473. package/clients/cli/commands/theme.doc.mjs +1 -1
  474. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  475. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  476. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  477. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  478. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  479. package/clients/cli/commands/upgrade.mjs +29 -7
  480. package/clients/cli/formatters/index.mjs +164 -1
  481. package/clients/cli/formatters/index.test.mjs +97 -0
  482. package/clients/cli/index.mjs +21 -34
  483. package/clients/cli/latest-version-env.test.mjs +50 -0
  484. package/clients/cli/lib/cli-error.test.mjs +7 -0
  485. package/clients/cli/lib/component-format.mjs +9 -9
  486. package/clients/cli/lib/component-format.test.mjs +1 -1
  487. package/clients/cli/lib/define-command.mjs +32 -6
  488. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  489. package/clients/cli/lib/exit-codes.test.mjs +90 -0
  490. package/clients/cli/lib/hook-format.mjs +19 -10
  491. package/clients/cli/lib/json-shim.mjs +62 -16
  492. package/clients/cli/lib/json-shim.test.mjs +69 -0
  493. package/clients/cli/lib/manifest.d.ts +2 -0
  494. package/clients/cli/lib/manifest.mjs +39 -10
  495. package/clients/cli/lib/manifest.test.mjs +22 -2
  496. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  497. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  498. package/foundation/agent-docs/agent-docs.mjs +82 -12
  499. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  500. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  501. package/foundation/config/integration-debug.test.mjs +28 -3
  502. package/foundation/config/project-themes.test.mjs +11 -19
  503. package/foundation/config/project.d.mts +20 -11
  504. package/foundation/config/project.mjs +263 -91
  505. package/foundation/config/project.test.mjs +270 -21
  506. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  507. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  508. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  509. package/foundation/discovery/authoring-surface.d.mts +74 -0
  510. package/foundation/discovery/authoring-surface.mjs +525 -0
  511. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  512. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  513. package/foundation/discovery/cli-self-docs.mjs +490 -0
  514. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  515. package/foundation/discovery/component-discovery.d.mts +39 -1
  516. package/foundation/discovery/component-discovery.mjs +50 -1
  517. package/foundation/discovery/component-loader.d.mts +35 -38
  518. package/foundation/discovery/component-loader.mjs +53 -222
  519. package/foundation/discovery/docs-discovery.d.mts +119 -11
  520. package/foundation/discovery/docs-discovery.mjs +423 -108
  521. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  522. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  523. package/foundation/discovery/docs-output-budget.mjs +50 -0
  524. package/foundation/discovery/docs-section-key.d.mts +116 -0
  525. package/foundation/discovery/docs-section-key.mjs +322 -0
  526. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  527. package/foundation/discovery/template-adapter.d.mts +113 -11
  528. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  529. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  530. package/foundation/discovery/template-adapter.mjs +775 -84
  531. package/foundation/discovery/template-adapter.test.mjs +57 -0
  532. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  533. package/foundation/discovery/template-conflict-release.mjs +40 -0
  534. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  535. package/foundation/discovery/theme-discovery.d.mts +67 -7
  536. package/foundation/discovery/theme-discovery.mjs +916 -186
  537. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  538. package/foundation/discovery/theming-targets.test.mjs +4 -0
  539. package/foundation/doc-compiler/bundle.d.mts +47 -0
  540. package/foundation/doc-compiler/bundle.mjs +278 -0
  541. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  542. package/foundation/doc-compiler/compile.d.mts +343 -0
  543. package/foundation/doc-compiler/compile.mjs +558 -0
  544. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  545. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  546. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  547. package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
  548. package/foundation/doc-compiler/import.d.mts +24 -0
  549. package/foundation/doc-compiler/import.mjs +59 -0
  550. package/foundation/doc-compiler/inputs.d.mts +102 -0
  551. package/foundation/doc-compiler/inputs.mjs +291 -0
  552. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  553. package/foundation/doc-compiler/ir.d.mts +22 -0
  554. package/foundation/doc-compiler/ir.mjs +471 -0
  555. package/foundation/doc-compiler/lenses.d.mts +36 -0
  556. package/foundation/doc-compiler/lenses.mjs +173 -0
  557. package/foundation/doc-compiler/links.d.mts +162 -0
  558. package/foundation/doc-compiler/links.mjs +294 -0
  559. package/foundation/doc-compiler/links.test.mjs +192 -0
  560. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  561. package/foundation/doc-compiler/overlays.d.mts +37 -0
  562. package/foundation/doc-compiler/overlays.mjs +206 -0
  563. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  564. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  565. package/foundation/doc-compiler/read.d.mts +127 -0
  566. package/foundation/doc-compiler/read.mjs +325 -0
  567. package/foundation/doc-compiler/read.test.mjs +313 -0
  568. package/foundation/doc-compiler/source.d.mts +33 -0
  569. package/foundation/doc-compiler/source.mjs +128 -0
  570. package/foundation/doc-compiler/tree.d.mts +288 -0
  571. package/foundation/doc-compiler/tree.mjs +876 -0
  572. package/foundation/doc-compiler/tree.test.mjs +606 -0
  573. package/foundation/fs/file-protection.d.mts +33 -0
  574. package/foundation/fs/file-protection.mjs +825 -0
  575. package/foundation/fs/file-protection.test.mjs +250 -0
  576. package/foundation/fs/module-loader.d.mts +1 -0
  577. package/foundation/fs/module-loader.mjs +50 -1
  578. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  579. package/foundation/fs/path-safety.d.mts +3 -2
  580. package/foundation/fs/path-safety.mjs +49 -19
  581. package/foundation/fs/path-safety.test.mjs +50 -0
  582. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  583. package/foundation/identity/provider-identity.d.mts +90 -0
  584. package/foundation/identity/provider-identity.mjs +320 -0
  585. package/foundation/identity/provider-identity.test.mjs +254 -0
  586. package/foundation/identity/providers.d.mts +7 -0
  587. package/foundation/identity/providers.mjs +16 -0
  588. package/foundation/integrations/autolink.d.mts +58 -1
  589. package/foundation/integrations/autolink.mjs +143 -45
  590. package/foundation/integrations/autolink.test.mjs +1 -1
  591. package/foundation/integrations/cli-requirement.d.mts +45 -0
  592. package/foundation/integrations/cli-requirement.mjs +154 -0
  593. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  594. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  595. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  596. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  597. package/foundation/integrations/contribution-inventory.mjs +27 -24
  598. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  599. package/foundation/integrations/integration-warnings.d.mts +9 -2
  600. package/foundation/integrations/integration-warnings.mjs +52 -21
  601. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  602. package/foundation/integrations/integrations.d.mts +63 -3
  603. package/foundation/integrations/integrations.mjs +122 -9
  604. package/foundation/integrations/integrations.test.mjs +415 -1
  605. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  606. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  607. package/foundation/integrations/provider-resolution.d.mts +152 -0
  608. package/foundation/integrations/provider-resolution.mjs +576 -0
  609. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  610. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  611. package/foundation/integrations/theme-descriptor.mjs +44 -0
  612. package/foundation/integrations/validate-contributions.d.mts +2 -0
  613. package/foundation/integrations/validate-contributions.mjs +131 -29
  614. package/foundation/response/base.d.ts +8 -4
  615. package/foundation/response/batch.type.d.mts +33 -0
  616. package/foundation/response/batch.type.mjs +34 -0
  617. package/foundation/response/error-codes.d.mts +3 -1
  618. package/foundation/response/error-codes.d.ts +2 -0
  619. package/foundation/response/error-codes.doc.mjs +13 -4
  620. package/foundation/response/error-codes.mjs +8 -2
  621. package/foundation/response/error-codes.test.mjs +137 -10
  622. package/foundation/response/json-contract.test.mjs +57 -17
  623. package/foundation/response/json.d.mts +4 -2
  624. package/foundation/response/json.mjs +8 -10
  625. package/foundation/response/response-types.doc.d.mts +5 -1
  626. package/foundation/response/response-types.doc.mjs +46 -38
  627. package/foundation/response/response-types.doc.test.mjs +181 -0
  628. package/foundation/response/response.doc.mjs +1 -1
  629. package/foundation/text/string-utils.d.mts +8 -0
  630. package/foundation/text/string-utils.mjs +40 -10
  631. package/foundation/xle/browser.d.mts +3 -3
  632. package/foundation/xle/browser.mjs +3 -3
  633. package/foundation/xle/expand.d.mts +2 -0
  634. package/foundation/xle/expand.mjs +6 -5
  635. package/foundation/xle/expand.test.mjs +54 -0
  636. package/foundation/xle/parse.mjs +1 -1
  637. package/foundation/xle/print.mjs +2 -2
  638. package/foundation/xle/splice.mjs +1 -1
  639. package/foundation/xle/xle.test.mjs +13 -0
  640. package/package.json +10 -11
  641. package/api/layout/_adapter.d.mts +0 -34
  642. package/api/layout/_adapter.mjs +0 -133
  643. package/api/layout/check/check.d.mts +0 -16
  644. package/api/layout/check/check.mjs +0 -40
  645. package/api/layout/expand/expand.d.mts +0 -22
  646. package/api/layout/expand/expand.mjs +0 -153
  647. package/api/layout/grammar/grammar.d.mts +0 -13
  648. package/api/layout/grammar/grammar.mjs +0 -86
  649. package/api/layout/layout.d.mts +0 -6
  650. package/api/layout/layout.mjs +0 -17
  651. package/api/layout/layout.test.mjs +0 -297
  652. package/api/layout/layout.type.d.mts +0 -89
  653. package/api/layout/layout.type.mjs +0 -103
  654. package/api/layout/layoutCheck.doc.d.mts +0 -11
  655. package/api/layout/layoutCheck.doc.mjs +0 -84
  656. package/api/layout/layoutExpand.doc.d.mts +0 -11
  657. package/api/layout/layoutExpand.doc.mjs +0 -106
  658. package/api/layout/layoutGrammar.doc.d.mts +0 -11
  659. package/api/layout/layoutGrammar.doc.mjs +0 -56
  660. package/assets/templates/themes/manifest.json +0 -95
  661. package/clients/cli/commands/layout-check.doc.mjs +0 -54
  662. package/clients/cli/commands/layout-expand.doc.mjs +0 -66
  663. package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
  664. package/clients/cli/commands/layout.doc.mjs +0 -34
  665. package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
  666. package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
  667. package/clients/cli/commands/layout.mjs +0 -263
  668. package/clients/cli/lib/update-check.mjs +0 -83
  669. package/clients/cli/lib/update-check.test.mjs +0 -137
  670. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -4,86 +4,81 @@
4
4
  * @file Codemod: Rename status variants positive/negative → success/error
5
5
  * @see https://github.com/facebookexperimental/xds/issues/996
6
6
  *
7
- * Converges component APIs to match the token layer naming:
8
- * - `positive` → `success` (maps to --color-success)
9
- * - `negative` → `error` (maps to --color-error)
10
- * - `info` → `accent` (maps to --color-accent)
11
- *
12
- * Affected components:
13
- * - XDSStatusDot: variant="positive|negative|info" → variant="success|error|accent"
14
- * - XDSAvatarStatusDot: variant="positive|negative" → variant="success|error"
15
- * - XDSIcon: color="positive|negative" → color="success|error"
16
- * - XDSProgressBar: variant="positive|negative" → variant="success|error"
17
- *
18
- * Transforms JSX attributes, object properties (in files importing affected
19
- * components), TypeScript type annotations, and Storybook argType options.
7
+ * This transform is deliberately limited to static literals written directly
8
+ * in affected props on imported JSX components. It does not infer through
9
+ * variables, helpers, objects, types, or wrappers: missing an indirect
10
+ * migration is safer than rewriting an unrelated domain using the same words.
20
11
  */
21
12
 
13
+ import {transformProp} from '../../transform-prop.mjs';
14
+
22
15
  export const meta = {
23
16
  title: 'Rename status variants positive/negative → success/error',
24
17
  description:
25
- 'Renames `positive` to `success`, `negative` to `error`, and `info` to `accent` ' +
26
- 'on StatusDot, AvatarStatusDot, Icon, SVGIcon, and ProgressBar to align with token naming. ' +
27
- 'The `info` -> `accent` rename is only applied to direct JSX attributes on these ' +
28
- 'components (where the component is known); in context-blind locations (object ' +
29
- 'properties, type unions) `info` is left untouched because it is a valid variant on ' +
30
- 'other components such as Badge.',
18
+ 'Renames static status values written directly on imported StatusDot, ' +
19
+ 'AvatarStatusDot, Icon, SVGIcon, ProgressBar, and Badge JSX elements. ' +
20
+ 'Indirect values are left unchanged for manual migration.',
31
21
  pr: '#996',
32
22
  };
33
23
 
34
- /** Rename mappings. */
35
- const RENAMES = new Map([
24
+ const CORE_IMPORT_RE = /^@(astryxdesign|xds)\/core(?:\/|$)/;
25
+
26
+ const COMPONENT_PROPS = new Map([
27
+ ['StatusDot', new Set(['variant'])],
28
+ ['AvatarStatusDot', new Set(['variant'])],
29
+ ['Icon', new Set(['color'])],
30
+ ['SVGIcon', new Set(['color'])],
31
+ ['ProgressBar', new Set(['variant'])],
32
+ ['Badge', new Set(['variant'])],
33
+ ]);
34
+
35
+ const STATUS_RENAMES = new Map([
36
36
  ['positive', 'success'],
37
37
  ['negative', 'error'],
38
38
  ['info', 'accent'],
39
39
  ]);
40
40
 
41
- /**
42
- * Ambiguous renames that are only safe when the target component is known.
43
- *
44
- * `info` is a VALID variant on non-target components (notably XDSBadge, whose
45
- * BadgeVariantMap still has `info`). `positive`/`negative` are not retained by
46
- * any component post-migration, so renaming them is always safe. Therefore the
47
- * context-blind heuristic paths (object properties, type unions, and suffixed
48
- * props on wrapper components) must NOT rewrite `info` — only the precise path,
49
- * a direct JSX attribute on a known target component, may. Otherwise a
50
- * `variant: 'info'` on an unrelated Badge config in a file that merely also
51
- * imports e.g. XDSIcon gets wrongly rewritten to the invalid `accent`.
52
- */
53
- const AMBIGUOUS_VALUES = new Set(['info']);
54
-
55
-
56
- /**
57
- * Components and which props are affected.
58
- * Key: component name. Value: set of prop names to check.
59
- */
60
- const COMPONENT_PROPS = new Map([
61
- ['XDSStatusDot', new Set(['variant'])],
62
- ['XDSAvatarStatusDot', new Set(['variant'])],
63
- ['XDSIcon', new Set(['color'])],
64
- ['XDSProgressBar', new Set(['variant'])],
41
+ const BADGE_RENAMES = new Map([
42
+ ['positive', 'success'],
43
+ ['negative', 'error'],
65
44
  ]);
66
45
 
67
- /** All affected component names for quick lookup. */
68
- const TARGET_COMPONENTS = new Set(COMPONENT_PROPS.keys());
69
-
70
- /** All affected prop names (variant, color). */
71
- const TARGET_PROP_NAMES = new Set();
72
- for (const props of COMPONENT_PROPS.values()) {
73
- for (const p of props) TARGET_PROP_NAMES.add(p);
46
+ /** @param {string} name */
47
+ function canonicalComponentName(name) {
48
+ return name.startsWith('XDS') ? name.slice(3) : name;
74
49
  }
75
50
 
76
51
  /**
77
- * Check if a key matches a target prop — exact or case-insensitive suffix.
78
- * e.g. "dotVariant" matches because it ends with "variant".
52
+ * @param {any} node
53
+ * @param {ReadonlyMap<string, string>} renames
54
+ * @returns {boolean}
79
55
  */
80
- function matchesPropName(/** @type {any} */ keyName) {
81
- if (TARGET_PROP_NAMES.has(keyName)) return true;
82
- const lower = keyName.toLowerCase();
83
- for (const prop of TARGET_PROP_NAMES) {
84
- if (lower.endsWith(prop.toLowerCase()) && lower !== prop.toLowerCase()) return true;
56
+ function renameStaticValue(node, renames) {
57
+ if (!node) return false;
58
+ if (
59
+ node.type === 'TSAsExpression' ||
60
+ node.type === 'TSSatisfiesExpression' ||
61
+ node.type === 'TypeCastExpression' ||
62
+ node.type === 'ParenthesizedExpression'
63
+ ) {
64
+ return renameStaticValue(node.expression, renames);
85
65
  }
86
- return false;
66
+ if (node.type === 'ConditionalExpression') {
67
+ const consequentChanged = renameStaticValue(node.consequent, renames);
68
+ const alternateChanged = renameStaticValue(node.alternate, renames);
69
+ return consequentChanged || alternateChanged;
70
+ }
71
+ if (
72
+ (node.type !== 'StringLiteral' && node.type !== 'Literal') ||
73
+ typeof node.value !== 'string'
74
+ ) {
75
+ return false;
76
+ }
77
+ const replacement = renames.get(node.value);
78
+ if (!replacement) return false;
79
+ node.value = replacement;
80
+ if (node.raw) node.raw = undefined;
81
+ return true;
87
82
  }
88
83
 
89
84
  /**
@@ -96,158 +91,25 @@ export default function transformer(file, api) {
96
91
  const root = j(file.source);
97
92
  let hasChanges = false;
98
93
 
99
- /**
100
- * Rename a string literal value if it matches our renames.
101
- * Unwraps TSAsExpression (e.g. 'positive' as const) to reach the literal.
102
- * @returns {boolean} whether a rename occurred
103
- */
104
- function renameValue(/** @type {any} */ node, {precise = false} = {}) {
105
- if (!node) return false;
106
-
107
- // Unwrap TSAsExpression (e.g. 'positive' as const → StringLiteral)
108
- const target = node.type === 'TSAsExpression' ? node.expression : node;
109
-
110
- const isString =
111
- target.type === 'StringLiteral' || target.type === 'Literal';
112
- if (!isString || typeof target.value !== 'string') return false;
113
-
114
- const replacement = RENAMES.get(target.value);
115
- if (!replacement) return false;
116
-
117
- // Ambiguous values (e.g. `info`) are only renamed in a precise context
118
- // where the target component is known (a direct JSX attribute on a target).
119
- // In context-blind paths they may belong to a component that legitimately
120
- // keeps the value (e.g. Badge's `info`), so leave them untouched.
121
- if (!precise && AMBIGUOUS_VALUES.has(target.value)) return false;
122
-
123
- target.value = replacement;
124
- if (target.raw) target.raw = undefined;
125
- return true;
126
- }
127
-
128
- /**
129
- * Rename elements in an array (handles TSAsExpression wrapping).
130
- */
131
- function renameArrayElements(/** @type {any} */ node, {precise = false} = {}) {
132
- let arrayNode = node;
133
- if (arrayNode.type === 'TSAsExpression') arrayNode = arrayNode.expression;
134
- if (arrayNode.type !== 'ArrayExpression') return;
135
- arrayNode.elements.forEach((/** @type {any} */ el) => {
136
- if (renameValue(el, {precise})) hasChanges = true;
137
- });
138
- }
139
-
140
- // Determine early: does this file import any target component?
141
- const importsTarget = [...TARGET_COMPONENTS].some(
142
- (name) =>
143
- root.find(j.ImportSpecifier, {imported: {name}}).length > 0,
94
+ transformProp(
95
+ root,
96
+ j,
97
+ {
98
+ matchesImport: source => CORE_IMPORT_RE.test(source),
99
+ components: COMPONENT_PROPS,
100
+ normalizeComponentName: canonicalComponentName,
101
+ },
102
+ (propPath, {component}) => {
103
+ const prop = propPath.node;
104
+ const value =
105
+ prop.value?.type === 'JSXExpressionContainer'
106
+ ? prop.value.expression
107
+ : prop.value;
108
+ const renames = component === 'Badge' ? BADGE_RENAMES : STATUS_RENAMES;
109
+ if (renameStaticValue(value, renames)) hasChanges = true;
110
+ },
144
111
  );
145
112
 
146
- // 1. JSX attributes on target components
147
- root.find(j.JSXOpeningElement).forEach((/** @type {any} */ path) => {
148
- const name = path.node.name;
149
- const componentName = name.type === 'JSXIdentifier' ? name.name : null;
150
- if (!componentName) return;
151
-
152
- const isDirectTarget = TARGET_COMPONENTS.has(componentName);
153
- // For non-target components, only check suffixed props if file imports targets
154
- if (!isDirectTarget && !importsTarget) return;
155
-
156
- path.node.attributes.forEach((/** @type {any} */ attr) => {
157
- if (attr.type !== 'JSXAttribute') return;
158
- const attrName = attr.name.name;
159
-
160
- if (isDirectTarget) {
161
- // Direct targets: only their specific props
162
- const targetProps = COMPONENT_PROPS.get(componentName);
163
- if (!targetProps || !targetProps.has(attrName)) return;
164
- } else {
165
- // Non-target components: suffixed prop names only
166
- // (e.g. dotVariant on ChangelogSection wrapping XDSStatusDot)
167
- if (!matchesPropName(attrName) || TARGET_PROP_NAMES.has(attrName)) return;
168
- }
169
-
170
- // Only a direct JSX attribute on a target component is a precise context
171
- // where the component (and thus the validity of `info`) is known. The
172
- // wrapper/suffixed-prop case is a heuristic and must not touch ambiguous
173
- // values.
174
- const precise = isDirectTarget;
175
- const value = attr.value;
176
-
177
- // variant="positive" (string literal)
178
- if (renameValue(value, {precise})) {
179
- hasChanges = true;
180
- return;
181
- }
182
-
183
- // variant={'positive'} (expression container)
184
- if (
185
- value &&
186
- value.type === 'JSXExpressionContainer' &&
187
- value.expression
188
- ) {
189
- if (renameValue(value.expression, {precise})) {
190
- hasChanges = true;
191
- return;
192
- }
193
-
194
- // variant={condition ? 'positive' : 'negative'} (ternary)
195
- if (value.expression.type === 'ConditionalExpression') {
196
- if (renameValue(value.expression.consequent, {precise}))
197
- hasChanges = true;
198
- if (renameValue(value.expression.alternate, {precise}))
199
- hasChanges = true;
200
- }
201
- }
202
- });
203
- });
204
-
205
- // 2. Object properties in files importing target components.
206
- // Handles args objects, config objects, Storybook argTypes, etc.
207
- if (importsTarget) {
208
- const PropertyType = j.ObjectProperty ?? j.Property;
209
- root.find(PropertyType).forEach((/** @type {any} */ path) => {
210
- const key = path.node.key;
211
- const keyName =
212
- key.type === 'Identifier'
213
- ? key.name
214
- : key.type === 'StringLiteral' || key.type === 'Literal'
215
- ? key.value
216
- : null;
217
-
218
- if (!keyName || !matchesPropName(keyName)) return;
219
-
220
- const value = path.node.value;
221
-
222
- // variant: 'positive' → variant: 'success'
223
- if (renameValue(value)) {
224
- hasChanges = true;
225
- return;
226
- }
227
-
228
- // variant: { options: ['positive', 'negative', ...] }
229
- if (value.type === 'ObjectExpression') {
230
- const optionsProp = value.properties.find(
231
- (/** @type {any} */ p) => p.key && (p.key.name === 'options' || p.key.value === 'options'),
232
- );
233
- if (optionsProp) {
234
- renameArrayElements(optionsProp.value);
235
- }
236
- }
237
-
238
- // variant: ['positive', 'negative'] or [...] as Type[]
239
- renameArrayElements(value);
240
- });
241
- }
242
-
243
- // 3. TypeScript type references: 'positive' | 'negative' in union types
244
- if (importsTarget) {
245
- root.find(j.TSLiteralType).forEach((/** @type {any} */ path) => {
246
- const lit = path.node.literal;
247
- if (renameValue(lit)) hasChanges = true;
248
- });
249
- }
250
-
251
113
  if (!hasChanges) return undefined;
252
114
  return root.toSource({quote: 'single'});
253
115
  }
@@ -1,161 +1,129 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- import {describe, it, expect} from 'vitest';
3
+ import {describe, expect, it} from 'vitest';
4
+ import transform from '../rename-avatar-size-scale.mjs';
4
5
 
5
6
  async function applyTransform(source) {
6
- const {default: transform} = await import('../rename-avatar-size-scale.mjs');
7
7
  const jscodeshift = (await import('jscodeshift')).default;
8
8
  const j = jscodeshift.withParser('tsx');
9
9
  const api = {jscodeshift: j, stats: () => {}, report: () => {}};
10
- const file = {source, path: 'test.tsx'};
11
- const result = transform(file, api);
12
- return result ?? source;
10
+ return transform({source, path: 'test.tsx'}, api) ?? source;
13
11
  }
14
12
 
15
13
  describe('rename-avatar-size-scale', () => {
16
- it('renames every named size on an Avatar JSX size attribute', async () => {
17
- const input = `import {Avatar} from '@astryxdesign/core';
14
+ it('renames every direct Avatar size literal', async () => {
15
+ const output =
16
+ await applyTransform(`import {Avatar} from '@astryxdesign/core';
18
17
  const a = <Avatar name="A" size="tiny" />;
19
18
  const b = <Avatar name="B" size="xsmall" />;
20
19
  const c = <Avatar name="C" size="small" />;
21
20
  const d = <Avatar name="D" size="medium" />;
22
- const e = <Avatar name="E" size="large" />;`;
23
- const output = await applyTransform(input);
24
- expect(output).toContain(`size='xsm'`);
25
- expect(output).toContain(`size='sm'`);
26
- expect(output).toContain(`size='md'`);
27
- expect(output).toContain(`size='lg'`);
28
- expect(output).toContain(`size='xl'`);
29
- for (const old of ['tiny', 'xsmall', 'small', 'medium', 'large']) {
30
- expect(output).not.toContain(`size="${old}"`);
21
+ const e = <Avatar name="E" size="large" />;`);
22
+
23
+ for (const size of ['xsm', 'sm', 'md', 'lg', 'xl']) {
24
+ expect(output).toContain(`size='${size}'`);
31
25
  }
32
26
  });
33
27
 
34
- it('renames size on AvatarGroup', async () => {
35
- const input = `import {AvatarGroup} from '@astryxdesign/core';
36
- const x = <AvatarGroup size="medium">{kids}</AvatarGroup>;`;
37
- const output = await applyTransform(input);
38
- expect(output).toContain(`size='lg'`);
39
- });
28
+ it('renames literals inside satisfies expressions while preserving the type', async () => {
29
+ const output =
30
+ await applyTransform(`import {Avatar} from '@astryxdesign/core';
31
+ const view = <Avatar size={'small' satisfies AvatarSize} />;`);
40
32
 
41
- it('leaves numeric sizes untouched', async () => {
42
- const input = `import {Avatar} from '@astryxdesign/core';
43
- const x = <Avatar name="A" size={48} />;`;
44
- const output = await applyTransform(input);
45
- expect(output).toContain('size={48}');
33
+ expect(output).toContain("{'md' satisfies AvatarSize}");
46
34
  });
47
35
 
48
- it('is alias-aware', async () => {
49
- const input = `import {Avatar as Face} from '@astryxdesign/core';
50
- const x = <Face name="A" size="small" />;`;
51
- const output = await applyTransform(input);
52
- expect(output).toContain(`size='md'`);
53
- });
36
+ it('renames AvatarGroup and conditional literals', async () => {
37
+ const output =
38
+ await applyTransform(`import {AvatarGroup} from '@astryxdesign/core';
39
+ const view = <AvatarGroup size={large ? 'large' : 'small'}>{kids}</AvatarGroup>;`);
54
40
 
55
- it('renames the subpath and legacy import sources', async () => {
56
- const sub = `import {Avatar} from '@astryxdesign/core/Avatar';
57
- const x = <Avatar name="A" size="large" />;`;
58
- expect(await applyTransform(sub)).toContain(`size='xl'`);
59
- const legacy = `import {Avatar} from '@xds/core';
60
- const x = <Avatar name="A" size="tiny" />;`;
61
- expect(await applyTransform(legacy)).toContain(`size='xsm'`);
41
+ expect(output).toContain("large ? 'xl' : 'md'");
62
42
  });
63
43
 
64
- it('renames a size inside a ternary on an Avatar element', async () => {
65
- const input = `import {Avatar} from '@astryxdesign/core';
66
- const x = <Avatar name="A" size={big ? 'large' : 'small'} />;`;
67
- const output = await applyTransform(input);
68
- expect(output).toContain(`big ? 'xl' : 'md'`);
69
- });
44
+ it('maps import aliases and default subpath imports', async () => {
45
+ const output =
46
+ await applyTransform(`import {Avatar as Face} from '@xds/core';
47
+ import Faces from '@astryxdesign/core/AvatarGroup';
48
+ const view = <><Face size="medium" /><Faces size="large" /></>;`);
70
49
 
71
- it('renames the UNIQUE names tiny/xsmall in Storybook options and size args', async () => {
72
- const input = `import {Avatar} from '@astryxdesign/core';
73
- const meta = {
74
- argTypes: {size: {control: 'select', options: ['tiny', 'xsmall']}},
75
- args: {size: 'tiny'},
76
- };`;
77
- const output = await applyTransform(input);
78
- expect(output).toContain(`['xsm', 'sm']`);
79
- expect(output).toContain(`size: 'xsm'`);
50
+ expect(output).toContain("<Face size='lg'");
51
+ expect(output).toContain("<Faces size='xl'");
80
52
  });
81
53
 
82
- it('renames a FULL Storybook options array (unique name unlocks ambiguous members)', async () => {
83
- // The presence of a unique name (tiny/xsmall) proves the whole array is the
84
- // Avatar size enum, so small/medium/large in it are safe to rename too.
85
- const input = `import {Avatar} from '@astryxdesign/core';
86
- const meta = {
87
- argTypes: {size: {control: 'select', options: ['tiny', 'xsmall', 'small', 'medium', 'large']}},
88
- };`;
89
- const output = await applyTransform(input);
90
- expect(output).toContain(`['xsm', 'sm', 'md', 'lg', 'xl']`);
91
- });
54
+ it('ignores declaration-level type imports paired with a local Avatar', async () => {
55
+ const input = `import type {Avatar} from '@astryxdesign/core';
56
+ const Avatar = props => <div {...props} />;
57
+ const view = <Avatar size="small" />;`;
92
58
 
93
- it('renames a standalone Avatar-size array literal used with .map()', async () => {
94
- const input = `import {AvatarGroup} from '@astryxdesign/core';
95
- const sizes = (['tiny', 'xsmall', 'small', 'medium', 'large'] as const).map(s => s);`;
96
- const output = await applyTransform(input);
97
- expect(output).toContain(`['xsm', 'sm', 'md', 'lg', 'xl']`);
59
+ expect(await applyTransform(input)).toBe(input);
98
60
  });
99
61
 
100
- it('does NOT rename an array of ambiguous words with no unique Avatar name', async () => {
101
- // Without tiny/xsmall, the array could be anything (priorities, densities),
102
- // so ambiguous members are left untouched.
103
- const input = `import {Avatar} from '@astryxdesign/core';
104
- const densities = ['small', 'medium', 'large'] as const;`;
105
- const output = await applyTransform(input);
106
- expect(output).toContain(`['small', 'medium', 'large']`);
107
- });
62
+ it('ignores mixed type specifiers while migrating runtime imports', async () => {
63
+ const output =
64
+ await applyTransform(`import {type Avatar, AvatarGroup} from '@astryxdesign/core';
65
+ const Avatar = props => <div {...props} />;
66
+ const view = <><Avatar size="small" /><AvatarGroup size="large" /></>;`);
108
67
 
109
- it('renames a UNIQUE name in a size-typed union literal', async () => {
110
- const input = `import {Avatar} from '@astryxdesign/core';
111
- type Props = {size: 'tiny' | 'xsmall'};`;
112
- const output = await applyTransform(input);
113
- expect(output).toContain(`'xsm' | 'sm'`);
68
+ expect(output).toContain('<Avatar size="small"');
69
+ expect(output).toContain("<AvatarGroup size='xl'");
114
70
  });
115
71
 
116
- // --- Precision guards: ambiguous common words must NOT be corrupted in
117
- // --- context-blind positions, even in files that import Avatar. ---
72
+ it('maps namespace imports', async () => {
73
+ const output =
74
+ await applyTransform(`import * as Core from '@astryxdesign/core';
75
+ const view = <Core.Avatar size="small" />;`);
118
76
 
119
- it('does NOT rename ambiguous names in an unrelated union type', async () => {
120
- const input = `import {Avatar} from '@astryxdesign/core';
121
- type TaskPriority = 'urgent' | 'high' | 'medium' | 'low' | 'none';`;
122
- const output = await applyTransform(input);
123
- expect(output).toContain(`'medium'`);
124
- expect(output).not.toContain(`'lg'`);
77
+ expect(output).toContain("size='md'");
125
78
  });
126
79
 
127
- it('does NOT rename an ambiguous name in a non-size object property', async () => {
80
+ it('leaves numeric and dynamic sizes untouched', async () => {
128
81
  const input = `import {Avatar} from '@astryxdesign/core';
129
- const cfg = {priority: 'medium', density: 'large'};`;
130
- const output = await applyTransform(input);
131
- expect(output).toContain(`priority: 'medium'`);
132
- expect(output).toContain(`density: 'large'`);
82
+ const named = 'small';
83
+ const a = <Avatar size={48} />;
84
+ const b = <Avatar size={named} />;`;
85
+ expect(await applyTransform(input)).toBe(input);
133
86
  });
134
87
 
135
- it('does NOT rename an ambiguous name in a size-keyed object property (component unknown)', async () => {
136
- // A `size: 'small'` object entry could belong to any component; renaming it
137
- // blind would be unsafe, so it is left for manual migration.
88
+ it('leaves objects, types, arrays, and Storybook metadata untouched', async () => {
138
89
  const input = `import {Avatar} from '@astryxdesign/core';
139
- const args = {size: 'small'};`;
140
- const output = await applyTransform(input);
141
- expect(output).toContain(`size: 'small'`);
90
+ type Density = 'tiny' | 'xsmall' | 'small' | 'medium' | 'large';
91
+ const card = {size: 'small'};
92
+ const sizes = ['tiny', 'xsmall', 'small', 'medium', 'large'];
93
+ const meta = {argTypes: {size: {options: sizes}}};
94
+ const view = <Avatar size={card.size} />;`;
95
+
96
+ expect(await applyTransform(input)).toBe(input);
142
97
  });
143
98
 
144
- it('does not touch files that never import Avatar/AvatarGroup', async () => {
99
+ it('does not touch files without an Avatar import', async () => {
145
100
  const input = `import {Badge} from '@astryxdesign/core';
146
- const x = <Badge size="small" />;
147
- type P = 'tiny' | 'xsmall';`;
148
- const output = await applyTransform(input);
149
- expect(output).toContain(`size="small"`);
150
- expect(output).toContain(`'tiny' | 'xsmall'`);
101
+ const view = <Badge size="small" />;`;
102
+ expect(await applyTransform(input)).toBe(input);
151
103
  });
152
104
 
153
- it('does not rename an unrelated non-size string in an Avatar file', async () => {
154
- const input = `import {Avatar} from '@astryxdesign/core';
155
- const label = 'small';
156
- const x = <Avatar name="A" size="small" />;`;
157
- const output = await applyTransform(input);
158
- expect(output).toContain(`const label = 'small'`);
159
- expect(output).toContain(`size='md'`);
105
+ it('ignores same-named components imported from other packages', async () => {
106
+ const input = `import {Avatar} from '@other/core';
107
+ const view = <Avatar size="small" />;`;
108
+ expect(await applyTransform(input)).toBe(input);
109
+ });
110
+
111
+ it('ignores a local component that shadows an imported alias', async () => {
112
+ const output =
113
+ await applyTransform(`import {Avatar as Face} from '@xds/core';
114
+ const migrated = <Face size="medium" />;
115
+ function Local(Face) { return <Face size="large" />; }`);
116
+
117
+ expect(output).toContain("size='lg'");
118
+ expect(output).toContain('size="large"');
119
+ });
120
+
121
+ it('leaves unrelated props on Avatar untouched', async () => {
122
+ const output =
123
+ await applyTransform(`import {Avatar} from '@astryxdesign/core';
124
+ const view = <Avatar size="small" label="small" />;`);
125
+
126
+ expect(output).toContain("size='md'");
127
+ expect(output).toContain('label="small"');
160
128
  });
161
129
  });