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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +121 -85
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +36 -13
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +272 -41
  54. package/api/docs/_adapter.mjs +985 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docs.d.mts +10 -3
  61. package/api/docs/docs.doc.mjs +55 -16
  62. package/api/docs/docs.mjs +53 -10
  63. package/api/docs/docs.test.mjs +166 -4
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/integration-tree.test.mjs +555 -0
  70. package/api/docs/integrationDocs.test.mjs +114 -8
  71. package/api/docs/list/list.mjs +28 -12
  72. package/api/docs/node/node.d.mts +43 -0
  73. package/api/docs/node/node.mjs +192 -0
  74. package/api/docs/reference-blocks.test.mjs +406 -0
  75. package/api/doctor/doctor.d.mts +104 -1
  76. package/api/doctor/doctor.doc.mjs +1 -0
  77. package/api/doctor/doctor.mjs +635 -7
  78. package/api/doctor/doctor.test.mjs +732 -11
  79. package/api/gap-report/gap-report.doc.mjs +8 -4
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +1 -0
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -3
  87. package/api/index.mjs +5 -4
  88. package/api/init/init.doc.mjs +6 -1
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +34 -64
  99. package/api/integration/add-theme.test.mjs +105 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
  119. package/api/integration/pack-check.mjs +111 -10
  120. package/api/integration/pack-check.test.mjs +387 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +14 -1
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +1 -0
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -1
  133. package/api/json/isError.doc.mjs +1 -0
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/search/search-return-type.test.mjs +54 -0
  136. package/api/search/search.d.mts +62 -11
  137. package/api/search/search.doc.mjs +8 -2
  138. package/api/search/search.mjs +471 -83
  139. package/api/search/search.test.mjs +142 -1
  140. package/api/search/search.type.d.mts +15 -3
  141. package/api/search/search.type.mjs +5 -2
  142. package/api/swizzle/copy/copy.mjs +28 -11
  143. package/api/swizzle/swizzle.doc.mjs +2 -1
  144. package/api/swizzle/swizzle.type.d.mts +2 -2
  145. package/api/swizzle/swizzle.type.mjs +2 -2
  146. package/api/template/copy/copy.mjs +17 -23
  147. package/api/template/copy/copy.test.mjs +17 -0
  148. package/api/template/list/list.mjs +1 -0
  149. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  150. package/api/template/template-integration.test.mjs +1008 -3
  151. package/api/template/template-suffix.test.mjs +41 -21
  152. package/api/template/template.d.mts +1 -1
  153. package/api/template/template.doc.mjs +30 -8
  154. package/api/template/template.mjs +46 -9
  155. package/api/template/template.type.d.mts +12 -14
  156. package/api/template/template.type.mjs +15 -14
  157. package/api/theme/_adapter.d.mts +2 -3
  158. package/api/theme/_adapter.mjs +4 -5
  159. package/api/theme/add/add.binary.test.mjs +84 -0
  160. package/api/theme/add/add.mjs +31 -22
  161. package/api/theme/add/add.rollback.test.mjs +158 -0
  162. package/api/theme/add/add.staging.test.mjs +83 -0
  163. package/api/theme/add/add.test.mjs +14 -1
  164. package/api/theme/build/build.family.test.mjs +7 -12
  165. package/api/theme/build/build.mjs +140 -59
  166. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  167. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  168. package/api/theme/build/build.rollback.test.mjs +148 -0
  169. package/api/theme/build/build.test.mjs +127 -0
  170. package/api/theme/build/font-warning.mjs +3 -3
  171. package/api/theme/build/font-warning.test.mjs +5 -2
  172. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  173. package/api/theme/integration-themes.test.mjs +39 -28
  174. package/api/theme/list/list.test.mjs +19 -20
  175. package/api/theme/listThemes.doc.mjs +6 -5
  176. package/api/theme/palette/generate/generate.mjs +8 -3
  177. package/api/theme/palette/generate/generate.test.mjs +96 -0
  178. package/api/theme/palette/generate/generator.d.mts +10 -13
  179. package/api/theme/palette/generate/generator.mjs +15 -4
  180. package/api/theme/palette/generate/generator.test.mjs +10 -0
  181. package/api/theme/template/template.mjs +11 -2
  182. package/api/theme/template/template.test.mjs +20 -0
  183. package/api/theme/theme.type.d.mts +170 -11
  184. package/api/theme/theme.type.mjs +94 -27
  185. package/api/theme/themeAdd.doc.mjs +4 -3
  186. package/api/theme/themeBuild.doc.mjs +8 -4
  187. package/api/theme/themeList.doc.mjs +6 -3
  188. package/api/theme/themeListAvailable.doc.mjs +5 -3
  189. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  190. package/api/theme/themeTargets.doc.mjs +1 -0
  191. package/api/theme/themeTemplate.doc.mjs +6 -2
  192. package/api/upgrade/_adapter.d.mts +32 -5
  193. package/api/upgrade/_adapter.mjs +139 -22
  194. package/api/upgrade/list/list.mjs +2 -1
  195. package/api/upgrade/list/list.test.mjs +73 -0
  196. package/api/upgrade/project-context.test.mjs +272 -0
  197. package/api/upgrade/provider-agreement.test.mjs +152 -0
  198. package/api/upgrade/run/files-changed.test.mjs +111 -0
  199. package/api/upgrade/run/run.mjs +359 -60
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +12 -5
  202. package/api/upgrade/upgrade.type.d.mts +43 -5
  203. package/api/upgrade/upgrade.type.mjs +29 -13
  204. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  205. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  206. package/assets/codemods/file-count.test.mjs +163 -0
  207. package/assets/codemods/integration-discovery.mjs +48 -4
  208. package/assets/codemods/integration-discovery.test.mjs +73 -0
  209. package/assets/codemods/integration-runner.mjs +59 -7
  210. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  211. package/assets/codemods/registry.mjs +1 -0
  212. package/assets/codemods/run-codemod.mjs +177 -34
  213. package/assets/codemods/runner.mjs +353 -104
  214. package/assets/codemods/term-log.mjs +32 -8
  215. package/assets/codemods/term-log.test.mjs +19 -1
  216. package/assets/codemods/transform-prop.mjs +109 -0
  217. package/assets/codemods/transform-prop.test.mjs +95 -0
  218. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  219. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  220. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  221. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  222. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  223. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  224. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  225. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  226. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  227. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  228. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  229. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  230. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  231. package/assets/docs/README.md +9 -0
  232. package/assets/docs/authoring.doc.mjs +14 -0
  233. package/assets/docs/getting-started.doc.mjs +2 -2
  234. package/assets/docs/internationalization.doc.mjs +7 -5
  235. package/assets/docs/layout.doc.dense.mjs +2 -2
  236. package/assets/docs/layout.doc.mjs +1 -1
  237. package/assets/docs/principles.doc.mjs +6 -6
  238. package/assets/docs/styling-libraries.doc.mjs +4 -4
  239. package/assets/docs/styling.doc.mjs +4 -4
  240. package/assets/docs/theme.doc.mjs +5 -5
  241. package/assets/docs/tokens.doc.mjs +1 -1
  242. package/assets/docs/tree/api.doc.mjs +30 -0
  243. package/assets/docs/tree/cli.doc.mjs +23 -0
  244. package/assets/docs/tree/commands.doc.mjs +25 -0
  245. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  246. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  247. package/assets/docs/tree/integrations.test.mjs +62 -0
  248. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  249. package/assets/docs/working-with-ai.doc.mjs +4 -4
  250. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  251. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  252. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  253. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  254. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  255. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  268. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  270. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  271. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  272. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  273. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  274. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  275. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  277. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  278. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  279. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  280. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  281. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  282. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  283. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  284. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  285. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  286. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  287. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  292. package/authoring/_shared/contract.ts +22 -0
  293. package/authoring/codemod/codemod.doc.mjs +7 -2
  294. package/authoring/codemod/parse.d.mts +8 -8
  295. package/authoring/codemod/parse.mjs +8 -6
  296. package/authoring/codemod/type.ts +12 -0
  297. package/authoring/config/config.doc.mjs +11 -3
  298. package/authoring/config/debug-composition.test.mjs +92 -0
  299. package/authoring/config/parse.d.mts +15 -13
  300. package/authoring/config/parse.mjs +27 -8
  301. package/authoring/config/parse.test.mjs +8 -0
  302. package/authoring/config/type.ts +31 -8
  303. package/authoring/debug/debug.doc.d.mts +11 -0
  304. package/authoring/debug/debug.doc.mjs +182 -0
  305. package/authoring/debug/parse.d.mts +8 -8
  306. package/authoring/debug/parse.mjs +3 -3
  307. package/authoring/discover/discover.doc.d.mts +13 -0
  308. package/authoring/discover/discover.doc.mjs +138 -0
  309. package/authoring/discover/parse.d.mts +24 -0
  310. package/authoring/discover/parse.mjs +128 -0
  311. package/authoring/discover/parse.test.mjs +124 -0
  312. package/authoring/discover/type.ts +87 -0
  313. package/authoring/doctypes/_schema.d.mts +790 -23
  314. package/authoring/doctypes/_schema.mjs +543 -39
  315. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  316. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  317. package/authoring/doctypes/base/type.ts +41 -0
  318. package/authoring/doctypes/command/command.doc.mjs +5 -4
  319. package/authoring/doctypes/command/parse.d.mts +2 -2
  320. package/authoring/doctypes/command/parse.mjs +1 -1
  321. package/authoring/doctypes/command/type.ts +6 -5
  322. package/authoring/doctypes/component/component.doc.mjs +6 -3
  323. package/authoring/doctypes/component/parse.d.mts +2 -2
  324. package/authoring/doctypes/component/parse.mjs +1 -1
  325. package/authoring/doctypes/component/type.ts +6 -5
  326. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  327. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  328. package/authoring/doctypes/enum/parse.d.mts +2 -2
  329. package/authoring/doctypes/enum/parse.mjs +1 -1
  330. package/authoring/doctypes/enum/type.ts +4 -2
  331. package/authoring/doctypes/function/function.doc.mjs +7 -2
  332. package/authoring/doctypes/function/parse.d.mts +2 -2
  333. package/authoring/doctypes/function/parse.mjs +1 -1
  334. package/authoring/doctypes/function/type.ts +9 -4
  335. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  336. package/authoring/doctypes/hook/parse.d.mts +2 -2
  337. package/authoring/doctypes/hook/parse.mjs +1 -1
  338. package/authoring/doctypes/hook/type.ts +5 -4
  339. package/authoring/doctypes/legacy.d.mts +8 -6
  340. package/authoring/doctypes/legacy.mjs +5 -4
  341. package/authoring/doctypes/load-contract.test.mjs +233 -0
  342. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  343. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  344. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  345. package/authoring/doctypes/namespace/parse.mjs +25 -0
  346. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  347. package/authoring/doctypes/namespace/type.ts +74 -0
  348. package/authoring/doctypes/parse.d.mts +22 -18
  349. package/authoring/doctypes/parse.mjs +22 -11
  350. package/authoring/doctypes/parse.test.mjs +77 -3
  351. package/authoring/doctypes/reference/parse.d.mts +2 -2
  352. package/authoring/doctypes/reference/parse.mjs +8 -5
  353. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  354. package/authoring/doctypes/reference/type.ts +70 -7
  355. package/authoring/doctypes/schema/parse.d.mts +2 -2
  356. package/authoring/doctypes/schema/parse.mjs +1 -1
  357. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  358. package/authoring/doctypes/schema/type.ts +4 -4
  359. package/authoring/doctypes/template/parse.d.mts +94 -1
  360. package/authoring/doctypes/template/parse.mjs +40 -2
  361. package/authoring/doctypes/template/parse.test.mjs +26 -2
  362. package/authoring/doctypes/template/template.doc.mjs +13 -3
  363. package/authoring/doctypes/template/type.ts +13 -2
  364. package/authoring/doctypes/theme/parse.d.mts +35 -0
  365. package/authoring/doctypes/theme/parse.mjs +76 -0
  366. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  367. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  368. package/authoring/doctypes/theme/type.ts +42 -0
  369. package/authoring/doctypes/types.ts +12 -10
  370. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  371. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  372. package/authoring/gap-report/parse.d.mts +10 -10
  373. package/authoring/gap-report/parse.mjs +6 -6
  374. package/authoring/gap-report/type.ts +1 -1
  375. package/authoring/identity/identity.doc.d.mts +9 -0
  376. package/authoring/identity/identity.doc.mjs +61 -0
  377. package/authoring/identity/type.ts +132 -0
  378. package/authoring/index.d.mts +3 -0
  379. package/authoring/index.d.ts +62 -17
  380. package/authoring/index.mjs +4 -1
  381. package/authoring/integration/integration.doc.mjs +15 -8
  382. package/authoring/integration/parse.d.mts +2 -2
  383. package/authoring/integration/parse.mjs +1 -1
  384. package/authoring/integration/parse.test.mjs +10 -1
  385. package/authoring/integration/schema.d.mts +6 -4
  386. package/authoring/integration/schema.mjs +9 -3
  387. package/authoring/integration/type.ts +19 -8
  388. package/authoring/shadcn/receipt.d.mts +6 -6
  389. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  390. package/clients/cli/command-load-failure.test.mjs +83 -0
  391. package/clients/cli/command-result-coverage.test.mjs +7 -7
  392. package/clients/cli/commands/blog.doc.mjs +1 -1
  393. package/clients/cli/commands/blog.mjs +23 -8
  394. package/clients/cli/commands/blog.test.mjs +42 -1
  395. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  396. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  397. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  398. package/clients/cli/commands/build-theme.mjs +16 -50
  399. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  400. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  401. package/clients/cli/commands/build.doc.mjs +16 -8
  402. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  403. package/clients/cli/commands/build.mjs +137 -114
  404. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  405. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  406. package/clients/cli/commands/component/index.mjs +153 -61
  407. package/clients/cli/commands/component-batch.test.mjs +341 -0
  408. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +24 -7
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
  414. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  415. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  416. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  417. package/clients/cli/commands/discover.doc.mjs +55 -9
  418. package/clients/cli/commands/discover.mjs +393 -118
  419. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  420. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  421. package/clients/cli/commands/docs.doc.mjs +28 -6
  422. package/clients/cli/commands/docs.mjs +240 -26
  423. package/clients/cli/commands/docs.test.mjs +222 -1
  424. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  425. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  426. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  427. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  429. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  430. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  431. package/clients/cli/commands/doctor.doc.mjs +1 -1
  432. package/clients/cli/commands/doctor.mjs +59 -32
  433. package/clients/cli/commands/doctor.test.mjs +42 -0
  434. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  435. package/clients/cli/commands/gap-report.test.mjs +72 -0
  436. package/clients/cli/commands/hook/index.mjs +7 -17
  437. package/clients/cli/commands/hook.doc.mjs +1 -1
  438. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  439. package/clients/cli/commands/init.doc.mjs +20 -9
  440. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  441. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  442. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  443. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  444. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  445. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  446. package/clients/cli/commands/integration.doc.mjs +1 -1
  447. package/clients/cli/commands/integration.mjs +1 -0
  448. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  449. package/clients/cli/commands/json-contract.test.mjs +33 -0
  450. package/clients/cli/commands/manifest.doc.mjs +1 -1
  451. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  452. package/clients/cli/commands/search.doc.mjs +7 -4
  453. package/clients/cli/commands/search.mjs +28 -9
  454. package/clients/cli/commands/search.test.mjs +75 -0
  455. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  456. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  457. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  458. package/clients/cli/commands/template.doc.mjs +52 -13
  459. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  460. package/clients/cli/commands/template.mjs +4 -91
  461. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  462. package/clients/cli/commands/text-json-parity.test.mjs +702 -0
  463. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  464. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  465. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  466. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  467. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  468. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  469. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  470. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  471. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  472. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  473. package/clients/cli/commands/theme.doc.mjs +1 -1
  474. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  475. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  476. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  477. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  478. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  479. package/clients/cli/commands/upgrade.mjs +29 -7
  480. package/clients/cli/formatters/index.mjs +164 -1
  481. package/clients/cli/formatters/index.test.mjs +97 -0
  482. package/clients/cli/index.mjs +21 -34
  483. package/clients/cli/latest-version-env.test.mjs +50 -0
  484. package/clients/cli/lib/cli-error.test.mjs +7 -0
  485. package/clients/cli/lib/component-format.mjs +9 -9
  486. package/clients/cli/lib/component-format.test.mjs +1 -1
  487. package/clients/cli/lib/define-command.mjs +32 -6
  488. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  489. package/clients/cli/lib/exit-codes.test.mjs +90 -0
  490. package/clients/cli/lib/hook-format.mjs +19 -10
  491. package/clients/cli/lib/json-shim.mjs +62 -16
  492. package/clients/cli/lib/json-shim.test.mjs +69 -0
  493. package/clients/cli/lib/manifest.d.ts +2 -0
  494. package/clients/cli/lib/manifest.mjs +39 -10
  495. package/clients/cli/lib/manifest.test.mjs +22 -2
  496. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  497. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  498. package/foundation/agent-docs/agent-docs.mjs +82 -12
  499. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  500. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  501. package/foundation/config/integration-debug.test.mjs +28 -3
  502. package/foundation/config/project-themes.test.mjs +11 -19
  503. package/foundation/config/project.d.mts +20 -11
  504. package/foundation/config/project.mjs +263 -91
  505. package/foundation/config/project.test.mjs +270 -21
  506. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  507. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  508. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  509. package/foundation/discovery/authoring-surface.d.mts +74 -0
  510. package/foundation/discovery/authoring-surface.mjs +525 -0
  511. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  512. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  513. package/foundation/discovery/cli-self-docs.mjs +490 -0
  514. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  515. package/foundation/discovery/component-discovery.d.mts +39 -1
  516. package/foundation/discovery/component-discovery.mjs +50 -1
  517. package/foundation/discovery/component-loader.d.mts +35 -38
  518. package/foundation/discovery/component-loader.mjs +53 -222
  519. package/foundation/discovery/docs-discovery.d.mts +119 -11
  520. package/foundation/discovery/docs-discovery.mjs +423 -108
  521. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  522. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  523. package/foundation/discovery/docs-output-budget.mjs +50 -0
  524. package/foundation/discovery/docs-section-key.d.mts +116 -0
  525. package/foundation/discovery/docs-section-key.mjs +322 -0
  526. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  527. package/foundation/discovery/template-adapter.d.mts +113 -11
  528. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  529. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  530. package/foundation/discovery/template-adapter.mjs +775 -84
  531. package/foundation/discovery/template-adapter.test.mjs +57 -0
  532. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  533. package/foundation/discovery/template-conflict-release.mjs +40 -0
  534. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  535. package/foundation/discovery/theme-discovery.d.mts +67 -7
  536. package/foundation/discovery/theme-discovery.mjs +916 -186
  537. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  538. package/foundation/discovery/theming-targets.test.mjs +4 -0
  539. package/foundation/doc-compiler/bundle.d.mts +47 -0
  540. package/foundation/doc-compiler/bundle.mjs +278 -0
  541. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  542. package/foundation/doc-compiler/compile.d.mts +343 -0
  543. package/foundation/doc-compiler/compile.mjs +558 -0
  544. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  545. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  546. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  547. package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
  548. package/foundation/doc-compiler/import.d.mts +24 -0
  549. package/foundation/doc-compiler/import.mjs +59 -0
  550. package/foundation/doc-compiler/inputs.d.mts +102 -0
  551. package/foundation/doc-compiler/inputs.mjs +291 -0
  552. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  553. package/foundation/doc-compiler/ir.d.mts +22 -0
  554. package/foundation/doc-compiler/ir.mjs +471 -0
  555. package/foundation/doc-compiler/lenses.d.mts +36 -0
  556. package/foundation/doc-compiler/lenses.mjs +173 -0
  557. package/foundation/doc-compiler/links.d.mts +162 -0
  558. package/foundation/doc-compiler/links.mjs +294 -0
  559. package/foundation/doc-compiler/links.test.mjs +192 -0
  560. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  561. package/foundation/doc-compiler/overlays.d.mts +37 -0
  562. package/foundation/doc-compiler/overlays.mjs +206 -0
  563. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  564. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  565. package/foundation/doc-compiler/read.d.mts +127 -0
  566. package/foundation/doc-compiler/read.mjs +325 -0
  567. package/foundation/doc-compiler/read.test.mjs +313 -0
  568. package/foundation/doc-compiler/source.d.mts +33 -0
  569. package/foundation/doc-compiler/source.mjs +128 -0
  570. package/foundation/doc-compiler/tree.d.mts +288 -0
  571. package/foundation/doc-compiler/tree.mjs +876 -0
  572. package/foundation/doc-compiler/tree.test.mjs +606 -0
  573. package/foundation/fs/file-protection.d.mts +33 -0
  574. package/foundation/fs/file-protection.mjs +825 -0
  575. package/foundation/fs/file-protection.test.mjs +250 -0
  576. package/foundation/fs/module-loader.d.mts +1 -0
  577. package/foundation/fs/module-loader.mjs +50 -1
  578. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  579. package/foundation/fs/path-safety.d.mts +3 -2
  580. package/foundation/fs/path-safety.mjs +49 -19
  581. package/foundation/fs/path-safety.test.mjs +50 -0
  582. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  583. package/foundation/identity/provider-identity.d.mts +90 -0
  584. package/foundation/identity/provider-identity.mjs +320 -0
  585. package/foundation/identity/provider-identity.test.mjs +254 -0
  586. package/foundation/identity/providers.d.mts +7 -0
  587. package/foundation/identity/providers.mjs +16 -0
  588. package/foundation/integrations/autolink.d.mts +58 -1
  589. package/foundation/integrations/autolink.mjs +143 -45
  590. package/foundation/integrations/autolink.test.mjs +1 -1
  591. package/foundation/integrations/cli-requirement.d.mts +45 -0
  592. package/foundation/integrations/cli-requirement.mjs +154 -0
  593. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  594. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  595. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  596. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  597. package/foundation/integrations/contribution-inventory.mjs +27 -24
  598. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  599. package/foundation/integrations/integration-warnings.d.mts +9 -2
  600. package/foundation/integrations/integration-warnings.mjs +52 -21
  601. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  602. package/foundation/integrations/integrations.d.mts +63 -3
  603. package/foundation/integrations/integrations.mjs +122 -9
  604. package/foundation/integrations/integrations.test.mjs +415 -1
  605. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  606. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  607. package/foundation/integrations/provider-resolution.d.mts +152 -0
  608. package/foundation/integrations/provider-resolution.mjs +576 -0
  609. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  610. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  611. package/foundation/integrations/theme-descriptor.mjs +44 -0
  612. package/foundation/integrations/validate-contributions.d.mts +2 -0
  613. package/foundation/integrations/validate-contributions.mjs +131 -29
  614. package/foundation/response/base.d.ts +8 -4
  615. package/foundation/response/batch.type.d.mts +33 -0
  616. package/foundation/response/batch.type.mjs +34 -0
  617. package/foundation/response/error-codes.d.mts +3 -1
  618. package/foundation/response/error-codes.d.ts +2 -0
  619. package/foundation/response/error-codes.doc.mjs +13 -4
  620. package/foundation/response/error-codes.mjs +8 -2
  621. package/foundation/response/error-codes.test.mjs +137 -10
  622. package/foundation/response/json-contract.test.mjs +57 -17
  623. package/foundation/response/json.d.mts +4 -2
  624. package/foundation/response/json.mjs +8 -10
  625. package/foundation/response/response-types.doc.d.mts +5 -1
  626. package/foundation/response/response-types.doc.mjs +46 -38
  627. package/foundation/response/response-types.doc.test.mjs +181 -0
  628. package/foundation/response/response.doc.mjs +1 -1
  629. package/foundation/text/string-utils.d.mts +8 -0
  630. package/foundation/text/string-utils.mjs +40 -10
  631. package/foundation/xle/browser.d.mts +3 -3
  632. package/foundation/xle/browser.mjs +3 -3
  633. package/foundation/xle/expand.d.mts +2 -0
  634. package/foundation/xle/expand.mjs +6 -5
  635. package/foundation/xle/expand.test.mjs +54 -0
  636. package/foundation/xle/parse.mjs +1 -1
  637. package/foundation/xle/print.mjs +2 -2
  638. package/foundation/xle/splice.mjs +1 -1
  639. package/foundation/xle/xle.test.mjs +13 -0
  640. package/package.json +10 -11
  641. package/api/layout/_adapter.d.mts +0 -34
  642. package/api/layout/_adapter.mjs +0 -133
  643. package/api/layout/check/check.d.mts +0 -16
  644. package/api/layout/check/check.mjs +0 -40
  645. package/api/layout/expand/expand.d.mts +0 -22
  646. package/api/layout/expand/expand.mjs +0 -153
  647. package/api/layout/grammar/grammar.d.mts +0 -13
  648. package/api/layout/grammar/grammar.mjs +0 -86
  649. package/api/layout/layout.d.mts +0 -6
  650. package/api/layout/layout.mjs +0 -17
  651. package/api/layout/layout.test.mjs +0 -297
  652. package/api/layout/layout.type.d.mts +0 -89
  653. package/api/layout/layout.type.mjs +0 -103
  654. package/api/layout/layoutCheck.doc.d.mts +0 -11
  655. package/api/layout/layoutCheck.doc.mjs +0 -84
  656. package/api/layout/layoutExpand.doc.d.mts +0 -11
  657. package/api/layout/layoutExpand.doc.mjs +0 -106
  658. package/api/layout/layoutGrammar.doc.d.mts +0 -11
  659. package/api/layout/layoutGrammar.doc.mjs +0 -56
  660. package/assets/templates/themes/manifest.json +0 -95
  661. package/clients/cli/commands/layout-check.doc.mjs +0 -54
  662. package/clients/cli/commands/layout-expand.doc.mjs +0 -66
  663. package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
  664. package/clients/cli/commands/layout.doc.mjs +0 -34
  665. package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
  666. package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
  667. package/clients/cli/commands/layout.mjs +0 -263
  668. package/clients/cli/lib/update-check.mjs +0 -83
  669. package/clients/cli/lib/update-check.test.mjs +0 -137
  670. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -11,11 +11,39 @@ export function pkgOf(t: {
11
11
  package?: string;
12
12
  }): string;
