@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.ee13359

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 (571) hide show
  1. package/README.md +114 -76
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/build.doc.mjs +4 -3
  4. package/api/build/build.test.mjs +14 -3
  5. package/api/build/build.type.d.mts +36 -2
  6. package/api/build/build.type.mjs +25 -4
  7. package/api/build/help/help.d.mts +8 -5
  8. package/api/build/help/help.mjs +56 -6
  9. package/api/component/_adapter.d.mts +6 -12
  10. package/api/component/_adapter.mjs +20 -10
  11. package/api/component/component.doc.mjs +13 -3
  12. package/api/component/component.mjs +91 -14
  13. package/api/component/component.test.mjs +38 -0
  14. package/api/component/component.type.d.mts +22 -11
  15. package/api/component/component.type.mjs +32 -24
  16. package/api/component/detail/blocks/blocks.d.mts +2 -1
  17. package/api/component/detail/blocks/blocks.mjs +4 -3
  18. package/api/component/list/list.d.mts +0 -5
  19. package/api/component/list/list.mjs +40 -11
  20. package/api/discover/discover.doc.mjs +2 -1
  21. package/api/discover/discover.type.d.mts +4 -4
  22. package/api/discover/discover.type.mjs +10 -10
  23. package/api/docs/_adapter.d.mts +230 -41
  24. package/api/docs/_adapter.mjs +734 -108
  25. package/api/docs/compiled-topics.test.mjs +78 -0
  26. package/api/docs/detail/detail.mjs +22 -63
  27. package/api/docs/detail/section/section.d.mts +1 -1
  28. package/api/docs/detail/section/section.mjs +54 -19
  29. package/api/docs/detail/section/section.test.mjs +50 -0
  30. package/api/docs/docs.d.mts +10 -3
  31. package/api/docs/docs.doc.mjs +54 -16
  32. package/api/docs/docs.mjs +53 -10
  33. package/api/docs/docs.test.mjs +164 -4
  34. package/api/docs/docs.type.d.mts +205 -5
  35. package/api/docs/docs.type.mjs +137 -11
  36. package/api/docs/index/index.d.mts +18 -0
  37. package/api/docs/index/index.mjs +40 -0
  38. package/api/docs/index/index.test.mjs +62 -0
  39. package/api/docs/integration-tree.test.mjs +547 -0
  40. package/api/docs/integrationDocs.test.mjs +114 -8
  41. package/api/docs/list/list.mjs +28 -12
  42. package/api/docs/node/node.d.mts +43 -0
  43. package/api/docs/node/node.mjs +192 -0
  44. package/api/doctor/doctor.d.mts +99 -1
  45. package/api/doctor/doctor.doc.mjs +1 -0
  46. package/api/doctor/doctor.mjs +544 -1
  47. package/api/doctor/doctor.test.mjs +610 -1
  48. package/api/gap-report/gap-report.doc.mjs +8 -4
  49. package/api/hook/_adapter.mjs +19 -5
  50. package/api/hook/hook.doc.mjs +1 -0
  51. package/api/hook/hook.type.d.mts +3 -3
  52. package/api/hook/hook.type.mjs +11 -11
  53. package/api/hook/list/list.d.mts +2 -2
  54. package/api/hook/list/list.mjs +69 -17
  55. package/api/index.d.mts +1 -1
  56. package/api/index.mjs +1 -0
  57. package/api/init/init.doc.mjs +6 -1
  58. package/api/init/init.test.mjs +41 -1
  59. package/api/init/remove/remove.mjs +1 -1
  60. package/api/init/run/run.mjs +20 -10
  61. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  62. package/api/integration/add-contribution.d.mts +2 -1
  63. package/api/integration/add-contribution.mjs +130 -15
  64. package/api/integration/add-contribution.test.mjs +258 -7
  65. package/api/integration/add-theme.mjs +34 -64
  66. package/api/integration/add-theme.test.mjs +105 -21
  67. package/api/integration/authoring-checks.mjs +108 -31
  68. package/api/integration/authoring-checks.test.mjs +171 -6
  69. package/api/integration/authoring-checks.type.d.mts +3 -1
  70. package/api/integration/authoring-checks.type.mjs +3 -1
  71. package/api/integration/integration-authoring.type.d.mts +3 -1
  72. package/api/integration/integration-authoring.type.mjs +2 -0
  73. package/api/integration/integration-block-exports.test.mjs +10 -6
  74. package/api/integration/integrationAdd.doc.mjs +14 -4
  75. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  76. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  77. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  78. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  79. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  80. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  81. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  82. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  83. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  84. package/api/integration/integrationTemplateConflicts.doc.mjs +7 -5
  85. package/api/integration/pack-check.mjs +83 -7
  86. package/api/integration/pack-check.test.mjs +387 -47
  87. package/api/integration/pack-check.type.d.mts +26 -2
  88. package/api/integration/pack-check.type.mjs +14 -1
  89. package/api/integration/summarizeIssues.doc.mjs +1 -0
  90. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  91. package/api/integration/validate-integration.mjs +52 -102
  92. package/api/integration/validate-integration.test.mjs +179 -26
  93. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  94. package/api/integration/validateIntegration.doc.mjs +3 -2
  95. package/api/json/assertResponse.doc.mjs +1 -0
  96. package/api/json/envelope-types.test.mjs +76 -0
  97. package/api/json/index.ts +2 -0
  98. package/api/json/isError.doc.mjs +1 -0
  99. package/api/json/parseResponse.doc.mjs +3 -2
  100. package/api/layout/_adapter.mjs +20 -5
  101. package/api/layout/expand/expand.mjs +7 -5
  102. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  103. package/api/layout/grammar/grammar.mjs +2 -1
  104. package/api/layout/layoutCheck.doc.mjs +1 -0
  105. package/api/layout/layoutExpand.doc.mjs +2 -1
  106. package/api/layout/layoutGrammar.doc.mjs +1 -0
  107. package/api/search/search-return-type.test.mjs +54 -0
  108. package/api/search/search.d.mts +29 -11
  109. package/api/search/search.doc.mjs +8 -2
  110. package/api/search/search.mjs +337 -41
  111. package/api/search/search.test.mjs +124 -1
  112. package/api/search/search.type.d.mts +15 -3
  113. package/api/search/search.type.mjs +5 -2
  114. package/api/swizzle/copy/copy.mjs +28 -11
  115. package/api/swizzle/swizzle.doc.mjs +2 -1
  116. package/api/swizzle/swizzle.type.d.mts +2 -2
  117. package/api/swizzle/swizzle.type.mjs +2 -2
  118. package/api/template/copy/copy.mjs +17 -23
  119. package/api/template/copy/copy.test.mjs +17 -0
  120. package/api/template/list/list.mjs +1 -0
  121. package/api/template/template-integration.test.mjs +1022 -3
  122. package/api/template/template-suffix.test.mjs +41 -21
  123. package/api/template/template.d.mts +1 -1
  124. package/api/template/template.doc.mjs +30 -8
  125. package/api/template/template.mjs +45 -8
  126. package/api/template/template.type.d.mts +12 -14
  127. package/api/template/template.type.mjs +15 -14
  128. package/api/theme/_adapter.d.mts +2 -3
  129. package/api/theme/_adapter.mjs +4 -5
  130. package/api/theme/add/add.binary.test.mjs +84 -0
  131. package/api/theme/add/add.mjs +20 -3
  132. package/api/theme/add/add.staging.test.mjs +66 -0
  133. package/api/theme/add/add.test.mjs +14 -1
  134. package/api/theme/build/build.mjs +133 -42
  135. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  136. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  137. package/api/theme/build/build.test.mjs +127 -0
  138. package/api/theme/build/font-warning.mjs +3 -3
  139. package/api/theme/build/font-warning.test.mjs +5 -2
  140. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  141. package/api/theme/integration-themes.test.mjs +39 -28
  142. package/api/theme/list/list.test.mjs +19 -20
  143. package/api/theme/listThemes.doc.mjs +6 -5
  144. package/api/theme/palette/generate/generate.mjs +8 -3
  145. package/api/theme/palette/generate/generate.test.mjs +96 -0
  146. package/api/theme/palette/generate/generator.d.mts +10 -13
  147. package/api/theme/palette/generate/generator.mjs +15 -4
  148. package/api/theme/palette/generate/generator.test.mjs +10 -0
  149. package/api/theme/template/template.mjs +11 -2
  150. package/api/theme/template/template.test.mjs +20 -0
  151. package/api/theme/theme.type.d.mts +170 -11
  152. package/api/theme/theme.type.mjs +94 -27
  153. package/api/theme/themeAdd.doc.mjs +4 -3
  154. package/api/theme/themeBuild.doc.mjs +8 -4
  155. package/api/theme/themeList.doc.mjs +6 -3
  156. package/api/theme/themeListAvailable.doc.mjs +5 -3
  157. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  158. package/api/theme/themeTargets.doc.mjs +1 -0
  159. package/api/theme/themeTemplate.doc.mjs +6 -2
  160. package/api/upgrade/_adapter.d.mts +32 -5
  161. package/api/upgrade/_adapter.mjs +139 -22
  162. package/api/upgrade/list/list.mjs +2 -1
  163. package/api/upgrade/list/list.test.mjs +73 -0
  164. package/api/upgrade/project-context.test.mjs +272 -0
  165. package/api/upgrade/provider-agreement.test.mjs +152 -0
  166. package/api/upgrade/run/run.mjs +356 -59
  167. package/api/upgrade/status/status.mjs +2 -2
  168. package/api/upgrade/upgrade.doc.mjs +12 -5
  169. package/api/upgrade/upgrade.type.d.mts +43 -5
  170. package/api/upgrade/upgrade.type.mjs +27 -11
  171. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  172. package/assets/codemods/integration-discovery.mjs +48 -4
  173. package/assets/codemods/integration-discovery.test.mjs +73 -0
  174. package/assets/codemods/integration-runner.mjs +56 -4
  175. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  176. package/assets/codemods/run-codemod.mjs +177 -34
  177. package/assets/codemods/runner.mjs +350 -102
  178. package/assets/codemods/term-log.mjs +32 -8
  179. package/assets/codemods/term-log.test.mjs +19 -1
  180. package/assets/codemods/transform-prop.mjs +109 -0
  181. package/assets/codemods/transform-prop.test.mjs +95 -0
  182. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  183. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  184. package/assets/codemods/transforms/next/index.mjs +19 -1
  185. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  186. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  187. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  188. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  189. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  190. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  191. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  192. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  193. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  194. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  195. package/assets/docs/README.md +9 -0
  196. package/assets/docs/authoring.doc.mjs +14 -0
  197. package/assets/docs/getting-started.doc.mjs +2 -2
  198. package/assets/docs/principles.doc.mjs +6 -6
  199. package/assets/docs/styling-libraries.doc.mjs +3 -3
  200. package/assets/docs/styling.doc.mjs +4 -4
  201. package/assets/docs/theme.doc.mjs +4 -4
  202. package/assets/docs/tokens.doc.mjs +1 -1
  203. package/assets/docs/tree/api.doc.mjs +30 -0
  204. package/assets/docs/tree/cli.doc.mjs +23 -0
  205. package/assets/docs/tree/commands.doc.mjs +25 -0
  206. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +124 -25
  207. package/assets/docs/tree/integrations.test.mjs +62 -0
  208. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  209. package/assets/docs/working-with-ai.doc.mjs +1 -1
  210. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  211. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  212. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  213. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  214. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  215. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  216. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  217. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  218. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  219. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  220. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  221. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  222. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  223. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  224. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  225. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  226. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  227. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  228. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  229. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  230. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  231. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  232. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  233. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  234. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  235. package/authoring/_shared/contract.ts +22 -0
  236. package/authoring/codemod/codemod.doc.mjs +7 -2
  237. package/authoring/codemod/parse.d.mts +8 -8
  238. package/authoring/codemod/parse.mjs +8 -6
  239. package/authoring/codemod/type.ts +12 -0
  240. package/authoring/config/config.doc.mjs +2 -2
  241. package/authoring/config/debug-composition.test.mjs +92 -0
  242. package/authoring/config/parse.d.mts +13 -13
  243. package/authoring/config/parse.mjs +8 -8
  244. package/authoring/config/type.ts +18 -6
  245. package/authoring/debug/debug.doc.d.mts +11 -0
  246. package/authoring/debug/debug.doc.mjs +182 -0
  247. package/authoring/debug/parse.d.mts +8 -8
  248. package/authoring/debug/parse.mjs +3 -3
  249. package/authoring/doctypes/_schema.d.mts +718 -23
  250. package/authoring/doctypes/_schema.mjs +519 -39
  251. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  252. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  253. package/authoring/doctypes/base/type.ts +41 -0
  254. package/authoring/doctypes/command/command.doc.mjs +4 -3
  255. package/authoring/doctypes/command/parse.d.mts +2 -2
  256. package/authoring/doctypes/command/parse.mjs +1 -1
  257. package/authoring/doctypes/command/type.ts +5 -4
  258. package/authoring/doctypes/component/component.doc.mjs +6 -3
  259. package/authoring/doctypes/component/parse.d.mts +2 -2
  260. package/authoring/doctypes/component/parse.mjs +1 -1
  261. package/authoring/doctypes/component/type.ts +6 -5
  262. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  263. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  264. package/authoring/doctypes/enum/parse.d.mts +2 -2
  265. package/authoring/doctypes/enum/parse.mjs +1 -1
  266. package/authoring/doctypes/enum/type.ts +4 -2
  267. package/authoring/doctypes/function/function.doc.mjs +7 -2
  268. package/authoring/doctypes/function/parse.d.mts +2 -2
  269. package/authoring/doctypes/function/parse.mjs +1 -1
  270. package/authoring/doctypes/function/type.ts +9 -4
  271. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  272. package/authoring/doctypes/hook/parse.d.mts +2 -2
  273. package/authoring/doctypes/hook/parse.mjs +1 -1
  274. package/authoring/doctypes/hook/type.ts +5 -4
  275. package/authoring/doctypes/legacy.d.mts +8 -6
  276. package/authoring/doctypes/legacy.mjs +5 -4
  277. package/authoring/doctypes/load-contract.test.mjs +208 -0
  278. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  279. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  280. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  281. package/authoring/doctypes/namespace/parse.mjs +25 -0
  282. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  283. package/authoring/doctypes/namespace/type.ts +74 -0
  284. package/authoring/doctypes/parse.d.mts +22 -18
  285. package/authoring/doctypes/parse.mjs +22 -11
  286. package/authoring/doctypes/parse.test.mjs +77 -3
  287. package/authoring/doctypes/reference/parse.d.mts +2 -2
  288. package/authoring/doctypes/reference/parse.mjs +8 -5
  289. package/authoring/doctypes/reference/reference.doc.mjs +20 -5
  290. package/authoring/doctypes/reference/type.ts +53 -5
  291. package/authoring/doctypes/schema/parse.d.mts +2 -2
  292. package/authoring/doctypes/schema/parse.mjs +1 -1
  293. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  294. package/authoring/doctypes/schema/type.ts +4 -4
  295. package/authoring/doctypes/template/parse.d.mts +94 -1
  296. package/authoring/doctypes/template/parse.mjs +40 -2
  297. package/authoring/doctypes/template/parse.test.mjs +26 -2
  298. package/authoring/doctypes/template/template.doc.mjs +13 -3
  299. package/authoring/doctypes/template/type.ts +13 -2
  300. package/authoring/doctypes/theme/parse.d.mts +35 -0
  301. package/authoring/doctypes/theme/parse.mjs +76 -0
  302. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  303. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  304. package/authoring/doctypes/theme/type.ts +42 -0
  305. package/authoring/doctypes/types.ts +12 -10
  306. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  307. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  308. package/authoring/gap-report/parse.d.mts +10 -10
  309. package/authoring/gap-report/parse.mjs +6 -6
  310. package/authoring/gap-report/type.ts +1 -1
  311. package/authoring/identity/identity.doc.d.mts +9 -0
  312. package/authoring/identity/identity.doc.mjs +61 -0
  313. package/authoring/identity/type.ts +132 -0
  314. package/authoring/index.d.mts +2 -0
  315. package/authoring/index.d.ts +52 -17
  316. package/authoring/index.mjs +3 -1
  317. package/authoring/integration/integration.doc.mjs +15 -8
  318. package/authoring/integration/parse.d.mts +2 -2
  319. package/authoring/integration/parse.mjs +1 -1
  320. package/authoring/integration/parse.test.mjs +10 -1
  321. package/authoring/integration/schema.d.mts +6 -4
  322. package/authoring/integration/schema.mjs +9 -3
  323. package/authoring/integration/type.ts +19 -8
  324. package/authoring/shadcn/receipt.d.mts +6 -6
  325. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  326. package/clients/cli/command-load-failure.test.mjs +83 -0
  327. package/clients/cli/commands/blog.doc.mjs +1 -1
  328. package/clients/cli/commands/blog.mjs +23 -8
  329. package/clients/cli/commands/blog.test.mjs +42 -1
  330. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  331. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  332. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  333. package/clients/cli/commands/build-theme.mjs +16 -50
  334. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  335. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  336. package/clients/cli/commands/build.doc.mjs +5 -2
  337. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  338. package/clients/cli/commands/build.mjs +37 -49
  339. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  340. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  341. package/clients/cli/commands/component/index.mjs +3 -8
  342. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  343. package/clients/cli/commands/component-package.test.mjs +46 -0
  344. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  345. package/clients/cli/commands/component.doc.mjs +1 -1
  346. package/clients/cli/commands/component.test.mjs +19 -0
  347. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  348. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  349. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  350. package/clients/cli/commands/discover.doc.mjs +5 -3
  351. package/clients/cli/commands/discover.mjs +4 -4
  352. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  353. package/clients/cli/commands/docs.doc.mjs +28 -6
  354. package/clients/cli/commands/docs.mjs +238 -24
  355. package/clients/cli/commands/docs.test.mjs +193 -1
  356. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  357. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  358. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  359. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  360. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  361. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  362. package/clients/cli/commands/doctor-integration.test.mjs +83 -8
  363. package/clients/cli/commands/doctor.doc.mjs +1 -1
  364. package/clients/cli/commands/doctor.mjs +30 -25
  365. package/clients/cli/commands/doctor.test.mjs +42 -0
  366. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  367. package/clients/cli/commands/gap-report.test.mjs +72 -0
  368. package/clients/cli/commands/hook/index.mjs +7 -17
  369. package/clients/cli/commands/hook.doc.mjs +1 -1
  370. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  371. package/clients/cli/commands/init.doc.mjs +20 -9
  372. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  373. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  374. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  375. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  376. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  377. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  378. package/clients/cli/commands/integration.doc.mjs +1 -1
  379. package/clients/cli/commands/integration.mjs +1 -0
  380. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  381. package/clients/cli/commands/json-contract.test.mjs +33 -0
  382. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  383. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  384. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  385. package/clients/cli/commands/layout.doc.mjs +3 -3
  386. package/clients/cli/commands/layout.mjs +21 -9
  387. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  388. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  389. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  390. package/clients/cli/commands/manifest.doc.mjs +1 -1
  391. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  392. package/clients/cli/commands/search.doc.mjs +7 -4
  393. package/clients/cli/commands/search.mjs +28 -9
  394. package/clients/cli/commands/search.test.mjs +75 -0
  395. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  396. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  397. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  398. package/clients/cli/commands/template.doc.mjs +52 -13
  399. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  400. package/clients/cli/commands/template.mjs +4 -91
  401. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  402. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  403. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  404. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  405. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  406. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  407. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  408. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  409. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  410. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  411. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  412. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  413. package/clients/cli/commands/theme.doc.mjs +1 -1
  414. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  415. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  416. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  417. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  418. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  419. package/clients/cli/commands/upgrade.mjs +29 -7
  420. package/clients/cli/formatters/index.mjs +164 -1
  421. package/clients/cli/formatters/index.test.mjs +97 -0
  422. package/clients/cli/index.mjs +21 -30
  423. package/clients/cli/latest-version-env.test.mjs +50 -0
  424. package/clients/cli/lib/cli-error.test.mjs +7 -0
  425. package/clients/cli/lib/component-format.mjs +9 -9
  426. package/clients/cli/lib/component-format.test.mjs +1 -1
  427. package/clients/cli/lib/define-command.mjs +32 -6
  428. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  429. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  430. package/clients/cli/lib/hook-format.mjs +19 -10
  431. package/clients/cli/lib/json-shim.mjs +38 -2
  432. package/clients/cli/lib/json-shim.test.mjs +83 -0
  433. package/clients/cli/lib/manifest.d.ts +2 -0
  434. package/clients/cli/lib/manifest.mjs +36 -2
  435. package/clients/cli/lib/manifest.test.mjs +17 -0
  436. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  437. package/foundation/agent-docs/agent-docs.mjs +70 -3
  438. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  439. package/foundation/agent-docs/agent-docs.test.mjs +10 -1
  440. package/foundation/config/integration-debug.test.mjs +28 -3
  441. package/foundation/config/project-themes.test.mjs +11 -19
  442. package/foundation/config/project.d.mts +20 -11
  443. package/foundation/config/project.mjs +263 -91
  444. package/foundation/config/project.test.mjs +270 -21
  445. package/foundation/discovery/authoring-self-docs.d.mts +75 -0
  446. package/foundation/discovery/authoring-self-docs.mjs +224 -0
  447. package/foundation/discovery/authoring-self-docs.test.mjs +165 -0
  448. package/foundation/discovery/authoring-surface.d.mts +74 -0
  449. package/foundation/discovery/authoring-surface.mjs +525 -0
  450. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  451. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  452. package/foundation/discovery/cli-self-docs.mjs +490 -0
  453. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  454. package/foundation/discovery/component-discovery.d.mts +39 -1
  455. package/foundation/discovery/component-discovery.mjs +50 -1
  456. package/foundation/discovery/component-loader.d.mts +35 -38
  457. package/foundation/discovery/component-loader.mjs +53 -222
  458. package/foundation/discovery/docs-discovery.d.mts +116 -11
  459. package/foundation/discovery/docs-discovery.mjs +389 -108
  460. package/foundation/discovery/docs-discovery.test.mjs +325 -20
  461. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  462. package/foundation/discovery/docs-output-budget.mjs +50 -0
  463. package/foundation/discovery/docs-section-key.d.mts +116 -0
  464. package/foundation/discovery/docs-section-key.mjs +322 -0
  465. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  466. package/foundation/discovery/template-adapter.d.mts +113 -11
  467. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  468. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  469. package/foundation/discovery/template-adapter.mjs +774 -83
  470. package/foundation/discovery/template-adapter.test.mjs +57 -0
  471. package/foundation/discovery/theme-discovery.d.mts +67 -7
  472. package/foundation/discovery/theme-discovery.mjs +916 -186
  473. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  474. package/foundation/discovery/theming-targets.test.mjs +4 -0
  475. package/foundation/doc-compiler/bundle.d.mts +47 -0
  476. package/foundation/doc-compiler/bundle.mjs +278 -0
  477. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  478. package/foundation/doc-compiler/compile.d.mts +343 -0
  479. package/foundation/doc-compiler/compile.mjs +558 -0
  480. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  481. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  482. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  483. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  484. package/foundation/doc-compiler/import.d.mts +24 -0
  485. package/foundation/doc-compiler/import.mjs +59 -0
  486. package/foundation/doc-compiler/inputs.d.mts +102 -0
  487. package/foundation/doc-compiler/inputs.mjs +291 -0
  488. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  489. package/foundation/doc-compiler/ir.d.mts +22 -0
  490. package/foundation/doc-compiler/ir.mjs +471 -0
  491. package/foundation/doc-compiler/lenses.d.mts +34 -0
  492. package/foundation/doc-compiler/lenses.mjs +128 -0
  493. package/foundation/doc-compiler/links.d.mts +135 -0
  494. package/foundation/doc-compiler/links.mjs +253 -0
  495. package/foundation/doc-compiler/links.test.mjs +139 -0
  496. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  497. package/foundation/doc-compiler/overlays.d.mts +37 -0
  498. package/foundation/doc-compiler/overlays.mjs +206 -0
  499. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  500. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  501. package/foundation/doc-compiler/read.d.mts +127 -0
  502. package/foundation/doc-compiler/read.mjs +325 -0
  503. package/foundation/doc-compiler/read.test.mjs +313 -0
  504. package/foundation/doc-compiler/source.d.mts +33 -0
  505. package/foundation/doc-compiler/source.mjs +128 -0
  506. package/foundation/doc-compiler/tree.d.mts +288 -0
  507. package/foundation/doc-compiler/tree.mjs +876 -0
  508. package/foundation/doc-compiler/tree.test.mjs +598 -0
  509. package/foundation/fs/file-protection.d.mts +33 -0
  510. package/foundation/fs/file-protection.mjs +825 -0
  511. package/foundation/fs/file-protection.test.mjs +250 -0
  512. package/foundation/fs/module-loader.d.mts +1 -0
  513. package/foundation/fs/module-loader.mjs +50 -1
  514. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  515. package/foundation/fs/path-safety.d.mts +3 -2
  516. package/foundation/fs/path-safety.mjs +49 -19
  517. package/foundation/fs/path-safety.test.mjs +50 -0
  518. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  519. package/foundation/identity/provider-identity.d.mts +90 -0
  520. package/foundation/identity/provider-identity.mjs +320 -0
  521. package/foundation/identity/provider-identity.test.mjs +254 -0
  522. package/foundation/identity/providers.d.mts +7 -0
  523. package/foundation/identity/providers.mjs +16 -0
  524. package/foundation/integrations/autolink.d.mts +58 -1
  525. package/foundation/integrations/autolink.mjs +143 -45
  526. package/foundation/integrations/autolink.test.mjs +1 -1
  527. package/foundation/integrations/cli-requirement.d.mts +45 -0
  528. package/foundation/integrations/cli-requirement.mjs +154 -0
  529. package/foundation/integrations/cli-requirement.test.mjs +109 -0
  530. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  531. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  532. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  533. package/foundation/integrations/contribution-inventory.mjs +27 -24
  534. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  535. package/foundation/integrations/integration-warnings.d.mts +9 -2
  536. package/foundation/integrations/integration-warnings.mjs +52 -21
  537. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  538. package/foundation/integrations/integrations.d.mts +49 -2
  539. package/foundation/integrations/integrations.mjs +81 -8
  540. package/foundation/integrations/integrations.test.mjs +384 -1
  541. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  542. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  543. package/foundation/integrations/provider-resolution.d.mts +152 -0
  544. package/foundation/integrations/provider-resolution.mjs +576 -0
  545. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  546. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  547. package/foundation/integrations/theme-descriptor.mjs +44 -0
  548. package/foundation/integrations/validate-contributions.d.mts +2 -0
  549. package/foundation/integrations/validate-contributions.mjs +131 -29
  550. package/foundation/response/base.d.ts +8 -4
  551. package/foundation/response/error-codes.d.mts +3 -1
  552. package/foundation/response/error-codes.d.ts +2 -0
  553. package/foundation/response/error-codes.doc.mjs +13 -4
  554. package/foundation/response/error-codes.mjs +8 -2
  555. package/foundation/response/error-codes.test.mjs +137 -10
  556. package/foundation/response/json-contract.test.mjs +57 -17
  557. package/foundation/response/json.d.mts +4 -2
  558. package/foundation/response/json.mjs +8 -10
  559. package/foundation/response/response-types.doc.mjs +26 -16
  560. package/foundation/response/response-types.doc.test.mjs +158 -0
  561. package/foundation/response/response.doc.mjs +1 -1
  562. package/foundation/text/string-utils.mjs +22 -10
  563. package/foundation/xle/expand.d.mts +2 -0
  564. package/foundation/xle/expand.mjs +4 -3
  565. package/foundation/xle/expand.test.mjs +54 -0
  566. package/foundation/xle/xle.test.mjs +13 -0
  567. package/package.json +10 -11
  568. package/assets/templates/themes/manifest.json +0 -95
  569. package/clients/cli/lib/update-check.mjs +0 -83
  570. package/clients/cli/lib/update-check.test.mjs +0 -137
  571. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -4,46 +4,23 @@
