@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25

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 (728) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +152 -107
  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 +22 -10
  7. package/api/build/build.test.mjs +219 -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 +208 -53
  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 +49 -19
  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 +277 -41
  54. package/api/docs/_adapter.mjs +993 -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/docOverlays.test.mjs +27 -1
  61. package/api/docs/docs.d.mts +10 -3
  62. package/api/docs/docs.doc.mjs +55 -16
  63. package/api/docs/docs.mjs +53 -10
  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/list/list.mjs +28 -12
  70. package/api/docs/node/node.d.mts +43 -0
  71. package/api/docs/node/node.mjs +192 -0
  72. package/api/docs/reference-blocks.test.mjs +406 -0
  73. package/api/doctor/doctor.d.mts +104 -1
  74. package/api/doctor/doctor.doc.mjs +18 -8
  75. package/api/doctor/doctor.mjs +635 -7
  76. package/api/doctor/doctor.test.mjs +732 -11
  77. package/api/doctor/doctor.type.d.mts +1 -1
  78. package/api/doctor/doctor.type.mjs +1 -1
  79. package/api/gap-report/gap-report.doc.mjs +27 -14
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +7 -3
  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 -1
  87. package/api/index.mjs +6 -3
  88. package/api/init/init.doc.mjs +22 -12
  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 +56 -65
  99. package/api/integration/add-theme.test.mjs +139 -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 +5 -4
  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 +107 -0
  119. package/api/integration/pack-check.mjs +160 -11
  120. package/api/integration/pack-check.test.mjs +477 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +15 -2
  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 +2 -1
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -0
  133. package/api/json/isError.doc.mjs +2 -1
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/layout/_adapter.mjs +20 -5
  136. package/api/layout/expand/expand.mjs +7 -5
  137. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  138. package/api/layout/grammar/grammar.mjs +2 -1
  139. package/api/layout/layoutCheck.doc.mjs +1 -0
  140. package/api/layout/layoutExpand.doc.mjs +2 -1
  141. package/api/layout/layoutGrammar.doc.mjs +1 -0
  142. package/api/search/search-return-type.test.mjs +54 -0
  143. package/api/search/search.d.mts +89 -12
  144. package/api/search/search.doc.mjs +8 -2
  145. package/api/search/search.mjs +697 -97
  146. package/api/search/search.type.d.mts +15 -3
  147. package/api/search/search.type.mjs +5 -2
  148. package/api/swizzle/copy/copy.mjs +28 -11
  149. package/api/swizzle/swizzle.doc.mjs +8 -5
  150. package/api/swizzle/swizzle.type.d.mts +2 -2
  151. package/api/swizzle/swizzle.type.mjs +2 -2
  152. package/api/template/copy/copy.mjs +18 -24
  153. package/api/template/copy/copy.test.mjs +26 -0
  154. package/api/template/list/list.mjs +1 -0
  155. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  156. package/api/template/template-integration.test.mjs +1072 -3
  157. package/api/template/template-suffix.test.mjs +41 -21
  158. package/api/template/template.d.mts +1 -1
  159. package/api/template/template.doc.mjs +32 -9
  160. package/api/template/template.mjs +45 -8
  161. package/api/template/template.type.d.mts +12 -14
  162. package/api/template/template.type.mjs +15 -14
  163. package/api/theme/_adapter.d.mts +2 -3
  164. package/api/theme/_adapter.mjs +4 -5
  165. package/api/theme/add/add.binary.test.mjs +84 -0
  166. package/api/theme/add/add.mjs +31 -22
  167. package/api/theme/add/add.rollback.test.mjs +158 -0
  168. package/api/theme/add/add.staging.test.mjs +83 -0
  169. package/api/theme/add/add.test.mjs +14 -1
  170. package/api/theme/build/build.family.test.mjs +7 -12
  171. package/api/theme/build/build.mjs +140 -59
  172. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  173. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  174. package/api/theme/build/build.rollback.test.mjs +148 -0
  175. package/api/theme/build/build.test.mjs +127 -0
  176. package/api/theme/build/font-warning.mjs +3 -3
  177. package/api/theme/build/font-warning.test.mjs +5 -2
  178. package/api/theme/generateTonalPalette.doc.mjs +2 -2
  179. package/api/theme/integration-themes.test.mjs +39 -28
  180. package/api/theme/list/list.test.mjs +19 -20
  181. package/api/theme/listThemes.doc.mjs +6 -5
  182. package/api/theme/palette/generate/generate.mjs +8 -3
  183. package/api/theme/palette/generate/generate.test.mjs +96 -0
  184. package/api/theme/palette/generate/generator.d.mts +10 -13
  185. package/api/theme/palette/generate/generator.mjs +15 -4
  186. package/api/theme/palette/generate/generator.test.mjs +10 -0
  187. package/api/theme/template/template.mjs +11 -2
  188. package/api/theme/template/template.test.mjs +20 -0
  189. package/api/theme/theme.type.d.mts +170 -11
  190. package/api/theme/theme.type.mjs +94 -27
  191. package/api/theme/themeAdd.doc.mjs +12 -12
  192. package/api/theme/themeBuild.doc.mjs +21 -17
  193. package/api/theme/themeList.doc.mjs +6 -3
  194. package/api/theme/themeListAvailable.doc.mjs +6 -3
  195. package/api/theme/themePaletteGenerate.doc.mjs +16 -8
  196. package/api/theme/themeTargets.doc.mjs +4 -2
  197. package/api/theme/themeTemplate.doc.mjs +8 -3
  198. package/api/upgrade/_adapter.d.mts +32 -5
  199. package/api/upgrade/_adapter.mjs +139 -22
  200. package/api/upgrade/list/list.mjs +2 -1
  201. package/api/upgrade/list/list.test.mjs +73 -0
  202. package/api/upgrade/project-context.test.mjs +272 -0
  203. package/api/upgrade/provider-agreement.test.mjs +152 -0
  204. package/api/upgrade/run/files-changed.test.mjs +111 -0
  205. package/api/upgrade/run/run.mjs +358 -59
  206. package/api/upgrade/status/status.mjs +2 -2
  207. package/api/upgrade/upgrade.doc.mjs +32 -23
  208. package/api/upgrade/upgrade.type.d.mts +43 -5
  209. package/api/upgrade/upgrade.type.mjs +29 -13
  210. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  211. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  212. package/assets/codemods/file-count.test.mjs +163 -0
  213. package/assets/codemods/integration-discovery.mjs +48 -4
  214. package/assets/codemods/integration-discovery.test.mjs +73 -0
  215. package/assets/codemods/integration-runner.mjs +59 -7
  216. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  217. package/assets/codemods/registry.mjs +1 -0
  218. package/assets/codemods/run-codemod.mjs +177 -34
  219. package/assets/codemods/runner.mjs +353 -104
  220. package/assets/codemods/term-log.mjs +32 -8
  221. package/assets/codemods/term-log.test.mjs +19 -1
  222. package/assets/codemods/transform-prop.mjs +109 -0
  223. package/assets/codemods/transform-prop.test.mjs +95 -0
  224. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  225. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  226. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  227. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  228. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  229. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  230. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  231. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  232. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  233. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  234. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  235. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  236. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  237. package/assets/docs/README.md +12 -1
  238. package/assets/docs/authoring.doc.mjs +14 -0
  239. package/assets/docs/browser-support.doc.mjs +11 -11
  240. package/assets/docs/color.doc.mjs +8 -2
  241. package/assets/docs/elevation.doc.mjs +6 -4
  242. package/assets/docs/getting-started.doc.mjs +6 -17
  243. package/assets/docs/icons.doc.mjs +2 -21
  244. package/assets/docs/illustrations.doc.mjs +7 -15
  245. package/assets/docs/internationalization.doc.mjs +7 -5
  246. package/assets/docs/layout.doc.dense.mjs +132 -84
  247. package/assets/docs/layout.doc.mjs +134 -78
  248. package/assets/docs/migration.doc.mjs +19 -21
  249. package/assets/docs/motion.doc.mjs +16 -3
  250. package/assets/docs/principles.doc.dense.mjs +5 -5
  251. package/assets/docs/principles.doc.mjs +14 -6
  252. package/assets/docs/principles.doc.zh.mjs +6 -6
  253. package/assets/docs/shape.doc.mjs +8 -3
  254. package/assets/docs/spacing.doc.mjs +7 -2
  255. package/assets/docs/styling-libraries.doc.mjs +10 -6
  256. package/assets/docs/styling.doc.mjs +22 -26
  257. package/assets/docs/theme.doc.dense.mjs +58 -18
  258. package/assets/docs/theme.doc.mjs +60 -50
  259. package/assets/docs/theme.doc.zh.mjs +9 -8
  260. package/assets/docs/tokens.doc.dense.mjs +2 -2
  261. package/assets/docs/tokens.doc.mjs +390 -9
  262. package/assets/docs/tokens.doc.zh.mjs +2 -2
  263. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  264. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  265. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  266. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  267. package/assets/docs/tree/api.doc.mjs +30 -0
  268. package/assets/docs/tree/block-template.doc.mjs +130 -0
  269. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  270. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  271. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  272. package/assets/docs/tree/checks.doc.mjs +119 -0
  273. package/assets/docs/tree/cli.doc.mjs +23 -0
  274. package/assets/docs/tree/codemods.doc.mjs +147 -0
  275. package/assets/docs/tree/commands.doc.mjs +25 -0
  276. package/assets/docs/tree/component-family.doc.mjs +113 -0
  277. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  278. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  279. package/assets/docs/tree/components.doc.mjs +23 -0
  280. package/assets/docs/tree/configuration.doc.mjs +23 -0
  281. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  282. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  283. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  284. package/assets/docs/tree/docs.doc.mjs +21 -0
  285. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  286. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  287. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  288. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  291. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  292. package/assets/docs/tree/help.doc.mjs +16 -0
  293. package/assets/docs/tree/integrations.doc.mjs +40 -0
  294. package/assets/docs/tree/links.doc.mjs +98 -0
  295. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  296. package/assets/docs/tree/page-template.doc.mjs +71 -0
  297. package/assets/docs/tree/publishing.doc.mjs +111 -0
  298. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  299. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  300. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  301. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  302. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  303. package/assets/docs/tree/ship.doc.mjs +16 -0
  304. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  305. package/assets/docs/tree/single-component.doc.mjs +165 -0
  306. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  307. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  308. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  309. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  310. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  311. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  312. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  313. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  314. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  315. package/assets/docs/tree/templates.doc.mjs +34 -0
  316. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  317. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  318. package/assets/docs/tree/themes.doc.mjs +39 -0
  319. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  320. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  321. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  322. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  323. package/assets/docs/tree/versioning.doc.mjs +161 -0
  324. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  325. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  326. package/assets/docs/typography.doc.mjs +24 -4
  327. package/assets/docs/working-with-ai.doc.mjs +34 -26
  328. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  329. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  330. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  331. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  332. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  333. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  334. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  335. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  336. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  337. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  338. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  339. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  340. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  341. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  342. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  343. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  344. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  345. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  346. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  347. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  348. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  349. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  350. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  351. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  352. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  353. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  354. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  355. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  356. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  357. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  358. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  359. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  360. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  361. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  362. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  363. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  364. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  365. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  366. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  367. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  368. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  369. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  370. package/authoring/_shared/contract.ts +22 -0
  371. package/authoring/codemod/codemod.doc.mjs +7 -2
  372. package/authoring/codemod/parse.d.mts +8 -8
  373. package/authoring/codemod/parse.mjs +8 -6
  374. package/authoring/codemod/type.ts +12 -0
  375. package/authoring/config/config.doc.mjs +11 -3
  376. package/authoring/config/debug-composition.test.mjs +92 -0
  377. package/authoring/config/parse.d.mts +15 -13
  378. package/authoring/config/parse.mjs +27 -8
  379. package/authoring/config/parse.test.mjs +8 -0
  380. package/authoring/config/type.ts +29 -6
  381. package/authoring/debug/debug.doc.d.mts +11 -0
  382. package/authoring/debug/debug.doc.mjs +182 -0
  383. package/authoring/debug/parse.d.mts +8 -8
  384. package/authoring/debug/parse.mjs +3 -3
  385. package/authoring/discover/discover.doc.d.mts +13 -0
  386. package/authoring/discover/discover.doc.mjs +138 -0
  387. package/authoring/discover/parse.d.mts +24 -0
  388. package/authoring/discover/parse.mjs +128 -0
  389. package/authoring/discover/parse.test.mjs +124 -0
  390. package/authoring/discover/type.ts +87 -0
  391. package/authoring/doctypes/_schema.d.mts +792 -24
  392. package/authoring/doctypes/_schema.mjs +549 -39
  393. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  394. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  395. package/authoring/doctypes/base/type.ts +43 -0
  396. package/authoring/doctypes/command/command.doc.mjs +4 -3
  397. package/authoring/doctypes/command/parse.d.mts +2 -2
  398. package/authoring/doctypes/command/parse.mjs +1 -1
  399. package/authoring/doctypes/command/type.ts +5 -4
  400. package/authoring/doctypes/component/component.doc.mjs +12 -3
  401. package/authoring/doctypes/component/parse.d.mts +2 -2
  402. package/authoring/doctypes/component/parse.mjs +1 -1
  403. package/authoring/doctypes/component/type.ts +14 -5
  404. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  405. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  406. package/authoring/doctypes/enum/parse.d.mts +2 -2
  407. package/authoring/doctypes/enum/parse.mjs +1 -1
  408. package/authoring/doctypes/enum/type.ts +4 -2
  409. package/authoring/doctypes/function/function.doc.mjs +7 -2
  410. package/authoring/doctypes/function/parse.d.mts +2 -2
  411. package/authoring/doctypes/function/parse.mjs +1 -1
  412. package/authoring/doctypes/function/type.ts +9 -4
  413. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  414. package/authoring/doctypes/hook/parse.d.mts +2 -2
  415. package/authoring/doctypes/hook/parse.mjs +1 -1
  416. package/authoring/doctypes/hook/type.ts +5 -4
  417. package/authoring/doctypes/legacy.d.mts +8 -6
  418. package/authoring/doctypes/legacy.mjs +5 -4
  419. package/authoring/doctypes/load-contract.test.mjs +233 -0
  420. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  421. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  422. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  423. package/authoring/doctypes/namespace/parse.mjs +25 -0
  424. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  425. package/authoring/doctypes/namespace/type.ts +74 -0
  426. package/authoring/doctypes/parse.d.mts +22 -18
  427. package/authoring/doctypes/parse.mjs +22 -11
  428. package/authoring/doctypes/parse.test.mjs +77 -3
  429. package/authoring/doctypes/reference/parse.d.mts +2 -2
  430. package/authoring/doctypes/reference/parse.mjs +8 -5
  431. package/authoring/doctypes/reference/reference.doc.mjs +55 -6
  432. package/authoring/doctypes/reference/type.ts +75 -7
  433. package/authoring/doctypes/schema/parse.d.mts +2 -2
  434. package/authoring/doctypes/schema/parse.mjs +1 -1
  435. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  436. package/authoring/doctypes/schema/type.ts +4 -4
  437. package/authoring/doctypes/template/parse.d.mts +94 -1
  438. package/authoring/doctypes/template/parse.mjs +40 -2
  439. package/authoring/doctypes/template/parse.test.mjs +26 -2
  440. package/authoring/doctypes/template/template.doc.mjs +13 -3
  441. package/authoring/doctypes/template/type.ts +13 -2
  442. package/authoring/doctypes/theme/parse.d.mts +35 -0
  443. package/authoring/doctypes/theme/parse.mjs +76 -0
  444. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  445. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  446. package/authoring/doctypes/theme/type.ts +42 -0
  447. package/authoring/doctypes/types.ts +12 -10
  448. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  449. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  450. package/authoring/gap-report/parse.d.mts +10 -10
  451. package/authoring/gap-report/parse.mjs +6 -6
  452. package/authoring/gap-report/type.ts +1 -1
  453. package/authoring/identity/identity.doc.d.mts +9 -0
  454. package/authoring/identity/identity.doc.mjs +61 -0
  455. package/authoring/identity/type.ts +132 -0
  456. package/authoring/index.d.mts +3 -0
  457. package/authoring/index.d.ts +62 -17
  458. package/authoring/index.mjs +4 -1
  459. package/authoring/integration/integration.doc.mjs +22 -13
  460. package/authoring/integration/parse.d.mts +2 -2
  461. package/authoring/integration/parse.mjs +1 -1
  462. package/authoring/integration/parse.test.mjs +10 -1
  463. package/authoring/integration/schema.d.mts +6 -4
  464. package/authoring/integration/schema.mjs +9 -3
  465. package/authoring/integration/type.ts +19 -8
  466. package/authoring/shadcn/receipt.d.mts +6 -6
  467. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  468. package/clients/cli/command-load-failure.test.mjs +83 -0
  469. package/clients/cli/commands/blog.doc.mjs +1 -1
  470. package/clients/cli/commands/blog.mjs +23 -8
  471. package/clients/cli/commands/blog.test.mjs +42 -1
  472. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  473. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  474. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  475. package/clients/cli/commands/build-theme.mjs +16 -50
  476. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  477. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  478. package/clients/cli/commands/build.doc.mjs +16 -8
  479. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  480. package/clients/cli/commands/build.mjs +137 -114
  481. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  482. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  483. package/clients/cli/commands/component/index.mjs +153 -61
  484. package/clients/cli/commands/component-batch.test.mjs +341 -0
  485. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  486. package/clients/cli/commands/component-package.test.mjs +46 -0
  487. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  488. package/clients/cli/commands/component.doc.mjs +28 -10
  489. package/clients/cli/commands/component.test.mjs +19 -0
  490. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  491. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  492. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  493. package/clients/cli/commands/discover.doc.mjs +55 -9
  494. package/clients/cli/commands/discover.mjs +393 -118
  495. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  496. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  497. package/clients/cli/commands/docs.doc.mjs +28 -6
  498. package/clients/cli/commands/docs.mjs +295 -38
  499. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  500. package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
  501. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  502. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  503. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  504. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  505. package/clients/cli/commands/doctor-integration.test.mjs +143 -8
  506. package/clients/cli/commands/doctor.doc.mjs +4 -2
  507. package/clients/cli/commands/doctor.mjs +108 -37
  508. package/clients/cli/commands/doctor.test.mjs +42 -0
  509. package/clients/cli/commands/gap-report.doc.mjs +27 -15
  510. package/clients/cli/commands/gap-report.test.mjs +72 -0
  511. package/clients/cli/commands/hook/index.mjs +7 -17
  512. package/clients/cli/commands/hook.doc.mjs +1 -1
  513. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  514. package/clients/cli/commands/init.doc.mjs +24 -10
  515. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  516. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  517. package/clients/cli/commands/integration-add.doc.mjs +39 -13
  518. package/clients/cli/commands/integration-authoring.test.mjs +74 -19
  519. package/clients/cli/commands/integration-pack.doc.mjs +6 -10
  520. package/clients/cli/commands/integration-real-world.test.mjs +4 -10
  521. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  522. package/clients/cli/commands/integration.doc.mjs +5 -5
  523. package/clients/cli/commands/integration.mjs +75 -43
  524. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  525. package/clients/cli/commands/json-contract.test.mjs +33 -0
  526. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  527. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  528. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  529. package/clients/cli/commands/layout.doc.mjs +3 -3
  530. package/clients/cli/commands/layout.mjs +21 -9
  531. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  532. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  533. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  534. package/clients/cli/commands/manifest.doc.mjs +2 -2
  535. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  536. package/clients/cli/commands/search.doc.mjs +16 -6
  537. package/clients/cli/commands/search.mjs +49 -11
  538. package/clients/cli/commands/search.test.mjs +92 -0
  539. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  540. package/clients/cli/commands/swizzle.doc.mjs +4 -3
  541. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  542. package/clients/cli/commands/template.doc.mjs +53 -14
  543. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  544. package/clients/cli/commands/template.mjs +4 -91
  545. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  546. package/clients/cli/commands/text-json-parity.test.mjs +725 -0
  547. package/clients/cli/commands/theme-add.doc.mjs +5 -4
  548. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  549. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  550. package/clients/cli/commands/theme-palette-generate.doc.mjs +12 -7
  551. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  552. package/clients/cli/commands/theme-palette.doc.mjs +2 -3
  553. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  554. package/clients/cli/commands/theme-targets.doc.mjs +3 -3
  555. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  556. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  557. package/clients/cli/commands/theme.doc.mjs +3 -2
  558. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  559. package/clients/cli/commands/upgrade.doc.mjs +83 -12
  560. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  561. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  562. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  563. package/clients/cli/commands/upgrade.mjs +29 -7
  564. package/clients/cli/formatters/index.mjs +164 -1
  565. package/clients/cli/formatters/index.test.mjs +97 -0
  566. package/clients/cli/index.mjs +47 -34
  567. package/clients/cli/latest-version-env.test.mjs +50 -0
  568. package/clients/cli/lib/cli-error.test.mjs +7 -0
  569. package/clients/cli/lib/component-format.mjs +9 -9
  570. package/clients/cli/lib/component-format.test.mjs +1 -1
  571. package/clients/cli/lib/define-command.mjs +56 -6
  572. package/clients/cli/lib/define-command.test.mjs +54 -0
  573. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  574. package/clients/cli/lib/exit-codes.test.mjs +113 -0
  575. package/clients/cli/lib/hook-format.mjs +19 -10
  576. package/clients/cli/lib/json-shim.mjs +62 -16
  577. package/clients/cli/lib/json-shim.test.mjs +83 -0
  578. package/clients/cli/lib/manifest.d.ts +2 -0
  579. package/clients/cli/lib/manifest.mjs +53 -6
  580. package/clients/cli/lib/manifest.test.mjs +22 -2
  581. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  582. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  583. package/foundation/agent-docs/agent-docs.mjs +83 -13
  584. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  585. package/foundation/config/integration-debug.test.mjs +28 -3
  586. package/foundation/config/project-themes.test.mjs +11 -19
  587. package/foundation/config/project.d.mts +20 -11
  588. package/foundation/config/project.mjs +263 -91
  589. package/foundation/config/project.test.mjs +270 -21
  590. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  591. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  592. package/foundation/discovery/authoring-self-docs.test.mjs +174 -0
  593. package/foundation/discovery/authoring-surface.d.mts +74 -0
  594. package/foundation/discovery/authoring-surface.mjs +525 -0
  595. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  596. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  597. package/foundation/discovery/cli-self-docs.mjs +504 -0
  598. package/foundation/discovery/cli-self-docs.test.mjs +395 -0
  599. package/foundation/discovery/component-discovery.d.mts +39 -1
  600. package/foundation/discovery/component-discovery.mjs +50 -1
  601. package/foundation/discovery/component-loader.d.mts +35 -38
  602. package/foundation/discovery/component-loader.mjs +53 -222
  603. package/foundation/discovery/docs-discovery.d.mts +119 -11
  604. package/foundation/discovery/docs-discovery.mjs +427 -108
  605. package/foundation/discovery/docs-discovery.test.mjs +386 -20
  606. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  607. package/foundation/discovery/docs-output-budget.mjs +50 -0
  608. package/foundation/discovery/docs-section-key.d.mts +116 -0
  609. package/foundation/discovery/docs-section-key.mjs +322 -0
  610. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  611. package/foundation/discovery/template-adapter.d.mts +113 -11
  612. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  613. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  614. package/foundation/discovery/template-adapter.mjs +774 -83
  615. package/foundation/discovery/template-adapter.test.mjs +57 -0
  616. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  617. package/foundation/discovery/template-conflict-release.mjs +40 -0
  618. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  619. package/foundation/discovery/theme-discovery.d.mts +67 -7
  620. package/foundation/discovery/theme-discovery.mjs +916 -186
  621. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  622. package/foundation/discovery/theming-targets.test.mjs +4 -0
  623. package/foundation/doc-compiler/bundle.d.mts +47 -0
  624. package/foundation/doc-compiler/bundle.mjs +278 -0
  625. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  626. package/foundation/doc-compiler/compile.d.mts +343 -0
  627. package/foundation/doc-compiler/compile.mjs +558 -0
  628. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  629. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  630. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  631. package/foundation/doc-compiler/doc-loads.test.mjs +1643 -0
  632. package/foundation/doc-compiler/import.d.mts +24 -0
  633. package/foundation/doc-compiler/import.mjs +59 -0
  634. package/foundation/doc-compiler/inputs.d.mts +102 -0
  635. package/foundation/doc-compiler/inputs.mjs +291 -0
  636. package/foundation/doc-compiler/inputs.test.mjs +298 -0
  637. package/foundation/doc-compiler/ir.d.mts +22 -0
  638. package/foundation/doc-compiler/ir.mjs +471 -0
  639. package/foundation/doc-compiler/lenses.d.mts +36 -0
  640. package/foundation/doc-compiler/lenses.mjs +173 -0
  641. package/foundation/doc-compiler/links.d.mts +162 -0
  642. package/foundation/doc-compiler/links.mjs +294 -0
  643. package/foundation/doc-compiler/links.test.mjs +192 -0
  644. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  645. package/foundation/doc-compiler/overlays.d.mts +37 -0
  646. package/foundation/doc-compiler/overlays.mjs +206 -0
  647. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  648. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  649. package/foundation/doc-compiler/read.d.mts +127 -0
  650. package/foundation/doc-compiler/read.mjs +325 -0
  651. package/foundation/doc-compiler/read.test.mjs +313 -0
  652. package/foundation/doc-compiler/source.d.mts +33 -0
  653. package/foundation/doc-compiler/source.mjs +128 -0
  654. package/foundation/doc-compiler/tree.d.mts +292 -0
  655. package/foundation/doc-compiler/tree.mjs +881 -0
  656. package/foundation/fs/file-protection.d.mts +33 -0
  657. package/foundation/fs/file-protection.mjs +825 -0
  658. package/foundation/fs/file-protection.test.mjs +250 -0
  659. package/foundation/fs/module-loader.d.mts +1 -0
  660. package/foundation/fs/module-loader.mjs +50 -1
  661. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  662. package/foundation/fs/path-safety.d.mts +3 -2
  663. package/foundation/fs/path-safety.mjs +49 -19
  664. package/foundation/fs/path-safety.test.mjs +50 -0
  665. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  666. package/foundation/identity/provider-identity.d.mts +90 -0
  667. package/foundation/identity/provider-identity.mjs +320 -0
  668. package/foundation/identity/provider-identity.test.mjs +254 -0
  669. package/foundation/identity/providers.d.mts +7 -0
  670. package/foundation/identity/providers.mjs +16 -0
  671. package/foundation/integrations/autolink.d.mts +58 -1
  672. package/foundation/integrations/autolink.mjs +143 -45
  673. package/foundation/integrations/autolink.test.mjs +1 -1
  674. package/foundation/integrations/cli-requirement.d.mts +65 -0
  675. package/foundation/integrations/cli-requirement.mjs +189 -0
  676. package/foundation/integrations/cli-requirement.test.mjs +89 -0
  677. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  678. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  679. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  680. package/foundation/integrations/contribution-inventory.mjs +28 -25
  681. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  682. package/foundation/integrations/integration-warnings.d.mts +9 -2
  683. package/foundation/integrations/integration-warnings.mjs +52 -21
  684. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  685. package/foundation/integrations/integrations.d.mts +63 -3
  686. package/foundation/integrations/integrations.mjs +122 -9
  687. package/foundation/integrations/integrations.test.mjs +415 -1
  688. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  689. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  690. package/foundation/integrations/provider-resolution.d.mts +152 -0
  691. package/foundation/integrations/provider-resolution.mjs +576 -0
  692. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  693. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  694. package/foundation/integrations/theme-descriptor.mjs +44 -0
  695. package/foundation/integrations/validate-contributions.d.mts +2 -0
  696. package/foundation/integrations/validate-contributions.mjs +131 -29
  697. package/foundation/response/base.d.ts +8 -4
  698. package/foundation/response/batch.type.d.mts +33 -0
  699. package/foundation/response/batch.type.mjs +34 -0
  700. package/foundation/response/error-codes.d.mts +3 -1
  701. package/foundation/response/error-codes.d.ts +2 -0
  702. package/foundation/response/error-codes.doc.mjs +19 -12
  703. package/foundation/response/error-codes.mjs +8 -2
  704. package/foundation/response/error-codes.test.mjs +166 -14
  705. package/foundation/response/json-contract.test.mjs +57 -17
  706. package/foundation/response/json.d.mts +4 -2
  707. package/foundation/response/json.mjs +8 -10
  708. package/foundation/response/response-types.doc.d.mts +7 -2
  709. package/foundation/response/response-types.doc.mjs +69 -25
  710. package/foundation/response/response-types.doc.test.mjs +181 -0
  711. package/foundation/response/response.doc.mjs +12 -11
  712. package/foundation/text/string-utils.d.mts +8 -0
  713. package/foundation/text/string-utils.mjs +40 -10
  714. package/foundation/xle/expand.d.mts +2 -0
  715. package/foundation/xle/expand.mjs +4 -3
  716. package/foundation/xle/expand.test.mjs +54 -0
  717. package/foundation/xle/xle.test.mjs +13 -0
  718. package/package.json +10 -11
  719. package/api/docs/docs.test.mjs +0 -83
  720. package/api/docs/integrationDocs.test.mjs +0 -208
  721. package/api/search/search.test.mjs +0 -389
  722. package/assets/docs/cli-integrations.doc.mjs +0 -367
  723. package/assets/templates/themes/manifest.json +0 -95
  724. package/clients/cli/commands/docs.test.mjs +0 -102
  725. package/clients/cli/lib/update-check.mjs +0 -83
  726. package/clients/cli/lib/update-check.test.mjs +0 -137
  727. package/clients/cli/update-hint-commands.test.mjs +0 -54
  728. package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