13
13
  /**
14
- * Replace demo asset references with a placeholder so scaffolded pages
15
- * render with zero setup. Images get a self-contained data URI; videos
16
- * (which have no equivalent inline placeholder — see VIDEO_EXTENSIONS) are
17
- * stripped to an empty src instead of being mis-replaced with image data.
18
- * Builders drop in their own media either way.
14
+ * Every id that should resolve to a discovered template. Replacements keep
15
+ * their own integration id and also own the Core id they replace.
16
+ * @param {{dirName: string, replaces?: string}} template
17
+ * @returns {string[]}
18
+ */
19
+ export function templateLookupIds(template: {
20
+ dirName: string;
21
+ replaces?: string;
22
+ }): string[];
23
+ /**
24
+ * Remove entries shadowed in the default discovery view while retaining them in
25
+ * package-scoped views. An active replacement owns its target id. A rejected
26
+ * same-id declaration falls back to Core when a Core template of the same kind
27
+ * owns that id; otherwise the integration template remains available by kind.
28
+ * @param {DiscoveredTemplate[]} templates
29
+ * @returns {DiscoveredTemplate[]}
30
+ */
31
+ export function effectiveTemplateDiscovery(templates: DiscoveredTemplate[]): DiscoveredTemplate[];
32
+ /**
33
+ * Replace each Astryx template fixture reference with a placeholder so
34
+ * scaffolded pages render with zero setup. Images get a self-contained data
35
+ * URI; videos (which have no equivalent inline placeholder — see
36
+ * VIDEO_EXTENSIONS) are stripped to an empty src instead of being
37
+ * mis-replaced with image data. Builders drop in their own media either way.
38
+ *
39
+ * A reference is a URL token that resolves to a root-relative path under
40
+ * FIXTURE_SEGMENT. It is replaced whole, query and fragment included, and
41
+ * classified by the suffix of its last path segment. A reference that cannot
42
+ * be replaced safely throws with its path rather than being guessed at or
43
+ * left behind. Prose is left as written: in text (JSX text, a word inside a
44
+ * longer string) trailing punctuation is not part of a path and a path with
45
+ * no suffix, such as the bare directory, is a mention; inside a comment
46
+ * nothing throws.
19
47
  *
20
48
  * @param {string} source - Template source code.
21
49
  * @returns {string} Source with demo asset references replaced.
@@ -28,6 +56,13 @@ export function stripTemplateAssetRefs(source: string): string;
28
56
  * @returns {string[]}
29
57
  */
