@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d

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 (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -23,18 +23,19 @@
23
23
  // ═══════════════════════════════════════════════════════════════════════
24
24
  // AUTHOR THESE — each is the default export of one authored file.
25
25
  // ═══════════════════════════════════════════════════════════════════════
26
- export type {ComponentDoc} from './doctypes/types'; // Button.doc.{ts,mjs}
27
- export type {HookDoc} from './doctypes/types'; // useToast.doc.{ts,mjs}
28
- export type {FunctionDoc} from './doctypes/types'; // search.doc.mjs (hook | api)
29
- export type {ReferenceDoc} from './doctypes/types'; // theming.doc.{ts,mjs}
30
- export type {TemplateDoc} from './doctypes/types'; // Foo.template.{ts,mjs}
31
- export type {SchemaDoc} from './doctypes/types'; // config.doc.mjs (object shape)
32
- export type {CommandDoc} from './doctypes/types'; // search.doc.mjs (CLI command)
33
- export type {EnumDoc} from './doctypes/types'; // error-codes.doc.mjs (vocabulary)
34
- export type {NamespaceDoc} from './doctypes/types'; // cli.doc.mjs (hierarchy)
35
- export type {AstryxConfig} from './config/type'; // astryx.config.{ts,mjs}
36
- export type {DebugEvent} from './debug/type'; // one recorded CLI run
37
- export type {AstryxIntegration} from './integration/type'; // astryx.integration.{ts,mjs}
26
+ export type {ComponentDoc} from './doctypes/types.js'; // Button.doc.mjs
27
+ export type {HookDoc} from './doctypes/types.js'; // useToast.doc.mjs
28
+ export type {FunctionDoc} from './doctypes/types.js'; // search.doc.mjs (hook | api)
29
+ export type {ReferenceDoc} from './doctypes/types.js'; // theming.doc.mjs
30
+ export type {TemplateDoc} from './doctypes/types.js'; // Foo.doc.mjs
31
+ export type {SchemaDoc} from './doctypes/types.js'; // config.doc.mjs (object shape)
32
+ export type {CommandDoc} from './doctypes/types.js'; // search.doc.mjs (CLI command)
33
+ export type {EnumDoc} from './doctypes/types.js'; // error-codes.doc.mjs (vocabulary)
34
+ export type {NamespaceDoc} from './doctypes/types.js'; // cli.doc.mjs (hierarchy)
35
+ export type {ThemeDoc} from './doctypes/types.js'; // oceanTheme.doc.mjs
36
+ export type {AstryxConfig} from './config/type.js'; // astryx.config.{ts,mjs}
37
+ export type {DebugEvent} from './debug/type.js'; // one recorded CLI run
38
+ export type {AstryxIntegration} from './integration/type.js'; // astryx.integration.{ts,mjs}
38
39
  export type {
39
40
  GapReportHandler,
40
41
  GapReportHandlerContext,
@@ -42,8 +43,17 @@ export type {
42
43
  GapReportCategory,
43
44
  GapReportTarget,
44
45
  GapReportHandlerReceipt,
45
- } from './gap-report/type'; // gap-report handler contract
46
- export type {AstryxCodemod, AstryxConfigCodemod} from './codemod/type'; // codemods/*
46
+ } from './gap-report/type.js'; // gap-report handler contract
47
+ export type {
48
+ DiscoverSource,
49
+ DiscoverSourceContext,
50
+ DiscoverCatalog,
51
+ DiscoverPackage,
52
+ DiscoverVersion,
53
+ DiscoverContribution,
54
+ DiscoverKind,
55
+ } from './discover/type.js'; // discover source contract
56
+ export type {AstryxCodemod, AstryxConfigCodemod} from './codemod/type.js'; // codemods/*
47
57
 
48
58
  // ═══════════════════════════════════════════════════════════════════════
49
59
  // PARSERS — the CLI's load boundary (types come from each parser's JSDoc).
@@ -58,6 +68,7 @@ export {parseSchema} from './doctypes/schema/parse.mjs';
58
68
  export {parseCommand} from './doctypes/command/parse.mjs';
59
69
  export {parseEnum} from './doctypes/enum/parse.mjs';
60
70
  export {parseNamespace} from './doctypes/namespace/parse.mjs';
71
+ export {parseTheme} from './doctypes/theme/parse.mjs';
61
72
  export {parseLegacyDoc} from './doctypes/legacy.mjs';
62
73
  export {parseConfig} from './config/parse.mjs';
63
74
  export {parseIntegration} from './integration/parse.mjs';
@@ -65,6 +76,7 @@ export {
65
76
  parseGapReportHandler,
66
77
  parseGapReportReceipt,
67
78
  } from './gap-report/parse.mjs';
79
+ export {parseDiscoverCatalog} from './discover/parse.mjs';
68
80
  export {parseCodemod} from './codemod/parse.mjs';
69
81
  export {parseDebugEvent} from './debug/parse.mjs';
70
82
 
@@ -87,7 +99,7 @@ export type {
87
99
  AuthoredDocSnapshot,
88
100
  AuthoredDocSource,
89
101
  AuthoredDocEntry,
90
- } from './identity/type';
102
+ } from './identity/type.js';
91
103
  export type {
92
104
  // shared graph
93
105
  AuthoredDocKind,
@@ -129,6 +141,7 @@ export type {
129
141
  // reference
130
142
  ReferenceSection,
131
143
  ReferenceContentBlock,
144
+ GraphContentBlock,
132
145
  ReferenceTokenPreviewType,
133
146
  ReferenceTranslationDoc,
134
147
  WorkflowStep,
@@ -151,8 +164,8 @@ export type {
151
164
  CommandExampleDoc,
152
165
  // enum
153
166
  EnumMemberDoc,
154
- } from './doctypes/types';
155
- export type {PostCodemodHook, DebugConfig} from './config/type';
167
+ } from './doctypes/types.js';
168
+ export type {PostCodemodHook, DebugConfig} from './config/type.js';
156
169
  export type {
157
170
  // debug
158
171
  DebugSchemaVersion,
@@ -165,11 +178,11 @@ export type {
165
178
  DebugEventEnv,
166
179
  DebugEventProject,
167
180
  DebugEventHandler,
168
- } from './debug/type';
181
+ } from './debug/type.js';
169
182
  export type {
170
183
  AstryxCodemodDef,
171
184
  AstryxConfigCodemodDef,
172
185
  AstryxCodemodFile,
173
186
  AstryxCodemodApi,
174
187
  AstryxCodemodTransform,
175
- } from './codemod/type';
188
+ } from './codemod/type.js';
@@ -11,7 +11,7 @@
11
11
  * `type` directly.