@@ -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
 
@@ -0,0 +1,63 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import transform from '../migrate-native-picker-to-presentation.mjs';
5
+
6
+ async function applyTransform(source) {
7
+ const jscodeshift = (await import('jscodeshift')).default;
8
+ const j = jscodeshift.withParser('tsx');
9
+ const api = {jscodeshift: j, stats: () => {}, report: () => {}};
10
+ return transform({source, path: 'test.tsx'}, api) ?? source;
11
+ }
12
+
13
+ describe('migrate-native-picker-to-presentation', () => {
14
+ it('maps DateInput and DateTimeInput values (FR3)', async () => {
15
+ const output =
16
+ await applyTransform(`import {DateInput, DateTimeInput} from '@astryxdesign/core';
17
+ const a = <DateInput label="d" nativePicker="touch" />;
18
+ const b = <DateInput label="d" nativePicker="always" />;
19
+ const c = <DateTimeInput label="dt" nativePicker="never" />;`);
20
+
21
+ expect(output).toContain("presentation='adaptive-native'");
22
+ expect(output).toContain("presentation='native'");
23
+ expect(output).toContain("presentation='adaptive-bottom-sheet'");
24
+ expect(output).not.toContain('nativePicker');
25
+ });
26
+
27
+ it('maps TimeInput never to text-input (FR3)', async () => {
28
+ const output =
29
+ await applyTransform(`import {TimeInput} from '@astryxdesign/core';
30
+ const a = <TimeInput label="t" nativePicker="never" />;
31
+ const b = <TimeInput label="t" nativePicker={'touch'} />;`);
32
+
33
+ expect(output).toContain("presentation='text-input'");
34
+ expect(output).toContain("presentation={'adaptive-native'}");
35
+ });
36
+
37
+ it('drops nativePicker when presentation is already set (FR4)', async () => {
38
+ const output =
39
+ await applyTransform(`import {DateInput} from '@astryxdesign/core';
40
+ const a = <DateInput label="d" presentation="popover" nativePicker="always" />;`);
41
+
42
+ expect(output).toContain('presentation="popover"');
43
+ expect(output).not.toContain('nativePicker');
44
+ });
45
+
46
+ it('leaves dynamic values and unrelated components unchanged', async () => {
47
+ const source = `import {DateInput, Selector} from '@astryxdesign/core';
48
+ const a = <DateInput label="d" nativePicker={mode} />;
49
+ const b = <Selector nativePicker="never" />;`;
50
+ expect(await applyTransform(source)).toBe(source);
51
+ });
52
+
53
+ it('leaves a mixed static/dynamic conditional byte-identical when a sibling migrates', async () => {
54
+ const output =
55
+ await applyTransform(`import {TimeInput} from '@astryxdesign/core';
56
+ const a = <TimeInput label="t" nativePicker="touch" />;
57
+ const b = <TimeInput label="t" nativePicker={flag ? 'always' : mode} />;`);
58
+
59
+ expect(output).toContain("presentation='adaptive-native'");
60
+ expect(output).toContain("nativePicker={flag ? 'always' : mode}");
61
+ expect(output).not.toContain("'native'");
62
+ });
63
+ });