30
58
  export function listTemplates(): string[];
59
+ /**
60
+ * Resolve the template-spec file for a core page directory: the first existing
61
+ * metadata file in {@link ALL_TEMPLATE_SUFFIXES} precedence, or null.
62
+ * @param {string} dirPath
63
+ * @returns {string | null}
64
+ */
65
+ export function findPageDocFile(dirPath: string): string | null;
31
66
  /**
32
67
  * Discover only the templates built into @astryxdesign/core. Integration
33
68
  * authoring checks use this narrower surface so a broken project config or a
@@ -35,22 +70,54 @@ export function listTemplates(): string[];
35
70
  * @returns {Promise<DiscoveredTemplate[]>}
36
71
  */
37
72
  export function discoverCoreTemplates(): Promise<DiscoveredTemplate[]>;
73
+ /**
74
+ * Apply valid integration replacements to a raw template set.
75
+ *
76
+ * One declaration owns its Core target. When different configured packages
77
+ * replace the same target, the later package wins and discovery returns a
78
+ * warning, matching integration-doc replacement order. Multiple declarations
79
+ * inside one package are invalid and fail closed. Missing targets and kind
80
+ * mismatches also fail closed: Core stays selected and every integration
81
+ * template remains addressable by its own id.
82
+ *
83
+ * @param {DiscoveredTemplate[]} templates
84
+ * @param {TemplateDiscoveryError[]} [declarationErrors]
85
+ * @returns {{templates: DiscoveredTemplate[], errors: TemplateReplacementError[]}}
86
+ */
87
+ export function applyTemplateReplacements(templates: DiscoveredTemplate[], declarationErrors?: TemplateDiscoveryError[]): {
88
+ templates: DiscoveredTemplate[];
89
+ errors: TemplateReplacementError[];
90
+ };
91
+ /**
92
+ * Discover every template without hiding replaced Core originals. Internal
93
+ * package-qualified selection uses this view.
94
+ * @param {string} [cwd]
95
+ * @returns {Promise<DiscoveredTemplate[]>}
96
+ */
97
+ export function discoverAllUnresolved(cwd?: string): Promise<DiscoveredTemplate[]>;
98
+ /**
99
+ * Discover the resolved catalog before default-view shadowing. Internal
100
+ * package-qualified selection uses this view.
101
+ * @param {string} [cwd]
102
+ * @returns {Promise<DiscoveredTemplate[]>}
103
+ */
104
+ export function discoverAllResolved(cwd?: string): Promise<DiscoveredTemplate[]>;
38
105
  /**
39
106
  * @param {string} [cwd]
40
107
  * @returns {Promise<DiscoveredTemplate[]>}
41
108
  */
