@ccslabs/xtend 0.1.0-rc.1 → 0.1.2

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 (566) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +4 -0
  3. package/catalog/component-catalog-coverage.js +2 -0
  4. package/catalog/epic13-package-export-lock.js +11 -1
  5. package/catalog/epic13-rmt-production-readiness.js +0 -1
  6. package/catalog/epic18-rmt-action-effect-runtime.d.ts +36 -0
  7. package/catalog/epic18-rmt-action-effect-runtime.js +249 -0
  8. package/catalog/epic18-rmt-app-platform-authoring.d.ts +39 -0
  9. package/catalog/epic18-rmt-app-platform-authoring.js +319 -0
  10. package/catalog/epic18-rmt-app-platform-fixture.d.ts +33 -0
  11. package/catalog/epic18-rmt-app-platform-fixture.js +221 -0
  12. package/catalog/epic18-rmt-app-platform-release-handoff.d.ts +30 -0
  13. package/catalog/epic18-rmt-app-platform-release-handoff.js +231 -0
  14. package/catalog/epic18-rmt-app-platform-tooling.d.ts +38 -0
  15. package/catalog/epic18-rmt-app-platform-tooling.js +242 -0
  16. package/catalog/epic18-rmt-component-template-primitives.d.ts +33 -0
  17. package/catalog/epic18-rmt-component-template-primitives.js +240 -0
  18. package/catalog/epic18-rmt-dom-descriptor-renderer.d.ts +35 -0
  19. package/catalog/epic18-rmt-dom-descriptor-renderer.js +232 -0
  20. package/catalog/epic18-rmt-event-routing-runtime.d.ts +35 -0
  21. package/catalog/epic18-rmt-event-routing-runtime.js +234 -0
  22. package/catalog/epic18-rmt-state-selector-runtime.d.ts +34 -0
  23. package/catalog/epic18-rmt-state-selector-runtime.js +216 -0
  24. package/catalog/epic18-rmt-surface-resource-graph-runtime.d.ts +36 -0
  25. package/catalog/epic18-rmt-surface-resource-graph-runtime.js +256 -0
  26. package/catalog/surface-manager-controller.js +5 -1
  27. package/catalog/surface-manager-materialization.js +7 -1
  28. package/catalog/surface-manager-overlay-bridge.js +41 -6
  29. package/catalog/surface-manager-workbench-fixture.js +1 -1
  30. package/catalog/surface-type-capability-matrix.d.ts +61 -0
  31. package/catalog/surface-type-capability-matrix.js +183 -0
  32. package/catalog/type-exports-rmt.js +37 -1
  33. package/catalog/type-exports.js +3 -3
  34. package/components/icon-packs/lucide.js +4 -0
  35. package/components/manifest.json +2 -0
  36. package/components/prism-rmt.d.ts +34 -0
  37. package/components/prism-rmt.js +130 -0
  38. package/components/xcards.js +15 -0
  39. package/components/xcode.d.ts +36 -1
  40. package/components/xcode.js +215 -20
  41. package/components/xfooter.js +17 -0
  42. package/components/xheader.js +14 -0
  43. package/components/xhero.js +16 -1
  44. package/components/xlink.js +97 -14
  45. package/components/xmasonry.js +15 -0
  46. package/components/xplayer.d.ts +44 -2
  47. package/components/xplayer.js +242 -15
  48. package/components/xrouter.js +27 -2
  49. package/components/xsection.js +15 -0
  50. package/components/xsidepanel.js +10 -2
  51. package/components/xsurfacemanager-controller.d.ts +2 -1
  52. package/components/xsurfacemanager-controller.js +27 -3
  53. package/components/xsurfacemanager.d.ts +2 -0
  54. package/components/xsurfacemanager.js +20 -8
  55. package/components/xsurfaceoverlay-bridge.d.ts +20 -5
  56. package/components/xsurfaceoverlay-bridge.js +114 -18
  57. package/components/xsurfaceportal.d.ts +29 -0
  58. package/components/xsurfaceportal.js +122 -0
  59. package/components/xsurfaceregion.d.ts +50 -0
  60. package/components/xsurfaceregion.js +285 -0
  61. package/components/xsurfacewindow.js +2 -1
  62. package/components/xtooltip.js +89 -23
  63. package/docs/README.md +222 -298
  64. package/docs/changelog.md +107 -0
  65. package/docs/component-catalog-coverage.md +9 -9
  66. package/docs/component-platform.md +19 -1
  67. package/docs/component-ux-app-authoring.md +56 -63
  68. package/docs/components/xcode.md +83 -53
  69. package/docs/components/xsurfaceportal.md +32 -0
  70. package/docs/components/xsurfaceregion.md +37 -0
  71. package/docs/components.md +105 -69
  72. package/docs/de/README.md +264 -0
  73. package/docs/de/XTend-ADR.md +221 -0
  74. package/docs/de/a11y-keyboard-smokes.md +62 -0
  75. package/docs/de/about.md +18 -0
  76. package/docs/de/api.md +157 -0
  77. package/docs/de/best-practices.md +76 -0
  78. package/docs/de/changelog.md +107 -0
  79. package/docs/de/component-catalog-coverage.md +58 -0
  80. package/docs/de/component-lab.md +103 -0
  81. package/docs/de/component-long-tail-migration.md +41 -0
  82. package/docs/de/component-platform.md +177 -0
  83. package/docs/de/component-ux-app-authoring.md +123 -0
  84. package/docs/de/component-ux-authoring.md +96 -0
  85. package/docs/de/component-ux-gates.md +45 -0
  86. package/docs/de/components/x-rmt-lifecycle-demo-build.md +60 -0
  87. package/docs/de/components/xalert.md +81 -0
  88. package/docs/de/components/xbutton.md +103 -0
  89. package/docs/de/components/xcalendar.md +82 -0
  90. package/docs/de/components/xcards.md +128 -0
  91. package/docs/de/components/xcheckbox.md +102 -0
  92. package/docs/de/components/xcode.md +156 -0
  93. package/docs/de/components/xdialog.md +92 -0
  94. package/docs/de/components/xdrawer.md +84 -0
  95. package/docs/de/components/xfooter.md +126 -0
  96. package/docs/de/components/xform.md +128 -0
  97. package/docs/de/components/xheader.md +308 -0
  98. package/docs/de/components/xhero.md +142 -0
  99. package/docs/de/components/xicon.md +125 -0
  100. package/docs/de/components/xinput.md +129 -0
  101. package/docs/de/components/xlightbox.md +98 -0
  102. package/docs/de/components/xlink.md +109 -0
  103. package/docs/de/components/xmasonry.md +124 -0
  104. package/docs/de/components/xmenu.md +158 -0
  105. package/docs/de/components/xmodal.md +82 -0
  106. package/docs/de/components/xplayer.md +104 -0
  107. package/docs/de/components/xpopover.md +67 -0
  108. package/docs/de/components/xprogress.md +56 -0
  109. package/docs/de/components/xradio.md +103 -0
  110. package/docs/de/components/xrouter.md +260 -0
  111. package/docs/de/components/xsection.md +125 -0
  112. package/docs/de/components/xselect.md +105 -0
  113. package/docs/de/components/xsidepanel.md +30 -0
  114. package/docs/de/components/xspinner.md +102 -0
  115. package/docs/de/components/xstate.md +148 -0
  116. package/docs/de/components/xstatus.md +55 -0
  117. package/docs/de/components/xsummary.md +78 -0
  118. package/docs/de/components/xsurfacemanager.md +27 -0
  119. package/docs/de/components/xsurfacewindow.md +21 -0
  120. package/docs/de/components/xtabs.md +160 -0
  121. package/docs/de/components/xtextarea.md +98 -0
  122. package/docs/de/components/xtheme.md +167 -0
  123. package/docs/de/components/xtoast.md +62 -0
  124. package/docs/de/components/xtooltip.md +66 -0
  125. package/docs/de/components/xtype.md +82 -0
  126. package/docs/de/components/xutils.md +144 -0
  127. package/docs/de/components/xwriter.md +94 -0
  128. package/docs/de/components.md +153 -0
  129. package/docs/de/conditional-network-evidence-ci.md +38 -0
  130. package/docs/de/conditional-network-evidence.md +50 -0
  131. package/docs/de/core-migration-guide.md +110 -0
  132. package/docs/de/design-tokens.md +116 -0
  133. package/docs/de/docs-rmt-production-hardening.md +31 -0
  134. package/docs/de/enterprise-adoption.md +413 -0
  135. package/docs/de/enterprise-component-flex-release-handoff.md +129 -0
  136. package/docs/de/epic10-platform-gates.md +62 -0
  137. package/docs/de/epic10-release-handoff.md +81 -0
  138. package/docs/de/epic11-enterprise-ux-handoff.md +70 -0
  139. package/docs/de/epic12-rc0-handoff.md +61 -0
  140. package/docs/de/epic18-media-manager-vendor-upstream.md +318 -0
  141. package/docs/de/epic18-rmt-app-platform-release-handoff.md +67 -0
  142. package/docs/de/epic18-vendor-bugfixes.md +34 -0
  143. package/docs/de/existing-component-metadata.md +67 -0
  144. package/docs/de/hydration-performance-closure.md +34 -0
  145. package/docs/de/hydration-policies.md +71 -0
  146. package/docs/de/known-residual-triage.md +22 -0
  147. package/docs/de/manifest-import-policy.md +79 -0
  148. package/docs/de/manifest.md +112 -0
  149. package/docs/de/motion-contrast.md +67 -0
  150. package/docs/de/package-export-lock.md +44 -0
  151. package/docs/de/performance-measurements.md +106 -0
  152. package/docs/de/performance-regression.md +89 -0
  153. package/docs/de/performance.md +94 -0
  154. package/docs/de/previews/README.md +17 -0
  155. package/docs/de/prod-browser-csp-smokes.md +40 -0
  156. package/docs/de/public-component-types.md +79 -0
  157. package/docs/de/quick-start-guide.md +220 -0
  158. package/docs/de/rc0-adoption-guide.md +102 -0
  159. package/docs/de/rc0-gate-matrix.md +58 -0
  160. package/docs/de/rc1-gate-matrix-ci-handoff.md +56 -0
  161. package/docs/de/rc1-migration-notes.md +69 -0
  162. package/docs/de/rc1-readiness.md +46 -0
  163. package/docs/de/release-owner-acceptance.md +56 -0
  164. package/docs/de/release-report-pack-dry-run-evidence.md +39 -0
  165. package/docs/de/rmt-action-effect-runtime.md +81 -0
  166. package/docs/de/rmt-app-platform-authoring.md +54 -0
  167. package/docs/de/rmt-app-platform-fixture.md +46 -0
  168. package/docs/de/rmt-app-platform-migration-guide.md +88 -0
  169. package/docs/de/rmt-app-platform-tooling.md +79 -0
  170. package/docs/de/rmt-component-template-primitives.md +57 -0
  171. package/docs/de/rmt-dom-descriptor-renderer.md +64 -0
  172. package/docs/de/rmt-dsl-authoring-polish.md +145 -0
  173. package/docs/de/rmt-event-routing-runtime.md +81 -0
  174. package/docs/de/rmt-first-demo-app.md +77 -0
  175. package/docs/de/rmt-first-xtend-apps.md +129 -0
  176. package/docs/de/rmt-kernel-panic-recovery-incident-handoff.md +61 -0
  177. package/docs/de/rmt-kernel-security-hardening-migration.md +50 -0
  178. package/docs/de/rmt-kernel-trusted-output-authoring.md +69 -0
  179. package/docs/de/rmt-language-server.md +234 -0
  180. package/docs/de/rmt-lifecycle-demo.md +24 -0
  181. package/docs/de/rmt-linter.md +140 -0
  182. package/docs/de/rmt-node-ssr-adapter.md +100 -0
  183. package/docs/de/rmt-php-ssr-adapter.md +120 -0
  184. package/docs/de/rmt-production-readiness.md +63 -0
  185. package/docs/de/rmt-state-selector-runtime.md +47 -0
  186. package/docs/de/rmt-surface-resource-graph-runtime.md +92 -0
  187. package/docs/de/rmt-tooling-release-gates.md +77 -0
  188. package/docs/de/rmt-vnext-authoring.md +170 -0
  189. package/docs/de/rmt-vnext-component-primitives.md +188 -0
  190. package/docs/de/rmt-vnext-cross-surface-events.md +68 -0
  191. package/docs/de/rmt-vnext-enterprise-mfe-handoff.md +70 -0
  192. package/docs/de/rmt-vnext-fabric-bridge-evidence.md +81 -0
  193. package/docs/de/rmt-vnext-migration-notes.md +62 -0
  194. package/docs/de/rmt-vnext-primitive-authoring-tooling.md +247 -0
  195. package/docs/de/rmt-vnext-primitive-grammar-design.md +289 -0
  196. package/docs/de/rmt-vnext-primitive-lowering.md +108 -0
  197. package/docs/de/rmt-vnext-primitive-migration.md +119 -0
  198. package/docs/de/rmt-vnext-primitive-parser-ast.md +76 -0
  199. package/docs/de/rmt-vnext-primitive-semantic-graph.md +118 -0
  200. package/docs/de/rmt-vnext-primitives-compiler-backlog.md +739 -0
  201. package/docs/de/rmt-vnext-release-handoff.md +83 -0
  202. package/docs/de/rmt-vnext-remote-surfaces.md +90 -0
  203. package/docs/de/rmt-vnext-source-to-sea-gate.md +612 -0
  204. package/docs/de/rmt-vnext-surface-registry-enterprise.md +76 -0
  205. package/docs/de/screenreader-signals.md +56 -0
  206. package/docs/de/supply-chain-gates.md +100 -0
  207. package/docs/de/surface-manager-authoring-guide.md +94 -0
  208. package/docs/de/surface-manager-browser-lab.md +45 -0
  209. package/docs/de/surface-manager-component-lab.md +43 -0
  210. package/docs/de/surface-manager-controller.md +66 -0
  211. package/docs/de/surface-manager-layout-engines.md +32 -0
  212. package/docs/de/surface-manager-lazy-hydration.md +63 -0
  213. package/docs/de/surface-manager-migration-guide.md +122 -0
  214. package/docs/de/surface-manager-native-rmt-surfaces.md +38 -0
  215. package/docs/de/surface-manager-overlay-bridge.md +53 -0
  216. package/docs/de/surface-manager-persistence.md +30 -0
  217. package/docs/de/surface-manager-quality-gates.md +51 -0
  218. package/docs/de/surface-manager-release-handoff.md +68 -0
  219. package/docs/de/surface-manager-remote-policy.md +54 -0
  220. package/docs/de/surface-manager-rmt-authoring.md +102 -0
  221. package/docs/de/surface-manager-route-lifecycle.md +59 -0
  222. package/docs/de/surface-manager-runtime-release-handoff.md +69 -0
  223. package/docs/de/surface-manager-side-panel-runtime.md +36 -0
  224. package/docs/de/surface-manager-stack-policy.md +39 -0
  225. package/docs/de/surface-manager-window-runtime.md +47 -0
  226. package/docs/de/surface-manager-workbench-fixture.md +43 -0
  227. package/docs/de/third-party-design-authoring.md +406 -0
  228. package/docs/de/trusted-dom-boundary-browser-proof.md +32 -0
  229. package/docs/de/trusted-dom-sanitizing.md +110 -0
  230. package/docs/de/type-exports.md +61 -0
  231. package/docs/de/typescript-components.md +63 -0
  232. package/docs/de/visual-browser-regression.md +83 -0
  233. package/docs/de/visual-owner-artifacts.md +46 -0
  234. package/docs/de/visual-snapshot-automation.md +87 -0
  235. package/docs/de/xtend-api-types.md +55 -0
  236. package/docs/de/xtend-builder-types.md +55 -0
  237. package/docs/de/xtend-catalog-types.md +44 -0
  238. package/docs/de/xtend-fabric-rmt-lane-mapping.md +143 -0
  239. package/docs/de/xtend-fabric.md +474 -0
  240. package/docs/de/xtend-loader-types.md +58 -0
  241. package/docs/de/xtend-loader.md +265 -0
  242. package/docs/de/xtend-policy-types.md +38 -0
  243. package/docs/de/xtend-rmt-types.md +40 -0
  244. package/docs/de/xtend-vendor-types.md +36 -0
  245. package/docs/de/xtendrmt-app-dsl.md +334 -0
  246. package/docs/de/xtendrmt-migration-guide.md +266 -0
  247. package/docs/de/xtendrmt-native-authoring.md +333 -0
  248. package/docs/de/xtendrmt-overview.md +109 -0
  249. package/docs/de/xtendrmt-parsedown-scheduling.md +301 -0
  250. package/docs/de/xtendrmt-runtime-bridge.md +155 -0
  251. package/docs/en/README.md +163 -0
  252. package/docs/en/XTend-ADR.md +221 -0
  253. package/docs/en/a11y-keyboard-smokes.md +68 -0
  254. package/docs/en/about.md +25 -0
  255. package/docs/en/api.md +171 -0
  256. package/docs/en/best-practices.md +125 -0
  257. package/docs/en/changelog.md +104 -0
  258. package/docs/en/component-catalog-coverage.md +104 -0
  259. package/docs/en/component-lab.md +103 -0
  260. package/docs/en/component-long-tail-migration.md +41 -0
  261. package/docs/en/component-platform.md +243 -0
  262. package/docs/en/component-ux-app-authoring.md +118 -0
  263. package/docs/en/component-ux-authoring.md +96 -0
  264. package/docs/en/component-ux-gates.md +45 -0
  265. package/docs/en/components/x-rmt-lifecycle-demo-build.md +75 -0
  266. package/docs/en/components/xalert.md +94 -0
  267. package/docs/en/components/xbutton.md +118 -0
  268. package/docs/en/components/xcalendar.md +95 -0
  269. package/docs/en/components/xcards.md +139 -0
  270. package/docs/en/components/xcheckbox.md +118 -0
  271. package/docs/en/components/xcode.md +153 -0
  272. package/docs/en/components/xdialog.md +108 -0
  273. package/docs/en/components/xdrawer.md +110 -0
  274. package/docs/en/components/xfooter.md +138 -0
  275. package/docs/en/components/xform.md +147 -0
  276. package/docs/en/components/xheader.md +308 -0
  277. package/docs/en/components/xhero.md +157 -0
  278. package/docs/en/components/xicon.md +149 -0
  279. package/docs/en/components/xinput.md +147 -0
  280. package/docs/en/components/xlightbox.md +113 -0
  281. package/docs/en/components/xlink.md +130 -0
  282. package/docs/en/components/xmasonry.md +136 -0
  283. package/docs/en/components/xmenu.md +185 -0
  284. package/docs/en/components/xmodal.md +102 -0
  285. package/docs/en/components/xplayer.md +114 -0
  286. package/docs/en/components/xpopover.md +87 -0
  287. package/docs/en/components/xprogress.md +73 -0
  288. package/docs/en/components/xradio.md +119 -0
  289. package/docs/en/components/xrouter.md +260 -0
  290. package/docs/en/components/xsection.md +136 -0
  291. package/docs/en/components/xselect.md +122 -0
  292. package/docs/en/components/xsidepanel.md +48 -0
  293. package/docs/en/components/xspinner.md +118 -0
  294. package/docs/en/components/xstate.md +163 -0
  295. package/docs/en/components/xstatus.md +71 -0
  296. package/docs/en/components/xsummary.md +90 -0
  297. package/docs/en/components/xsurfacemanager.md +42 -0
  298. package/docs/en/components/xsurfacewindow.md +31 -0
  299. package/docs/en/components/xtabs.md +187 -0
  300. package/docs/en/components/xtextarea.md +115 -0
  301. package/docs/en/components/xtheme.md +203 -0
  302. package/docs/en/components/xtoast.md +78 -0
  303. package/docs/en/components/xtooltip.md +85 -0
  304. package/docs/en/components/xtype.md +91 -0
  305. package/docs/en/components/xutils.md +161 -0
  306. package/docs/en/components/xwriter.md +106 -0
  307. package/docs/en/components.md +151 -0
  308. package/docs/en/conditional-network-evidence-ci.md +38 -0
  309. package/docs/en/conditional-network-evidence.md +50 -0
  310. package/docs/en/core-migration-guide.md +110 -0
  311. package/docs/en/design-tokens.md +137 -0
  312. package/docs/en/docs-rmt-production-hardening.md +31 -0
  313. package/docs/en/enterprise-adoption.md +413 -0
  314. package/docs/en/enterprise-component-flex-release-handoff.md +129 -0
  315. package/docs/en/epic10-platform-gates.md +62 -0
  316. package/docs/en/epic10-release-handoff.md +81 -0
  317. package/docs/en/epic11-enterprise-ux-handoff.md +70 -0
  318. package/docs/en/epic12-rc0-handoff.md +61 -0
  319. package/docs/en/epic18-media-manager-vendor-upstream.md +232 -0
  320. package/docs/en/epic18-rmt-app-platform-release-handoff.md +60 -0
  321. package/docs/en/epic18-vendor-bugfixes.md +29 -0
  322. package/docs/en/existing-component-metadata.md +67 -0
  323. package/docs/en/hydration-performance-closure.md +34 -0
  324. package/docs/en/hydration-policies.md +75 -0
  325. package/docs/en/known-residual-triage.md +22 -0
  326. package/docs/en/manifest-import-policy.md +81 -0
  327. package/docs/en/manifest.md +135 -0
  328. package/docs/en/motion-contrast.md +67 -0
  329. package/docs/en/package-export-lock.md +44 -0
  330. package/docs/en/performance-measurements.md +106 -0
  331. package/docs/en/performance-regression.md +89 -0
  332. package/docs/en/performance.md +132 -0
  333. package/docs/en/previews/README.md +17 -0
  334. package/docs/en/prod-browser-csp-smokes.md +40 -0
  335. package/docs/en/public-component-types.md +79 -0
  336. package/docs/en/quick-start-guide.md +189 -0
  337. package/docs/en/rc0-adoption-guide.md +102 -0
  338. package/docs/en/rc0-gate-matrix.md +58 -0
  339. package/docs/en/rc1-gate-matrix-ci-handoff.md +56 -0
  340. package/docs/en/rc1-migration-notes.md +69 -0
  341. package/docs/en/rc1-readiness.md +46 -0
  342. package/docs/en/release-owner-acceptance.md +56 -0
  343. package/docs/en/release-report-pack-dry-run-evidence.md +39 -0
  344. package/docs/en/rmt-action-effect-runtime.md +101 -0
  345. package/docs/en/rmt-app-platform-authoring.md +47 -0
  346. package/docs/en/rmt-app-platform-fixture.md +35 -0
  347. package/docs/en/rmt-app-platform-migration-guide.md +75 -0
  348. package/docs/en/rmt-app-platform-tooling.md +58 -0
  349. package/docs/en/rmt-component-template-primitives.md +49 -0
  350. package/docs/en/rmt-dom-descriptor-renderer.md +54 -0
  351. package/docs/en/rmt-dsl-authoring-polish.md +143 -0
  352. package/docs/en/rmt-event-routing-runtime.md +98 -0
  353. package/docs/en/rmt-first-demo-app.md +87 -0
  354. package/docs/en/rmt-first-xtend-apps.md +127 -0
  355. package/docs/en/rmt-kernel-panic-recovery-incident-handoff.md +60 -0
  356. package/docs/en/rmt-kernel-security-hardening-migration.md +49 -0
  357. package/docs/en/rmt-kernel-trusted-output-authoring.md +68 -0
  358. package/docs/en/rmt-language-server.md +243 -0
  359. package/docs/en/rmt-lifecycle-demo.md +23 -0
  360. package/docs/en/rmt-linter.md +146 -0
  361. package/docs/en/rmt-node-ssr-adapter.md +99 -0
  362. package/docs/en/rmt-php-ssr-adapter.md +118 -0
  363. package/docs/en/rmt-production-readiness.md +63 -0
  364. package/docs/en/rmt-state-selector-runtime.md +34 -0
  365. package/docs/en/rmt-surface-resource-graph-runtime.md +68 -0
  366. package/docs/en/rmt-tooling-release-gates.md +77 -0
  367. package/docs/en/rmt-vnext-authoring.md +102 -0
  368. package/docs/en/rmt-vnext-component-primitives.md +185 -0
  369. package/docs/en/rmt-vnext-cross-surface-events.md +59 -0
  370. package/docs/en/rmt-vnext-enterprise-mfe-handoff.md +62 -0
  371. package/docs/en/rmt-vnext-fabric-bridge-evidence.md +64 -0
  372. package/docs/en/rmt-vnext-migration-notes.md +62 -0
  373. package/docs/en/rmt-vnext-primitive-authoring-tooling.md +174 -0
  374. package/docs/en/rmt-vnext-primitive-grammar-design.md +268 -0
  375. package/docs/en/rmt-vnext-primitive-lowering.md +91 -0
  376. package/docs/en/rmt-vnext-primitive-migration.md +93 -0
  377. package/docs/en/rmt-vnext-primitive-parser-ast.md +59 -0
  378. package/docs/en/rmt-vnext-primitive-semantic-graph.md +103 -0
  379. package/docs/en/rmt-vnext-primitives-compiler-backlog.md +327 -0
  380. package/docs/en/rmt-vnext-release-handoff.md +83 -0
  381. package/docs/en/rmt-vnext-remote-surfaces.md +81 -0
  382. package/docs/en/rmt-vnext-source-to-sea-gate.md +482 -0
  383. package/docs/en/rmt-vnext-surface-registry-enterprise.md +68 -0
  384. package/docs/en/screenreader-signals.md +56 -0
  385. package/docs/en/supply-chain-gates.md +106 -0
  386. package/docs/en/surface-manager-authoring-guide.md +94 -0
  387. package/docs/en/surface-manager-browser-lab.md +45 -0
  388. package/docs/en/surface-manager-component-lab.md +43 -0
  389. package/docs/en/surface-manager-controller.md +66 -0
  390. package/docs/en/surface-manager-layout-engines.md +32 -0
  391. package/docs/en/surface-manager-lazy-hydration.md +63 -0
  392. package/docs/en/surface-manager-migration-guide.md +113 -0
  393. package/docs/en/surface-manager-native-rmt-surfaces.md +38 -0
  394. package/docs/en/surface-manager-overlay-bridge.md +53 -0
  395. package/docs/en/surface-manager-persistence.md +30 -0
  396. package/docs/en/surface-manager-quality-gates.md +51 -0
  397. package/docs/en/surface-manager-release-handoff.md +68 -0
  398. package/docs/en/surface-manager-remote-policy.md +54 -0
  399. package/docs/en/surface-manager-rmt-authoring.md +89 -0
  400. package/docs/en/surface-manager-route-lifecycle.md +59 -0
  401. package/docs/en/surface-manager-runtime-release-handoff.md +69 -0
  402. package/docs/en/surface-manager-side-panel-runtime.md +36 -0
  403. package/docs/en/surface-manager-stack-policy.md +39 -0
  404. package/docs/en/surface-manager-window-runtime.md +47 -0
  405. package/docs/en/surface-manager-workbench-fixture.md +43 -0
  406. package/docs/en/third-party-design-authoring.md +406 -0
  407. package/docs/en/trusted-dom-boundary-browser-proof.md +32 -0
  408. package/docs/en/trusted-dom-sanitizing.md +124 -0
  409. package/docs/en/type-exports.md +61 -0
  410. package/docs/en/typescript-components.md +63 -0
  411. package/docs/en/visual-browser-regression.md +83 -0
  412. package/docs/en/visual-owner-artifacts.md +46 -0
  413. package/docs/en/visual-snapshot-automation.md +87 -0
  414. package/docs/en/xtend-api-types.md +55 -0
  415. package/docs/en/xtend-builder-types.md +55 -0
  416. package/docs/en/xtend-catalog-types.md +44 -0
  417. package/docs/en/xtend-fabric-rmt-lane-mapping.md +143 -0
  418. package/docs/en/xtend-fabric.md +474 -0
  419. package/docs/en/xtend-loader-types.md +58 -0
  420. package/docs/en/xtend-loader.md +265 -0
  421. package/docs/en/xtend-policy-types.md +38 -0
  422. package/docs/en/xtend-rmt-types.md +40 -0
  423. package/docs/en/xtend-vendor-types.md +36 -0
  424. package/docs/en/xtendrmt-app-dsl.md +331 -0
  425. package/docs/en/xtendrmt-migration-guide.md +256 -0
  426. package/docs/en/xtendrmt-native-authoring.md +336 -0
  427. package/docs/en/xtendrmt-overview.md +63 -0
  428. package/docs/en/xtendrmt-parsedown-scheduling.md +301 -0
  429. package/docs/en/xtendrmt-runtime-bridge.md +155 -0
  430. package/docs/enterprise-adoption.md +4 -2
  431. package/docs/epic18-media-manager-vendor-upstream.md +318 -0
  432. package/docs/epic18-rmt-app-platform-release-handoff.md +67 -0
  433. package/docs/epic18-vendor-bugfixes.md +34 -0
  434. package/docs/index.php +1056 -109
  435. package/docs/manifest.md +8 -2
  436. package/docs/menu.json +986 -133
  437. package/docs/package-export-lock.md +2 -2
  438. package/docs/public-component-types.md +2 -2
  439. package/docs/quick-start-guide.md +126 -58
  440. package/docs/rmt-action-effect-runtime.md +101 -0
  441. package/docs/rmt-app-platform-authoring.md +54 -0
  442. package/docs/rmt-app-platform-fixture.md +46 -0
  443. package/docs/rmt-app-platform-migration-guide.md +88 -0
  444. package/docs/rmt-app-platform-tooling.md +79 -0
  445. package/docs/rmt-component-template-primitives.md +57 -0
  446. package/docs/rmt-dom-descriptor-renderer.md +64 -0
  447. package/docs/rmt-dsl-authoring-polish.md +67 -44
  448. package/docs/rmt-event-routing-runtime.md +98 -0
  449. package/docs/rmt-first-demo-app.md +2 -2
  450. package/docs/rmt-first-xtend-apps.md +70 -46
  451. package/docs/rmt-language-server.md +61 -4
  452. package/docs/rmt-lifecycle-demo.md +1 -2
  453. package/docs/rmt-node-ssr-adapter.md +144 -0
  454. package/docs/rmt-php-ssr-adapter.md +158 -0
  455. package/docs/rmt-state-selector-runtime.md +47 -0
  456. package/docs/rmt-surface-resource-graph-runtime.md +92 -0
  457. package/docs/rmt-vnext-authoring.md +128 -18
  458. package/docs/rmt-vnext-component-primitives.md +188 -0
  459. package/docs/rmt-vnext-fabric-bridge-evidence.md +81 -0
  460. package/docs/rmt-vnext-primitive-authoring-tooling.md +247 -0
  461. package/docs/rmt-vnext-primitive-grammar-design.md +289 -0
  462. package/docs/rmt-vnext-primitive-lowering.md +108 -0
  463. package/docs/rmt-vnext-primitive-migration.md +119 -0
  464. package/docs/rmt-vnext-primitive-parser-ast.md +76 -0
  465. package/docs/rmt-vnext-primitive-semantic-graph.md +118 -0
  466. package/docs/rmt-vnext-primitives-compiler-backlog.md +742 -0
  467. package/docs/rmt-vnext-release-handoff.md +14 -0
  468. package/docs/rmt-vnext-source-to-sea-gate.md +629 -0
  469. package/docs/surface-manager-migration-guide.md +34 -6
  470. package/docs/surface-manager-overlay-bridge.md +9 -4
  471. package/docs/surface-manager-rmt-authoring.md +50 -34
  472. package/docs/surface-manager-workbench-fixture.md +1 -2
  473. package/docs/third-party-design-authoring.md +1 -1
  474. package/docs/type-exports.md +3 -3
  475. package/docs/utils/pageloader.js +811 -62
  476. package/docs/visual-browser-regression.md +1 -1
  477. package/docs/xtend-rmt-types.md +3 -2
  478. package/docs/xtendrmt-app-dsl.md +187 -122
  479. package/docs/xtendrmt-docs-shell-vnext.rmt +165 -0
  480. package/docs/xtendrmt-migration-guide.md +48 -17
  481. package/docs/xtendrmt-native-authoring.md +213 -217
  482. package/docs/xtendrmt-overview.md +81 -61
  483. package/docs/xtendrmt-parsedown-scheduling.md +23 -8
  484. package/fabric/package.json +1 -1
  485. package/package.json +684 -21
  486. package/tools/package.json +5 -1
  487. package/tools/rmt-editor/vscode/README.md +72 -5
  488. package/tools/rmt-editor/vscode/XTend-Logo.png +0 -0
  489. package/tools/rmt-editor/vscode/extension.d.ts +33 -0
  490. package/tools/rmt-editor/vscode/extension.js +1816 -7
  491. package/tools/rmt-editor/vscode/language-configuration.json +2 -1
  492. package/tools/rmt-editor/vscode/package.json +193 -2
  493. package/tools/rmt-editor/vscode/snippets/rmt.code-snippets +41 -0
  494. package/tools/rmt-editor/vscode/syntaxes/rmt.tmLanguage.json +103 -1
  495. package/tools/rmt-editor/vscode/templates/launch.json +70 -0
  496. package/tools/rmt-editor/vscode/templates/tasks.json +172 -0
  497. package/tools/rmt-editor/vscode/xtend-rmt-language-0.0.0-enterprise-readiness.vsix +0 -0
  498. package/tools/rmt-language/app-platform-tooling.d.ts +128 -0
  499. package/tools/rmt-language/app-platform-tooling.js +677 -0
  500. package/tools/rmt-language/completions.d.ts +5 -0
  501. package/tools/rmt-language/completions.js +185 -3
  502. package/tools/rmt-language/diagnostics.js +54 -0
  503. package/tools/rmt-language/hover.js +36 -0
  504. package/tools/rmt-language/rmt-tooling-public-types.d.ts +7 -0
  505. package/tools/rmt-language/rules/app-platform-policy.js +39 -0
  506. package/tools/rmt-language/rules/index.js +5 -1
  507. package/tools/rmt-language/semantic-graph.d.ts +6 -0
  508. package/tools/rmt-language/semantic-graph.js +928 -0
  509. package/tools/rmt-language/snippets/index.js +44 -0
  510. package/tools/rmt-language/snippets/rmt.code-snippets +41 -0
  511. package/tools/rmt-language/vnext-compatibility.d.ts +10 -0
  512. package/tools/rmt-language/vnext-compatibility.js +642 -0
  513. package/tools/rmt-language/vnext-compiler.d.ts +5 -0
  514. package/tools/rmt-language/vnext-compiler.js +863 -17
  515. package/tools/rmt-language/vnext-parser.js +725 -9
  516. package/tools/rmt-language/vnext-release.d.ts +1 -0
  517. package/tools/rmt-language/vnext-release.js +20 -0
  518. package/tools/rmt-language/vnext-source-to-sea.d.ts +33 -0
  519. package/tools/rmt-language/vnext-source-to-sea.js +2227 -0
  520. package/tools/rmt-language/vnext-surfaces.js +111 -52
  521. package/tools/rmt-language/vnext-tooling.d.ts +19 -1
  522. package/tools/rmt-language/vnext-tooling.js +1247 -5
  523. package/tools/rmt-language-server/protocol.js +3 -0
  524. package/tools/rmt-language-server/server.d.ts +2 -0
  525. package/tools/rmt-language-server/server.js +176 -22
  526. package/tools/rmt-linter/cli.d.ts +2 -0
  527. package/tools/rmt-linter/cli.js +62 -0
  528. package/xtend-builder/generators/registry.js +11 -0
  529. package/xtend-builder/generators/rmt-app-platform.js +239 -0
  530. package/xtend-builder/generators/rmt-lifecycle-demo.js +3 -11
  531. package/xtend-builder/lib/cli.js +38 -0
  532. package/xtend-builder/package.json +3 -3
  533. package/xtend-builder/scaffold.config.js +29 -2
  534. package/xtend.css +49 -2
  535. package/xtendrmt/package.json +49 -1
  536. package/xtendrmt/rmt-action-effect-runtime.d.ts +126 -0
  537. package/xtendrmt/rmt-action-effect-runtime.js +494 -0
  538. package/xtendrmt/rmt-component-capability-registry.d.ts +180 -0
  539. package/xtendrmt/rmt-component-capability-registry.js +636 -0
  540. package/xtendrmt/rmt-core.d.ts +6 -0
  541. package/xtendrmt/rmt-core.esm.js +32 -6
  542. package/xtendrmt/rmt-dom-descriptor-renderer.d.ts +107 -0
  543. package/xtendrmt/rmt-dom-descriptor-renderer.js +1066 -0
  544. package/xtendrmt/rmt-event-routing-runtime.d.ts +144 -0
  545. package/xtendrmt/rmt-event-routing-runtime.js +666 -0
  546. package/xtendrmt/rmt-lifecycle-demo.app.js +2 -2
  547. package/xtendrmt/rmt-lifecycle-demo.core.json +4 -0
  548. package/xtendrmt/rmt-lifecycle-demo.rmt-build.app.js +1 -1
  549. package/xtendrmt/rmt-lifecycle-demo.rmt-build.scaffold.json +2 -2
  550. package/xtendrmt/rmt-lifecycle-demo.scaffold.json +4 -4
  551. package/xtendrmt/rmt-native-shell-runtime.d.ts +77 -0
  552. package/xtendrmt/rmt-native-shell-runtime.js +309 -0
  553. package/xtendrmt/rmt-node-ssr-adapter.d.ts +197 -0
  554. package/xtendrmt/rmt-node-ssr-adapter.js +1006 -0
  555. package/xtendrmt/rmt-php-ssr-adapter.php +976 -0
  556. package/xtendrmt/rmt-runtime.browser.js +32 -6
  557. package/xtendrmt/rmt-runtime.esm.js +32 -6
  558. package/xtendrmt/rmt-state-selector-runtime.d.ts +166 -0
  559. package/xtendrmt/rmt-state-selector-runtime.js +866 -0
  560. package/xtendrmt/rmt-surface-resource-graph-runtime.d.ts +224 -0
  561. package/xtendrmt/rmt-surface-resource-graph-runtime.js +932 -0
  562. package/xtendrmt/rmt-vnext-enterprise-mfe-demo.core.json +3 -0
  563. package/xtendrmt/rmt-vnext-reference-demo.core.json +3 -0
  564. package/xtendrmt/xtendrmt-bestcase-demo.core.json +3420 -372
  565. package/xtendrmt/xtendrmt-bestcase-demo.js +424 -8
  566. package/xtendrmt/xtendrmt-bestcase-demo.rmt +214 -6
