@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
@@ -12,6 +12,7 @@ const RMT_VNEXT_TOOLING_SCHEMA = 'xtend.rmt.vnext-tooling-adapter.v1';
12
12
  const RMT_VNEXT_TOOLING_REPORT_SCHEMA = 'xtend.rmt.vnext-tooling-report.v1';
13
13
  const RMT_VNEXT_TOOLING_FORMATTER_SCHEMA = 'xtend.rmt.vnext-formatter.v1';
14
14
  const RMT_VNEXT_TOOLING_WORKPACKAGE = 'WP-E15-15';
15
+ const RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE = 'RMT-VNEXT-PRIM-07';
15
16
  const RMT_VNEXT_TOOLING_MODULE_PATH = 'tools/rmt-language/vnext-tooling.js';
16
17
  const RMT_VNEXT_TOOLING_SUITE_PATH = 'tests/rmt-language/rmt_vnext_tooling_suite.js';
17
18
  const RMT_VNEXT_TOOLING_PACKAGE_SCRIPT = 'npm run test:rmt-vnext-tooling';
@@ -30,6 +31,14 @@ const RMT_DOCUMENT_SYMBOL_SCHEMA = 'xtend.rmt.document-symbol.v1';
30
31
  const RMT_DEFINITION_REPORT_SCHEMA = 'xtend.rmt.definition-report.v1';
31
32
  const RMT_DEFINITION_PROVIDER_SCHEMA = 'xtend.rmt.definition-provider.v1';
32
33
  const RMT_DEFINITION_TARGET_SCHEMA = 'xtend.rmt.definition-target.v1';
34
+ const RMT_VNEXT_PRIMITIVE_CODE_ACTION_PROVIDER_SCHEMA = 'xtend.rmt.vnext.primitive-code-action-provider.v1';
35
+ const RMT_VNEXT_PRIMITIVE_CODE_ACTION_REPORT_SCHEMA = 'xtend.rmt.vnext.primitive-code-action-report.v1';
36
+ const RMT_VNEXT_PRIMITIVE_CODE_ACTION_PREVIEW_SCHEMA = 'xtend.rmt.vnext.primitive-code-action-preview.v1';
37
+ const RMT_VNEXT_PRIMITIVE_FIX_ALL_KIND = 'source.fixAll.rmt.vnext.primitives';
38
+ const RMT_VNEXT_PRIMITIVE_COMMAND_HANDOFF_SCHEMA = 'xtend.rmt.vnext.primitive-command-handoff.v1';
39
+ const RMT_VNEXT_PRIMITIVE_KERNEL_BOUNDARY_COMMAND = 'xtend.rmt.vnext.extractKernelImport';
40
+ const RMT_CODE_ACTION_SCHEMA = 'xtend.rmt.code-action.v1';
41
+ const RMT_WORKSPACE_EDIT_SCHEMA = 'xtend.rmt.workspace-edit.v1';
33
42
 