42
109
  export function discoverAll(cwd?: string): Promise<DiscoveredTemplate[]>;
43
110
  /**
44
- * Like {@link discoverAll} but also returns integration-template discovery
45
- * errors (missing same-stem source, missing `type`, load failure). Use this
46
- * when the caller wants to warn about malformed integration templates.
111
+ * Like {@link discoverAll} but also returns integration-template discovery and
112
+ * replacement-declaration errors. Use this when the caller wants to warn about
113
+ * malformed integration templates or inactive replacement declarations.
47
114
  *
48
115
  * @param {string} [cwd]
49
- * @returns {Promise<{templates: DiscoveredTemplate[], errors: TemplateDiscoveryError[]}>}
116
+ * @returns {Promise<{templates: DiscoveredTemplate[], errors: Array<TemplateDiscoveryError | TemplateReplacementError>}>}
50
117
  */
51
118
  export function discoverAllWithErrors(cwd?: string): Promise<{
52
119
  templates: DiscoveredTemplate[];
53
- errors: TemplateDiscoveryError[];
120
+ errors: Array<TemplateDiscoveryError | TemplateReplacementError>;
54
121
  }>;
55
122
  /**
56
123
  * Discover the templates contributed by a SINGLE integration. Same per-template
@@ -58,12 +125,13 @@ export function discoverAllWithErrors(cwd?: string): Promise<{
58
125
  * page|block type required); broken templates are recorded in `errors` rather
59
126
  * than thrown. Exposed for `doctor integration validate` and template authoring checks.
60
127
  *
61
- * @param {{name?: string, __spec?: string, templates?: string}} integration
128
+ * @param {{name?: string, __spec?: string, __autolinked?: boolean, templates?: string}} integration
62
129
  * @returns {Promise<{templates: DiscoveredTemplate[], errors: TemplateDiscoveryError[]}>}
63
130
  */