@@ -0,0 +1,1006 @@
1
+ import { Readable } from 'node:stream';
2
+ import { createRmtComponentCapabilityRegistry } from './rmt-component-capability-registry.js';
3
+ import { createRmtDomDescriptorRenderer } from './rmt-dom-descriptor-renderer.js';
4
+
5
+ export const RMT_NODE_SSR_ADAPTER_SCHEMA = 'xtend.rmt.node-ssr-adapter.v1';
6
+ export const RMT_NODE_SSR_RENDER_RESULT_SCHEMA = 'xtend.rmt.node-ssr-render-result.v1';
7
+ export const RMT_NODE_SSR_JSONL_FRAME_SCHEMA = 'xtend.rmt.node-ssr-jsonl-frame.v1';
8
+ export const RMT_NODE_SSR_DIAGNOSTIC_SCHEMA = 'xtend.rmt.node-ssr-diagnostic.v1';
9
+ export const RMT_NODE_SSR_HYDRATION_SCHEMA = 'xtend.rmt.node-ssr-hydration-payload.v1';
10
+ export const RMT_NODE_SSR_CHUNK_KIND = 'renderman_template_chunk';
11
+ export const RMT_NODE_SSR_RESPONSE_KIND = 'renderman_template_prerender_response';
12
+ export const RMT_NODE_SSR_EXECUTION_MODE = 'server_prerender_hydrate';
13
+ export const RMT_NODE_SSR_STREAMING_CONTRACT_SCHEMA = 'xtend.rmt.vnext-streaming-contract.v1';
14
+ export const RMT_NODE_SSR_KERNEL_BOUNDARY = 'no-rmt-kernel-import-of-xtend-types';
15
+
16
+ const BLOCKING_SEVERITIES = new Set(['error', 'fatal']);
17
+ const TRUST_BOUNDARY_TOKENS = new Set([
18
+ 'xtend.security.trusted-dom-boundary.v1',
19
+ 'xtend.security.sanitizing-boundary.v1',
20
+ 'xtend.security.streaming-boundary.v1',
21
+ 'trusted',
22
+ 'sanitized',
23
+ 'host-sanitized'
24
+ ]);
25
+ const URL_ATTRIBUTES = new Set(['href', 'src', 'action', 'formaction', 'poster', 'xlink:href']);
26
+ const BLOCKED_ATTRIBUTES = new Set(['srcdoc']);
27
+ const VOID_TAGS = new Set([
28
+ 'area',
29
+ 'base',
30
+ 'br',
31
+ 'col',
32
+ 'embed',
33
+ 'hr',
34
+ 'img',
35
+ 'input',
36
+ 'link',
37
+ 'meta',
38
+ 'param',
39
+ 'source',
40
+ 'track',
41
+ 'wbr'
42
+ ]);
43
+ const BLOCKED_MARKUP_TAGS = new Set(['script', 'iframe', 'frame', 'frameset', 'object', 'embed', 'base']);
44
+
45
+ function asArray(value) {
46
+ if (Array.isArray(value)) return value;
47
+ if (value == null || value === false) return [];
48
+ return [value];
49
+ }
50
+
51
+ function objectRecord(value) {
52
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
53
+ }
54
+
55
+ function cloneJson(value) {
56
+ if (value == null) return value;
57
+ return JSON.parse(JSON.stringify(value));
58
+ }
59
+
60
+ function stableString(value, fallback = '') {
61
+ if (value == null) return fallback;
62
+ if (typeof value === 'string') return value;
63
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);
64
+ return fallback;
65
+ }
66
+
67
+ function safeIdentifier(value, fallback = 'rmt-node-ssr') {
68
+ const normalized = stableString(value, '').trim().replace(/[^a-zA-Z0-9_.:-]+/gu, '-').replace(/^-+|-+$/gu, '');
69
+ return normalized || fallback;
70
+ }
71
+
72
+ function escapeHtml(value) {
73
+ return stableString(value, '').replace(/[&<>"']/gu, (character) => {
74
+ switch (character) {
75
+ case '&': return '&amp;';
76
+ case '<': return '&lt;';
77
+ case '>': return '&gt;';
78
+ case '"': return '&quot;';
79
+ case "'": return '&#39;';
80
+ default: return character;
81
+ }
82
+ });
83
+ }
84
+
85
+ function escapeAttribute(value) {
86
+ return escapeHtml(value).replace(/`/gu, '&#96;');
87
+ }
88
+
89
+ function isSafeTagName(tagName) {
90
+ return /^[a-z][a-z0-9._:-]*$/u.test(stableString(tagName, '').toLowerCase());
91
+ }
92
+
93
+ function normalizeTagName(tagName, diagnostics, context) {
94
+ const normalized = stableString(tagName, '').trim().toLowerCase();
95
+ if (isSafeTagName(normalized) && !BLOCKED_MARKUP_TAGS.has(normalized)) return normalized;
96
+ diagnostics.publish('rmt.node_ssr.tag_blocked', `Blocked unsafe tag "${stableString(tagName, '<empty>')}".`, 'error', context);
97
+ return 'div';
98
+ }
99
+
100
+ function normalizeAttributeName(name) {
101
+ return stableString(name, '').trim().toLowerCase();
102
+ }
103
+
104
+ function isSafeAttributeName(name) {
105
+ return /^[a-z_:][a-z0-9_.:-]*$/u.test(name);
106
+ }
107
+
108
+ function isSafeUrl(value) {
109
+ const raw = stableString(value, '').trim();
110
+ if (!raw) return true;
111
+ const compact = raw.replace(/[\u0000-\u001F\u007F\s]+/gu, '').toLowerCase();
112
+ if (compact.startsWith('#') || compact.startsWith('/') || compact.startsWith('./') || compact.startsWith('../')) return true;
113
+ if (compact.startsWith('http://') || compact.startsWith('https://') || compact.startsWith('mailto:') || compact.startsWith('tel:') || compact.startsWith('blob:')) return true;
114
+ if (compact.startsWith('data:image/')) return true;
115
+ if (/^[a-z][a-z0-9+.-]*:/u.test(compact)) return false;
116
+ return true;
117
+ }
118
+
119
+ function createDiagnostic(code, message, severity = 'error', details = {}) {
120
+ let safeDetails = {};
121
+ if (details && typeof details === 'object') {
122
+ safeDetails = JSON.parse(JSON.stringify(details, (key, value) => {
123
+ if (typeof value === 'function') return undefined;
124
+ if (value instanceof Map) return [...value.entries()];
125
+ if (value instanceof Set) return [...value.values()];
126
+ if (key === 'options' || key === 'diagnostics' || key === 'componentRegistry') return undefined;
127
+ return value;
128
+ }));
129
+ }
130
+ return {
131
+ schema: RMT_NODE_SSR_DIAGNOSTIC_SCHEMA,
132
+ code,
133
+ severity,
134
+ message,
135
+ ...safeDetails
136
+ };
137
+ }
138
+
139
+ function createDiagnosticsCollector(options = {}) {
140
+ const diagnostics = [];
141
+ return {
142
+ diagnostics,
143
+ publish(code, message, severity = 'error', details = {}) {
144
+ const diagnostic = createDiagnostic(code, message, severity, details);
145
+ diagnostics.push(diagnostic);
146
+ if (typeof options.publishDiagnostic === 'function') {
147
+ options.publishDiagnostic(diagnostic);
148
+ }
149
+ return diagnostic;
150
+ },
151
+ pushMany(entries) {
152
+ asArray(entries).forEach((entry) => {
153
+ if (!entry) return;
154
+ if (entry.schema === RMT_NODE_SSR_DIAGNOSTIC_SCHEMA) {
155
+ diagnostics.push(entry);
156
+ } else {
157
+ diagnostics.push(createDiagnostic(
158
+ entry.code || 'rmt.node_ssr.upstream_diagnostic',
159
+ entry.message || 'Upstream RMT diagnostic.',
160
+ entry.severity || 'warning',
161
+ { upstream: cloneJson(entry) }
162
+ ));
163
+ }
164
+ });
165
+ }
166
+ };
167
+ }
168
+
169
+ function createValueResolver() {
170
+ const renderer = createRmtDomDescriptorRenderer({
171
+ documentTarget: {
172
+ createElement: () => ({}),
173
+ createTextNode: (text) => ({ nodeType: 3, textContent: stableString(text, '') }),
174
+ createDocumentFragment: () => ({ nodeType: 11, childNodes: [] })
175
+ }
176
+ });
177
+ return (value, context = {}) => renderer.resolveValue(value, context);
178
+ }
179
+
180
+ function hasTrustBoundary(record, options = {}) {
181
+ const candidates = asArray(record && (record.trustBoundary || record.trust || record.securityBoundary || record.sanitizer));
182
+ const optionCandidates = asArray(options.trustBoundary || options.defaultTrustBoundary);
183
+ return [...candidates, ...optionCandidates].some((entry) => TRUST_BOUNDARY_TOKENS.has(stableString(entry, '').trim()));
184
+ }
185
+
186
+ function fallbackSanitizeHtml(html, diagnostics, context) {
187
+ let sanitized = stableString(html, '');
188
+ const before = sanitized;
189
+ sanitized = sanitized.replace(/<\/?(script|iframe|frame|frameset|object|embed|base)\b[^>]*>/giu, '');
190
+ sanitized = sanitized.replace(/\s+on[a-z0-9_-]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/giu, '');
191
+ sanitized = sanitized.replace(/\s+srcdoc\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/giu, '');
192
+ sanitized = sanitized.replace(/\s+(href|src|action|formaction|poster|xlink:href)\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/giu, (match, name, rawValue) => {
193
+ const value = rawValue.replace(/^['"]|['"]$/gu, '');
194
+ return isSafeUrl(value) ? match : '';
195
+ });
196
+ if (before !== sanitized) {
197
+ diagnostics.publish(
198
+ 'rmt.node_ssr.html_sanitized',
199
+ 'Unsafe server markup was sanitized by the Node SSR adapter fallback sanitizer.',
200
+ 'warning',
201
+ context
202
+ );
203
+ }
204
+ return sanitized;
205
+ }
206
+
207
+ function sanitizeHtmlFragment(html, diagnostics, context, options = {}) {
208
+ if (!hasTrustBoundary(context && context.descriptor, options)) {
209
+ diagnostics.publish(
210
+ 'rmt.node_ssr.trust_boundary_missing',
211
+ 'HTML fragments require an explicit XTend trust boundary or host sanitizer.',
212
+ 'error',
213
+ context
214
+ );
215
+ }
216
+ if (typeof options.sanitizeHtmlOutput === 'function') {
217
+ return stableString(options.sanitizeHtmlOutput(stableString(html, ''), { ...context, diagnostics: diagnostics.diagnostics }), '');
218
+ }
219
+ return fallbackSanitizeHtml(html, diagnostics, context);
220
+ }
221
+
222
+ function serializeAttribute(name, value, diagnostics, context) {
223
+ const attrName = normalizeAttributeName(name);
224
+ if (!attrName || !isSafeAttributeName(attrName)) {
225
+ diagnostics.publish('rmt.node_ssr.attribute_blocked', `Blocked invalid attribute "${stableString(name, '<empty>')}".`, 'error', context);
226
+ return '';
227
+ }
228
+ if (attrName.startsWith('on') || BLOCKED_ATTRIBUTES.has(attrName)) {
229
+ diagnostics.publish('rmt.node_ssr.attribute_blocked', `Blocked unsafe attribute "${attrName}".`, 'error', context);
230
+ return '';
231
+ }
232
+ if (value == null || value === false) return '';
233
+ if (URL_ATTRIBUTES.has(attrName) && !isSafeUrl(value)) {
234
+ diagnostics.publish('rmt.node_ssr.url_blocked', `Blocked unsafe URL in "${attrName}".`, 'error', { ...context, attribute: attrName });
235
+ return '';
236
+ }
237
+ if (value === true) return ` ${attrName}="true"`;
238
+ if (typeof value === 'object') {
239
+ return ` ${attrName}="${escapeAttribute(JSON.stringify(value))}"`;
240
+ }
241
+ return ` ${attrName}="${escapeAttribute(value)}"`;
242
+ }
243
+
244
+ function mergeAttributes(...records) {
245
+ return Object.assign({}, ...records.map(objectRecord));
246
+ }
247
+
248
+ function serializeAttributes(attributes, diagnostics, context) {
249
+ return Object.entries(objectRecord(attributes))
250
+ .map(([name, value]) => serializeAttribute(name, value, diagnostics, context))
251
+ .join('');
252
+ }
253
+
254
+ function normalizeDescriptor(input) {
255
+ if (Array.isArray(input)) return { type: 'fragment', children: input };
256
+ if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') return { type: 'text', text: input };
257
+ if (!input || typeof input !== 'object') return { type: 'empty' };
258
+ if (input.descriptor) return normalizeDescriptor(input.descriptor);
259
+ if (input.domDescriptor) return normalizeDescriptor(input.domDescriptor);
260
+ if (input.type || input.kind || input.tag || input.component || input.html || input.text || input.children || input.nodes) return input;
261
+ return { type: 'empty' };
262
+ }
263
+
264
+ function descriptorWithSlot(descriptor, slotName) {
265
+ if (!descriptor || typeof descriptor !== 'object' || Array.isArray(descriptor)) {
266
+ return {
267
+ type: 'element',
268
+ tag: 'span',
269
+ attributes: { slot: slotName },
270
+ children: [descriptor]
271
+ };
272
+ }
273
+ if (descriptor.text != null && !descriptor.type && !descriptor.tag && !descriptor.component) {
274
+ return {
275
+ type: 'element',
276
+ tag: 'span',
277
+ attributes: {
278
+ ...objectRecord(descriptor.attributes),
279
+ slot: descriptor.slot || objectRecord(descriptor.attributes).slot || slotName
280
+ },
281
+ children: [{ type: 'text', text: descriptor.text }]
282
+ };
283
+ }
284
+ return {
285
+ ...descriptor,
286
+ attributes: {
287
+ ...objectRecord(descriptor.attributes),
288
+ slot: descriptor.slot || objectRecord(descriptor.attributes).slot || slotName
289
+ }
290
+ };
291
+ }
292
+
293
+ function resolveComponentDescriptor(descriptor, registry, diagnostics, context) {
294
+ const tag = descriptor.tag || descriptor.componentTag || descriptor.host || descriptor.component || descriptor.ref || 'div';
295
+ const capability = registry && typeof registry.resolveComponentCapability === 'function'
296
+ ? registry.resolveComponentCapability(tag) || registry.resolveComponentCapability(descriptor.component)
297
+ : null;
298
+ const built = capability && typeof registry.buildComponentDescriptor === 'function'
299
+ ? registry.buildComponentDescriptor({
300
+ ...descriptor,
301
+ tag: capability.tag,
302
+ component: descriptor.component || capability.tag,
303
+ id: descriptor.id || descriptor.key || capability.tag
304
+ }, { source: context.source || null })
305
+ : null;
306
+ if (capability && context.componentCapabilities && !context.componentCapabilities.has(capability.tag)) {
307
+ context.componentCapabilities.set(capability.tag, {
308
+ tag: capability.tag,
309
+ family: capability.family,
310
+ visualKind: capability.visualKind,
311
+ modulePath: capability.modulePath,
312
+ slots: asArray(capability.slots),
313
+ parts: asArray(capability.parts),
314
+ events: asArray(capability.events),
315
+ importPolicy: capability.importPolicy,
316
+ kernelBoundary: capability.kernelBoundary
317
+ });
318
+ }
319
+ if (!capability && tag && String(tag).startsWith('x-')) {
320
+ diagnostics.publish(
321
+ 'rmt.node_ssr.component_capability_missing',
322
+ `No XTend component capability metadata was available for "${tag}".`,
323
+ 'warning',
324
+ { tag, source: context.source || null }
325
+ );
326
+ }
327
+ return {
328
+ descriptor: built || descriptor,
329
+ capability
330
+ };
331
+ }
332
+
333
+ function serializeElementLike(descriptor, context) {
334
+ const tag = normalizeTagName(descriptor.tag || descriptor.element || 'div', context.diagnostics, context);
335
+ const attributes = mergeAttributes(descriptor.attributes, descriptor.attrs);
336
+ const children = asArray(descriptor.children || descriptor.nodes || descriptor.childNodes);
337
+ const open = `<${tag}${serializeAttributes(attributes, context.diagnostics, { ...context, tag })}>`;
338
+ if (VOID_TAGS.has(tag)) return open;
339
+ return `${open}${children.map((child, index) => serializeDescriptor(child, { ...context, source: { ...(context.source || {}), index } })).join('')}</${tag}>`;
340
+ }
341
+
342
+ function serializeComponent(descriptor, context) {
343
+ const registryResult = resolveComponentDescriptor(descriptor, context.componentRegistry, context.diagnostics, context);
344
+ const componentDescriptor = registryResult.descriptor;
345
+ const capability = registryResult.capability || componentDescriptor.capability || null;
346
+ const tag = normalizeTagName(componentDescriptor.tag || descriptor.tag || 'div', context.diagnostics, context);
347
+ const partList = [
348
+ ...asArray(componentDescriptor.parts),
349
+ ...asArray(descriptor.parts || descriptor.part)
350
+ ].filter(Boolean);
351
+ const eventAttributes = Object.fromEntries(Object.entries(objectRecord(componentDescriptor.events || descriptor.events || descriptor.eventBindings))
352
+ .map(([eventName, action]) => [`data-rmt-event-${safeIdentifier(eventName, 'event')}`, stableString(action, '')]));
353
+ const propertyAttributes = Object.fromEntries(Object.entries(objectRecord(componentDescriptor.properties || componentDescriptor.props || descriptor.properties || descriptor.props))
354
+ .filter(([, value]) => value == null || typeof value !== 'function')
355
+ .map(([name, value]) => {
356
+ if (value != null && typeof value === 'object') return [`data-rmt-prop-${safeIdentifier(name, 'prop')}`, JSON.stringify(value)];
357
+ return [name, value];
358
+ }));
359
+ const attributes = mergeAttributes(
360
+ componentDescriptor.attributes,
361
+ descriptor.attributes,
362
+ propertyAttributes,
363
+ {
364
+ 'data-rmt-node-ssr': 'true',
365
+ 'data-rmt-component-capability': capability && capability.tag || tag,
366
+ 'data-rmt-component-family': capability && capability.family || componentDescriptor.attributes && componentDescriptor.attributes['data-rmt-component-family'],
367
+ 'data-rmt-lazy-import': capability && capability.modulePath || componentDescriptor.attributes && componentDescriptor.attributes['data-rmt-lazy-import']
368
+ },
369
+ eventAttributes
370
+ );
371
+ if (partList.length) attributes.part = [...new Set(partList.map((entry) => stableString(entry, '').trim()).filter(Boolean))].join(' ');
372
+ const slotChildren = Object.entries(objectRecord(componentDescriptor.slots || descriptor.slots))
373
+ .flatMap(([slotName, slotValue]) => asArray(slotValue).map((entry) => descriptorWithSlot(entry, slotName)));
374
+ const children = [
375
+ ...slotChildren,
376
+ ...asArray(componentDescriptor.children || componentDescriptor.nodes || descriptor.children || descriptor.nodes)
377
+ ];
378
+ const open = `<${tag}${serializeAttributes(attributes, context.diagnostics, { ...context, tag, capability: capability && capability.tag || tag })}>`;
379
+ return `${open}${children.map((child, index) => serializeDescriptor(child, { ...context, source: { ...(context.source || {}), index } })).join('')}</${tag}>`;
380
+ }
381
+
382
+ function serializeDescriptor(descriptorInput, context) {
383
+ const descriptor = normalizeDescriptor(descriptorInput);
384
+ const type = stableString(descriptor.type || descriptor.kind || (descriptor.component || descriptor.componentTag ? 'component' : descriptor.tag ? 'element' : descriptor.html ? 'html' : descriptor.text != null ? 'text' : 'fragment'), 'fragment');
385
+ if (type === 'empty') return '';
386
+ if (type === 'text') return escapeHtml(context.resolveValue(descriptor.text, context));
387
+ if (type === 'html' || type === 'trusted_html' || descriptor.html != null) {
388
+ return sanitizeHtmlFragment(context.resolveValue(descriptor.html || descriptor.content || '', context), context.diagnostics, { ...context, descriptor }, context.options);
389
+ }
390
+ if (type === 'component') return serializeComponent(descriptor, context);
391
+ if (type === 'element') return serializeElementLike(descriptor, context);
392
+ if (type === 'fragment') {
393
+ return asArray(descriptor.children || descriptor.nodes).map((child, index) => serializeDescriptor(child, {
394
+ ...context,
395
+ source: { ...(context.source || {}), index }
396
+ })).join('');
397
+ }
398
+ if (type === 'slot') {
399
+ return serializeDescriptor(descriptorWithSlot(descriptor.children || descriptor.text || '', descriptor.slot || descriptor.name || 'default'), context);
400
+ }
401
+ context.diagnostics.publish('rmt.node_ssr.descriptor_type_unsupported', `Unsupported SSR descriptor type "${type}".`, 'error', context);
402
+ return '';
403
+ }
404
+
405
+ function extractTextContent(html) {
406
+ return stableString(html, '').replace(/<[^>]*>/gu, '').replace(/\s+/gu, ' ').trim();
407
+ }
408
+
409
+ function findStateValue(coreDocument, selector) {
410
+ if (!selector) return null;
411
+ const candidates = [
412
+ selector.target,
413
+ selector.source,
414
+ selector.sourceRef,
415
+ selector.id && `state:${selector.id}`,
416
+ selector.name && `state:${selector.name}`
417
+ ].filter(Boolean);
418
+ const states = asArray(coreDocument && coreDocument.states);
419
+ for (const candidate of candidates) {
420
+ const found = states.find((state) => state && (state.id === candidate || state.name === candidate || state.target === candidate));
421
+ if (found) return found.initial || found.value || found.defaultValue || null;
422
+ }
423
+ return null;
424
+ }
425
+
426
+ function deriveDescriptorFromCore(coreDocument) {
427
+ const selectors = new Map(asArray(coreDocument && coreDocument.selectors).map((selector) => [selector.id || selector.name, selector]));
428
+ const lanes = asArray(coreDocument && coreDocument.lanes);
429
+ const children = asArray(coreDocument && coreDocument.surfaces).map((surface) => {
430
+ const selector = selectors.get(surface.source && (surface.source.selectorId || surface.source.id || surface.source.name));
431
+ const stateValue = findStateValue(coreDocument, selector);
432
+ const text = stateValue && (stateValue.text || stateValue.label || stateValue.value || stateValue.status);
433
+ const lane = lanes.find((entry) => entry && asArray(entry.surfaceIds || entry.surfaces).includes(surface.id));
434
+ return {
435
+ type: 'component',
436
+ tag: surface.component || surface.tag || 'section',
437
+ id: safeIdentifier(surface.id || surface.name),
438
+ key: safeIdentifier(surface.key || surface.id || surface.name),
439
+ attributes: {
440
+ id: safeIdentifier(surface.id || surface.name),
441
+ 'data-rmt-surface-id': surface.id || surface.name,
442
+ 'data-rmt-surface-name': surface.name || surface.id,
443
+ 'data-rmt-surface-kind': surface.kind || surface.type || 'surface',
444
+ 'data-rmt-primitive-id': surface.name || surface.id,
445
+ 'data-rmt-lane': lane && (lane.name || lane.id) || 'server-prerender',
446
+ 'data-rmt-source-ref': surface.sourceRef || surface.source && surface.source.sourceRef || null
447
+ },
448
+ children: text ? [{ type: 'text', text }] : []
449
+ };
450
+ });
451
+ return {
452
+ type: 'element',
453
+ tag: 'section',
454
+ attributes: {
455
+ 'data-rmt-node-ssr-root': 'true',
456
+ 'data-rmt-document-id': coreDocument && coreDocument.manifest && coreDocument.manifest.id || 'rmt-document'
457
+ },
458
+ children
459
+ };
460
+ }
461
+
462
+ async function loadDefaultCompiler(disabled) {
463
+ if (disabled) return null;
464
+ try {
465
+ const moduleApi = await import('../tools/rmt-language/vnext-compiler.js');
466
+ return moduleApi.compileRmtVNextSource || moduleApi.default && moduleApi.default.compileRmtVNextSource || null;
467
+ } catch {
468
+ return null;
469
+ }
470
+ }
471
+
472
+ async function loadDefaultStreamingContractFactory() {
473
+ try {
474
+ const moduleApi = await import('../tools/rmt-language/vnext-streaming.js');
475
+ return moduleApi.createStreamingContract || moduleApi.default && moduleApi.default.createStreamingContract || null;
476
+ } catch {
477
+ return null;
478
+ }
479
+ }
480
+
481
+ function isCoreDocument(value) {
482
+ return Boolean(value && typeof value === 'object' && (value.schema === 'xtend.rmt.core-format.vnext.v1' || Array.isArray(value.surfaces) && Array.isArray(value.operations)));
483
+ }
484
+
485
+ async function normalizeRenderInput(input, adapterOptions, renderOptions, diagnostics) {
486
+ const value = input && typeof input === 'object' && !Array.isArray(input) ? input : { descriptor: input };
487
+ if (value.descriptor || value.domDescriptor) {
488
+ return {
489
+ kind: 'dom-descriptor',
490
+ descriptor: normalizeDescriptor(value.descriptor || value.domDescriptor),
491
+ sourceRef: value.filePath || value.sourceRef || null
492
+ };
493
+ }
494
+ if (isCoreDocument(value.coreDocument || value.core || value)) {
495
+ const coreDocument = value.coreDocument || value.core || value;
496
+ return {
497
+ kind: 'core-document',
498
+ coreDocument,
499
+ descriptor: value.descriptor ? normalizeDescriptor(value.descriptor) : deriveDescriptorFromCore(coreDocument),
500
+ sourceRef: value.filePath || coreDocument.sourceRef || null
501
+ };
502
+ }
503
+ if (value.template || value.preparedTemplate || value.kind === 'renderman_prepared_template') {
504
+ const template = value.template || value.preparedTemplate || value;
505
+ return {
506
+ kind: 'prepared-template',
507
+ template,
508
+ descriptor: normalizeDescriptor(template.descriptor || template.domDescriptor || template.markup && template.markup.descriptor || template.html && { html: template.html, trustBoundary: template.trustBoundary }),
509
+ sourceRef: value.filePath || template.sourceRef || null
510
+ };
511
+ }
512
+ if (typeof input === 'string' || typeof value.source === 'string' || typeof value.text === 'string') {
513
+ const source = typeof input === 'string' ? input : value.source || value.text;
514
+ const compileRmtVNextSource = adapterOptions.compileRmtVNextSource || renderOptions.compileRmtVNextSource || await loadDefaultCompiler(adapterOptions.disableAutoCompiler || renderOptions.disableAutoCompiler);
515
+ if (typeof compileRmtVNextSource !== 'function') {
516
+ diagnostics.publish(
517
+ 'rmt.node_ssr.compiler_required',
518
+ 'Rendering RMT source in the runtime-only adapter requires an injected compileRmtVNextSource function.',
519
+ 'error',
520
+ { filePath: value.filePath || null }
521
+ );
522
+ return {
523
+ kind: 'source',
524
+ source,
525
+ sourceRef: value.filePath || null,
526
+ descriptor: { type: 'empty' }
527
+ };
528
+ }
529
+ const compileResult = compileRmtVNextSource(source, { filePath: value.filePath || value.sourceRef || 'inline.rmt' });
530
+ diagnostics.pushMany(compileResult && (compileResult.diagnostics || compileResult.compilerDiagnostics));
531
+ if (!compileResult || compileResult.ok === false || !compileResult.coreDocument) {
532
+ diagnostics.publish('rmt.node_ssr.compile_failed', 'RMT source could not be compiled for SSR.', 'error', { filePath: value.filePath || null });
533
+ return {
534
+ kind: 'source',
535
+ source,
536
+ compileResult,
537
+ sourceRef: value.filePath || null,
538
+ descriptor: { type: 'empty' }
539
+ };
540
+ }
541
+ return {
542
+ kind: 'source',
543
+ source,
544
+ compileResult,
545
+ coreDocument: compileResult.coreDocument,
546
+ descriptor: deriveDescriptorFromCore(compileResult.coreDocument),
547
+ sourceRef: value.filePath || compileResult.coreDocument.sourceRef || null
548
+ };
549
+ }
550
+ return {
551
+ kind: 'dom-descriptor',
552
+ descriptor: normalizeDescriptor(input),
553
+ sourceRef: null
554
+ };
555
+ }
556
+
557
+ function createChunk(renderState, html, descriptor, hydration) {
558
+ const documentId = renderState.coreDocument && renderState.coreDocument.manifest && renderState.coreDocument.manifest.id || renderState.requestId;
559
+ const templateId = safeIdentifier(renderState.options.templateId || documentId, 'rmt-node-ssr-template');
560
+ const qualifiedId = `${safeIdentifier(renderState.options.namespace || 'rmt')}:${templateId}`;
561
+ return {
562
+ kind: RMT_NODE_SSR_CHUNK_KIND,
563
+ version: '1.0',
564
+ executionMode: RMT_NODE_SSR_EXECUTION_MODE,
565
+ transport: 'server',
566
+ rootId: renderState.rootId,
567
+ template: {
568
+ id: templateId,
569
+ qualifiedId,
570
+ namespace: renderState.options.namespace || 'rmt',
571
+ documentId,
572
+ mode: 'dom_descriptor',
573
+ props: []
574
+ },
575
+ target: {
576
+ elementId: renderState.rootId,
577
+ selector: `#${renderState.rootId}`,
578
+ ownershipMode: 'hydrate_existing',
579
+ namespace: renderState.options.namespace || 'rmt'
580
+ },
581
+ markup: {
582
+ html,
583
+ textContent: extractTextContent(html),
584
+ descriptor: cloneJson(descriptor)
585
+ },
586
+ hydration: {
587
+ bindings: [],
588
+ slots: [],
589
+ props: [],
590
+ templateHydration: {
591
+ mode: RMT_NODE_SSR_EXECUTION_MODE,
592
+ schema: RMT_NODE_SSR_HYDRATION_SCHEMA
593
+ },
594
+ errorBoundary: {
595
+ mode: 'preserve-server-markup'
596
+ },
597
+ reactivityHints: {
598
+ source: 'rmt-node-ssr-adapter'
599
+ },
600
+ ownershipMode: 'hydrate_existing',
601
+ resourceId: `template.chunk:${qualifiedId}`,
602
+ metadata: hydration
603
+ },
604
+ modelSnapshot: renderState.model || {},
605
+ plan: {
606
+ executionMode: RMT_NODE_SSR_EXECUTION_MODE,
607
+ rootId: renderState.rootId,
608
+ templateQualifiedId: qualifiedId,
609
+ namespace: renderState.options.namespace || 'rmt',
610
+ phases: ['server_prerender', 'html_delivery', 'client_hydrate']
611
+ },
612
+ renderedAt: renderState.renderedAt
613
+ };
614
+ }
615
+
616
+ function normalizeDataSources(coreDocument, options = {}) {
617
+ const records = [
618
+ ...asArray(coreDocument && coreDocument.dataSources),
619
+ ...asArray(options.dataSources)
620
+ ];
621
+ return records.map((entry, index) => ({
622
+ id: entry.id || entry.dataSourceId || entry.target || `dataSource.${index}`,
623
+ kind: entry.kind || entry.type || null,
624
+ target: entry.target || entry.id || entry.dataSourceId || null,
625
+ unsafe: entry.unsafe === true || entry.requiresTrustBoundary === true,
626
+ format: entry.format || entry.responseType || null,
627
+ requiresTrustBoundary: entry.requiresTrustBoundary !== false && (entry.unsafe === true || entry.format === 'html' || entry.responseType === 'html' || entry.kind === 'endpoint'),
628
+ source: entry
629
+ }));
630
+ }
631
+
632
+ async function createStreamingContract(coreDocument, options, diagnostics) {
633
+ if (!coreDocument || asArray(coreDocument.dataSources).length === 0) return null;
634
+ const factory = options.createStreamingContract || await loadDefaultStreamingContractFactory();
635
+ if (typeof factory !== 'function') return null;
636
+ const contract = factory(coreDocument, {
637
+ dataSources: normalizeDataSources(coreDocument, options),
638
+ runtimeProbes: options.runtimeProbes || []
639
+ });
640
+ diagnostics.pushMany(contract && contract.diagnostics);
641
+ return contract;
642
+ }
643
+
644
+ async function resolveDataSource(record, context) {
645
+ const options = context.options || {};
646
+ if (typeof options.resolveDataSource === 'function') {
647
+ return options.resolveDataSource(record, context);
648
+ }
649
+ const endpointHandlers = objectRecord(options.endpointHandlers);
650
+ const target = record && (record.target || record.id);
651
+ if (target && typeof endpointHandlers[target] === 'function') {
652
+ return endpointHandlers[target](record, context);
653
+ }
654
+ const staticDataSources = {
655
+ ...objectRecord(options.staticDataSources),
656
+ ...objectRecord(options.fixtures)
657
+ };
658
+ if (target && Object.prototype.hasOwnProperty.call(staticDataSources, target)) {
659
+ return staticDataSources[target];
660
+ }
661
+ if (target && Object.prototype.hasOwnProperty.call(staticDataSources, record.id)) {
662
+ return staticDataSources[record.id];
663
+ }
664
+ if (typeof options.fetchAdapter === 'function') {
665
+ return options.fetchAdapter(record, context);
666
+ }
667
+ context.diagnostics.publish(
668
+ 'rmt.node_ssr.datasource_missing',
669
+ `No host resolver was provided for data source "${target || '<unknown>'}".`,
670
+ 'error',
671
+ { operationId: context.operationId || null, dataSourceId: record && record.id || null, target: target || null }
672
+ );
673
+ return null;
674
+ }
675
+
676
+ function normalizeJsonlPayload(value) {
677
+ if (value == null) return {};
678
+ if (typeof value === 'string') return { html: value };
679
+ if (value && typeof value === 'object') return value;
680
+ return { value };
681
+ }
682
+
683
+ function toJsonlLine(frame) {
684
+ return `${JSON.stringify(frame)}\n`;
685
+ }
686
+
687
+ function createFrameFactory(base) {
688
+ let sequence = 0;
689
+ return (type, fields = {}) => ({
690
+ schema: RMT_NODE_SSR_JSONL_FRAME_SCHEMA,
691
+ type,
692
+ requestId: base.requestId,
693
+ sequence: sequence++,
694
+ operationId: fields.operationId || null,
695
+ variant: fields.variant || null,
696
+ capability: fields.capability || null,
697
+ lane: fields.lane || null,
698
+ chunkKey: fields.chunkKey || null,
699
+ payload: fields.payload || {},
700
+ diagnostics: asArray(fields.diagnostics)
701
+ });
702
+ }
703
+
704
+ function hasBlockingDiagnostics(diagnostics) {
705
+ return asArray(diagnostics).some((entry) => BLOCKING_SEVERITIES.has(entry && entry.severity));
706
+ }
707
+
708
+ function collectPreloads(html) {
709
+ const preloads = [];
710
+ for (const match of stableString(html, '').matchAll(/data-rmt-lazy-import="([^"]+)"/gu)) {
711
+ const href = match[1];
712
+ if (href && !preloads.some((entry) => entry.href === href)) {
713
+ preloads.push({ href, as: 'script', rel: 'modulepreload' });
714
+ }
715
+ }
716
+ return preloads;
717
+ }
718
+
719
+ export function createRmtNodeSsrAdapter(options = {}) {
720
+ const adapterOptions = { ...options };
721
+ const resolveValue = createValueResolver();
722
+ const componentRegistry = adapterOptions.componentRegistry || (
723
+ adapterOptions.manifest
724
+ ? createRmtComponentCapabilityRegistry({
725
+ manifest: adapterOptions.manifest,
726
+ sourceTexts: adapterOptions.sourceTexts || {},
727
+ contracts: adapterOptions.contracts || {},
728
+ metadata: adapterOptions.metadata || {}
729
+ })
730
+ : null
731
+ );
732
+
733
+ async function render(input, renderOptions = {}) {
734
+ const mergedOptions = { ...adapterOptions, ...renderOptions };
735
+ const diagnostics = createDiagnosticsCollector(mergedOptions);
736
+ const requestId = safeIdentifier(mergedOptions.requestId || mergedOptions.operationId || `rmt-node-ssr-${Date.now()}`);
737
+ const normalized = await normalizeRenderInput(input, adapterOptions, renderOptions, diagnostics);
738
+ const rootId = safeIdentifier(mergedOptions.rootId || 'rmt-node-ssr-root');
739
+ const componentCapabilities = new Map();
740
+ const html = serializeDescriptor(normalized.descriptor, {
741
+ options: mergedOptions,
742
+ diagnostics,
743
+ componentRegistry: mergedOptions.componentRegistry || componentRegistry,
744
+ componentCapabilities,
745
+ model: mergedOptions.model || {},
746
+ selectorValues: mergedOptions.selectorValues || {},
747
+ source: { inputKind: normalized.kind, sourceRef: normalized.sourceRef },
748
+ resolveValue
749
+ });
750
+ const streamingContract = await createStreamingContract(normalized.coreDocument, mergedOptions, diagnostics);
751
+ const hydration = {
752
+ schema: RMT_NODE_SSR_HYDRATION_SCHEMA,
753
+ requestId,
754
+ executionMode: RMT_NODE_SSR_EXECUTION_MODE,
755
+ sourceKind: normalized.kind,
756
+ sourceRef: normalized.sourceRef,
757
+ componentCapabilities: [...componentCapabilities.values()],
758
+ coreDocumentSchema: normalized.coreDocument && normalized.coreDocument.schema || null,
759
+ streamingContractSchema: streamingContract && streamingContract.schema || null
760
+ };
761
+ const renderState = {
762
+ requestId,
763
+ rootId,
764
+ options: mergedOptions,
765
+ coreDocument: normalized.coreDocument,
766
+ renderedAt: mergedOptions.renderedAt || new Date().toISOString(),
767
+ model: mergedOptions.model || {}
768
+ };
769
+ const chunk = createChunk(renderState, html, normalized.descriptor, hydration);
770
+ const result = {
771
+ schema: RMT_NODE_SSR_RENDER_RESULT_SCHEMA,
772
+ adapterSchema: RMT_NODE_SSR_ADAPTER_SCHEMA,
773
+ ok: !hasBlockingDiagnostics(diagnostics.diagnostics),
774
+ status: hasBlockingDiagnostics(diagnostics.diagnostics) ? 'blocked' : 'rendered',
775
+ requestId,
776
+ html,
777
+ head: {
778
+ preloads: collectPreloads(html),
779
+ hints: [
780
+ {
781
+ rel: 'xtend-rmt-hydration',
782
+ schema: RMT_NODE_SSR_HYDRATION_SCHEMA
783
+ }
784
+ ]
785
+ },
786
+ chunks: [chunk],
787
+ response: {
788
+ kind: RMT_NODE_SSR_RESPONSE_KIND,
789
+ version: '1.0',
790
+ executionMode: RMT_NODE_SSR_EXECUTION_MODE,
791
+ rootId,
792
+ chunks: [chunk],
793
+ hydration,
794
+ diagnostics: diagnostics.diagnostics.slice()
795
+ },
796
+ hydration,
797
+ streamingContract,
798
+ componentCapabilities: [...componentCapabilities.values()],
799
+ fabricTelemetryHints: {
800
+ schema: 'xtend.rmt.node-ssr-fabric-telemetry-hints.v1',
801
+ lanes: asArray(normalized.coreDocument && normalized.coreDocument.lanes).map((lane) => lane.id || lane.name).filter(Boolean),
802
+ kernelBoundary: RMT_NODE_SSR_KERNEL_BOUNDARY,
803
+ transport: 'node-ssr'
804
+ },
805
+ diagnostics: diagnostics.diagnostics.slice()
806
+ };
807
+ return result;
808
+ }
809
+
810
+ async function* streamJsonl(input, streamOptions = {}) {
811
+ const mergedOptions = { ...adapterOptions, ...streamOptions };
812
+ const renderResult = await render(input, { ...mergedOptions, streamMode: true });
813
+ const frame = createFrameFactory({ requestId: renderResult.requestId });
814
+ yield toJsonlLine(frame('start', {
815
+ payload: {
816
+ adapterSchema: RMT_NODE_SSR_ADAPTER_SCHEMA,
817
+ streamingContractSchema: renderResult.streamingContract && renderResult.streamingContract.schema || RMT_NODE_SSR_STREAMING_CONTRACT_SCHEMA
818
+ }
819
+ }));
820
+ for (const diagnostic of renderResult.diagnostics) {
821
+ yield toJsonlLine(frame('diagnostic', { diagnostics: [diagnostic], payload: { code: diagnostic.code } }));
822
+ }
823
+ for (const capability of renderResult.componentCapabilities) {
824
+ yield toJsonlLine(frame('component', {
825
+ capability: capability.tag,
826
+ payload: capability
827
+ }));
828
+ }
829
+ yield toJsonlLine(frame('html', {
830
+ variant: 'ssr',
831
+ capability: 'stream.ssr.incremental',
832
+ lane: 'server-prerender',
833
+ chunkKey: renderResult.chunks[0] && renderResult.chunks[0].template && renderResult.chunks[0].template.qualifiedId,
834
+ payload: { html: renderResult.html }
835
+ }));
836
+ const operations = asArray(
837
+ renderResult.streamingContract && (renderResult.streamingContract.streams || renderResult.streamingContract.operations)
838
+ );
839
+ for (const operation of operations) {
840
+ if (mergedOptions.signal && mergedOptions.signal.aborted) {
841
+ yield toJsonlLine(frame('error', {
842
+ operationId: operation.operationId || operation.id,
843
+ variant: operation.variant,
844
+ capability: operation.capability,
845
+ diagnostics: [createDiagnostic('rmt.node_ssr.stream_aborted', 'Node SSR JSONL stream was aborted.', 'error', { operationId: operation.operationId || operation.id })]
846
+ }));
847
+ return;
848
+ }
849
+ const operationId = operation.operationId || operation.id || null;
850
+ const record = operation.dataSource
851
+ ? {
852
+ id: operation.dataSource.id || operation.sourceId || operation.sourceRef || operationId,
853
+ kind: operation.dataSource.kind || null,
854
+ target: operation.dataSource.target || operation.dataSource.id || null,
855
+ unsafe: operation.dataSource.catalog && operation.dataSource.catalog.unsafe === true,
856
+ format: operation.dataSource.catalog && operation.dataSource.catalog.format || null,
857
+ requiresTrustBoundary: operation.security && operation.security.required === true,
858
+ source: operation.dataSource
859
+ }
860
+ : null;
861
+ if (!record) continue;
862
+ const diagnostics = createDiagnosticsCollector(mergedOptions);
863
+ const payload = normalizeJsonlPayload(await resolveDataSource(record, {
864
+ options: mergedOptions,
865
+ diagnostics,
866
+ operationId,
867
+ renderResult
868
+ }));
869
+ for (const diagnostic of diagnostics.diagnostics) {
870
+ yield toJsonlLine(frame('diagnostic', {
871
+ operationId,
872
+ variant: operation.variant,
873
+ capability: operation.capability,
874
+ diagnostics: [diagnostic],
875
+ payload: { code: diagnostic.code }
876
+ }));
877
+ }
878
+ if (payload.html != null) {
879
+ const html = sanitizeHtmlFragment(payload.html, diagnostics, {
880
+ descriptor: {
881
+ trustBoundary: payload.trustBoundary
882
+ || record.source && record.source.trustBoundary
883
+ || operation.security && operation.security.boundaryIds
884
+ || mergedOptions.defaultTrustBoundary
885
+ },
886
+ operationId
887
+ }, mergedOptions);
888
+ yield toJsonlLine(frame('html', {
889
+ operationId,
890
+ variant: operation.variant,
891
+ capability: operation.capability,
892
+ lane: operation.scheduler && operation.scheduler.laneId || operation.lane || operation.variant || null,
893
+ chunkKey: operation.chunking && operation.chunking.metadata && operation.chunking.metadata.chunkKey || operation.chunkKey || operationId,
894
+ payload: { html, dataSourceId: record.id }
895
+ }));
896
+ }
897
+ if (payload.descriptor) {
898
+ const descriptorHtml = serializeDescriptor(payload.descriptor, {
899
+ options: mergedOptions,
900
+ diagnostics,
901
+ componentRegistry: mergedOptions.componentRegistry || componentRegistry,
902
+ componentCapabilities: new Map(),
903
+ model: mergedOptions.model || {},
904
+ selectorValues: mergedOptions.selectorValues || {},
905
+ source: { inputKind: 'stream-descriptor', operationId },
906
+ resolveValue
907
+ });
908
+ yield toJsonlLine(frame('html', {
909
+ operationId,
910
+ variant: operation.variant,
911
+ capability: operation.capability,
912
+ lane: operation.scheduler && operation.scheduler.laneId || operation.lane || operation.variant || null,
913
+ chunkKey: operation.chunking && operation.chunking.metadata && operation.chunking.metadata.chunkKey || operation.chunkKey || operationId,
914
+ payload: { html: descriptorHtml, dataSourceId: record.id }
915
+ }));
916
+ }
917
+ }
918
+ yield toJsonlLine(frame('hydration', {
919
+ variant: 'hydration',
920
+ capability: 'stream.hydration.chunked',
921
+ lane: 'client-hydrate',
922
+ chunkKey: renderResult.chunks[0] && renderResult.chunks[0].template && renderResult.chunks[0].template.qualifiedId,
923
+ payload: renderResult.hydration
924
+ }));
925
+ yield toJsonlLine(frame('complete', {
926
+ payload: {
927
+ ok: renderResult.ok,
928
+ status: renderResult.status,
929
+ diagnostics: renderResult.diagnostics.length
930
+ }
931
+ }));
932
+ }
933
+
934
+ function toNodeReadable(input, streamOptions = {}) {
935
+ return Readable.from(streamJsonl(input, streamOptions));
936
+ }
937
+
938
+ function toReadableStream(input, streamOptions = {}) {
939
+ const iterable = streamJsonl(input, streamOptions);
940
+ if (typeof ReadableStream === 'function') {
941
+ const iterator = iterable[Symbol.asyncIterator]();
942
+ return new ReadableStream({
943
+ async pull(controller) {
944
+ const next = await iterator.next();
945
+ if (next.done) {
946
+ controller.close();
947
+ } else {
948
+ controller.enqueue(next.value);
949
+ }
950
+ },
951
+ async cancel() {
952
+ if (typeof iterator.return === 'function') await iterator.return();
953
+ }
954
+ });
955
+ }
956
+ return Readable.toWeb(Readable.from(iterable));
957
+ }
958
+
959
+ return Object.freeze({
960
+ schema: RMT_NODE_SSR_ADAPTER_SCHEMA,
961
+ kernelBoundary: RMT_NODE_SSR_KERNEL_BOUNDARY,
962
+ componentRegistry,
963
+ render,
964
+ streamJsonl,
965
+ toReadableStream,
966
+ toNodeReadable,
967
+ renderDescriptorToHtml(descriptor, renderOptions = {}) {
968
+ const diagnostics = createDiagnosticsCollector({ ...adapterOptions, ...renderOptions });
969
+ const componentCapabilities = new Map();
970
+ const html = serializeDescriptor(descriptor, {
971
+ options: { ...adapterOptions, ...renderOptions },
972
+ diagnostics,
973
+ componentRegistry: renderOptions.componentRegistry || componentRegistry,
974
+ componentCapabilities,
975
+ model: renderOptions.model || {},
976
+ selectorValues: renderOptions.selectorValues || {},
977
+ source: { inputKind: 'descriptor-helper' },
978
+ resolveValue
979
+ });
980
+ return {
981
+ html,
982
+ componentCapabilities: [...componentCapabilities.values()],
983
+ diagnostics: diagnostics.diagnostics.slice()
984
+ };
985
+ },
986
+ listDiagnostics() {
987
+ return componentRegistry && typeof componentRegistry.listDiagnostics === 'function'
988
+ ? componentRegistry.listDiagnostics()
989
+ : [];
990
+ }
991
+ });
992
+ }
993
+
994
+ export default {
995
+ RMT_NODE_SSR_ADAPTER_SCHEMA,
996
+ RMT_NODE_SSR_RENDER_RESULT_SCHEMA,
997
+ RMT_NODE_SSR_JSONL_FRAME_SCHEMA,
998
+ RMT_NODE_SSR_DIAGNOSTIC_SCHEMA,
999
+ RMT_NODE_SSR_HYDRATION_SCHEMA,
1000
+ RMT_NODE_SSR_CHUNK_KIND,
1001
+ RMT_NODE_SSR_RESPONSE_KIND,
1002
+ RMT_NODE_SSR_EXECUTION_MODE,
1003
+ RMT_NODE_SSR_STREAMING_CONTRACT_SCHEMA,
1004
+ RMT_NODE_SSR_KERNEL_BOUNDARY,
1005
+ createRmtNodeSsrAdapter
1006
+ };