12
12
  *
13
13
  * Types (config, integration, codemod, and the doc vocabulary —
14
- * component/hook/reference/template) are re-exported via `./index.ts`.
14
+ * component/hook/reference/template/theme) are re-exported via `./index.ts`.
15
15
  */
16
16
 
17
17
  export {parseConfig} from './config/parse.mjs';
@@ -20,6 +20,7 @@ export {
20
20
  parseGapReportHandler,
21
21
  parseGapReportReceipt,
22
22
  } from './gap-report/parse.mjs';
23
+ export {parseDiscoverCatalog} from './discover/parse.mjs';
23
24
  export {parseCodemod} from './codemod/parse.mjs';
24
25
  export {parseDebugEvent} from './debug/parse.mjs';
25
26
  export {parseDoc} from './doctypes/parse.mjs';
@@ -32,4 +33,5 @@ export {parseSchema} from './doctypes/schema/parse.mjs';
32
33
  export {parseCommand} from './doctypes/command/parse.mjs';
33
34
  export {parseEnum} from './doctypes/enum/parse.mjs';
34
35
  export {parseNamespace} from './doctypes/namespace/parse.mjs';
36
+ export {parseTheme} from './doctypes/theme/parse.mjs';
35
37
  export {parseLegacyDoc} from './doctypes/legacy.mjs';