64
131
  export function discoverIntegrationTemplatesForOne(integration: {
65
132
  name?: string;
66
133
  __spec?: string;
134
+ __autolinked?: boolean;
67
135
  templates?: string;
68
136
  }): Promise<{
69
137
  templates: DiscoveredTemplate[];
@@ -117,6 +185,23 @@ export type DiscoveredTemplate = {
117
185
  filePath: string;
118
186
  docPath: string;
119
187
  package?: string | undefined;
188
+ /**
189
+ * whether the owning integration was discovered
190
+ * from package.json rather than named in astryx.config
191
+ */
192
+ autolinked?: boolean | undefined;
193
+ /**
194
+ * active Core template id this integration template replaces
195
+ */
196
+ replaces?: string | undefined;
197
+ /**
198
+ * whether an invalid declaration was disabled
199
+ */
200
+ replacementRejected?: boolean | undefined;
201
+ /**
202
+ * disabled declaration target
203
+ */
204
+ replacementTarget?: string | undefined;
120
205
  };
121
206
  /**
122
207
  * An integration-template discovery error.
@@ -125,6 +210,23 @@ export type TemplateDiscoveryError = {
125
210
  package: string;
126
211
  template?: string | undefined;
127
212
  message: string;
213
+ code?: string | undefined;
214
+ severity?: "error" | "warning" | undefined;
215
+ /**
216
+ * Core target whose replacement set is invalid
217
+ */
218
+ replacementTarget?: string | undefined;
219
+ /**
220
+ * whether the declaration came from an autolinked integration
221
+ */
222
+ autolinked?: boolean | undefined;
223
+ };
224
+ /**
225
+ * A semantic error in an integration template replacement declaration.
226
+ */
227
+ export type TemplateReplacementError = TemplateDiscoveryError & {
228
+ code: "missing_template_replacement_target" | "ambiguous_template_replacement" | "invalid_template_replacement";
229
+ severity: "warning" | "error";
128
230
  };