4
4
  * @file Codemod: Rename Avatar named sizes to Icon's abbreviated scale
5
5
  * @see https://github.com/facebook/astryx/issues/2672
6
6
  *
7
- * As of v0.1.8, Avatar and AvatarGroup use the same abbreviated size scale as
8
- * Icon (`xsm`/`sm`/`md`/`lg`/`xl`) instead of full words. Pixel values are
9
- * unchanged — only the names move:
10
- *
11
- * tiny (20px) → xsm
12
- * xsmall (24px) → sm
13
- * small (36px) → md ← also the new default (was `small`)
14
- * medium (48px) → lg
15
- * large (128px) → xl
16
- *
17
- * The default size shifts from `small` to `md`, but that is the SAME 36px, so
18
- * call sites that relied on the default need no change.
19
- *
20
- * ## Precision
21
- *
22
- * `small`, `medium`, and `large` are common English words that appear as
23
- * unrelated string/type literals (priorities, statuses, breakpoints, …). To
24
- * avoid corrupting those, the three AMBIGUOUS names are renamed ONLY in a
25
- * precise context: a `size` JSX attribute on a component that resolves to an
26
- * Avatar/AvatarGroup import (alias-aware).
27
- *
28
- * `tiny` and `xsmall` are unique to Avatar's scale, so they are additionally
29
- * renamed in context-blind positions (object properties keyed `size`/`*Size`,
30
- * Storybook `options` arrays, and size-typed union literals) within files that
31
- * import Avatar/AvatarGroup.
7
+ * This transform is deliberately limited to static literals written directly
8
+ * in the `size` prop of an imported Avatar or AvatarGroup JSX element. It does
9
+ * not infer through variables, helpers, objects, types, Storybook metadata, or
10
+ * wrappers: missing an indirect migration is safer than rewriting another
11
+ * component's size vocabulary.
32
12
  */