@@ -11,7 +11,7 @@ export const doc = {
11
11
  type: 'schema',
12
12
  name: 'integration',
13
13
  displayName: 'Astryx Integration',
14
- namespace: 'cli',
14
+ namespace: 'authoring',
15
15
  description:
16
16
  'The astryx.integration.* manifest that sits beside an integration ' +
17
17
  "package's package.json. It can preserve a stable provider identity across a package rename, " +
@@ -57,7 +57,7 @@ export const doc = {
57
57
  name: 'themes',
58
58
  type: 'string',
59
59
  description:
60
- 'Relative path to a source-theme catalog root containing manifest.json plus one directory per theme slug. Installed themes appear in `astryx theme list` and can be copied with `astryx theme add`.',
60
+ 'Relative path to a source-theme root with one directory per theme slug. Each directory contains a source module and mandatory same-stem, strongly typed .doc.mjs descriptor. Installed themes appear in `astryx theme list` and can be copied with `astryx theme add`.',
61
61
  example: "'./themes'",
62
62
  },
63
63
  {
@@ -1,7 +1,7 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
- /** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
4
+ /** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
5
5
  /**
6
6
  * Validate an unknown value as an Astryx integration manifest, or throw.
7
7
  *
@@ -14,4 +14,4 @@
14
14
  * @returns {AstryxIntegration}
15
15
  */
16
16
  export function parseIntegration(input: unknown, label?: string): AstryxIntegration;
17
- export type AstryxIntegration = import("./type").AstryxIntegration;
17
+ export type AstryxIntegration = import("./type.js").AstryxIntegration;
@@ -14,7 +14,7 @@
14
14
  import {formatZodError} from '../_shared/errors.mjs';
15
15
  import {integrationSchema} from './schema.mjs';
16
16
 
17
- /** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
17
+ /** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
18
18
 
19
19
  /**
20
20
  * Validate an unknown value as an Astryx integration manifest, or throw.
@@ -55,8 +55,8 @@ export const integrationSchema: z.ZodObject<{
55
55
  /**
56
56
  * Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
57
57
  *
58
- * @typedef {import('../_shared/contract').Expect<
59
- * import('../_shared/contract').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
58
+ * @typedef {import('../_shared/contract.js').Expect<
59
+ * import('../_shared/contract.js').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
60
60
  * >} _IntegrationDriftLock
61
61
  */
62
62
  /**
@@ -69,9 +69,9 @@ export const integrationSchema: z.ZodObject<{
69
69
  * @type {string[]}
70
70
  */
71
71
  export const KNOWN_INTEGRATION_KEYS: string[];
72
- export type AstryxIntegration = import("./type").AstryxIntegration;
72
+ export type AstryxIntegration = import("./type.js").AstryxIntegration;
73
73
  /**
74
74
  * Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
75
75
  */
76
- export type _IntegrationDriftLock = import("../_shared/contract").Expect<import("../_shared/contract").Equal<z.infer<typeof integrationSchema>, AstryxIntegration>>;
76
+ export type _IntegrationDriftLock = import("../_shared/contract.js").Expect<import("../_shared/contract.js").Equal<z.infer<typeof integrationSchema>, AstryxIntegration>>;
77
77
  import { z } from 'zod';
@@ -16,7 +16,7 @@
16
16
  import {z} from 'zod';
17
17
  import {formatZodError} from '../_shared/errors.mjs';
18
18
 
19
- /** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
19
+ /** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
20
20
 
21
21
  const MAX_AGENT_DOC_LINES = 8;
22
22
  const MAX_AGENT_DOC_LINE_CODE_POINTS = 240;
@@ -121,8 +121,8 @@ export function parseAgentDocsField(input, label) {
121
121
  /**
122
122
  * Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
123
123
  *
124
- * @typedef {import('../_shared/contract').Expect<
125
- * import('../_shared/contract').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
124
+ * @typedef {import('../_shared/contract.js').Expect<
125
+ * import('../_shared/contract.js').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
126
126
  * >} _IntegrationDriftLock
127
127
  */
128
128
 
@@ -11,7 +11,7 @@
11
11
  * The manifest module may also carry `debug` and `gapReport` NAMED exports.
12
12
  * They are not fields here on purpose: a CLI released before a given manifest
13
13
  * field existed could reject it and lose every contribution, while an unknown
14
- * named export is simply not read. See the `cli-integrations` doc topic.
14
+ * named export is simply not read. See `astryx docs cli/integrations`.
15
15
  */
16
16
  export interface AstryxIntegration {
17
17
  /** Stable logical provider ID. Omit to use package.json#name. Set this only
@@ -34,15 +34,9 @@ export interface AstryxIntegration {
34
34
  * serves from `astryx docs`, alongside the built-in ones. A topic may also
35
35
  * `replace` or `extend` a built-in topic; see the ReferenceDoc type. */
36
36
  docs?: string;
37
- /** Relative path to the source-theme catalog root (resolved to absolute).
38
- * The root contains `manifest.json` plus one directory per theme slug.
39
- * `manifest.json` is `{ "version": 1, "themes": [...] }` where each
40
- * entry requires `slug`, `displayName`, `description` (string),
41
- * `maintained` (boolean), `entry` (source file relative to `themes/<slug>/`),
42
- * `exportName` (a valid JS identifier naming the runtime export), and
43
- * `files` (non-empty array of filenames relative to `themes/<slug>/`).
44
- * Every file listed must exist on disk; the entry file must also appear
45
- * in `files`. */
37
+ /** Relative path to the source-theme root (resolved to absolute). Each
38
+ * lower-kebab theme directory contains a source module and mandatory
39
+ * same-stem, strongly typed `.doc.mjs` descriptor. */
46
40
  themes?: string;
47
41
  /** Static package guidance appended to the CLI-owned managed agent block. */
48
42
  agentDocs?: {
@@ -66,4 +60,4 @@ export type {
66
60
  GapReportCategory,
67
61
  GapReportTarget,
68
62
  GapReportHandlerReceipt,
69
- } from '../gap-report/type';
63
+ } from '../gap-report/type.js';
@@ -3,37 +3,35 @@
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
5
  import {describe, it, expect} from 'vitest';
6
-
7
- describe('@astryxdesign/cli Theme Manifest & Template Validation', () => {
8
- const manifestPath = path.resolve(
9
- 'packages/cli/assets/templates/themes/manifest.json',
10
- );
11
-
12
- it('validates theme manifest existence and structure', () => {
13
- expect(fs.existsSync(manifestPath)).toBe(true);
14
- const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
15
-
16
- expect(manifest.version).toBe(1);
17
- expect(Array.isArray(manifest.themes)).toBe(true);
18
- expect(manifest.themes.length).toBeGreaterThan(0);
19
- });
20
-
21
- it('verifies all referenced theme files exist', () => {
22
- const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
23
- const themesDir = path.dirname(manifestPath);
24
-
25
- for (const theme of manifest.themes) {
26
- expect(theme.slug).toBeDefined();
27
- expect(theme.displayName).toBeDefined();
28
- expect(theme.entry).toBeDefined();
29
-
30
- const entryPath = path.join(themesDir, theme.slug, theme.entry);
31
- expect(fs.existsSync(entryPath)).toBe(true);
32
-
6
+ import {discoverBundledThemes} from '../../../foundation/discovery/theme-discovery.mjs';
7
+
8
+ describe('@astryxdesign/cli bundled theme descriptor validation', () => {
9
+ it('discovers typed descriptors and their same-stem source files', () => {
10
+ const themes = discoverBundledThemes();
11
+ expect(themes.length).toBeGreaterThan(0);
12
+
13
+ for (const theme of themes) {
14
+ expect(theme.slug).toBeTruthy();
15
+ expect(theme.displayName).toBeTruthy();
16
+ expect(theme.docPath).toBe(
17
+ path.join(
18
+ theme.sourceDir,
19
+ `${path.basename(theme.entry, path.extname(theme.entry))}.doc.mjs`,
20
+ ),
21
+ );
22
+ expect(fs.existsSync(theme.docPath)).toBe(true);
23
+ expect(fs.existsSync(path.join(theme.sourceDir, theme.entry))).toBe(true);
33
24
  for (const file of theme.files) {
34
- const filePath = path.join(themesDir, theme.slug, file);
35
- expect(fs.existsSync(filePath)).toBe(true);
25
+ expect(fs.existsSync(path.join(theme.sourceDir, file))).toBe(true);
36
26
  }
37
27
  }
38
28
  });
29
+
30
+ it('does not ship the obsolete central theme catalog', () => {
31
+ expect(
32
+ fs.existsSync(
33
+ path.resolve('packages/cli/assets/templates/themes/manifest.json'),
34
+ ),
35
+ ).toBe(false);
36
+ });
39
37
  });
@@ -0,0 +1,83 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file A command whose module fails to import still answers: with --json, one
5
+ * error envelope on stdout; without it, the error on stderr. Exit 1 either way.
6
+ *
7
+ * The failure is injected with a module-load hook in a real subprocess, so the
8
+ * lazy command registry in index.mjs sees what a broken install would give it.
9
+ */
10
+
11
+ import {describe, it, expect, beforeAll, afterAll} from 'vitest';
12
+ import {spawnSync} from 'node:child_process';
13
+ import * as fs from 'node:fs';
14
+ import * as os from 'node:os';
15
+ import * as path from 'node:path';
16
+ import {fileURLToPath, pathToFileURL} from 'node:url';
17
+
18
+ const BIN = fileURLToPath(new URL('./bin/astryx.mjs', import.meta.url));
19
+
20
+ /** @type {string} */
21
+ let dir;
22
+ /** @type {string} */
23
+ let register;
24
+
25
+ beforeAll(() => {
26
+ dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-load-failure-'));
27
+ const hooks = path.join(dir, 'hooks.mjs');
28
+ fs.writeFileSync(
29
+ hooks,
30
+ [
31
+ 'export async function load(url, context, nextLoad) {',
32
+ " if (url.endsWith('/clients/cli/commands/blog.mjs')) {",
33
+ " throw new Error('simulated load failure');",
34
+ ' }',
35
+ ' return nextLoad(url, context);',
36
+ '}',
37
+ '',
38
+ ].join('\n'),
39
+ );
40
+ register = path.join(dir, 'register.mjs');
41
+ fs.writeFileSync(
42
+ register,
43
+ `import {register} from 'node:module';\nregister(${JSON.stringify(pathToFileURL(hooks).href)});\n`,
44
+ );
45
+ });
46
+
47
+ afterAll(() => {
48
+ fs.rmSync(dir, {recursive: true, force: true});
49
+ });
50
+
51
+ /** @param {string[]} args */
52
+ function run(args) {
53
+ const res = spawnSync(
54
+ process.execPath,
55
+ ['--import', pathToFileURL(register).href, BIN, ...args],
56
+ {cwd: dir, encoding: 'utf-8', timeout: 20_000},
57
+ );
58
+ return {status: res.status, stdout: res.stdout, stderr: res.stderr};
59
+ }
60
+
61
+ describe('a command that fails to load', () => {
62
+ it('answers --json with one error envelope, exit 1', () => {
63
+ const {status, stdout, stderr} = run(['blog', '--json']);
64
+ expect(status).toBe(1);
65
+ expect(stderr).toBe('');
66
+ const envelope = JSON.parse(stdout);
67
+ expect(envelope).toMatchObject({apiVersion: 1, code: 'ERR_UNKNOWN'});
68
+ expect(envelope.error).toMatch(/blog.*simulated load failure/);
69
+ });
70
+
71
+ it('reports the failure on stderr without --json, exit 1', () => {
72
+ const {status, stdout, stderr} = run(['blog']);
73
+ expect(status).toBe(1);
74
+ expect(stdout).toBe('');
75
+ expect(stderr).toMatch(/blog.*failed to load.*simulated load failure/s);
76
+ });
77
+
78
+ it('leaves the other commands working', () => {
79
+ const {status, stdout} = run(['docs', '--json']);
80
+ expect(status).toBe(0);
81
+ expect(JSON.parse(stdout).type).toMatch(/^docs\./);
82
+ });
83
+ });
@@ -12,7 +12,7 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'blog',
14
14
  displayName: 'astryx blog',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'Read the Astryx blog from the published feed',
17
17
  description:
18
18
  'Reads the design-system blog over its published RSS feed (never the source ' +
@@ -24,6 +24,18 @@ import {resultSet} from '../../../foundation/debug/index.mjs';
24
24
  import {doc as blogCommand} from './blog.doc.mjs';
25
25
  import {doc as blogFn} from '../../../api/blog/blog.doc.mjs';
26
26
 
27
+ /** Every field of a post in the JSON, in order; record() skips empty ones. */
28
+ const POST_FIELDS = [
29
+ 'slug',
30
+ 'title',
31
+ 'description',
32
+ 'date',
33
+ 'type',
34
+ 'authors',
35
+ 'link',
36
+ 'textUrl',
37
+ ];
38
+
27
39
  /**
28
40
  * @param {import('commander').Command} program
29
41
  */
@@ -62,22 +74,25 @@ export function registerBlog(program) {
62
74
  const {feedUrl, posts} = result.data;
63
75
  if (posts.length === 0) {
64
76
  emit(
65
- section('Astryx blog', `feed: ${feedUrl}`),
77
+ section('Astryx blog'),
78
+ record({feedUrl}),
66
79
  text('No posts found in the feed.'),
67
80
  );
68
81
  return answered;
69
82
  }
70
- // One record per post — fields mirror the JSON post shape; empty
71
- // fields (type/textUrl) are skipped by record().
72
83
  emit(
73
- section('Astryx blog', `feed: ${feedUrl}`),
74
- records(posts, {fields: ['slug', 'title', 'type', 'textUrl']}),
84
+ section('Astryx blog'),
85
+ record({feedUrl}),
86
+ records(posts, {fields: POST_FIELDS}),
75
87
  text(`Read one: ${run} astryx blog <slug>`),
76
88
  );
77
89
  } else {
78
- // blog.detail — the feed URL, then the post body emitted verbatim
79
- // (code() so article typography/spacing isn't ASCII-normalized).
80
- emit(record({feed: result.data.feedUrl}), code(result.data.text));
90
+ // blog.detail — the post's fields and the feed URL, then the body
91
+ // verbatim (code() so article typography/spacing isn't ASCII-normalized).
92
+ emit(
93
+ record(result.data, {fields: [...POST_FIELDS, 'feedUrl']}),
94
+ code(result.data.text),
95
+ );
81
96
  }
82
97
  return answered;
83
98
  },
@@ -19,7 +19,10 @@ const FEED = `<?xml version="1.0" encoding="UTF-8"?>
19
19
  <item>
20
20
  <title>How Astryx works</title>
21
21
  <link>${SITE_URL}/blog/how-astryx-works</link>
22
+ <description>Under the hood &amp; more</description>
22
23
  <category>engineering</category>
24
+ <author>Ada</author>
25
+ <author>Grace</author>
23
26
  <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
24
27
  <atom:link rel="alternate" type="text/plain" href="${SITE_URL}/blog/how-astryx-works.txt" />
25
28
  </item>
@@ -39,6 +42,23 @@ function stubFetch(routes) {
39
42
  });
40
43
  }
41
44
 
45
+ /**
46
+ * Every non-empty field prints as a `key: value` line under its JSON key.
47
+ * @param {string} stdout
48
+ * @param {Record<string, unknown>} fields
49
+ */
50
+ function expectFields(stdout, fields) {
51
+ const lines = stdout.split('\n');
52
+ for (const [key, value] of Object.entries(fields)) {
53
+ if (value == null || value === '' || (Array.isArray(value) && !value.length)) continue;
54
+ const shown = Array.isArray(value) ? value.join(', ') : String(value);
55
+ expect(
56
+ lines.some(line => line.startsWith(`${key}:`) && line.trimEnd().endsWith(shown)),
57
+ `${key}: ${shown}`,
58
+ ).toBe(true);
59
+ }
60
+ }
61
+
42
62
  beforeEach(() => {
43
63
  vi.stubGlobal(
44
64
  'fetch',
@@ -83,10 +103,31 @@ describe('blog CLI — json-enabled', () => {
83
103
  const {status, stdout} = await runCli(['blog']);
84
104
  expect(status).toBe(0);
85
105
  expect(stdout).toMatch(/Astryx blog/);
86
- expect(stdout).toMatch(/feed:/);
106
+ expect(stdout).toMatch(/^feedUrl:/m);
87
107
  expect(stdout).toMatch(/how-astryx-works/);
88
108
  });
89
109
 
110
+ it('the text list projects every JSON field under its JSON key', async () => {
111
+ const env = JSON.parse((await runCli(['blog', '--json'])).stdout);
112
+ const {status, stdout} = await runCli(['blog']);
113
+ expect(status).toBe(0);
114
+ expectFields(stdout, {feedUrl: env.data.feedUrl});
115
+ for (const post of env.data.posts) expectFields(stdout, post);
116
+ expect(stdout).not.toMatch(/^feed:/m);
117
+ });
118
+
119
+ it('the text detail projects every JSON field, then the post body', async () => {
120
+ const env = JSON.parse(
121
+ (await runCli(['blog', 'how-astryx-works', '--json'])).stdout,
122
+ );
123
+ const {status, stdout} = await runCli(['blog', 'how-astryx-works']);
124
+ expect(status).toBe(0);
125
+ const {text, ...fields} = env.data;
126
+ expectFields(stdout, fields);
127
+ expect(stdout).toContain(text);
128
+ expect(stdout).not.toMatch(/^feed:/m);
129
+ });
130
+
90
131
  it('surfaces the API error code and exits non-zero for an unknown slug (--json)', async () => {
91
132
  const {status, stdout} = await runCli(['blog', 'no-such-post', '--json']);
92
133
  expect(status).not.toBe(0);
@@ -3,7 +3,8 @@
3
3
  /**
4
4
  * @file Ensures `astryx theme build` preserves AST-012 adaptation semantics.
5
5
  * Runtime and static output share core's compiler; this suite guards the CLI
6
- * loading, diagnostics, serialization, and extension boundaries around it.
6
+ * loading, diagnostics, serialization, and extension boundaries around it,
7
+ * including root component overrides underneath adapted typography scales.
7
8
  */
8
9
 
9
10
  import {afterEach, beforeAll, beforeEach, describe, expect, it} from 'vitest';
@@ -94,6 +95,104 @@ describe('theme build adaptations', () => {
94
95
  );
95
96
  });
96
97
 
98
+ it.each([
99
+ ['defined', writeTheme],
100
+ ['plain', writePlainTheme],
101
+ ])(
102
+ 'preserves component pins in %s themes and built extensions',
103
+ async (_kind, write) => {
104
+ const {defineTheme, generateAdaptationCSS, generateThemeCSS} =
105
+ await import('@astryxdesign/core/theme');
106
+ const project = path.join(tmpDir, 'project');
107
+ const themesDir = path.join(project, 'themes');
108
+ const displayFamily =
109
+ 'Sarina, "Brush Script MT", "Snell Roundhand", cursive';
110
+ const input = {
111
+ name: 'adaptive-display',
112
+ typography: {
113
+ scale: {base: 16, ratio: 1.25},
114
+ body: {family: 'Outfit', fallbacks: 'sans-serif'},
115
+ },
116
+ components: {
117
+ text: Object.fromEntries(
118
+ ['display-1', 'display-2', 'display-3'].map(type => [
119
+ `type:${type}`,
120
+ {fontFamily: displayFamily},
121
+ ]),
122
+ ),
123
+ button: {base: {borderRadius: '12px'}},
124
+ },
125
+ adaptations: {
126
+ rules: [
127
+ {
128
+ when: {width: {below: 'md'}, pointer: 'coarse'},
129
+ value: {typography: {scale: {base: 14, ratio: 1.2}}},
130
+ },
131
+ {
132
+ when: {contrast: 'more'},
133
+ value: {
134
+ typography: {scale: {base: 15}},
135
+ components: {
136
+ text: {'type:display-1': {fontFamily: 'monospace'}},
137
+ },
138
+ },
139
+ },
140
+ ],
141
+ },
142
+ };
143
+ const themeFile = write(themesDir, input.name, JSON.stringify(input));
144
+ const result = await build(project, themeFile);
145
+ expect(result.code, result.stderr).toBe(0);
146
+ const css = fs.readFileSync(
147
+ path.join(themesDir, 'adaptive-display.css'),
148
+ 'utf8',
149
+ );
150
+ const compact = value => value.replace(/\s+/g, ' ').trim();
151
+ const source = defineTheme(input);
152
+ const runtime = generateThemeCSS(source);
153
+ // The CLI wraps root, adaptation, and surface CSS in separate @layer
154
+ // blocks; their contents and order must still match runtime output.
155
+ const adaptationCSS = generateAdaptationCSS(source).component;
156
+ const [rootCSS, surfaceCSS] = runtime.component.split(adaptationCSS);
157
+ const blocks = [rootCSS, adaptationCSS, surfaceCSS].map(compact);
158
+ let previousIndex = -1;
159
+ for (const block of blocks) {
160
+ expect(compact(css)).toContain(block);
161
+ const index = compact(css).indexOf(block);
162
+ expect(index).toBeGreaterThan(previousIndex);
163
+ previousIndex = index;
164
+ }
165
+ expect(compact(css)).toContain(compact(runtime.prose));
166
+ const scaleBlock = css.slice(
167
+ css.indexOf('@media (width < 768px) and (pointer: coarse)'),
168
+ css.indexOf('@media (prefers-contrast: more)'),
169
+ );
170
+ expect(scaleBlock).toContain('--font-size-base: 0.875rem');
171
+ expect(scaleBlock).not.toContain('.astryx-text');
172
+ expect(scaleBlock).not.toContain('.astryx-heading');
173
+ expect(scaleBlock).not.toContain('.astryx-button');
174
+ expect(css).toContain(`font-family: ${displayFamily};`);
175
+ expect(css).toContain('font-family: monospace;');
176
+
177
+ const {adaptiveDisplayTheme: builtTheme} = await import(
178
+ pathToFileURL(path.join(themesDir, 'adaptive-display.js')).href
179
+ );
180
+ expect(builtTheme.__adaptationRules).toBeUndefined();
181
+ expect(generateThemeCSS(builtTheme)).toEqual(runtime);
182
+ const childInput = {
183
+ name: 'display-child',
184
+ components: {text: {'type:display-2': {fontFamily: 'serif'}}},
185
+ };
186
+ const fromSource = defineTheme({...childInput, extends: source});
187
+ const fromBuilt = defineTheme({...childInput, extends: builtTheme});
188
+ expect(generateThemeCSS(fromBuilt)).toEqual(generateThemeCSS(fromSource));
189
+ expect(fromBuilt.__adaptationRules[0].components).toBeUndefined();
190
+ expect(fromBuilt.components.text['type:display-2'].fontFamily).toBe(
191
+ 'serif',
192
+ );
193
+ },
194
+ );
195
+
97
196
  it('resolves a plain object whose only input-only field is adaptations', async () => {
98
197
  const project = path.join(tmpDir, 'project');
99
198
  const themesDir = path.join(project, 'themes');