129
231
  /**
130
232
  * The loaded metadata object from a template spec (loose — authored shape).
@@ -0,0 +1,248 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import {fileURLToPath} from 'node:url';
7
+ import jscodeshift from 'jscodeshift';
8
+ import {stripTemplateAssetRefs} from './template-adapter.mjs';
9
+
10
+ const PLACEHOLDER = stripTemplateAssetRefs("'/template-assets/x.png'").slice(
11
+ 1,
12
+ -1,
13
+ );
14
+
15
+ describe('stripTemplateAssetRefs fixture references', () => {
16
+ it('replaces an image with a self-contained placeholder', () => {
17
+ expect(PLACEHOLDER).toMatch(/^data:image\/svg\+xml,[^\s'"`()]+$/u);
18
+ });
19
+
20
+ it.each([
21
+ 'https://cdn.example.com/template-assets/logo.png',
22
+ '//cdn.example.com/template-assets/logo.png',
23
+ '/my-app/template-assets/hero.jpg',
24
+ './template-assets/hero.jpg',
25
+ 'template-assets/hero.jpg',
26
+ '/template-assets-archive/hero.jpg',
27
+ '@/template-assets/hero.jpg',
28
+ ])('leaves %s untouched', value => {
29
+ const source = `const src = '${value}';`;
30
+ expect(stripTemplateAssetRefs(source)).toBe(source);
31
+ });
32
+
33
+ it.each([
34
+ 'import StarIcon from "./icons/star.svg";',
35
+ '<Icon icon="/icons/star.svg" />',
36
+ '<Button icon={StarIcon} />',
37
+ "const icons = {star: 'heroicons:star'};",
38
+ ])('leaves an icon outside the fixture namespace untouched: %s', source => {
39
+ expect(stripTemplateAssetRefs(source)).toBe(source);
40
+ });
41
+
42
+ it.each([
43
+ ['a subdirectory', '/template-assets/avatars/ada.png'],
44
+ ['an @ in its name', '/template-assets/hero@2x.png'],
45
+ ['a plus in its name', '/template-assets/cover+1.jpg'],
46
+ ['an encoded space in its name', '/template-assets/hero%20wide.png'],
47
+ ])('replaces a fixture with %s', (_, value) => {
48
+ expect(stripTemplateAssetRefs(`<img src="${value}" />`)).toBe(
49
+ `<img src="${PLACEHOLDER}" />`,
50
+ );
51
+ });
52
+
53
+ it('replaces the whole reference, query and fragment included', () => {
54
+ expect(
55
+ stripTemplateAssetRefs("const hero = '/template-assets/hero.jpg?w=200';"),
56
+ ).toBe(`const hero = '${PLACEHOLDER}';`);
57
+ expect(
58
+ stripTemplateAssetRefs("const clip = '/template-assets/clip.mp4#t=5';"),
59
+ ).toBe("const clip = '';");
60
+ expect(
61
+ stripTemplateAssetRefs(
62
+ "const hero = '/template-assets/a.png?f=/template-assets/b.png';",
63
+ ),
64
+ ).toBe(`const hero = '${PLACEHOLDER}';`);
65
+ });
66
+
67
+ it('classifies by the complete final suffix, ignoring case', () => {
68
+ expect(
69
+ stripTemplateAssetRefs("src: '/template-assets/Clip.Min.MP4',"),
70
+ ).toBe("src: '',");
71
+ });
72
+
73
+ it.each([
74
+ [
75
+ 'a CSS url()',
76
+ "backgroundImage: 'url(/template-assets/hero.png)'",
77
+ `backgroundImage: 'url(${PLACEHOLDER})'`,
78
+ ],
79
+ [
80
+ 'a srcset list',
81
+ 'srcSet="/template-assets/a.png 1x, /template-assets/a@2x.png 2x"',
82
+ `srcSet="${PLACEHOLDER} 1x, ${PLACEHOLDER} 2x"`,
83
+ ],
84
+ [
85
+ 'an HTML string with escaped quotes',
86
+ 'const html = "<img src=\\"/template-assets/a.png\\">";',
87
+ `const html = "<img src=\\"${PLACEHOLDER}\\">";`,
88
+ ],
89
+ [
90
+ 'JSX text',
91
+ '<code>/template-assets/hero.png</code>',
92
+ `<code>${PLACEHOLDER}</code>`,
93
+ ],
94
+ [
95
+ 'a sentence that quotes it',
96
+ 'const tip = "Replace \'/template-assets/hero.png\'.";',
97
+ `const tip = "Replace '${PLACEHOLDER}'.";`,
98
+ ],
99
+ [
100
+ 'a url() inside a longer string',
101
+ "const bg = 'url(/template-assets/a.png) + x';",
102
+ `const bg = 'url(${PLACEHOLDER}) + x';`,
103
+ ],
104
+ [
105
+ 'a comment',
106
+ '// hero: /template-assets/hero.png\n',
107
+ `// hero: ${PLACEHOLDER}\n`,
108
+ ],
109
+ [
110
+ 'a sentence, keeping its punctuation',
111
+ '// Uses /template-assets/a.png, then /template-assets/b.png.\n',
112
+ `// Uses ${PLACEHOLDER}, then ${PLACEHOLDER}.\n`,
113
+ ],
114
+ ])('replaces a fixture inside %s', (_, source, expected) => {
115
+ expect(stripTemplateAssetRefs(source)).toBe(expected);
116
+ });
117
+
118
+ it.each([
119
+ '<Text>Put your images in /template-assets/ first.</Text>',
120
+ "const note = 'Media: /template-assets/hero';",
121
+ '// Demo images live under /template-assets and are replaced.\n',
122
+ "const html = '<img src=/template-assets-archive/a.png>';",
123
+ ])('leaves a mention in text that names no media file: %s', source => {
124
+ expect(stripTemplateAssetRefs(source)).toBe(source);
125
+ });
126
+
127
+ it.each([
128
+ "// Images come from `/template-assets/*` and '/template-assets/'.\nexport default function Page() {\n return null;\n}\n",
129
+ "/* Was '/template-assets/clip.bin'. */\nexport const x = 1;\n",
130
+ ])('leaves a comment it would otherwise reject: %s', source => {
131
+ expect(stripTemplateAssetRefs(source)).toBe(source);
132
+ });
133
+
134
+ it.each([
135
+ [
136
+ 'no file suffix',
137
+ "src: '/template-assets/hero',",
138
+ '/template-assets/hero',
139
+ ],
140
+ ['no file name', "src: '/template-assets/',", '/template-assets/'],
141
+ [
142
+ 'no path below it',
143
+ "export const base = '/template-assets'; // base\n",
144
+ '/template-assets',
145
+ ],
146
+ ])(
147
+ 'fails with the fixture path when a value has %s',
148
+ (_, source, reference) => {
149
+ expect(() => stripTemplateAssetRefs(source)).toThrow(
150
+ `Unrecognized template asset format (none) for ${reference}`,
151
+ );
152
+ },
153
+ );
154
+
155
+ it.each([
156
+ [
157
+ 'const src = `/template-assets/${name}.png`;',
158
+ '/template-assets/${name}.png',
159
+ ],
160
+ ['const src = `/template-assets${path}`;', '/template-assets${path}'],
161
+ ])(
162
+ 'fails when a fixture path is built by interpolation: %s',
163
+ (source, reference) => {
164
+ expect(() => stripTemplateAssetRefs(source)).toThrow(
165
+ `Template asset reference ${reference} cannot be replaced safely: it is built by a template-literal interpolation`,
166
+ );
167
+ },
168
+ );
169
+
170
+ it.each([
171
+ [
172
+ 'follows an interpolation',
173
+ 'const src = `${base}/template-assets/a.png`;',
174
+ ],
175
+ ['is cut short by a parenthesis', "src: '/template-assets/a(1).mp4',"],
176
+ ['ends a word in text', 'const s = "clip: /template-assets/a.png(1).mp4";'],
177
+ [
178
+ 'has mismatched escaped quotes',
179
+ 'const html = "<img src=\\"/template-assets/a.png\\\'>";',
180
+ ],
181
+ [
182
+ 'sits between a quote and a parenthesis',
183
+ "const s = '\"/template-assets/a.png)';",
184
+ ],
185
+ ])('fails when a fixture path %s', (_, source) => {
186
+ expect(() => stripTemplateAssetRefs(source)).toThrow(
187
+ /\/template-assets\/a.* cannot be replaced safely: it is not a whole/u,
188
+ );
189
+ });
190
+
191
+ it.each([
192
+ 'srcSet="/template-assets/a.png 1x,/template-assets/b.png 2x"',
193
+ "const html = '<img src=/template-assets/b.png>';",
194
+ "const s = 'hero\\n/template-assets/b.png';",
195
+ ])('fails when a fixture path is joined to other text: %s', source => {
196
+ expect(() => stripTemplateAssetRefs(source)).toThrow(
197
+ /\/template-assets\/b\.png cannot be replaced safely: it is joined/u,
198
+ );
199
+ });
200
+
201
+ it.each([
202
+ ['concatenated', "const src = base + '/template-assets/hero.png';"],
203
+ ['concatenated', "const src = '/template-assets/hero.png' + query;"],
204
+ ['concatenated', "src += '/template-assets/hero.png';"],
205
+ ['a method', "const src = '/template-assets/hero.png'.concat('?w=1');"],
206
+ ['imported', "import hero from '/template-assets/hero.png';"],
207
+ ['imported', "const hero = require('/template-assets/hero.png');"],
208
+ ])('fails when a fixture string is %s: %s', (use, source) => {
209
+ expect(() => stripTemplateAssetRefs(source)).toThrow(
210
+ new RegExp(`/template-assets/hero\\.png .*${use}`, 'u'),
211
+ );
212
+ });
213
+ });
214
+
215
+ describe('shipped templates', () => {
216
+ it('copy with every fixture replaced and still parse', () => {
217
+ const root = path.resolve(
218
+ path.dirname(fileURLToPath(import.meta.url)),
219
+ '../../assets/templates',
220
+ );
221
+ const parse = jscodeshift.withParser('tsx');
222
+ const files = fs
223
+ .readdirSync(root, {recursive: true, encoding: 'utf-8'})
224
+ .filter(file => file.endsWith('.tsx'))
225
+ .filter(file =>
226
+ fs
227
+ .readFileSync(path.join(root, file), 'utf-8')
228
+ .includes('/template-assets'),
229
+ );
230
+ expect(files.length).toBeGreaterThan(10);
231
+
232
+ const problems = [];
233
+ for (const file of files) {
234
+ try {
235
+ const output = stripTemplateAssetRefs(
236
+ fs.readFileSync(path.join(root, file), 'utf-8'),
237
+ );
238
+ if (output.includes('/template-assets')) {
239
+ problems.push(`${file}: fixture reference left behind`);
240
+ }
241
+ parse(output);
242
+ } catch (err) {
243
+ problems.push(`${file}: ${/** @type {Error} */ (err).message}`);
244
+ }
245
+ }
246
+ expect(problems).toEqual([]);
247
+ });
248
+ });
@@ -0,0 +1,94 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Template discovery isolates each configured integration.
5
+ *
6
+ * An integration whose templates root cannot be read (here, the manifest points
7
+ * `templates` at a file) is that package's discovery error. Core templates and
8
+ * every other integration's templates are still discovered.
9
+ */
10
+
11
+ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
12
+ import * as fs from 'node:fs';
13
+ import * as os from 'node:os';
14
+ import * as path from 'node:path';
15
+ import {discoverAll, discoverAllWithErrors} from './template-adapter.mjs';
16
+ import {runCli} from '../../test-utils/run-cli.mjs';
17
+
18
+ let tmpDir = '';
19
+
20
+ /**
21
+ * @param {string} name
22
+ * @param {Record<string, string>} files
23
+ */
24
+ function installPackage(name, files) {
25
+ const dir = path.join(tmpDir, 'node_modules', ...name.split('/'));
26
+ fs.mkdirSync(dir, {recursive: true});
27
+ fs.writeFileSync(
28
+ path.join(dir, 'package.json'),
29
+ JSON.stringify({name, version: '1.0.0'}),
30
+ );
31
+ for (const [file, contents] of Object.entries(files)) {
32
+ fs.mkdirSync(path.dirname(path.join(dir, file)), {recursive: true});
33
+ fs.writeFileSync(path.join(dir, file), contents);
34
+ }
35
+ }
36
+
37
+ beforeEach(() => {
38
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-template-isolation-'));
39
+ fs.writeFileSync(
40
+ path.join(tmpDir, 'package.json'),
41
+ JSON.stringify({name: 'consumer', version: '1.0.0'}),
42
+ );
43
+ fs.writeFileSync(
44
+ path.join(tmpDir, 'astryx.config.mjs'),
45
+ `export default {integrations: ['@acme/file-root', '@acme/good']};\n`,
46
+ );
47
+ installPackage('@acme/file-root', {
48
+ 'astryx.integration.mjs': `export default {templates: './templates.mjs'};\n`,
49
+ 'templates.mjs': 'export default {};\n',
50
+ });
51
+ installPackage('@acme/good', {
52
+ 'astryx.integration.mjs': `export default {templates: './templates'};\n`,
53
+ 'templates/good-hero.template.mjs': `export default {type: 'block', name: 'Good hero', description: 'A hero.'};\n`,
54
+ 'templates/good-hero.tsx': 'export default function GoodHero() { return null; }\n',
55
+ });
56
+ });
57
+
58
+ afterEach(() => {
59
+ fs.rmSync(tmpDir, {recursive: true, force: true});
60
+ });
61
+
62
+ describe('template discovery with an unreadable templates root', () => {
63
+ it('keeps core and the other integrations', async () => {
64
+ const templates = await discoverAll(tmpDir);
65
+
66
+ expect(templates).toContainEqual(
67
+ expect.objectContaining({dirName: 'good-hero', package: '@acme/good'}),
68
+ );
69
+ expect(templates.some(template => template.package == null)).toBe(true);
70
+ expect(templates.some(t => t.package === '@acme/file-root')).toBe(false);
71
+ });
72
+
73
+ it('reports the unreadable root as that package’s error', async () => {
74
+ const {errors} = await discoverAllWithErrors(tmpDir);
75
+
76
+ expect(errors).toContainEqual(
77
+ expect.objectContaining({
78
+ package: '@acme/file-root',
79
+ message: expect.stringContaining('templates.mjs'),
80
+ }),
81
+ );
82
+ });
83
+
84
+ it('keeps astryx template --list working', async () => {
85
+ const {status, stdout} = await runCli(['template', '--list', '--json'], {
86
+ cwd: tmpDir,
87
+ });
88
+
89
+ expect(status).toBe(0);
90
+ expect(JSON.parse(stdout).data).toContainEqual(
91
+ expect.objectContaining({id: 'good-hero'}),
92
+ );
93
+ });
94
+ });