34
43
  const VNEXT_COMPLETION_KEYWORDS = Object.freeze([
35
44
  ['import', 'Statischen vNext Modulimport deklarieren.'],
@@ -51,6 +60,75 @@ const VNEXT_COMPLETION_KEYWORDS = Object.freeze([
51
60
  ['sanitize', 'Sanitize Policy setzen.']
52
61
  ]);
53
62
 
63
+ const VNEXT_PRIMITIVE_KEYWORDS = Object.freeze([
64
+ ['state', 'App-State Primitive in vNext deklarieren.'],
65
+ ['selector', 'Derived Selector aus State oder DataSource ableiten.'],
66
+ ['datasource', 'DataSource Primitive mit Endpoint, Fixture, SSE oder Worker deklarieren.'],
67
+ ['action', 'Action Primitive mit Inputs, Reducern, Effects und Emits deklarieren.'],
68
+ ['portal', 'Portal Root fuer Surface- oder Overlay-Layer deklarieren.'],
69
+ ['overlay', 'Overlay Primitive wie Toast, Tooltip, Popover, Lightbox, Menu oder Dialog deklarieren.'],
70
+ ['resource', 'Lifecycle-owned Resource wie Object URL, Stream, Observer, Timer oder Lazy Import deklarieren.'],
71
+ ['surface', 'Sichtbare oder wiederholbare App-Platform Surface deklarieren.'],
72
+ ['payload', 'Event-Payload Contract aus DOM-, Detail- oder Surface-Kontext mappen.'],
73
+ ['destroy releases', 'Surface-Lifecycle an Resource-Teardown binden.']
74
+ ]);
75
+
76
+ const VNEXT_PRIMITIVE_STATE_CLAUSES = Object.freeze([
77
+ ['type', 'State-Datentyp deklarieren.'],
78
+ ['preserve', 'State ueber Surface-Lifecycle hinweg erhalten.'],
79
+ ['initial', 'Initialen State-Wert deklarieren.']
80
+ ]);
81
+
82
+ const VNEXT_PRIMITIVE_SELECTOR_CLAUSES = Object.freeze([
83
+ ['from state', 'Selector aus State Record ableiten.'],
84
+ ['from datasource', 'Selector aus DataSource Record ableiten.'],
85
+ ['where', 'Deklarative Filterbedingung.'],
86
+ ['find', 'Einzelnen Datensatz deklarativ auswaehlen.'],
87
+ ['sort by', 'Stabile Sortierung fuer Selector-Ergebnis.'],
88
+ ['output', 'Selector-Output-Contract deklarieren.']
89
+ ]);
90
+
91
+ const VNEXT_PRIMITIVE_ACTION_CLAUSES = Object.freeze([
92
+ ['input', 'Typisierten Action-Input deklarieren.'],
93
+ ['status', 'Status-State fuer Loading, Success und Error binden.'],
94
+ ['reduce', 'State-Reducer deklarieren.'],
95
+ ['effect fetch datasource', 'Asynchronen Fetch-Effect gegen eine DataSource deklarieren.'],
96
+ ['on success -> reduce', 'Success-Result in State schreiben.'],
97
+ ['on success -> emit', 'Success-Event emittieren.'],
98
+ ['on error -> overlay', 'Error-Pfad an Overlay-Feedback binden.'],
99
+ ['emit', 'Typed Event mit Payload deklarieren.']
100
+ ]);
101
+
102
+ const VNEXT_PRIMITIVE_SURFACE_CLAUSES = Object.freeze([
103
+ ['source selector', 'Surface an Selector-Output binden.'],
104
+ ['repeat from selector', 'Keyed Surface-Repeater aus Selector-Output erzeugen.'],
105
+ ['key', 'Stabilen Surface-Key deklarieren.'],
106
+ ['portal', 'Surface in Portal Root materialisieren.'],
107
+ ['bounds', 'Initiale Surface-Geometrie deklarieren.'],
108
+ ['preserve on minimize', 'Surface-State beim Minimieren erhalten.'],
109
+ ['destroy releases resource', 'Surface-Destroy an Resource-Release koppeln.'],
110
+ ['lane visible', 'Sichtbare Fabric-Lane fuer Lifecycle-Operation deklarieren.'],
111
+ ['on click', 'DOM-Event-Binding auf Action deklarieren.'],
112
+ ['payload', 'Event-Payload Contract mappen.']
113
+ ]);
114
+
115
+ const VNEXT_PRIMITIVE_RESOURCE_KINDS = Object.freeze([
116
+ ['object-url', 'Object URL Resource mit Revoke-Cleanup.'],
117
+ ['stream', 'Stream Resource mit owner-scoped Close.'],
118
+ ['observer', 'Observer Resource mit Disconnect-Cleanup.'],
119
+ ['timer', 'Timer oder Idle Handle Resource.'],
120
+ ['lazy-import', 'Lazy Component/Module Import als Host-Adapter-Fakt.']
121
+ ]);
122
+
123
+ const VNEXT_PRIMITIVE_OVERLAY_KINDS = Object.freeze([
124
+ ['tooltip', 'Viewport-Hint Overlay.'],
125
+ ['toast', 'Nichtmodales Feedback Overlay.'],
126
+ ['popover', 'Anchored Interactive Overlay.'],
127
+ ['lightbox', 'Modaler Media-/Detail-Layer.'],
128
+ ['menu', 'Keyboard-navigierbares Menu.'],
129
+ ['dialog', 'Dialog Overlay.']
130
+ ]);
131
+
54
132
  const VNEXT_SOURCE_KINDS = Object.freeze([
55
133
  ['endpoint', 'Endpoint-basierte Data Source.'],
56
134
  ['sse', 'Server-Sent-Events Stream.'],
@@ -110,11 +188,55 @@ const VNEXT_SNIPPETS = Object.freeze([
110
188
  body: [
111
189
  'on ${1:submit} -> action ${2:settings.save}'
112
190
  ]
191
+ },
192
+ {
193
+ id: 'rmt-vnext-primitive-shell',
194
+ label: 'RMT vNext Primitive Shell',
195
+ prefix: 'rmt-vnext-primitive-shell',
196
+ description: 'Granulare App Shell mit State, Selector, Action, Portal, Surface, Lane und Event nur in vNext.',
197
+ body: [
198
+ 'template ${1:app.shell} {',
199
+ ' state ${2:app.status} type object preserve {',
200
+ ' initial {',
201
+ ' id "${3:status}"',
202
+ ' text "${4:Ready}"',
203
+ ' }',
204
+ ' }',
205
+ '',
206
+ ' selector ${2:app.status} from state ${2:app.status} {',
207
+ ' output ${5:AppStatus}',
208
+ ' }',
209
+ '',
210
+ ' action ${6:app.save} {',
211
+ ' input label string',
212
+ ' reduce state.${2:app.status}.text = "${7:Saved}"',
213
+ ' emit ${8:app.saved} with label input.label',
214
+ ' }',
215
+ '',
216
+ ' portal surface.root root "#${9:app-root}" layer surface',
217
+ '',
218
+ ' surface ${10:app.status.card} kind card component ${11:x-status} {',
219
+ ' source selector ${2:app.status}',
220
+ ' key status.id',
221
+ ' portal surface.root',
222
+ '',
223
+ ' lane visible weight 50 {',
224
+ ' hydrate ${12:status-card} from selector ${2:app.status}',
225
+ ' }',
226
+ '',
227
+ ' on click "[data-action=save]" -> action ${6:app.save} {',
228
+ ' payload label from target.dataset.label',
229
+ ' }',
230
+ ' }',
231
+ '}'
232
+ ]
113
233
  }
114
234
  ]);
115
235
 
116
236
  const DOMAIN_CONFIG = Object.freeze({
117
237
  templates: { kind: 'template', label: 'Template', childKind: 'template' },
238
+ states: { kind: 'state', label: 'State', childKind: 'variable' },
239
+ selectors: { kind: 'selector', label: 'Selector', childKind: 'function' },
118
240
  surfaces: { kind: 'surface', label: 'Surface', childKind: 'namespace' },
119
241
  remoteSurfaces: { kind: 'remote-surface', label: 'Remote Surface', childKind: 'namespace' },
120
242
  lanes: { kind: 'lane', label: 'Lane', childKind: 'event' },
@@ -122,6 +244,11 @@ const DOMAIN_CONFIG = Object.freeze({
122
244
  slots: { kind: 'slot', label: 'Slot', childKind: 'namespace' },
123
245
  events: { kind: 'event', label: 'Event', childKind: 'event' },
124
246
  dataSources: { kind: 'data-source', label: 'Data Source', childKind: 'interface' },
247
+ actions: { kind: 'action', label: 'Action', childKind: 'function' },
248
+ effects: { kind: 'effect', label: 'Effect', childKind: 'function' },
249
+ portals: { kind: 'portal', label: 'Portal', childKind: 'namespace' },
250
+ overlays: { kind: 'overlay', label: 'Overlay', childKind: 'namespace' },
251
+ resources: { kind: 'resource', label: 'Resource', childKind: 'object' },
125
252
  securityPolicies: { kind: 'security-policy', label: 'Security Policy', childKind: 'key' }
126
253
  });
127
254
 
@@ -155,7 +282,7 @@ function isLikelyRmtVNextSource(input = {}, options = {}) {
155
282
  }
156
283
 
157
284
  return /^(?:import|template|surface|remote\s+surface)\b/u.test(trimmed)
158
- || /(?:^|\n)\s*(?:remote\s+surface|template|surface|lane|mount|hydrate|update|unmount|stream|slot|on\s+\S+\s+->\s+action|trust\s+boundary|sanitize)\b/u.test(text);
285
+ || /(?:^|\n)\s*(?:remote\s+surface|template|state|selector|datasource|action|portal|overlay|resource|surface|lane|mount|hydrate|update|unmount|stream|slot|on\s+\S+\s+->\s+action|trust\s+boundary|sanitize)\b/u.test(text);
159
286
  }
160
287
 
161
288
  function sourceRefToRange(sourceMap, sourceRef) {
@@ -203,6 +330,43 @@ function describeRecord(domain, record = {}) {
203
330
  return [record.kind || 'source', record.target].filter(Boolean).join(' ');
204
331
  }
205
332
 
333
+ if (domain === 'states') {
334
+ return [record.type || 'state', record.preserve ? 'preserve' : 'ephemeral'].filter(Boolean).join(' - ');
335
+ }
336
+
337
+ if (domain === 'selectors') {
338
+ return [record.source && record.source.kind || 'source', record.source && record.source.target, record.output ? `output: ${record.output}` : ''].filter(Boolean).join(' ');
339
+ }
340
+
341
+ if (domain === 'actions') {
342
+ return [
343
+ `${toArray(record.inputs).length} input(s)`,
344
+ `${toArray(record.reducers).length} reducer(s)`,
345
+ `${toArray(record.effectRefs).length} effect(s)`
346
+ ].join(' - ');
347
+ }
348
+
349
+ if (domain === 'effects') {
350
+ return [record.kind || 'effect', record.dataSourceRef || record.target].filter(Boolean).join(' ');
351
+ }
352
+
353
+ if (domain === 'portals') {
354
+ return [record.layer || 'portal', record.root].filter(Boolean).join(' ');
355
+ }
356
+
357
+ if (domain === 'overlays') {
358
+ return [record.kind || 'overlay', record.portal && record.portal.target ? `portal: ${record.portal.target}` : ''].filter(Boolean).join(' - ');
359
+ }
360
+
361
+ if (domain === 'resources') {
362
+ const owner = record.owner ? `${record.owner.kind || 'owner'}:${record.owner.id || record.owner.ref || 'unknown'}` : '';
363
+ return [record.kind || 'resource', owner].filter(Boolean).join(' - ');
364
+ }
365
+
366
+ if (domain === 'surfaces' && record.primitive) {
367
+ return [record.kind || 'surface', record.component ? `component: ${record.component}` : '', record.source && record.source.target ? `source: ${record.source.target}` : ''].filter(Boolean).join(' - ');
368
+ }
369
+
206
370
  if (domain === 'securityPolicies') {
207
371
  return [record.kind || 'policy', record.boundary || record.format].filter(Boolean).join(' ');
208
372
  }
@@ -381,7 +545,7 @@ function lintRmtVNextToolingSource(input = {}, options = {}) {
381
545
  graphStatus: analysis.graphStatus,
382
546
  coreSchema: analysis.coreSchema,
383
547
  sourceMapSummary: analysis.sourceMapSummary,
384
- providerCapabilities: ['completion', 'hover', 'symbols', 'definition', 'format'],
548
+ providerCapabilities: ['completion', 'hover', 'symbols', 'definition', 'codeAction', 'format'],
385
549
  diagnostics,
386
550
  ruleCount: 0,
387
551
  rules: [],
@@ -417,6 +581,12 @@ function staticCompletionItems(entries, base = {}) {
417
581
 
418
582
  function inferCompletionContext(pointer, explicitContext) {
419
583
  if (explicitContext) return explicitContext;
584
+ if (/^\/states(?:\/|$)/u.test(pointer)) return 'vnext-primitive-state-clauses';
585
+ if (/^\/selectors(?:\/|$)/u.test(pointer)) return 'vnext-primitive-selector-clauses';
586
+ if (/^\/actions(?:\/|$)/u.test(pointer)) return 'vnext-primitive-action-clauses';
587
+ if (/^\/surfaces(?:\/|$)/u.test(pointer)) return 'vnext-primitive-surface-clauses';
588
+ if (/^\/resources(?:\/|$)/u.test(pointer)) return 'vnext-primitive-resource-kinds';
589
+ if (/^\/overlays(?:\/|$)/u.test(pointer)) return 'vnext-primitive-overlay-kinds';
420
590
  if (/^\/lanes(?:\/|$)/u.test(pointer)) return 'vnext-lanes';
421
591
  if (/^\/dataSources(?:\/|$)/u.test(pointer) || /\/source(?:\/|$)/u.test(pointer)) return 'vnext-source-kinds';
422
592
  if (/^\/securityPolicies(?:\/|$)/u.test(pointer)) return 'vnext-security';
@@ -424,21 +594,144 @@ function inferCompletionContext(pointer, explicitContext) {
424
594
  return 'vnext-keywords';
425
595
  }
426
596
 
597
+ function normalizePosition(position) {
598
+ if (!position || !Number.isInteger(position.line)) {
599
+ return null;
600
+ }
601
+
602
+ return {
603
+ line: Math.max(0, position.line),
604
+ character: Number.isInteger(position.character) ? Math.max(0, position.character) : 0
605
+ };
606
+ }
607
+
608
+ function getLinePrefixAtPosition(text, position) {
609
+ const normalized = normalizePosition(position);
610
+
611
+ if (!normalized) {
612
+ return '';
613
+ }
614
+
615
+ const lines = getInputText(text).split(/\r\n|\r|\n/u);
616
+ const line = lines[normalized.line] || '';
617
+
618
+ return line.slice(0, Math.min(normalized.character, line.length));
619
+ }
620
+
621
+ function inferCompletionPrefixFromLine(linePrefix) {
622
+ const match = String(linePrefix || '').match(/([A-Za-z0-9_.-]+)$/u);
623
+ return match ? match[1] : '';
624
+ }
625
+
626
+ function inferPrimitiveCompletionContextFromLine(linePrefix) {
627
+ const source = String(linePrefix || '');
628
+ const trimmed = source.trimStart();
629
+
630
+ if (!trimmed) {
631
+ return 'vnext-primitive-keywords';
632
+ }
633
+
634
+ if (/^resource\b/u.test(trimmed) && /\bkind\s+[A-Za-z0-9_.-]*$/u.test(trimmed)) {
635
+ return 'vnext-primitive-resource-kinds';
636
+ }
637
+
638
+ if (/^overlay\b/u.test(trimmed) && /\bkind\s+[A-Za-z0-9_.-]*$/u.test(trimmed)) {
639
+ return 'vnext-primitive-overlay-kinds';
640
+ }
641
+
642
+ if (/^state\b/u.test(trimmed)) {
643
+ return 'vnext-primitive-state-clauses';
644
+ }
645
+
646
+ if (/^selector\b/u.test(trimmed)) {
647
+ return 'vnext-primitive-selector-clauses';
648
+ }
649
+
650
+ if (/^action\b/u.test(trimmed) || /^(?:input|status|reduce|effect|emit)\b/u.test(trimmed)) {
651
+ return 'vnext-primitive-action-clauses';
652
+ }
653
+
654
+ if (/^(?:on\s+(?:success|error)\b|on\s*$)/u.test(trimmed)) {
655
+ return 'vnext-primitive-action-clauses';
656
+ }
657
+
658
+ if (/^(?:inp|red|eff|emi)[A-Za-z0-9_.-]*$/u.test(trimmed)) {
659
+ return 'vnext-primitive-action-clauses';
660
+ }
661
+
662
+ if (/^surface\b/u.test(trimmed)) {
663
+ return 'vnext-primitive-surface-clauses';
664
+ }
665
+
666
+ if (/^(?:source|repeat|key|portal|bounds|preserve|destroy|lane|payload)\b/u.test(trimmed)) {
667
+ return 'vnext-primitive-surface-clauses';
668
+ }
669
+
670
+ if (/^(?:sta|sel|dat|act|por|ove|res|sur|pay|des)[A-Za-z0-9_.-]*$/u.test(trimmed)) {
671
+ return 'vnext-primitive-keywords';
672
+ }
673
+
674
+ return null;
675
+ }
676
+
677
+ function inferPointerAtPosition(analysis, position) {
678
+ const normalized = normalizePosition(position);
679
+
680
+ if (!normalized || !analysis || typeof analysis.findPointerAtPosition !== 'function') {
681
+ return '';
682
+ }
683
+
684
+ return normalizeString(analysis.findPointerAtPosition(normalized));
685
+ }
686
+
687
+ function resolveCompletionRequest(input = {}, options = {}, analysis) {
688
+ const position = normalizePosition(options.position || input.position);
689
+ const linePrefix = position ? getLinePrefixAtPosition(input, position) : '';
690
+ const explicitContext = normalizeString(options.context || input.context);
691
+ const explicitPointer = normalizeString(options.pointer || input.pointer);
692
+ const pointer = explicitPointer || inferPointerAtPosition(analysis, position);
693
+ const lineContext = position && !explicitContext ? inferPrimitiveCompletionContextFromLine(linePrefix) : null;
694
+ const context = explicitContext || lineContext || inferCompletionContext(pointer, null);
695
+ const explicitPrefix = normalizeString(options.prefix || input.prefix);
696
+ const prefix = explicitPrefix || (explicitPointer && !lineContext ? '' : inferCompletionPrefixFromLine(linePrefix));
697
+
698
+ return {
699
+ pointer,
700
+ context,
701
+ prefix,
702
+ position,
703
+ linePrefix
704
+ };
705
+ }
706
+
427
707
  function sortItems(items) {
428
708
  return items.slice().sort((left, right) => String(left.sortText || left.label).localeCompare(String(right.sortText || right.label)));
429
709
  }
430
710
 
431
711
  function getRmtVNextToolingCompletions(input = {}, options = {}) {
432
712
  const analysis = options.analysis || analyzeRmtVNextToolingSource(input, options);
433
- const pointer = normalizeString(options.pointer || input.pointer);
434
- const context = inferCompletionContext(pointer, options.context);
435
- const prefix = normalizeString(options.prefix);
713
+ const request = resolveCompletionRequest(input, options, analysis);
714
+ const { pointer, context, prefix } = request;
436
715
  let items = [];
437
716
 
438
717
  if (context === 'vnext-lanes') {
439
718
  items = staticCompletionItems(VNEXT_LANES, { kind: 'enum', detail: 'vNext Scheduler Lane' });
440
719
  } else if (context === 'vnext-source-kinds') {
441
720
  items = staticCompletionItems(VNEXT_SOURCE_KINDS, { kind: 'enum', detail: 'vNext Data Source Kind' });
721
+ } else if (context === 'vnext-primitive-keywords') {
722
+ items = staticCompletionItems(VNEXT_PRIMITIVE_KEYWORDS, { kind: 'keyword', detail: 'vNext App-Platform Primitive' });
723
+ } else if (context === 'vnext-primitive-state-clauses') {
724
+ items = staticCompletionItems(VNEXT_PRIMITIVE_STATE_CLAUSES, { kind: 'keyword', detail: 'vNext State Clause' });
725
+ } else if (context === 'vnext-primitive-selector-clauses') {
726
+ items = staticCompletionItems(VNEXT_PRIMITIVE_SELECTOR_CLAUSES, { kind: 'keyword', detail: 'vNext Selector Clause' });
727
+ } else if (context === 'vnext-primitive-action-clauses') {
728
+ items = staticCompletionItems(VNEXT_PRIMITIVE_ACTION_CLAUSES, { kind: 'keyword', detail: 'vNext Action Clause' });
729
+ } else if (context === 'vnext-primitive-surface-clauses') {
730
+ items = staticCompletionItems(VNEXT_PRIMITIVE_SURFACE_CLAUSES, { kind: 'keyword', detail: 'vNext Surface Clause' });
731
+ } else if (context === 'vnext-primitive-resource-kinds') {
732
+ items = staticCompletionItems(VNEXT_PRIMITIVE_RESOURCE_KINDS, { kind: 'enum', detail: 'vNext Resource Kind' });
733
+ } else if (context === 'vnext-primitive-overlay-kinds') {
734
+ items = staticCompletionItems(VNEXT_PRIMITIVE_OVERLAY_KINDS, { kind: 'enum', detail: 'vNext Overlay Kind' });
442
735
  } else if (context === 'vnext-security') {
443
736
  items = staticCompletionItems(VNEXT_TRUST_BOUNDARIES, { kind: 'reference', detail: 'vNext Trust Boundary' })
444
737
  .concat(createCompletionItem({
@@ -472,6 +765,8 @@ function getRmtVNextToolingCompletions(input = {}, options = {}) {
472
765
  ok: true,
473
766
  context,
474
767
  prefix,
768
+ pointer,
769
+ position: request.position,
475
770
  itemCount: filtered.length,
476
771
  items: sortItems(filtered),
477
772
  graphStatus: analysis.graphStatus,
@@ -660,6 +955,934 @@ function getRmtVNextToolingDefinition(input = {}, options = {}) {
660
955
  };
661
956
  }
662
957
 
958
+ function createTextEdit(range, newText, annotationId = null) {
959
+ return {
960
+ range,
961
+ newText,
962
+ annotationId
963
+ };
964
+ }
965
+
966
+ function createWorkspaceEdit(uri, edits, metadata = {}) {
967
+ return {
968
+ schema: RMT_WORKSPACE_EDIT_SCHEMA,
969
+ changes: {
970
+ [uri]: edits
971
+ },
972
+ metadata
973
+ };
974
+ }
975
+
976
+ function createVNextPrimitiveCodeAction(input = {}) {
977
+ return {
978
+ schema: RMT_CODE_ACTION_SCHEMA,
979
+ title: input.title,
980
+ kind: input.kind || 'quickfix',
981
+ diagnosticCode: input.diagnosticCode || null,
982
+ pointer: input.pointer || null,
983
+ safe: input.safe !== false,
984
+ confidence: input.confidence || 'high',
985
+ source: input.source || 'rmt-vnext-primitive-code-actions',
986
+ diagnostics: toArray(input.diagnostics),
987
+ edit: input.edit || null,
988
+ command: input.command || null,
989
+ preview: input.preview || null,
990
+ fixAllActionCount: input.fixAllActionCount || null,
991
+ diagnosticCodes: toArray(input.diagnosticCodes),
992
+ isPreferred: !!input.isPreferred,
993
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
994
+ };
995
+ }
996
+
997
+ function collectWorkspaceEditEntries(edit) {
998
+ return Object.entries(edit && edit.changes ? edit.changes : {}).flatMap(([uri, edits]) => (
999
+ toArray(edits).map((entry, index) => ({
1000
+ uri,
1001
+ edit: entry,
1002
+ index
1003
+ }))
1004
+ ));
1005
+ }
1006
+
1007
+ function workspaceEditUris(edit) {
1008
+ return Array.from(new Set(collectWorkspaceEditEntries(edit).map((entry) => entry.uri))).sort();
1009
+ }
1010
+
1011
+ function applyWorkspaceEditToText(text, edit, uri) {
1012
+ const sourceModel = createRmtSourceModel({
1013
+ text,
1014
+ uri: uri || 'untitled:rmt-document'
1015
+ });
1016
+ const patches = collectWorkspaceEditEntries(edit)
1017
+ .filter((entry) => !uri || entry.uri === uri)
1018
+ .map((entry) => {
1019
+ const range = entry.edit && entry.edit.range;
1020
+ return {
1021
+ ...entry,
1022
+ start: range ? sourceModel.offsetAt(range.start) : 0,
1023
+ end: range ? sourceModel.offsetAt(range.end) : 0,
1024
+ newText: entry.edit && typeof entry.edit.newText === 'string' ? entry.edit.newText : ''
1025
+ };
1026
+ })
1027
+ .sort((left, right) => {
1028
+ if (left.start !== right.start) return right.start - left.start;
1029
+ if (left.end !== right.end) return right.end - left.end;
1030
+ return right.index - left.index;
1031
+ });
1032
+ let nextText = text;
1033
+
1034
+ patches.forEach((patch) => {
1035
+ nextText = `${nextText.slice(0, patch.start)}${patch.newText}${nextText.slice(patch.end)}`;
1036
+ });
1037
+
1038
+ return nextText;
1039
+ }
1040
+
1041
+ function summarizePreviewLines(beforeText, afterText) {
1042
+ const beforeLines = String(beforeText || '').split(/\r\n|\r|\n/u);
1043
+ const afterLines = String(afterText || '').split(/\r\n|\r|\n/u);
1044
+ const max = Math.max(beforeLines.length, afterLines.length);
1045
+ let firstChangedLine = -1;
1046
+
1047
+ for (let index = 0; index < max; index += 1) {
1048
+ if ((beforeLines[index] || '') !== (afterLines[index] || '')) {
1049
+ firstChangedLine = index;
1050
+ break;
1051
+ }
1052
+ }
1053
+
1054
+ if (firstChangedLine < 0) {
1055
+ return {
1056
+ changedLineCount: 0,
1057
+ firstChangedLine: null,
1058
+ before: [],
1059
+ after: []
1060
+ };
1061
+ }
1062
+
1063
+ let changedLineCount = 0;
1064
+ for (let index = firstChangedLine; index < max; index += 1) {
1065
+ if ((beforeLines[index] || '') !== (afterLines[index] || '')) {
1066
+ changedLineCount += 1;
1067
+ }
1068
+ }
1069
+
1070
+ const end = firstChangedLine + 8;
1071
+ return {
1072
+ changedLineCount,
1073
+ firstChangedLine,
1074
+ before: beforeLines.slice(firstChangedLine, end),
1075
+ after: afterLines.slice(firstChangedLine, end)
1076
+ };
1077
+ }
1078
+
1079
+ function createWorkspaceEditPreview(analysis, action, edit) {
1080
+ const sourceModel = analysis && analysis.sourceModel;
1081
+ const entries = collectWorkspaceEditEntries(edit);
1082
+ const affectedUris = workspaceEditUris(edit);
1083
+ const uri = sourceModel && sourceModel.uri;
1084
+ const localEntries = uri ? entries.filter((entry) => entry.uri === uri) : [];
1085
+ const status = localEntries.length > 0 ? 'ready' : entries.length > 0 ? 'external-uri' : 'empty';
1086
+ const beforeText = sourceModel ? sourceModel.text : '';
1087
+ const afterText = localEntries.length > 0
1088
+ ? applyWorkspaceEditToText(beforeText, {
1089
+ schema: RMT_WORKSPACE_EDIT_SCHEMA,
1090
+ changes: {
1091
+ [uri]: localEntries.map((entry) => entry.edit)
1092
+ }
1093
+ }, uri)
1094
+ : beforeText;
1095
+ const summary = summarizePreviewLines(beforeText, afterText);
1096
+
1097
+ return {
1098
+ schema: RMT_VNEXT_PRIMITIVE_CODE_ACTION_PREVIEW_SCHEMA,
1099
+ status,
1100
+ title: action && action.title ? action.title : null,
1101
+ kind: action && action.kind ? action.kind : 'quickfix',
1102
+ diagnosticCode: action && action.diagnosticCode ? action.diagnosticCode : null,
1103
+ safe: !(action && action.safe === false),
1104
+ uri: uri || null,
1105
+ affectedUris,
1106
+ editCount: entries.length,
1107
+ localEditCount: localEntries.length,
1108
+ changedLineCount: summary.changedLineCount,
1109
+ firstChangedLine: summary.firstChangedLine,
1110
+ before: summary.before,
1111
+ after: summary.after,
1112
+ repairKind: edit && edit.metadata ? edit.metadata.repairKind || null : null,
1113
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1114
+ };
1115
+ }
1116
+
1117
+ function attachVNextPrimitiveActionPreview(analysis, action) {
1118
+ if (!action) {
1119
+ return null;
1120
+ }
1121
+
1122
+ if (!action.edit) {
1123
+ return {
1124
+ ...action,
1125
+ preview: {
1126
+ schema: RMT_VNEXT_PRIMITIVE_CODE_ACTION_PREVIEW_SCHEMA,
1127
+ status: action.command ? 'manual-command' : 'empty',
1128
+ title: action.title || null,
1129
+ kind: action.kind || 'quickfix',
1130
+ diagnosticCode: action.diagnosticCode || null,
1131
+ safe: action.safe !== false,
1132
+ uri: analysis && analysis.sourceModel ? analysis.sourceModel.uri : null,
1133
+ affectedUris: [],
1134
+ editCount: 0,
1135
+ localEditCount: 0,
1136
+ changedLineCount: 0,
1137
+ firstChangedLine: null,
1138
+ before: [],
1139
+ after: [],
1140
+ repairKind: null,
1141
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1142
+ }
1143
+ };
1144
+ }
1145
+
1146
+ return {
1147
+ ...action,
1148
+ preview: createWorkspaceEditPreview(analysis, action, action.edit)
1149
+ };
1150
+ }
1151
+
1152
+ function rangeAtOffset(sourceModel, offset) {
1153
+ if (!sourceModel || typeof sourceModel.rangeForOffsets !== 'function') {
1154
+ return null;
1155
+ }
1156
+
1157
+ return sourceModel.rangeForOffsets(offset, offset);
1158
+ }
1159
+
1160
+ function lineIndent(sourceModel, line) {
1161
+ const text = sourceModel && typeof sourceModel.lineText === 'function'
1162
+ ? sourceModel.lineText(line)
1163
+ : '';
1164
+ return (text.match(/^\s*/u) || [''])[0];
1165
+ }
1166
+
1167
+ function lineEndInsertRange(sourceModel, line) {
1168
+ if (!sourceModel || typeof sourceModel.lineRange !== 'function') {
1169
+ return null;
1170
+ }
1171
+
1172
+ const lineRange = sourceModel.lineRange(line);
1173
+ return lineRange && Number.isInteger(lineRange.endOffset)
1174
+ ? rangeAtOffset(sourceModel, lineRange.endOffset)
1175
+ : null;
1176
+ }
1177
+
1178
+ function createLineEndInsertAction(analysis, diagnostic, newText, title, metadata = {}) {
1179
+ const sourceModel = analysis.sourceModel;
1180
+ const range = diagnostic.range || null;
1181
+ const line = range && range.start ? range.start.line : 0;
1182
+ const insertRange = lineEndInsertRange(sourceModel, line);
1183
+
1184
+ if (!insertRange || !sourceModel || !sourceModel.uri) {
1185
+ return null;
1186
+ }
1187
+
1188
+ return createVNextPrimitiveCodeAction({
1189
+ title,
1190
+ diagnosticCode: diagnostic.code,
1191
+ pointer: diagnostic.pointer || null,
1192
+ diagnostics: [diagnostic],
1193
+ edit: createWorkspaceEdit(sourceModel.uri, [
1194
+ createTextEdit(insertRange, newText, metadata.annotationId || `vnext-${diagnostic.code}`)
1195
+ ], {
1196
+ repairKind: metadata.repairKind || 'insert-vnext-primitive-clause',
1197
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE,
1198
+ ...metadata
1199
+ }),
1200
+ isPreferred: metadata.isPreferred !== false
1201
+ });
1202
+ }
1203
+
1204
+ function getVNextPrimitiveSemanticGraph(analysis) {
1205
+ return analysis
1206
+ && analysis.compileResult
1207
+ && analysis.compileResult.primitiveSemanticGraph
1208
+ ? analysis.compileResult.primitiveSemanticGraph
1209
+ : null;
1210
+ }
1211
+
1212
+ function getFirstCatalogId(analysis, key, fallbackDomain) {
1213
+ const semanticGraph = getVNextPrimitiveSemanticGraph(analysis);
1214
+ const hints = semanticGraph && semanticGraph.catalogHints || {};
1215
+ const fromHints = toArray(hints[key])[0];
1216
+
1217
+ if (fromHints) {
1218
+ return fromHints;
1219
+ }
1220
+
1221
+ const index = analysis && analysis.indexes && analysis.indexes[fallbackDomain];
1222
+ return index && index.ids ? index.ids[0] || '' : '';
1223
+ }
1224
+
1225
+ function selectPrimitiveOwner(analysis) {
1226
+ const surfaceId = getFirstCatalogId(analysis, 'surfaceIds', 'surfaces');
1227
+
1228
+ if (surfaceId) {
1229
+ return {
1230
+ kind: 'surface',
1231
+ id: surfaceId
1232
+ };
1233
+ }
1234
+
1235
+ const overlayId = getFirstCatalogId(analysis, 'overlayIds', 'overlays');
1236
+
1237
+ if (overlayId) {
1238
+ return {
1239
+ kind: 'overlay',
1240
+ id: overlayId
1241
+ };
1242
+ }
1243
+
1244
+ return null;
1245
+ }
1246
+
1247
+ function createResourceOwnerAction(analysis, diagnostic) {
1248
+ const sourceModel = analysis.sourceModel;
1249
+ const owner = selectPrimitiveOwner(analysis);
1250
+ const line = diagnostic.range && diagnostic.range.start ? diagnostic.range.start.line : 0;
1251
+ const lineText = sourceModel && typeof sourceModel.lineText === 'function' ? sourceModel.lineText(line) : '';
1252
+ const ownerText = owner ? `${owner.kind}.${owner.id}` : '';
1253
+
1254
+ if (!sourceModel || !sourceModel.uri || !ownerText || !/\bresource\b/u.test(lineText)) {
1255
+ return null;
1256
+ }
1257
+
1258
+ const lineRange = sourceModel.lineRange(line);
1259
+ const braceIndex = lineText.indexOf('{');
1260
+ const insertOffset = braceIndex >= 0
1261
+ ? lineRange.startOffset + braceIndex
1262
+ : lineRange.endOffset;
1263
+ const insertText = braceIndex >= 0
1264
+ ? `owner ${ownerText} `
1265
+ : ` owner ${ownerText}`;
1266
+ const insertRange = rangeAtOffset(sourceModel, insertOffset);
1267
+
1268
+ if (!insertRange) {
1269
+ return null;
1270
+ }
1271
+
1272
+ return createVNextPrimitiveCodeAction({
1273
+ title: `Resource owner auf ${ownerText} setzen`,
1274
+ diagnosticCode: diagnostic.code,
1275
+ pointer: diagnostic.pointer || null,
1276
+ diagnostics: [diagnostic],
1277
+ edit: createWorkspaceEdit(sourceModel.uri, [
1278
+ createTextEdit(insertRange, insertText, `vnext-owner-${diagnostic.code}`)
1279
+ ], {
1280
+ repairKind: 'add-resource-owner',
1281
+ owner: ownerText,
1282
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1283
+ }),
1284
+ isPreferred: true
1285
+ });
1286
+ }
1287
+
1288
+ function createSurfaceKeyAction(analysis, diagnostic) {
1289
+ const sourceModel = analysis.sourceModel;
1290
+ const line = diagnostic.range && diagnostic.range.start ? diagnostic.range.start.line : 0;
1291
+ const indent = lineIndent(sourceModel, line);
1292
+
1293
+ return createLineEndInsertAction(
1294
+ analysis,
1295
+ diagnostic,
1296
+ `\n${indent}key instance.id`,
1297
+ 'Surface key-Klausel ergaenzen',
1298
+ {
1299
+ repairKind: 'add-surface-key-clause',
1300
+ insertedClause: 'key instance.id'
1301
+ }
1302
+ );
1303
+ }
1304
+
1305
+ function createPayloadContractAction(analysis, diagnostic) {
1306
+ const sourceModel = analysis.sourceModel;
1307
+ const line = diagnostic.range && diagnostic.range.start ? diagnostic.range.start.line : 0;
1308
+ const text = sourceModel && typeof sourceModel.lineText === 'function' ? sourceModel.lineText(line) : '';
1309
+ const trimmed = text.trim();
1310
+ const indent = lineIndent(sourceModel, line);
1311
+ const newText = /^emit\b/u.test(trimmed)
1312
+ ? ' with value input.value'
1313
+ : trimmed.endsWith('{')
1314
+ ? `\n${indent} payload id from target.dataset.id`
1315
+ : ` {\n${indent} payload id from target.dataset.id\n${indent}}`;
1316
+
1317
+ return createLineEndInsertAction(
1318
+ analysis,
1319
+ diagnostic,
1320
+ newText,
1321
+ 'Event Payload Contract ergaenzen',
1322
+ {
1323
+ repairKind: 'add-event-payload-contract',
1324
+ insertedClause: /^emit\b/u.test(trimmed) ? 'with value input.value' : 'payload id from target.dataset.id'
1325
+ }
1326
+ );
1327
+ }
1328
+
1329
+ function findAstNodeByPointer(node, pointer) {
1330
+ if (!node || typeof node !== 'object' || !pointer) {
1331
+ return null;
1332
+ }
1333
+
1334
+ if (node.astPointer === pointer) {
1335
+ return node;
1336
+ }
1337
+
1338
+ for (const value of Object.values(node)) {
1339
+ if (Array.isArray(value)) {
1340
+ for (const entry of value) {
1341
+ const match = findAstNodeByPointer(entry, pointer);
1342
+ if (match) return match;
1343
+ }
1344
+ } else if (value && typeof value === 'object') {
1345
+ const match = findAstNodeByPointer(value, pointer);
1346
+ if (match) return match;
1347
+ }
1348
+ }
1349
+
1350
+ return null;
1351
+ }
1352
+
1353
+ function findTemplateChildForPointer(ast, pointer) {
1354
+ const templates = toArray(ast && ast.body).filter((entry) => entry && entry.type === 'RmtTemplateDeclaration');
1355
+
1356
+ for (const template of templates) {
1357
+ for (const child of toArray(template.body)) {
1358
+ if (child && child.astPointer && pointer.startsWith(child.astPointer)) {
1359
+ return child;
1360
+ }
1361
+ }
1362
+ }
1363
+
1364
+ return null;
1365
+ }
1366
+
1367
+ function insertRangeBeforeTemplateChild(analysis, pointer) {
1368
+ const sourceModel = analysis.sourceModel;
1369
+ const child = findTemplateChildForPointer(analysis.ast, pointer);
1370
+
1371
+ if (!sourceModel || !child || !child.range || !child.range.start) {
1372
+ return null;
1373
+ }
1374
+
1375
+ const lineRange = sourceModel.lineRange(child.range.start.line);
1376
+ return {
1377
+ range: rangeAtOffset(sourceModel, lineRange.startOffset),
1378
+ indent: lineIndent(sourceModel, child.range.start.line)
1379
+ };
1380
+ }
1381
+
1382
+ function getReferenceForDiagnostic(analysis, diagnostic) {
1383
+ const semanticGraph = getVNextPrimitiveSemanticGraph(analysis);
1384
+ return semanticGraph && typeof semanticGraph.findReferenceAtPointer === 'function'
1385
+ ? semanticGraph.findReferenceAtPointer(diagnostic.pointer)
1386
+ : null;
1387
+ }
1388
+
1389
+ function createSelectorStubAction(analysis, diagnostic, reference) {
1390
+ const sourceModel = analysis.sourceModel;
1391
+ const insertion = insertRangeBeforeTemplateChild(analysis, diagnostic.pointer);
1392
+ const targetId = normalizeString(reference && reference.targetId);
1393
+ const stateId = getFirstCatalogId(analysis, 'stateIds', 'states') || 'app.state';
1394
+
1395
+ if (!sourceModel || !sourceModel.uri || !insertion || !targetId) {
1396
+ return null;
1397
+ }
1398
+
1399
+ const selectorText = `${insertion.indent}selector ${targetId} from state ${stateId} {\n${insertion.indent} output GeneratedRecord[]\n${insertion.indent}}\n\n`;
1400
+
1401
+ return createVNextPrimitiveCodeAction({
1402
+ title: `Selector "${targetId}" anlegen`,
1403
+ diagnosticCode: diagnostic.code,
1404
+ pointer: diagnostic.pointer || null,
1405
+ diagnostics: [diagnostic],
1406
+ edit: createWorkspaceEdit(sourceModel.uri, [
1407
+ createTextEdit(insertion.range, selectorText, `vnext-selector-${targetId}`)
1408
+ ], {
1409
+ repairKind: 'create-selector-stub',
1410
+ targetDomain: 'selectors',
1411
+ targetId,
1412
+ dedupeKey: `selectors:${targetId}`,
1413
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1414
+ }),
1415
+ isPreferred: true
1416
+ });
1417
+ }
1418
+
1419
+ function createPortalStubAction(analysis, diagnostic, reference) {
1420
+ const sourceModel = analysis.sourceModel;
1421
+ const insertion = insertRangeBeforeTemplateChild(analysis, diagnostic.pointer);
1422
+ const targetId = normalizeString(reference && reference.targetId);
1423
+ const rootId = targetId ? targetId.replace(/[^A-Za-z0-9_-]+/gu, '-').replace(/^-+|-+$/gu, '') : 'generated-portal';
1424
+
1425
+ if (!sourceModel || !sourceModel.uri || !insertion || !targetId) {
1426
+ return null;
1427
+ }
1428
+
1429
+ const portalText = `${insertion.indent}portal ${targetId} root "#${rootId || 'generated-portal'}" layer surface\n\n`;
1430
+
1431
+ return createVNextPrimitiveCodeAction({
1432
+ title: `Portal "${targetId}" anlegen`,
1433
+ diagnosticCode: diagnostic.code,
1434
+ pointer: diagnostic.pointer || null,
1435
+ diagnostics: [diagnostic],
1436
+ edit: createWorkspaceEdit(sourceModel.uri, [
1437
+ createTextEdit(insertion.range, portalText, `vnext-portal-${targetId}`)
1438
+ ], {
1439
+ repairKind: 'create-portal-stub',
1440
+ targetDomain: 'portals',
1441
+ targetId,
1442
+ dedupeKey: `portals:${targetId}`,
1443
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1444
+ }),
1445
+ isPreferred: true
1446
+ });
1447
+ }
1448
+
1449
+ function createUnknownReferenceAction(analysis, diagnostic) {
1450
+ const reference = getReferenceForDiagnostic(analysis, diagnostic);
1451
+
1452
+ if (!reference || reference.resolved) {
1453
+ return null;
1454
+ }
1455
+
1456
+ if (reference.targetDomain === 'selectors') {
1457
+ return createSelectorStubAction(analysis, diagnostic, reference);
1458
+ }
1459
+
1460
+ if (reference.targetDomain === 'portals') {
1461
+ return createPortalStubAction(analysis, diagnostic, reference);
1462
+ }
1463
+
1464
+ return null;
1465
+ }
1466
+
1467
+ function defaultInitialForState(node) {
1468
+ const typeValue = normalizeString(node && node.dataType && node.dataType.value).toLowerCase();
1469
+
1470
+ if (typeValue.includes('[]')) {
1471
+ return '[]';
1472
+ }
1473
+
1474
+ if (typeValue.includes('boolean')) {
1475
+ return 'false';
1476
+ }
1477
+
1478
+ if (typeValue.includes('number') || typeValue.includes('int') || typeValue.includes('float')) {
1479
+ return '0';
1480
+ }
1481
+
1482
+ if (typeValue.includes('string')) {
1483
+ return '""';
1484
+ }
1485
+
1486
+ return '';
1487
+ }
1488
+
1489
+ function createStateInitialAction(analysis, diagnostic) {
1490
+ const sourceModel = analysis.sourceModel;
1491
+ const node = findAstNodeByPointer(analysis.ast, diagnostic.pointer);
1492
+ const line = diagnostic.range && diagnostic.range.start ? diagnostic.range.start.line : 0;
1493
+ const text = sourceModel && typeof sourceModel.lineText === 'function' ? sourceModel.lineText(line) : '';
1494
+ const indent = lineIndent(sourceModel, line);
1495
+ const lineRange = sourceModel && typeof sourceModel.lineRange === 'function' ? sourceModel.lineRange(line) : null;
1496
+ const initialValue = defaultInitialForState(node);
1497
+
1498
+ if (!sourceModel || !sourceModel.uri || !lineRange) {
1499
+ return null;
1500
+ }
1501
+
1502
+ let newText = initialValue ? ` initial ${initialValue}` : ` {\n${indent} initial {}\n${indent}}`;
1503
+
1504
+ if (text.includes('{')) {
1505
+ newText = `\n${indent} initial {}`;
1506
+ }
1507
+
1508
+ return createVNextPrimitiveCodeAction({
1509
+ title: 'State initial-Wert ergaenzen',
1510
+ diagnosticCode: diagnostic.code,
1511
+ pointer: diagnostic.pointer || null,
1512
+ diagnostics: [diagnostic],
1513
+ edit: createWorkspaceEdit(sourceModel.uri, [
1514
+ createTextEdit(rangeAtOffset(sourceModel, lineRange.endOffset), newText, `vnext-initial-${diagnostic.code}`)
1515
+ ], {
1516
+ repairKind: 'add-state-initial',
1517
+ insertedClause: initialValue ? `initial ${initialValue}` : 'initial {}',
1518
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1519
+ }),
1520
+ isPreferred: true
1521
+ });
1522
+ }
1523
+
1524
+ function createResourceKindAction(analysis, diagnostic) {
1525
+ const sourceModel = analysis.sourceModel;
1526
+ const line = diagnostic.range && diagnostic.range.start ? diagnostic.range.start.line : 0;
1527
+ const text = sourceModel && typeof sourceModel.lineText === 'function' ? sourceModel.lineText(line) : '';
1528
+ const lineRange = sourceModel && typeof sourceModel.lineRange === 'function' ? sourceModel.lineRange(line) : null;
1529
+ const match = text.match(/^(\s*resource\s+\S+\s*)/u);
1530
+
1531
+ if (!sourceModel || !sourceModel.uri || !lineRange || !match) {
1532
+ return null;
1533
+ }
1534
+
1535
+ return createVNextPrimitiveCodeAction({
1536
+ title: 'Resource kind auf object-url setzen',
1537
+ diagnosticCode: diagnostic.code,
1538
+ pointer: diagnostic.pointer || null,
1539
+ diagnostics: [diagnostic],
1540
+ edit: createWorkspaceEdit(sourceModel.uri, [
1541
+ createTextEdit(rangeAtOffset(sourceModel, lineRange.startOffset + match[1].length), 'kind object-url ', `vnext-kind-${diagnostic.code}`)
1542
+ ], {
1543
+ repairKind: 'add-resource-kind',
1544
+ resourceKind: 'object-url',
1545
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1546
+ }),
1547
+ isPreferred: true
1548
+ });
1549
+ }
1550
+
1551
+ function insertRangeBeforeNodeEnd(analysis, node) {
1552
+ const sourceModel = analysis.sourceModel;
1553
+
1554
+ if (!sourceModel || !node || !node.range || !node.range.end) {
1555
+ return null;
1556
+ }
1557
+
1558
+ const lineRange = sourceModel.lineRange(node.range.end.line);
1559
+
1560
+ return {
1561
+ range: rangeAtOffset(sourceModel, lineRange.startOffset),
1562
+ closingIndent: lineIndent(sourceModel, node.range.end.line)
1563
+ };
1564
+ }
1565
+
1566
+ function firstActionInputName(node) {
1567
+ const input = toArray(node && node.body).find((entry) => entry && entry.type === 'RmtActionInputClause' && entry.name);
1568
+ return normalizeString(input && input.name);
1569
+ }
1570
+
1571
+ function createActionReducerAction(analysis, diagnostic) {
1572
+ const sourceModel = analysis.sourceModel;
1573
+ const node = findAstNodeByPointer(analysis.ast, diagnostic.pointer);
1574
+ const insertion = insertRangeBeforeNodeEnd(analysis, node);
1575
+ const stateId = getFirstCatalogId(analysis, 'stateIds', 'states') || 'app.state';
1576
+ const inputName = firstActionInputName(node);
1577
+ const expression = inputName ? `input.${inputName}` : `state.${stateId}`;
1578
+
1579
+ if (!sourceModel || !sourceModel.uri || !insertion) {
1580
+ return null;
1581
+ }
1582
+
1583
+ return createVNextPrimitiveCodeAction({
1584
+ title: `Action Reducer-Ziel auf state.${stateId} setzen`,
1585
+ diagnosticCode: diagnostic.code,
1586
+ pointer: diagnostic.pointer || null,
1587
+ diagnostics: [diagnostic],
1588
+ edit: createWorkspaceEdit(sourceModel.uri, [
1589
+ createTextEdit(
1590
+ insertion.range,
1591
+ `${insertion.closingIndent} reduce state.${stateId} = ${expression}\n`,
1592
+ `vnext-action-reducer-${diagnostic.code}`
1593
+ )
1594
+ ], {
1595
+ repairKind: 'add-action-reducer-target',
1596
+ stateId,
1597
+ inputName: inputName || null,
1598
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1599
+ }),
1600
+ isPreferred: true
1601
+ });
1602
+ }
1603
+
1604
+ function createEffectSourceAction(analysis, diagnostic) {
1605
+ const dataSourceId = getFirstCatalogId(analysis, 'dataSourceIds', 'dataSources') || 'generated.datasource';
1606
+
1607
+ return createLineEndInsertAction(
1608
+ analysis,
1609
+ diagnostic,
1610
+ ` datasource ${dataSourceId}`,
1611
+ `Effect-Quelle datasource ${dataSourceId} ergaenzen`,
1612
+ {
1613
+ repairKind: 'add-effect-source',
1614
+ targetDomain: 'dataSources',
1615
+ targetId: dataSourceId
1616
+ }
1617
+ );
1618
+ }
1619
+
1620
+ function createKernelBoundaryCommandAction(analysis, diagnostic) {
1621
+ const sourceModel = analysis.sourceModel;
1622
+
1623
+ return createVNextPrimitiveCodeAction({
1624
+ title: 'Kernel/Fabric Import in Host-Adapter auslagern',
1625
+ diagnosticCode: diagnostic.code,
1626
+ pointer: diagnostic.pointer || null,
1627
+ diagnostics: [diagnostic],
1628
+ safe: false,
1629
+ confidence: 'manual',
1630
+ command: {
1631
+ title: 'Kernel/Fabric Import in Host-Adapter auslagern',
1632
+ command: RMT_VNEXT_PRIMITIVE_KERNEL_BOUNDARY_COMMAND,
1633
+ arguments: [{
1634
+ uri: sourceModel ? sourceModel.uri : null,
1635
+ pointer: diagnostic.pointer || null,
1636
+ diagnosticCode: diagnostic.code,
1637
+ reason: 'kernel-fabric-boundary'
1638
+ }]
1639
+ },
1640
+ isPreferred: false
1641
+ });
1642
+ }
1643
+
1644
+ function createRmtVNextPrimitiveCommandHandoff(input = {}, options = {}) {
1645
+ const command = normalizeString(input.command || options.command);
1646
+ const args = toArray(input.arguments || options.arguments);
1647
+ const firstArg = args[0] && typeof args[0] === 'object' ? args[0] : {};
1648
+ const pointer = normalizeString(input.pointer || firstArg.pointer || options.pointer);
1649
+ const uri = normalizeString(input.uri || firstArg.uri || options.uri);
1650
+ const diagnosticCode = normalizeString(input.diagnosticCode || firstArg.diagnosticCode || options.diagnosticCode);
1651
+ const supported = command === RMT_VNEXT_PRIMITIVE_KERNEL_BOUNDARY_COMMAND;
1652
+
1653
+ return {
1654
+ schema: RMT_VNEXT_PRIMITIVE_COMMAND_HANDOFF_SCHEMA,
1655
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE,
1656
+ languageMode: 'vnext',
1657
+ status: supported ? 'manual_handoff' : 'unsupported_command',
1658
+ ok: supported,
1659
+ command,
1660
+ uri: uri || null,
1661
+ pointer: pointer || null,
1662
+ diagnosticCode: diagnosticCode || null,
1663
+ safe: false,
1664
+ edit: null,
1665
+ commandKind: supported ? 'kernel-boundary-extraction' : null,
1666
+ boundary: 'no-kernel-fabric-imports-in-vnext-source',
1667
+ hostAdapterTarget: 'xtend-rmt-host-adapter',
1668
+ manualSteps: supported ? [
1669
+ 'Move Kernel/Fabric imports out of the vNext source file.',
1670
+ 'Expose the runtime dependency through a host adapter or scaffold/runtime boundary.',
1671
+ 'Keep RMT vNext source limited to primitive declarations and host-neutral references.',
1672
+ 'Re-run node scripts/run_xtend_tests.js rmt-vnext-tooling --json and the primitive aggregate gate.'
1673
+ ] : [],
1674
+ reason: normalizeString(input.reason || firstArg.reason || options.reason) || null
1675
+ };
1676
+ }
1677
+
1678
+ function createVNextPrimitiveActionForDiagnostic(analysis, diagnostic) {
1679
+ if (!diagnostic || !diagnostic.code) {
1680
+ return null;
1681
+ }
1682
+
1683
+ if (diagnostic.code === 'rmt.vnext.primitive.owner-missing') {
1684
+ return createResourceOwnerAction(analysis, diagnostic);
1685
+ }
1686
+
1687
+ if (diagnostic.code === 'rmt.vnext.primitive.unkeyed-repeat') {
1688
+ return createSurfaceKeyAction(analysis, diagnostic);
1689
+ }
1690
+
1691
+ if (diagnostic.code === 'rmt.vnext.primitive.payload-contract-missing') {
1692
+ return createPayloadContractAction(analysis, diagnostic);
1693
+ }
1694
+
1695
+ if (diagnostic.code === 'rmt.vnext.primitive.unknown-reference') {
1696
+ return createUnknownReferenceAction(analysis, diagnostic);
1697
+ }
1698
+
1699
+ if (diagnostic.code === 'rmt.vnext.primitive.initial-missing') {
1700
+ return createStateInitialAction(analysis, diagnostic);
1701
+ }
1702
+
1703
+ if (diagnostic.code === 'rmt.vnext.primitive.resource-kind-missing') {
1704
+ return createResourceKindAction(analysis, diagnostic);
1705
+ }
1706
+
1707
+ if (diagnostic.code === 'rmt.vnext.primitive.action-reducer-missing') {
1708
+ return createActionReducerAction(analysis, diagnostic);
1709
+ }
1710
+
1711
+ if (diagnostic.code === 'rmt.vnext.primitive.effect-source-missing') {
1712
+ return createEffectSourceAction(analysis, diagnostic);
1713
+ }
1714
+
1715
+ if (diagnostic.code === 'rmt.vnext.primitive.kernel-boundary') {
1716
+ return createKernelBoundaryCommandAction(analysis, diagnostic);
1717
+ }
1718
+
1719
+ return null;
1720
+ }
1721
+
1722
+ function actionKey(action) {
1723
+ if (!action) {
1724
+ return '';
1725
+ }
1726
+
1727
+ const dedupeKey = action.edit && action.edit.metadata && action.edit.metadata.dedupeKey;
1728
+
1729
+ if (dedupeKey) {
1730
+ return `${action.diagnosticCode}:${dedupeKey}`;
1731
+ }
1732
+
1733
+ const edit = action.edit ? JSON.stringify(action.edit) : '';
1734
+ const command = action.command ? JSON.stringify(action.command) : '';
1735
+
1736
+ return `${action.title}:${action.diagnosticCode}:${edit}:${command}`;
1737
+ }
1738
+
1739
+ function uniqueAndSortActions(actions) {
1740
+ const seen = new Set();
1741
+ const result = [];
1742
+
1743
+ actions.filter(Boolean).forEach((action) => {
1744
+ const key = actionKey(action);
1745
+
1746
+ if (seen.has(key)) {
1747
+ return;
1748
+ }
1749
+
1750
+ seen.add(key);
1751
+ result.push(action);
1752
+ });
1753
+
1754
+ return result.sort((left, right) => {
1755
+ const codeDiff = String(left.diagnosticCode || '').localeCompare(String(right.diagnosticCode || ''));
1756
+ return codeDiff !== 0 ? codeDiff : String(left.title || '').localeCompare(String(right.title || ''));
1757
+ });
1758
+ }
1759
+
1760
+ function mergeWorkspaceEdits(actions) {
1761
+ const changes = {};
1762
+ const repairKinds = [];
1763
+ const diagnosticCodes = [];
1764
+
1765
+ toArray(actions).forEach((action) => {
1766
+ if (!action || !action.edit || action.safe === false) {
1767
+ return;
1768
+ }
1769
+
1770
+ const metadata = action.edit.metadata || {};
1771
+
1772
+ if (metadata.repairKind) {
1773
+ repairKinds.push(metadata.repairKind);
1774
+ }
1775
+
1776
+ if (action.diagnosticCode) {
1777
+ diagnosticCodes.push(action.diagnosticCode);
1778
+ }
1779
+
1780
+ collectWorkspaceEditEntries(action.edit).forEach((entry) => {
1781
+ if (!changes[entry.uri]) {
1782
+ changes[entry.uri] = [];
1783
+ }
1784
+
1785
+ changes[entry.uri].push(entry.edit);
1786
+ });
1787
+ });
1788
+
1789
+ return {
1790
+ schema: RMT_WORKSPACE_EDIT_SCHEMA,
1791
+ changes,
1792
+ metadata: {
1793
+ repairKind: 'apply-all-safe-vnext-primitive-code-actions',
1794
+ actionCount: toArray(actions).filter((action) => action && action.edit && action.safe !== false).length,
1795
+ diagnosticCodes: Array.from(new Set(diagnosticCodes)).sort(),
1796
+ repairKinds: Array.from(new Set(repairKinds)).sort(),
1797
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE
1798
+ }
1799
+ };
1800
+ }
1801
+
1802
+ function createVNextPrimitiveFixAllAction(analysis, actions) {
1803
+ const safeActions = toArray(actions).filter((action) => action && action.edit && action.safe !== false);
1804
+
1805
+ if (safeActions.length < 2) {
1806
+ return null;
1807
+ }
1808
+
1809
+ const diagnosticCodes = Array.from(new Set(safeActions.map((action) => action.diagnosticCode).filter(Boolean))).sort();
1810
+
1811
+ return createVNextPrimitiveCodeAction({
1812
+ title: `Alle sicheren vNext-Primitive Quick-Fixes anwenden (${safeActions.length})`,
1813
+ kind: RMT_VNEXT_PRIMITIVE_FIX_ALL_KIND,
1814
+ diagnosticCode: 'rmt.vnext.primitive.fix-all-safe',
1815
+ pointer: null,
1816
+ diagnostics: safeActions.flatMap((action) => toArray(action.diagnostics)),
1817
+ edit: mergeWorkspaceEdits(safeActions),
1818
+ confidence: 'high',
1819
+ source: 'rmt-vnext-primitive-fix-all',
1820
+ isPreferred: false,
1821
+ preview: null,
1822
+ safe: true,
1823
+ fixAllActionCount: safeActions.length,
1824
+ diagnosticCodes
1825
+ });
1826
+ }
1827
+
1828
+ function normalizeDiagnosticFilters(diagnostics) {
1829
+ return toArray(diagnostics).map((diagnostic) => ({
1830
+ code: diagnostic.code || null,
1831
+ pointer: diagnostic.pointer || (diagnostic.data && diagnostic.data.pointer) || null
1832
+ }));
1833
+ }
1834
+
1835
+ function shouldIncludeDiagnostic(diagnostic, filters) {
1836
+ if (filters.length === 0) {
1837
+ return true;
1838
+ }
1839
+
1840
+ return filters.some((filter) => {
1841
+ const codeMatches = !filter.code || filter.code === diagnostic.code;
1842
+ const pointerMatches = !filter.pointer || filter.pointer === diagnostic.pointer;
1843
+
1844
+ return codeMatches && pointerMatches;
1845
+ });
1846
+ }
1847
+
1848
+ function getRmtVNextToolingCodeActions(input = {}, options = {}) {
1849
+ const analysis = options.analysis || analyzeRmtVNextToolingSource(input, options);
1850
+ const diagnostics = toArray(options.diagnostics || options.contextDiagnostics).length > 0
1851
+ ? toArray(analysis.diagnostics).filter((diagnostic) => shouldIncludeDiagnostic(
1852
+ diagnostic,
1853
+ normalizeDiagnosticFilters(options.diagnostics || options.contextDiagnostics)
1854
+ ))
1855
+ : toArray(analysis.diagnostics);
1856
+ const quickFixActions = uniqueAndSortActions(diagnostics.map((diagnostic) => createVNextPrimitiveActionForDiagnostic(analysis, diagnostic)))
1857
+ .map((action) => attachVNextPrimitiveActionPreview(analysis, action));
1858
+ const fixAllAction = attachVNextPrimitiveActionPreview(
1859
+ analysis,
1860
+ createVNextPrimitiveFixAllAction(analysis, quickFixActions)
1861
+ );
1862
+ const actions = fixAllAction ? [fixAllAction].concat(quickFixActions) : quickFixActions;
1863
+ const previews = actions.map((action) => action && action.preview).filter(Boolean);
1864
+
1865
+ return {
1866
+ schema: RMT_VNEXT_PRIMITIVE_CODE_ACTION_REPORT_SCHEMA,
1867
+ providerSchema: RMT_VNEXT_PRIMITIVE_CODE_ACTION_PROVIDER_SCHEMA,
1868
+ previewSchema: RMT_VNEXT_PRIMITIVE_CODE_ACTION_PREVIEW_SCHEMA,
1869
+ actionSchema: RMT_CODE_ACTION_SCHEMA,
1870
+ editSchema: RMT_WORKSPACE_EDIT_SCHEMA,
1871
+ workpackage: RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE,
1872
+ languageMode: 'vnext',
1873
+ status: analysis.sourceModel ? 'completed' : 'source_unavailable',
1874
+ ok: !!analysis.sourceModel,
1875
+ actionCount: actions.length,
1876
+ quickFixCount: quickFixActions.length,
1877
+ fixAllCount: fixAllAction ? 1 : 0,
1878
+ previewCount: previews.length,
1879
+ actions,
1880
+ diagnosticCount: diagnostics.length,
1881
+ graphStatus: analysis.graphStatus,
1882
+ sourceMapSummary: analysis.sourceMapSummary
1883
+ };
1884
+ }
1885
+
663
1886
  function formatRmtVNextSource(input = {}, options = {}) {
664
1887
  const text = getInputText(input);
665
1888
  const analysis = options.analysis || analyzeRmtVNextToolingSource(input, options);
@@ -698,27 +1921,46 @@ function createRmtVNextToolingAdapter(defaultOptions = {}) {
698
1921
  hover: (input = {}, options = {}) => getRmtVNextToolingHover(input, { ...defaultOptions, ...options }),
699
1922
  documentSymbols: (input = {}, options = {}) => getRmtVNextToolingDocumentSymbols(input, { ...defaultOptions, ...options }),
700
1923
  definition: (input = {}, options = {}) => getRmtVNextToolingDefinition(input, { ...defaultOptions, ...options }),
1924
+ codeActions: (input = {}, options = {}) => getRmtVNextToolingCodeActions(input, { ...defaultOptions, ...options }),
701
1925
  format: (input = {}, options = {}) => formatRmtVNextSource(input, { ...defaultOptions, ...options })
702
1926
  });
703
1927
  }
704
1928
 
705
1929
  module.exports = {
1930
+ RMT_CODE_ACTION_SCHEMA,
1931
+ RMT_WORKSPACE_EDIT_SCHEMA,
1932
+ RMT_VNEXT_PRIMITIVE_CODE_ACTION_PROVIDER_SCHEMA,
1933
+ RMT_VNEXT_PRIMITIVE_CODE_ACTION_PREVIEW_SCHEMA,
1934
+ RMT_VNEXT_PRIMITIVE_CODE_ACTION_REPORT_SCHEMA,
1935
+ RMT_VNEXT_PRIMITIVE_COMMAND_HANDOFF_SCHEMA,
1936
+ RMT_VNEXT_PRIMITIVE_FIX_ALL_KIND,
1937
+ RMT_VNEXT_PRIMITIVE_KERNEL_BOUNDARY_COMMAND,
706
1938
  RMT_VNEXT_TOOLING_FORMATTER_SCHEMA,
707
1939
  RMT_VNEXT_TOOLING_MODULE_PATH,
708
1940
  RMT_VNEXT_TOOLING_PACKAGE_SCRIPT,
1941
+ RMT_VNEXT_PRIMITIVE_AUTHORING_WORKPACKAGE,
709
1942
  RMT_VNEXT_TOOLING_REPORT_SCHEMA,
710
1943
  RMT_VNEXT_TOOLING_SCHEMA,
711
1944
  RMT_VNEXT_TOOLING_SUITE_PATH,
712
1945
  RMT_VNEXT_TOOLING_WORKPACKAGE,
713
1946
  VNEXT_COMPLETION_KEYWORDS,
714
1947
  VNEXT_LANES,
1948
+ VNEXT_PRIMITIVE_ACTION_CLAUSES,
1949
+ VNEXT_PRIMITIVE_KEYWORDS,
1950
+ VNEXT_PRIMITIVE_OVERLAY_KINDS,
1951
+ VNEXT_PRIMITIVE_RESOURCE_KINDS,
1952
+ VNEXT_PRIMITIVE_SELECTOR_CLAUSES,
1953
+ VNEXT_PRIMITIVE_STATE_CLAUSES,
1954
+ VNEXT_PRIMITIVE_SURFACE_CLAUSES,
715
1955
  VNEXT_SNIPPETS,
716
1956
  VNEXT_SOURCE_KINDS,
717
1957
  VNEXT_TRUST_BOUNDARIES,
718
1958
  analyzeRmtVNextToolingSource,
719
1959
  createRmtVNextToolingAdapter,
1960
+ createRmtVNextPrimitiveCommandHandoff,
720
1961
  findRmtVNextPointerAtPosition,
721
1962
  formatRmtVNextSource,
1963
+ getRmtVNextToolingCodeActions,
722
1964
  getRmtVNextToolingCompletions,
723
1965
  getRmtVNextToolingDefinition,
724
1966
  getRmtVNextToolingDocumentSymbols,