33
13
 
14
+ import {transformProp} from '../../transform-prop.mjs';
15
+
34
16
  export const meta = {
35
17
  title: 'Rename Avatar named sizes tiny/xsmall/small/medium/large → xsm/sm/md/lg/xl',
36
18
  description:
37
- 'Avatar and AvatarGroup adopt Icon\'s abbreviated size scale ' +
38
- '(xsm/sm/md/lg/xl). Pixel values are unchanged; the default moves from ' +
39
- '`small` to `md` (both 36px). The ambiguous names small/medium/large are ' +
40
- 'only renamed on Avatar/AvatarGroup `size` JSX attributes; the unique ' +
41
- 'names tiny/xsmall are also renamed in size-keyed props, Storybook ' +
42
- 'options, and union types in files importing Avatar/AvatarGroup.',
19
+ 'Renames static sizes written directly on imported Avatar and AvatarGroup ' +
20
+ 'JSX elements. Indirect values are left unchanged for manual migration.',
43
21
  pr: '#2672',
44
22
  };
45
23
 
46
- /** Import sources that provide the Astryx Avatar/AvatarGroup components. */
47
24
  const IMPORT_SOURCES = new Set([
48
25
  '@astryxdesign/core',
49
26
  '@astryxdesign/core/Avatar',
@@ -53,10 +30,11 @@ const IMPORT_SOURCES = new Set([
53
30
  '@xds/core/AvatarGroup',
54
31
  ]);
55
32
 
56
- /** Component names whose `size` prop is renamed. */
57
- const TARGET_IMPORTED_NAMES = new Set(['Avatar', 'AvatarGroup']);
33
+ const COMPONENT_PROPS = new Map([
34
+ ['Avatar', new Set(['size'])],
35
+ ['AvatarGroup', new Set(['size'])],
36
+ ]);
58
37
 
59
- /** Old → new size-name mapping. */
60
38
  const RENAMES = new Map([
61
39
  ['tiny', 'xsm'],
62
40
  ['xsmall', 'sm'],
@@ -65,46 +43,38 @@ const RENAMES = new Map([
65
43
  ['large', 'xl'],
66
44
  ]);
67
45
 
68
- /**
69
- * Ambiguous names — common words that must ONLY be renamed in a precise
70
- * context. `tiny`/`xsmall` are omitted because they are unique to Avatar's
71
- * scale; their presence in a collection proves it is an Avatar size enum.
72
- */
73
- const AMBIGUOUS = new Set(['small', 'medium', 'large']);
74
-
75
- /** Names that appear only in Avatar's scale — safe signals of Avatar sizing. */
76
- const UNIQUE = new Set(['tiny', 'xsmall']);
77
-
78
- /**
79
- * Rename a string-literal node if its value is an old size name.
80
- * Unwraps `'small' as const`. In non-precise contexts, ambiguous names are
81
- * skipped. Returns true when a rename occurred.
82
- */
83
- function renameValue(/** @type {any} */ node, {precise = false} = {}) {
84
- if (!node) return false;
85
- const target = node.type === 'TSAsExpression' ? node.expression : node;
86
- const isString =
87
- target.type === 'StringLiteral' || target.type === 'Literal';
88
- if (!isString || typeof target.value !== 'string') return false;
89
- const replacement = RENAMES.get(target.value);
90
- if (!replacement) return false;
91
- if (!precise && AMBIGUOUS.has(target.value)) return false;
92
- target.value = replacement;
93
- if (target.raw) target.raw = undefined;
94
- return true;
46
+ /** @param {string} name */
47
+ function canonicalComponentName(name) {
48
+ return name.startsWith('XDS') ? name.slice(3) : name;
95
49
  }
96
50
 
97
- /** Extract a plain string value from a literal-ish node, or null. */
98
- function literalString(/** @type {any} */ node) {
99
- const target = node?.type === 'TSAsExpression' ? node.expression : node;
51
+ /** @param {any} node @returns {boolean} */
52
+ function renameStaticValue(node) {
53
+ if (!node) return false;
100
54
  if (
101
- target &&
102
- (target.type === 'StringLiteral' || target.type === 'Literal') &&
103
- typeof target.value === 'string'
55
+ node.type === 'TSAsExpression' ||
56
+ node.type === 'TSSatisfiesExpression' ||
57
+ node.type === 'TypeCastExpression' ||
58
+ node.type === 'ParenthesizedExpression'
104
59
  ) {
105
- return target.value;
60
+ return renameStaticValue(node.expression);
106
61
  }
107
- return null;
62
+ if (node.type === 'ConditionalExpression') {
63
+ const consequentChanged = renameStaticValue(node.consequent);
64
+ const alternateChanged = renameStaticValue(node.alternate);
65
+ return consequentChanged || alternateChanged;
66
+ }
67
+ if (
68
+ (node.type !== 'StringLiteral' && node.type !== 'Literal') ||
69
+ typeof node.value !== 'string'
70
+ ) {
71
+ return false;
72
+ }
73
+ const replacement = RENAMES.get(node.value);
74
+ if (!replacement) return false;
75
+ node.value = replacement;
76
+ if (node.raw) node.raw = undefined;
77
+ return true;
108
78
  }
109
79
 
110
80
  /**
@@ -117,122 +87,23 @@ export default function transformer(file, api) {
117
87
  const root = j(file.source);
118
88
  let hasChanges = false;
119
89
 
120
- // Track alias-aware local names for the target components.
121
- const targetLocals = new Set();
122
- root.find(j.ImportDeclaration).forEach((/** @type {any} */ path) => {
123
- if (!IMPORT_SOURCES.has(path.node.source.value)) return;
124
- for (const spec of path.node.specifiers ?? []) {
125
- if (
126
- spec.type === 'ImportSpecifier' &&
127
- TARGET_IMPORTED_NAMES.has(spec.imported.name)
128
- ) {
129
- targetLocals.add(spec.local.name);
130
- }
131
- }
132
- });
133
-
134
- if (targetLocals.size === 0) return undefined;
135
-
136
- function renameArrayElements(/** @type {any} */ node) {
137
- let arr = node;
138
- if (arr.type === 'TSAsExpression') arr = arr.expression;
139
- if (arr.type !== 'ArrayExpression') return;
140
- // If the array contains a name unique to Avatar's scale (tiny/xsmall), the
141
- // whole collection is unambiguously the Avatar size enum, so it is safe to
142
- // rename the ambiguous members too. Otherwise stay conservative.
143
- const precise = arr.elements.some((/** @type {any} */ el) => UNIQUE.has(literalString(el)));
144
- for (const el of arr.elements) {
145
- if (renameValue(el, {precise})) hasChanges = true;
146
- }
147
- }
148
-
149
- // 1. `size` JSX attributes on target components — PRECISE (component known),
150
- // so all five names, including the ambiguous ones, are renamed here.
151
- root.find(j.JSXOpeningElement).forEach((/** @type {any} */ path) => {
152
- const name = path.node.name;
153
- const componentName = name.type === 'JSXIdentifier' ? name.name : null;
154
- if (!componentName || !targetLocals.has(componentName)) return;
155
-
156
- for (const attr of path.node.attributes) {
157
- if (attr.type !== 'JSXAttribute' || attr.name?.name !== 'size') continue;
158
- const value = attr.value;
159
-
160
- // size="small"
161
- if (renameValue(value, {precise: true})) {
162
- hasChanges = true;
163
- continue;
164
- }
165
- if (
166
- value &&
167
- value.type === 'JSXExpressionContainer' &&
168
- value.expression
169
- ) {
170
- // size={'small'}
171
- if (renameValue(value.expression, {precise: true})) {
172
- hasChanges = true;
173
- continue;
174
- }
175
- // size={cond ? 'small' : 'large'}
176
- if (value.expression.type === 'ConditionalExpression') {
177
- if (renameValue(value.expression.consequent, {precise: true}))
178
- hasChanges = true;
179
- if (renameValue(value.expression.alternate, {precise: true}))
180
- hasChanges = true;
181
- }
182
- }
183
- }
184
- });
185
-
186
- // 2. Object properties keyed `size` (or `*Size`) + Storybook `options`
187
- // arrays — NON-PRECISE (the component isn't known here), so only the
188
- // unique names tiny/xsmall are renamed.
189
- const PropertyType = j.ObjectProperty ?? j.Property;
190
- root.find(PropertyType).forEach((/** @type {any} */ path) => {
191
- const key = path.node.key;
192
- const keyName =
193
- key.type === 'Identifier'
194
- ? key.name
195
- : key.type === 'StringLiteral' || key.type === 'Literal'
196
- ? key.value
197
- : null;
198
- if (typeof keyName !== 'string') return;
199
-
200
- const lower = keyName.toLowerCase();
201
- if (lower !== 'size' && !lower.endsWith('size')) return;
202
-
203
- const value = path.node.value;
204
- // size: 'tiny'
205
- if (renameValue(value)) {
206
- hasChanges = true;
207
- return;
208
- }
209
- // size: { control: 'select', options: ['tiny', ...] }
210
- if (value.type === 'ObjectExpression') {
211
- const optionsProp = value.properties.find(
212
- (/** @type {any} */ p) => p.key && (p.key.name === 'options' || p.key.value === 'options'),
213
- );
214
- if (optionsProp) renameArrayElements(optionsProp.value);
215
- }
216
- // size: ['tiny', 'xsmall', ...]
217
- renameArrayElements(value);
218
- });
219
-
220
- // 3. Union-type literals — NON-PRECISE, so only the unique names tiny/xsmall
221
- // are renamed. This avoids corrupting unrelated unions that happen to use
222
- // common words like 'medium' (e.g. a priority or breakpoint type) in a
223
- // file that also imports Avatar.
224
- root.find(j.TSLiteralType).forEach((/** @type {any} */ path) => {
225
- if (renameValue(path.node.literal)) hasChanges = true;
226
- });
227
-
228
- // 4. Standalone array literals whose members are exactly the Avatar size
229
- // scale (identified by the presence of a unique name like tiny/xsmall) —
230
- // e.g. `(['tiny', 'xsmall', 'small', 'medium', 'large'] as const).map(...)`
231
- // used to render every size. The unique name proves the whole array is the
232
- // Avatar enum, so its ambiguous members can be renamed safely.
233
- root.find(j.ArrayExpression).forEach((/** @type {any} */ path) => {
234
- renameArrayElements(path.node);
235
- });
90
+ transformProp(
91
+ root,
92
+ j,
93
+ {
94
+ matchesImport: source => IMPORT_SOURCES.has(source),
95
+ components: COMPONENT_PROPS,
96
+ normalizeComponentName: canonicalComponentName,
97
+ },
98
+ propPath => {
99
+ const prop = propPath.node;
100
+ const value =
101
+ prop.value?.type === 'JSXExpressionContainer'
102
+ ? prop.value.expression
103
+ : prop.value;
104
+ if (renameStaticValue(value)) hasChanges = true;
105
+ },
106
+ );
236
107
 
237
108
  if (!hasChanges) return undefined;
238
109
  return root.toSource({quote: 'single'});
@@ -3,7 +3,8 @@
3
3
  import {describe, it, expect} from 'vitest';
4
4
 
5
5
  async function applyTransform(source, path = 'test.ts') {
6
- const {default: transform} = await import('../unwrap-authoring-factories.mjs');
6
+ const {default: transform} =
7
+ await import('../unwrap-authoring-factories.mjs');
7
8
  const jscodeshift = (await import('jscodeshift')).default;
8
9
  const j = jscodeshift.withParser('tsx');
9
10
  const api = {jscodeshift: j, stats: () => {}, report: () => {}};
@@ -18,7 +19,7 @@ export default createConfig({integrations: ['@acme/widgets']});
18
19
  `;
19
20
  const output = await applyTransform(input);
20
21
  expect(output).not.toContain('createConfig');
21
- expect(output).toContain("export default {");
22
+ expect(output).toContain('export default {');
22
23
  expect(output).toContain("integrations: ['@acme/widgets']");
23
24
  expect(output).not.toContain('type:');
24
25
  });
@@ -132,13 +133,34 @@ export default createComponentDoc();
132
133
  expect(output).toContain("type: 'component'");
133
134
  });
134
135
 
136
+ it('leaves same-named factories from unrelated packages unchanged', async () => {
137
+ const input = `import {createConfig} from '@acme/eslint';
138
+ export default createConfig({strict: true});
139
+ `;
140
+ expect(await applyTransform(input)).toBe(input);
141
+ });
142
+
143
+ it('keeps an unrelated same-named import when another factory is migrated', async () => {
144
+ const input = `import {createConfig as createLintConfig} from '@acme/eslint';
145
+ import {createDoc} from '@astryxdesign/cli/doc';
146
+ export const lintConfig = createLintConfig({strict: true});
147
+ export const doc = createDoc({name: 'Theming', description: 'How theming works.'});
148
+ `;
149
+ const output = await applyTransform(input);
150
+ expect(output).toContain(
151
+ "import {createConfig as createLintConfig} from '@acme/eslint'",
152
+ );
153
+ expect(output).toContain('createLintConfig({strict: true})');
154
+ expect(output).not.toContain('createDoc');
155
+ expect(output).toContain("type: 'generic'");
156
+ });
157
+
135
158
  it('is a no-op when no authoring factory is imported', async () => {
136
159
  const input = `import {Button} from '@astryxdesign/core';
137
160
  export default Button;
138
161
  `;
139
- const {default: transform} = await import(
140
- '../unwrap-authoring-factories.mjs'
141
- );
162
+ const {default: transform} =
163
+ await import('../unwrap-authoring-factories.mjs');
142
164
  const jscodeshift = (await import('jscodeshift')).default;
143
165
  const j = jscodeshift.withParser('tsx');
144
166
  const api = {jscodeshift: j, stats: () => {}, report: () => {}};
@@ -5,8 +5,9 @@
5
5
  *
6
6
  * v0.3.0 removes the authoring factories. Authoring is now types + parsers: an
7
7
  * author writes a plain object and stamps its `type` directly. This transform
8
- * rewrites every factory call to the plain object the factory used to return,
9
- * then drops the now-dead factory imports:
8
+ * rewrites factory calls imported from the retired Astryx authoring entrypoints
9
+ * to the plain object the factory used to return, then drops the now-dead
10
+ * factory imports:
10
11
  *
11
12
  * createConfig(o) / createIntegration(o) -> o (no discriminant)
12
13
  * createComponentDoc(o) -> { ...o, type: 'component' }
@@ -25,8 +26,9 @@
25
26
  *
26
27
  * Import aliases are followed (`import {createDoc as mk}` → calls to `mk`), and
27
28
  * the factory specifiers are removed afterward (the whole import statement goes
28
- * if nothing else was imported from it). Run this BEFORE
29
- * `migrate-authoring-imports`, which repoints the surviving type imports.
29
+ * if nothing else was imported from it). Same-named imports from other packages
30
+ * remain untouched. Run this BEFORE `migrate-authoring-imports`, which repoints
31
+ * the surviving type imports.
30
32
  */
31
33
 
32
34
  export const meta = {
@@ -35,13 +37,24 @@ export const meta = {
35
37
  'Rewrites createConfig/createIntegration/createComponentDoc/' +
36
38
  'createFunctionDoc/createDoc/createPageTemplate/createBlockTemplate/' +
37
39
  'createCodemod/createConfigCodemod calls to the plain object they returned ' +
38
- "(stamping the doc/template/codemod `type` discriminant), and removes the " +
40
+ '(stamping the doc/template/codemod `type` discriminant), and removes the ' +
39
41
  'now-dead factory imports. Authoring is types + parsers in v0.3.0 — there ' +
40
42
  'are no factories.',
41
43
  pr: '#4612',
42
44
  fileExtensions: ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs'],
43
45
  };
44
46
 
47
+ /** Legacy Astryx authoring entrypoints that exported the removed factories. */
48
+ const AUTHORING_SOURCES = new Set([
49
+ '@astryxdesign/cli/config',
50
+ '@astryxdesign/cli/doc',
51
+ '@astryxdesign/cli/integration',
52
+ '@astryxdesign/cli/template',
53
+ '@astryxdesign/cli/codemod',
54
+ '@astryxdesign/core/authoring',
55
+ '@astryxdesign/core/config',
56
+ ]);
57
+
45
58
  /**
46
59
  * Factory name → the `type` discriminant it stamped, or `null` for the config /
47
60
  * integration factories, which were pure typed-identity (no discriminant).
@@ -108,6 +121,7 @@ export default function transformer(file, api) {
108
121
  /** @type {Map<string, string>} */
109
122
  const localToFactory = new Map();
110
123
  root.find(j.ImportDeclaration).forEach((/** @type {any} */ path) => {
124
+ if (!AUTHORING_SOURCES.has(path.node.source.value)) return;
111
125
  for (const spec of path.node.specifiers ?? []) {
112
126
  if (spec.type !== 'ImportSpecifier') continue;
113
127
  const importedName = spec.imported?.name;
@@ -163,6 +177,7 @@ export default function transformer(file, api) {
163
177
  // Drop the now-dead factory import specifiers; remove any import statement
164
178
  // left empty.
165
179
  root.find(j.ImportDeclaration).forEach((/** @type {any} */ path) => {
180
+ if (!AUTHORING_SOURCES.has(path.node.source.value)) return;
166
181
  const specs = path.node.specifiers ?? [];
167
182
  const kept = specs.filter(
168
183
  (/** @type {any} */ spec) =>
@@ -220,4 +220,51 @@ function wrapper(useResizable) {
220
220
  const output = await apply('rename-resizable-pixel-bounds', input);
221
221
  expect(output).toBe(input);
222
222
  });
223
+
224
+ it('renames bounds when useResizable comes from a namespace import', async () => {
225
+ const input = `import * as Astryx from '@astryxdesign/core';
226
+ const region = Astryx.useResizable({defaultSize: 240, minSizePx: 120, maxSizePx: 480});`;
227
+ const output = await apply('rename-resizable-pixel-bounds', input);
228
+ expect(output).toContain('minSize: 120');
229
+ expect(output).toContain('maxSize: 480');
230
+ expect(output).not.toContain('minSizePx');
231
+ expect(output).not.toContain('maxSizePx');
232
+ });
233
+
234
+ it('leaves a namespace that does not come from Astryx alone', async () => {
235
+ const input = `import * as Other from 'other-resizable';
236
+ const region = Other.useResizable({minSizePx: 120});`;
237
+ const output = await apply('rename-resizable-pixel-bounds', input);
238
+ expect(output).toContain('minSizePx: 120');
239
+ });
240
+
241
+ it('does not rewrite a parameter that shadows the namespace import', async () => {
242
+ const input = `import * as Astryx from '@astryxdesign/core';
243
+ function build(Astryx) {
244
+ return Astryx.useResizable({minSizePx: 120});
245
+ }`;
246
+ const output = await apply('rename-resizable-pixel-bounds', input);
247
+ expect(output).toContain('minSizePx: 120');
248
+ });
249
+
250
+ it.each([
251
+ ['as const', '{defaultSize: 240, minSizePx: 120} as const'],
252
+ ['satisfies', '{defaultSize: 240, minSizePx: 120} satisfies object'],
253
+ ])('renames a static configuration wrapped in %s', async (_label, config) => {
254
+ const input = `import {useResizable} from '@astryxdesign/core/Resizable';
255
+ const region = useResizable(${config});`;
256
+ const output = await apply('rename-resizable-pixel-bounds', input);
257
+ expect(output).toContain('minSize: 120');
258
+ expect(output).not.toContain('minSizePx');
259
+ });
260
+
261
+ it('renames wrapped multi-region configurations', async () => {
262
+ const input = `import {useResizable} from '@astryxdesign/core';
263
+ const regions = useResizable({regions: {
264
+ nav: {defaultSize: 240, minSizePx: 120} as const,
265
+ } as const});`;
266
+ const output = await apply('rename-resizable-pixel-bounds', input);
267
+ expect(output).toContain('minSize: 120');
268
+ expect(output).not.toContain('minSizePx');
269
+ });
223
270
  });
@@ -8,6 +8,9 @@
8
8
  * released conflict rule (the unified property wins when both are present).
9
9
  * A spread or computed property can change precedence invisibly, so dynamic
10
10
  * objects stay unchanged and receive a manual-migration TODO instead.
11
+ * Named and namespace imports both count, and a type-only wrapper (`as`,
12
+ * `satisfies`, a non-null assertion, parentheses) does not make a
13
+ * configuration dynamic.
11
14
  */
12
15
 
13
16
  export const meta = {
@@ -33,6 +36,26 @@ const MANUAL_MIGRATION_COMMENT =
33
36
  'or computed property. Rename minSizePx/maxSizePx to minSize/maxSize ' +
34
37
  'manually without changing property precedence. ';
35
38
 
39
+ const TYPE_WRAPPERS = new Set([
40
+ 'TSAsExpression',
41
+ 'TSSatisfiesExpression',
42
+ 'TSTypeAssertion',
43
+ 'TSNonNullExpression',
44
+ 'ParenthesizedExpression',
45
+ ]);
46
+
47
+ /**
48
+ * The expression under type-only wrappers such as `{...} as const`.
49
+ * @param {any} node
50
+ */
51
+ function unwrap(node) {
52
+ let current = node;
53
+ while (current && TYPE_WRAPPERS.has(current.type)) {
54
+ current = current.expression;
55
+ }
56
+ return current;
57
+ }
58
+
36
59
  /** @param {any} property */
37
60
  function staticPropertyName(property) {
38
61
  if (property.computed) return null;
@@ -128,6 +151,8 @@ export default function transformer(file, api) {
128
151
  const root = j(file.source);
129
152
  /** @type {Map<string, any>} */
130
153
  const bindings = new Map();
154
+ /** @type {Map<string, any>} */
155
+ const namespaces = new Map();
131
156
 
132
157
  root.find(j.ImportDeclaration).forEach((/** @type {any} */ path) => {
133
158
  if (!IMPORT_SOURCES.has(path.node.source.value)) return;
@@ -138,17 +163,40 @@ export default function transformer(file, api) {
138
163
  ) {
139
164
  const local = specifier.local?.name ?? 'useResizable';
140
165
  bindings.set(local, path.scope.lookup(local) ?? path.scope);
166
+ } else if (specifier.type === 'ImportNamespaceSpecifier') {
167
+ const local = specifier.local.name;
168
+ namespaces.set(local, path.scope.lookup(local) ?? path.scope);
141
169
  }
142
170
  }
143
171
  });
144
- if (bindings.size === 0) return undefined;
172
+ if (bindings.size === 0 && namespaces.size === 0) return undefined;
173
+
174
+ /**
175
+ * @param {any} callee
176
+ * @param {any} scope
177
+ */
178
+ const isUseResizable = (callee, scope) => {
179
+ if (callee.type === 'Identifier') {
180
+ return (
181
+ bindings.has(callee.name) &&
182
+ scope.lookup(callee.name) === bindings.get(callee.name)
183
+ );
184
+ }
185
+ return (
186
+ callee.type === 'MemberExpression' &&
187
+ !callee.computed &&
188
+ callee.object.type === 'Identifier' &&
189
+ callee.property.type === 'Identifier' &&
190
+ callee.property.name === 'useResizable' &&
191
+ namespaces.has(callee.object.name) &&
192
+ scope.lookup(callee.object.name) === namespaces.get(callee.object.name)
193
+ );
194
+ };
145
195
 
146
196
  let changed = false;
147
197
  root.find(j.CallExpression).forEach((/** @type {any} */ path) => {
148
- const callee = path.node.callee;
149
- if (callee.type !== 'Identifier' || !bindings.has(callee.name)) return;
150
- if (path.scope.lookup(callee.name) !== bindings.get(callee.name)) return;
151
- const config = path.node.arguments[0];
198
+ if (!isUseResizable(path.node.callee, path.scope)) return;
199
+ const config = unwrap(path.node.arguments[0]);
152
200
  if (config?.type !== 'ObjectExpression') return;
153
201
 
154
202
  changed = migrateObject(j, config) || changed;
@@ -158,13 +206,12 @@ export default function transformer(file, api) {
158
206
  staticPropertyName(property) === 'regions',
159
207
  );
160
208
  if (!regions || !('value' in regions)) return;
161
- const regionsObject = regions.value;
209
+ const regionsObject = unwrap(regions.value);
162
210
  if (regionsObject?.type !== 'ObjectExpression') return;
163
211
  for (const region of regionsObject.properties) {
164
- if (!('value' in region) || region.value?.type !== 'ObjectExpression') {
165
- continue;
166
- }
167
- changed = migrateObject(j, region.value) || changed;
212
+ const regionConfig = 'value' in region ? unwrap(region.value) : null;
213
+ if (regionConfig?.type !== 'ObjectExpression') continue;
214
+ changed = migrateObject(j, regionConfig) || changed;
168
215
  }
169
216
  });
170
217
 
@@ -48,3 +48,12 @@ The material is usually good; the finding is placement, not quality. It goes in
48
48
  **Fits no row?** It is still not caller-facing. Default it to [Contributing](https://github.com/facebook/astryx/wiki/Contributing), or `CONTRIBUTING.md` when it is a step someone follows with the repo cloned. Never default it back to this directory.
49
49
 
50
50
  Worked example: a responsive-and-interaction readiness rubric is grading criteria → **Component-Audit-Rubric**, or **Component-Lifecycle** if it is a promotion gate.
51
+
52
+ ## Sections are read one at a time
53
+
54
+ `astryx docs <topic> --index` lists a topic's sections, and readers then open
55
+ one section by its key. A section's key is its `id`, or a key derived from its
56
+ title when it has none. Give a section an `id` when its title may change, since
57
+ readers and extensions link to the key. Two sections in one topic cannot share
58
+ a key. Keep each section small enough to read on its own: `astryx doctor` fails
59
+ any section over 32 KB.
@@ -0,0 +1,14 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `astryx docs authoring`: every authoring schema, one section each.
5
+ *
6
+ * Built from the self-docs colocated under packages/cli/authoring, so it cannot
7
+ * drift from the schemas it describes. `astryx doctor` names a self-doc this
8
+ * topic cannot reach.
9
+ */
10
+
11
+ import {buildAuthoringTopic} from '../../foundation/discovery/authoring-self-docs.mjs';
12
+
13
+ /** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
14
+ export const docs = await buildAuthoringTopic();
@@ -98,11 +98,11 @@ export const docs = {
98
98
  },
99
99
  {
100
100
  type: 'prose',
101
- text: 'These stylesheets are cascade-layered: the reset loads in @layer reset and component styles in @layer astryx-base. If your project has existing global CSS, a legacy reset, or Tailwind, declare the layer order explicitly and assign every stylesheet to a layer deliberately: unlayered styles and later layers both override astryx-base regardless of specificity. See the Cascade Layer Safety section in `astryx docs migration` before building screens.',
101
+ text: 'These stylesheets are cascade-layered: the reset loads in @layer reset and component styles in @layer astryx-base. If your project has existing global CSS, a legacy reset, or Tailwind, declare the layer order explicitly and assign every stylesheet to a layer deliberately: unlayered styles and later layers both override astryx-base regardless of specificity. See the Cascade Layer Safety section in {@link generic:migration} before building screens.',
102
102
  },
103
103
  {
104
104
  type: 'prose',
105
- text: 'Run `astryx docs theme` for the full theming guide.',
105
+ text: 'Run {@link generic:theme} for the full theming guide.',
106
106
  },
107
107
  ],
108
108
  },
@@ -39,10 +39,10 @@ export const docs = {
39
39
  style: 'ordered',
40
40
  items: [
41
41
  'Use components for everything they cover',
42
- 'Page layout is frame-first: pick the shell and budget regions before writing content (see \`astryx docs layout\`)',
42
+ 'Page layout is frame-first: pick the shell and budget regions before writing content (see {@link generic:layout})',
43
43
  'Dense data renders as rows (Table, List/Item), edge-to-edge with dividers; Card is for widgets, galleries, and settings groups',
44
- 'StyleX or Tailwind for custom styling; both are first-class (see \`astryx docs styling\`)',
45
- 'Semantic tokens, not hardcoded values (see \`astryx docs tokens\`)',
44
+ 'StyleX or Tailwind for custom styling; both are first-class (see {@link generic:styling})',
45
+ 'Semantic tokens, not hardcoded values (see {@link generic:tokens})',
46
46
  'CSS custom properties for colors, not hex values',
47
47
  'Form inputs are controlled (value + onChange)',
48
48
  'Use useLinkComponent() for navigation so consumers can plug in their framework router via LinkProvider',
@@ -60,7 +60,7 @@ export const docs = {
60
60
  },
61
61
  {
62
62
  type: 'prose',
63
- text: 'See \`astryx docs styling\` for the complete guide with examples.',
63
+ text: 'See {@link generic:styling} for the complete guide with examples.',
64
64
  },
65
65
  ],
66
66
  },
@@ -76,7 +76,7 @@ export const docs = {
76
76
  'Hardcoded colors (#fff). Use var(--color-*) or Tailwind semantic classes (text-primary, bg-surface)',
77
77
  'Hardcoded spacing (16px). Use spacing tokens or Tailwind spacing utilities',
78
78
  'Hardcoded <a> elements. Use useLinkComponent() so consumers can swap in their framework router via LinkProvider',
79
- 'Wrapping every list item or page section in a Card. Decide the frame first; dense data renders as rows (see \`astryx docs layout\`)',
79
+ 'Wrapping every list item or page section in a Card. Decide the frame first; dense data renders as rows (see {@link generic:layout})',
80
80
  'Badge as decoration. Reserve Badge for counts and enumerated states; use StatusDot or Token for status',
81
81
  'Inventing props. Read component docs first',
82
82
  ],
@@ -89,7 +89,7 @@ export const docs = {
89
89
  content: [
90
90
  {
91
91
  type: 'prose',
92
- text: 'The design system provides semantic design tokens for spacing, color, radius, shadow, typography, and size. Tokens adapt to the active theme and color mode. Run \`astryx docs tokens\` for the full reference with all values.',
92
+ text: 'The design system provides semantic design tokens for spacing, color, radius, shadow, typography, and size. Tokens adapt to the active theme and color mode. Run {@link generic:tokens} for the full reference with all values.',
93
93
  },
94
94
  ],
95
95
  },