@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.
- package/CHANGELOG.md +2 -0
- package/README.md +4 -0
- package/catalog/component-catalog-coverage.js +2 -0
- package/catalog/epic13-package-export-lock.js +11 -1
- package/catalog/epic13-rmt-production-readiness.js +0 -1
- package/catalog/epic18-rmt-action-effect-runtime.d.ts +36 -0
- package/catalog/epic18-rmt-action-effect-runtime.js +249 -0
- package/catalog/epic18-rmt-app-platform-authoring.d.ts +39 -0
- package/catalog/epic18-rmt-app-platform-authoring.js +319 -0
- package/catalog/epic18-rmt-app-platform-fixture.d.ts +33 -0
- package/catalog/epic18-rmt-app-platform-fixture.js +221 -0
- package/catalog/epic18-rmt-app-platform-release-handoff.d.ts +30 -0
- package/catalog/epic18-rmt-app-platform-release-handoff.js +231 -0
- package/catalog/epic18-rmt-app-platform-tooling.d.ts +38 -0
- package/catalog/epic18-rmt-app-platform-tooling.js +242 -0
- package/catalog/epic18-rmt-component-template-primitives.d.ts +33 -0
- package/catalog/epic18-rmt-component-template-primitives.js +240 -0
- package/catalog/epic18-rmt-dom-descriptor-renderer.d.ts +35 -0
- package/catalog/epic18-rmt-dom-descriptor-renderer.js +232 -0
- package/catalog/epic18-rmt-event-routing-runtime.d.ts +35 -0
- package/catalog/epic18-rmt-event-routing-runtime.js +234 -0
- package/catalog/epic18-rmt-state-selector-runtime.d.ts +34 -0
- package/catalog/epic18-rmt-state-selector-runtime.js +216 -0
- package/catalog/epic18-rmt-surface-resource-graph-runtime.d.ts +36 -0
- package/catalog/epic18-rmt-surface-resource-graph-runtime.js +256 -0
- package/catalog/surface-manager-controller.js +5 -1
- package/catalog/surface-manager-materialization.js +7 -1
- package/catalog/surface-manager-overlay-bridge.js +41 -6
- package/catalog/surface-manager-workbench-fixture.js +1 -1
- package/catalog/surface-type-capability-matrix.d.ts +61 -0
- package/catalog/surface-type-capability-matrix.js +183 -0
- package/catalog/type-exports-rmt.js +37 -1
- package/catalog/type-exports.js +3 -3
- package/components/icon-packs/lucide.js +4 -0
- package/components/manifest.json +2 -0
- package/components/prism-rmt.d.ts +34 -0
- package/components/prism-rmt.js +130 -0
- package/components/xcards.js +15 -0
- package/components/xcode.d.ts +36 -1
- package/components/xcode.js +215 -20
- package/components/xfooter.js +17 -0
- package/components/xheader.js +14 -0
- package/components/xhero.js +16 -1
- package/components/xlink.js +97 -14
- package/components/xmasonry.js +15 -0
- package/components/xplayer.d.ts +44 -2
- package/components/xplayer.js +242 -15
- package/components/xrouter.js +27 -2
- package/components/xsection.js +15 -0
- package/components/xsidepanel.js +10 -2
- package/components/xsurfacemanager-controller.d.ts +2 -1
- package/components/xsurfacemanager-controller.js +27 -3
- package/components/xsurfacemanager.d.ts +2 -0
- package/components/xsurfacemanager.js +20 -8
- package/components/xsurfaceoverlay-bridge.d.ts +20 -5
- package/components/xsurfaceoverlay-bridge.js +114 -18
- package/components/xsurfaceportal.d.ts +29 -0
- package/components/xsurfaceportal.js +122 -0
- package/components/xsurfaceregion.d.ts +50 -0
- package/components/xsurfaceregion.js +285 -0
- package/components/xsurfacewindow.js +2 -1
- package/components/xtooltip.js +89 -23
- package/docs/README.md +222 -298
- package/docs/changelog.md +107 -0
- package/docs/component-catalog-coverage.md +9 -9
- package/docs/component-platform.md +19 -1
- package/docs/component-ux-app-authoring.md +56 -63
- package/docs/components/xcode.md +83 -53
- package/docs/components/xsurfaceportal.md +32 -0
- package/docs/components/xsurfaceregion.md +37 -0
- package/docs/components.md +105 -69
- package/docs/de/README.md +264 -0
- package/docs/de/XTend-ADR.md +221 -0
- package/docs/de/a11y-keyboard-smokes.md +62 -0
- package/docs/de/about.md +18 -0
- package/docs/de/api.md +157 -0
- package/docs/de/best-practices.md +76 -0
- package/docs/de/changelog.md +107 -0
- package/docs/de/component-catalog-coverage.md +58 -0
- package/docs/de/component-lab.md +103 -0
- package/docs/de/component-long-tail-migration.md +41 -0
- package/docs/de/component-platform.md +177 -0
- package/docs/de/component-ux-app-authoring.md +123 -0
- package/docs/de/component-ux-authoring.md +96 -0
- package/docs/de/component-ux-gates.md +45 -0
- package/docs/de/components/x-rmt-lifecycle-demo-build.md +60 -0
- package/docs/de/components/xalert.md +81 -0
- package/docs/de/components/xbutton.md +103 -0
- package/docs/de/components/xcalendar.md +82 -0
- package/docs/de/components/xcards.md +128 -0
- package/docs/de/components/xcheckbox.md +102 -0
- package/docs/de/components/xcode.md +156 -0
- package/docs/de/components/xdialog.md +92 -0
- package/docs/de/components/xdrawer.md +84 -0
- package/docs/de/components/xfooter.md +126 -0
- package/docs/de/components/xform.md +128 -0
- package/docs/de/components/xheader.md +308 -0
- package/docs/de/components/xhero.md +142 -0
- package/docs/de/components/xicon.md +125 -0
- package/docs/de/components/xinput.md +129 -0
- package/docs/de/components/xlightbox.md +98 -0
- package/docs/de/components/xlink.md +109 -0
- package/docs/de/components/xmasonry.md +124 -0
- package/docs/de/components/xmenu.md +158 -0
- package/docs/de/components/xmodal.md +82 -0
- package/docs/de/components/xplayer.md +104 -0
- package/docs/de/components/xpopover.md +67 -0
- package/docs/de/components/xprogress.md +56 -0
- package/docs/de/components/xradio.md +103 -0
- package/docs/de/components/xrouter.md +260 -0
- package/docs/de/components/xsection.md +125 -0
- package/docs/de/components/xselect.md +105 -0
- package/docs/de/components/xsidepanel.md +30 -0
- package/docs/de/components/xspinner.md +102 -0
- package/docs/de/components/xstate.md +148 -0
- package/docs/de/components/xstatus.md +55 -0
- package/docs/de/components/xsummary.md +78 -0
- package/docs/de/components/xsurfacemanager.md +27 -0
- package/docs/de/components/xsurfacewindow.md +21 -0
- package/docs/de/components/xtabs.md +160 -0
- package/docs/de/components/xtextarea.md +98 -0
- package/docs/de/components/xtheme.md +167 -0
- package/docs/de/components/xtoast.md +62 -0
- package/docs/de/components/xtooltip.md +66 -0
- package/docs/de/components/xtype.md +82 -0
- package/docs/de/components/xutils.md +144 -0
- package/docs/de/components/xwriter.md +94 -0
- package/docs/de/components.md +153 -0
- package/docs/de/conditional-network-evidence-ci.md +38 -0
- package/docs/de/conditional-network-evidence.md +50 -0
- package/docs/de/core-migration-guide.md +110 -0
- package/docs/de/design-tokens.md +116 -0
- package/docs/de/docs-rmt-production-hardening.md +31 -0
- package/docs/de/enterprise-adoption.md +413 -0
- package/docs/de/enterprise-component-flex-release-handoff.md +129 -0
- package/docs/de/epic10-platform-gates.md +62 -0
- package/docs/de/epic10-release-handoff.md +81 -0
- package/docs/de/epic11-enterprise-ux-handoff.md +70 -0
- package/docs/de/epic12-rc0-handoff.md +61 -0
- package/docs/de/epic18-media-manager-vendor-upstream.md +318 -0
- package/docs/de/epic18-rmt-app-platform-release-handoff.md +67 -0
- package/docs/de/epic18-vendor-bugfixes.md +34 -0
- package/docs/de/existing-component-metadata.md +67 -0
- package/docs/de/hydration-performance-closure.md +34 -0
- package/docs/de/hydration-policies.md +71 -0
- package/docs/de/known-residual-triage.md +22 -0
- package/docs/de/manifest-import-policy.md +79 -0
- package/docs/de/manifest.md +112 -0
- package/docs/de/motion-contrast.md +67 -0
- package/docs/de/package-export-lock.md +44 -0
- package/docs/de/performance-measurements.md +106 -0
- package/docs/de/performance-regression.md +89 -0
- package/docs/de/performance.md +94 -0
- package/docs/de/previews/README.md +17 -0
- package/docs/de/prod-browser-csp-smokes.md +40 -0
- package/docs/de/public-component-types.md +79 -0
- package/docs/de/quick-start-guide.md +220 -0
- package/docs/de/rc0-adoption-guide.md +102 -0
- package/docs/de/rc0-gate-matrix.md +58 -0
- package/docs/de/rc1-gate-matrix-ci-handoff.md +56 -0
- package/docs/de/rc1-migration-notes.md +69 -0
- package/docs/de/rc1-readiness.md +46 -0
- package/docs/de/release-owner-acceptance.md +56 -0
- package/docs/de/release-report-pack-dry-run-evidence.md +39 -0
- package/docs/de/rmt-action-effect-runtime.md +81 -0
- package/docs/de/rmt-app-platform-authoring.md +54 -0
- package/docs/de/rmt-app-platform-fixture.md +46 -0
- package/docs/de/rmt-app-platform-migration-guide.md +88 -0
- package/docs/de/rmt-app-platform-tooling.md +79 -0
- package/docs/de/rmt-component-template-primitives.md +57 -0
- package/docs/de/rmt-dom-descriptor-renderer.md +64 -0
- package/docs/de/rmt-dsl-authoring-polish.md +145 -0
- package/docs/de/rmt-event-routing-runtime.md +81 -0
- package/docs/de/rmt-first-demo-app.md +77 -0
- package/docs/de/rmt-first-xtend-apps.md +129 -0
- package/docs/de/rmt-kernel-panic-recovery-incident-handoff.md +61 -0
- package/docs/de/rmt-kernel-security-hardening-migration.md +50 -0
- package/docs/de/rmt-kernel-trusted-output-authoring.md +69 -0
- package/docs/de/rmt-language-server.md +234 -0
- package/docs/de/rmt-lifecycle-demo.md +24 -0
- package/docs/de/rmt-linter.md +140 -0
- package/docs/de/rmt-node-ssr-adapter.md +100 -0
- package/docs/de/rmt-php-ssr-adapter.md +120 -0
- package/docs/de/rmt-production-readiness.md +63 -0
- package/docs/de/rmt-state-selector-runtime.md +47 -0
- package/docs/de/rmt-surface-resource-graph-runtime.md +92 -0
- package/docs/de/rmt-tooling-release-gates.md +77 -0
- package/docs/de/rmt-vnext-authoring.md +170 -0
- package/docs/de/rmt-vnext-component-primitives.md +188 -0
- package/docs/de/rmt-vnext-cross-surface-events.md +68 -0
- package/docs/de/rmt-vnext-enterprise-mfe-handoff.md +70 -0
- package/docs/de/rmt-vnext-fabric-bridge-evidence.md +81 -0
- package/docs/de/rmt-vnext-migration-notes.md +62 -0
- package/docs/de/rmt-vnext-primitive-authoring-tooling.md +247 -0
- package/docs/de/rmt-vnext-primitive-grammar-design.md +289 -0
- package/docs/de/rmt-vnext-primitive-lowering.md +108 -0
- package/docs/de/rmt-vnext-primitive-migration.md +119 -0
- package/docs/de/rmt-vnext-primitive-parser-ast.md +76 -0
- package/docs/de/rmt-vnext-primitive-semantic-graph.md +118 -0
- package/docs/de/rmt-vnext-primitives-compiler-backlog.md +739 -0
- package/docs/de/rmt-vnext-release-handoff.md +83 -0
- package/docs/de/rmt-vnext-remote-surfaces.md +90 -0
- package/docs/de/rmt-vnext-source-to-sea-gate.md +612 -0
- package/docs/de/rmt-vnext-surface-registry-enterprise.md +76 -0
- package/docs/de/screenreader-signals.md +56 -0
- package/docs/de/supply-chain-gates.md +100 -0
- package/docs/de/surface-manager-authoring-guide.md +94 -0
- package/docs/de/surface-manager-browser-lab.md +45 -0
- package/docs/de/surface-manager-component-lab.md +43 -0
- package/docs/de/surface-manager-controller.md +66 -0
- package/docs/de/surface-manager-layout-engines.md +32 -0
- package/docs/de/surface-manager-lazy-hydration.md +63 -0
- package/docs/de/surface-manager-migration-guide.md +122 -0
- package/docs/de/surface-manager-native-rmt-surfaces.md +38 -0
- package/docs/de/surface-manager-overlay-bridge.md +53 -0
- package/docs/de/surface-manager-persistence.md +30 -0
- package/docs/de/surface-manager-quality-gates.md +51 -0
- package/docs/de/surface-manager-release-handoff.md +68 -0
- package/docs/de/surface-manager-remote-policy.md +54 -0
- package/docs/de/surface-manager-rmt-authoring.md +102 -0
- package/docs/de/surface-manager-route-lifecycle.md +59 -0
- package/docs/de/surface-manager-runtime-release-handoff.md +69 -0
- package/docs/de/surface-manager-side-panel-runtime.md +36 -0
- package/docs/de/surface-manager-stack-policy.md +39 -0
- package/docs/de/surface-manager-window-runtime.md +47 -0
- package/docs/de/surface-manager-workbench-fixture.md +43 -0
- package/docs/de/third-party-design-authoring.md +406 -0
- package/docs/de/trusted-dom-boundary-browser-proof.md +32 -0
- package/docs/de/trusted-dom-sanitizing.md +110 -0
- package/docs/de/type-exports.md +61 -0
- package/docs/de/typescript-components.md +63 -0
- package/docs/de/visual-browser-regression.md +83 -0
- package/docs/de/visual-owner-artifacts.md +46 -0
- package/docs/de/visual-snapshot-automation.md +87 -0
- package/docs/de/xtend-api-types.md +55 -0
- package/docs/de/xtend-builder-types.md +55 -0
- package/docs/de/xtend-catalog-types.md +44 -0
- package/docs/de/xtend-fabric-rmt-lane-mapping.md +143 -0
- package/docs/de/xtend-fabric.md +474 -0
- package/docs/de/xtend-loader-types.md +58 -0
- package/docs/de/xtend-loader.md +265 -0
- package/docs/de/xtend-policy-types.md +38 -0
- package/docs/de/xtend-rmt-types.md +40 -0
- package/docs/de/xtend-vendor-types.md +36 -0
- package/docs/de/xtendrmt-app-dsl.md +334 -0
- package/docs/de/xtendrmt-migration-guide.md +266 -0
- package/docs/de/xtendrmt-native-authoring.md +333 -0
- package/docs/de/xtendrmt-overview.md +109 -0
- package/docs/de/xtendrmt-parsedown-scheduling.md +301 -0
- package/docs/de/xtendrmt-runtime-bridge.md +155 -0
- package/docs/en/README.md +163 -0
- package/docs/en/XTend-ADR.md +221 -0
- package/docs/en/a11y-keyboard-smokes.md +68 -0
- package/docs/en/about.md +25 -0
- package/docs/en/api.md +171 -0
- package/docs/en/best-practices.md +125 -0
- package/docs/en/changelog.md +104 -0
- package/docs/en/component-catalog-coverage.md +104 -0
- package/docs/en/component-lab.md +103 -0
- package/docs/en/component-long-tail-migration.md +41 -0
- package/docs/en/component-platform.md +243 -0
- package/docs/en/component-ux-app-authoring.md +118 -0
- package/docs/en/component-ux-authoring.md +96 -0
- package/docs/en/component-ux-gates.md +45 -0
- package/docs/en/components/x-rmt-lifecycle-demo-build.md +75 -0
- package/docs/en/components/xalert.md +94 -0
- package/docs/en/components/xbutton.md +118 -0
- package/docs/en/components/xcalendar.md +95 -0
- package/docs/en/components/xcards.md +139 -0
- package/docs/en/components/xcheckbox.md +118 -0
- package/docs/en/components/xcode.md +153 -0
- package/docs/en/components/xdialog.md +108 -0
- package/docs/en/components/xdrawer.md +110 -0
- package/docs/en/components/xfooter.md +138 -0
- package/docs/en/components/xform.md +147 -0
- package/docs/en/components/xheader.md +308 -0
- package/docs/en/components/xhero.md +157 -0
- package/docs/en/components/xicon.md +149 -0
- package/docs/en/components/xinput.md +147 -0
- package/docs/en/components/xlightbox.md +113 -0
- package/docs/en/components/xlink.md +130 -0
- package/docs/en/components/xmasonry.md +136 -0
- package/docs/en/components/xmenu.md +185 -0
- package/docs/en/components/xmodal.md +102 -0
- package/docs/en/components/xplayer.md +114 -0
- package/docs/en/components/xpopover.md +87 -0
- package/docs/en/components/xprogress.md +73 -0
- package/docs/en/components/xradio.md +119 -0
- package/docs/en/components/xrouter.md +260 -0
- package/docs/en/components/xsection.md +136 -0
- package/docs/en/components/xselect.md +122 -0
- package/docs/en/components/xsidepanel.md +48 -0
- package/docs/en/components/xspinner.md +118 -0
- package/docs/en/components/xstate.md +163 -0
- package/docs/en/components/xstatus.md +71 -0
- package/docs/en/components/xsummary.md +90 -0
- package/docs/en/components/xsurfacemanager.md +42 -0
- package/docs/en/components/xsurfacewindow.md +31 -0
- package/docs/en/components/xtabs.md +187 -0
- package/docs/en/components/xtextarea.md +115 -0
- package/docs/en/components/xtheme.md +203 -0
- package/docs/en/components/xtoast.md +78 -0
- package/docs/en/components/xtooltip.md +85 -0
- package/docs/en/components/xtype.md +91 -0
- package/docs/en/components/xutils.md +161 -0
- package/docs/en/components/xwriter.md +106 -0
- package/docs/en/components.md +151 -0
- package/docs/en/conditional-network-evidence-ci.md +38 -0
- package/docs/en/conditional-network-evidence.md +50 -0
- package/docs/en/core-migration-guide.md +110 -0
- package/docs/en/design-tokens.md +137 -0
- package/docs/en/docs-rmt-production-hardening.md +31 -0
- package/docs/en/enterprise-adoption.md +413 -0
- package/docs/en/enterprise-component-flex-release-handoff.md +129 -0
- package/docs/en/epic10-platform-gates.md +62 -0
- package/docs/en/epic10-release-handoff.md +81 -0
- package/docs/en/epic11-enterprise-ux-handoff.md +70 -0
- package/docs/en/epic12-rc0-handoff.md +61 -0
- package/docs/en/epic18-media-manager-vendor-upstream.md +232 -0
- package/docs/en/epic18-rmt-app-platform-release-handoff.md +60 -0
- package/docs/en/epic18-vendor-bugfixes.md +29 -0
- package/docs/en/existing-component-metadata.md +67 -0
- package/docs/en/hydration-performance-closure.md +34 -0
- package/docs/en/hydration-policies.md +75 -0
- package/docs/en/known-residual-triage.md +22 -0
- package/docs/en/manifest-import-policy.md +81 -0
- package/docs/en/manifest.md +135 -0
- package/docs/en/motion-contrast.md +67 -0
- package/docs/en/package-export-lock.md +44 -0
- package/docs/en/performance-measurements.md +106 -0
- package/docs/en/performance-regression.md +89 -0
- package/docs/en/performance.md +132 -0
- package/docs/en/previews/README.md +17 -0
- package/docs/en/prod-browser-csp-smokes.md +40 -0
- package/docs/en/public-component-types.md +79 -0
- package/docs/en/quick-start-guide.md +189 -0
- package/docs/en/rc0-adoption-guide.md +102 -0
- package/docs/en/rc0-gate-matrix.md +58 -0
- package/docs/en/rc1-gate-matrix-ci-handoff.md +56 -0
- package/docs/en/rc1-migration-notes.md +69 -0
- package/docs/en/rc1-readiness.md +46 -0
- package/docs/en/release-owner-acceptance.md +56 -0
- package/docs/en/release-report-pack-dry-run-evidence.md +39 -0
- package/docs/en/rmt-action-effect-runtime.md +101 -0
- package/docs/en/rmt-app-platform-authoring.md +47 -0
- package/docs/en/rmt-app-platform-fixture.md +35 -0
- package/docs/en/rmt-app-platform-migration-guide.md +75 -0
- package/docs/en/rmt-app-platform-tooling.md +58 -0
- package/docs/en/rmt-component-template-primitives.md +49 -0
- package/docs/en/rmt-dom-descriptor-renderer.md +54 -0
- package/docs/en/rmt-dsl-authoring-polish.md +143 -0
- package/docs/en/rmt-event-routing-runtime.md +98 -0
- package/docs/en/rmt-first-demo-app.md +87 -0
- package/docs/en/rmt-first-xtend-apps.md +127 -0
- package/docs/en/rmt-kernel-panic-recovery-incident-handoff.md +60 -0
- package/docs/en/rmt-kernel-security-hardening-migration.md +49 -0
- package/docs/en/rmt-kernel-trusted-output-authoring.md +68 -0
- package/docs/en/rmt-language-server.md +243 -0
- package/docs/en/rmt-lifecycle-demo.md +23 -0
- package/docs/en/rmt-linter.md +146 -0
- package/docs/en/rmt-node-ssr-adapter.md +99 -0
- package/docs/en/rmt-php-ssr-adapter.md +118 -0
- package/docs/en/rmt-production-readiness.md +63 -0
- package/docs/en/rmt-state-selector-runtime.md +34 -0
- package/docs/en/rmt-surface-resource-graph-runtime.md +68 -0
- package/docs/en/rmt-tooling-release-gates.md +77 -0
- package/docs/en/rmt-vnext-authoring.md +102 -0
- package/docs/en/rmt-vnext-component-primitives.md +185 -0
- package/docs/en/rmt-vnext-cross-surface-events.md +59 -0
- package/docs/en/rmt-vnext-enterprise-mfe-handoff.md +62 -0
- package/docs/en/rmt-vnext-fabric-bridge-evidence.md +64 -0
- package/docs/en/rmt-vnext-migration-notes.md +62 -0
- package/docs/en/rmt-vnext-primitive-authoring-tooling.md +174 -0
- package/docs/en/rmt-vnext-primitive-grammar-design.md +268 -0
- package/docs/en/rmt-vnext-primitive-lowering.md +91 -0
- package/docs/en/rmt-vnext-primitive-migration.md +93 -0
- package/docs/en/rmt-vnext-primitive-parser-ast.md +59 -0
- package/docs/en/rmt-vnext-primitive-semantic-graph.md +103 -0
- package/docs/en/rmt-vnext-primitives-compiler-backlog.md +327 -0
- package/docs/en/rmt-vnext-release-handoff.md +83 -0
- package/docs/en/rmt-vnext-remote-surfaces.md +81 -0
- package/docs/en/rmt-vnext-source-to-sea-gate.md +482 -0
- package/docs/en/rmt-vnext-surface-registry-enterprise.md +68 -0
- package/docs/en/screenreader-signals.md +56 -0
- package/docs/en/supply-chain-gates.md +106 -0
- package/docs/en/surface-manager-authoring-guide.md +94 -0
- package/docs/en/surface-manager-browser-lab.md +45 -0
- package/docs/en/surface-manager-component-lab.md +43 -0
- package/docs/en/surface-manager-controller.md +66 -0
- package/docs/en/surface-manager-layout-engines.md +32 -0
- package/docs/en/surface-manager-lazy-hydration.md +63 -0
- package/docs/en/surface-manager-migration-guide.md +113 -0
- package/docs/en/surface-manager-native-rmt-surfaces.md +38 -0
- package/docs/en/surface-manager-overlay-bridge.md +53 -0
- package/docs/en/surface-manager-persistence.md +30 -0
- package/docs/en/surface-manager-quality-gates.md +51 -0
- package/docs/en/surface-manager-release-handoff.md +68 -0
- package/docs/en/surface-manager-remote-policy.md +54 -0
- package/docs/en/surface-manager-rmt-authoring.md +89 -0
- package/docs/en/surface-manager-route-lifecycle.md +59 -0
- package/docs/en/surface-manager-runtime-release-handoff.md +69 -0
- package/docs/en/surface-manager-side-panel-runtime.md +36 -0
- package/docs/en/surface-manager-stack-policy.md +39 -0
- package/docs/en/surface-manager-window-runtime.md +47 -0
- package/docs/en/surface-manager-workbench-fixture.md +43 -0
- package/docs/en/third-party-design-authoring.md +406 -0
- package/docs/en/trusted-dom-boundary-browser-proof.md +32 -0
- package/docs/en/trusted-dom-sanitizing.md +124 -0
- package/docs/en/type-exports.md +61 -0
- package/docs/en/typescript-components.md +63 -0
- package/docs/en/visual-browser-regression.md +83 -0
- package/docs/en/visual-owner-artifacts.md +46 -0
- package/docs/en/visual-snapshot-automation.md +87 -0
- package/docs/en/xtend-api-types.md +55 -0
- package/docs/en/xtend-builder-types.md +55 -0
- package/docs/en/xtend-catalog-types.md +44 -0
- package/docs/en/xtend-fabric-rmt-lane-mapping.md +143 -0
- package/docs/en/xtend-fabric.md +474 -0
- package/docs/en/xtend-loader-types.md +58 -0
- package/docs/en/xtend-loader.md +265 -0
- package/docs/en/xtend-policy-types.md +38 -0
- package/docs/en/xtend-rmt-types.md +40 -0
- package/docs/en/xtend-vendor-types.md +36 -0
- package/docs/en/xtendrmt-app-dsl.md +331 -0
- package/docs/en/xtendrmt-migration-guide.md +256 -0
- package/docs/en/xtendrmt-native-authoring.md +336 -0
- package/docs/en/xtendrmt-overview.md +63 -0
- package/docs/en/xtendrmt-parsedown-scheduling.md +301 -0
- package/docs/en/xtendrmt-runtime-bridge.md +155 -0
- package/docs/enterprise-adoption.md +4 -2
- package/docs/epic18-media-manager-vendor-upstream.md +318 -0
- package/docs/epic18-rmt-app-platform-release-handoff.md +67 -0
- package/docs/epic18-vendor-bugfixes.md +34 -0
- package/docs/index.php +1056 -109
- package/docs/manifest.md +8 -2
- package/docs/menu.json +986 -133
- package/docs/package-export-lock.md +2 -2
- package/docs/public-component-types.md +2 -2
- package/docs/quick-start-guide.md +126 -58
- package/docs/rmt-action-effect-runtime.md +101 -0
- package/docs/rmt-app-platform-authoring.md +54 -0
- package/docs/rmt-app-platform-fixture.md +46 -0
- package/docs/rmt-app-platform-migration-guide.md +88 -0
- package/docs/rmt-app-platform-tooling.md +79 -0
- package/docs/rmt-component-template-primitives.md +57 -0
- package/docs/rmt-dom-descriptor-renderer.md +64 -0
- package/docs/rmt-dsl-authoring-polish.md +67 -44
- package/docs/rmt-event-routing-runtime.md +98 -0
- package/docs/rmt-first-demo-app.md +2 -2
- package/docs/rmt-first-xtend-apps.md +70 -46
- package/docs/rmt-language-server.md +61 -4
- package/docs/rmt-lifecycle-demo.md +1 -2
- package/docs/rmt-node-ssr-adapter.md +144 -0
- package/docs/rmt-php-ssr-adapter.md +158 -0
- package/docs/rmt-state-selector-runtime.md +47 -0
- package/docs/rmt-surface-resource-graph-runtime.md +92 -0
- package/docs/rmt-vnext-authoring.md +128 -18
- package/docs/rmt-vnext-component-primitives.md +188 -0
- package/docs/rmt-vnext-fabric-bridge-evidence.md +81 -0
- package/docs/rmt-vnext-primitive-authoring-tooling.md +247 -0
- package/docs/rmt-vnext-primitive-grammar-design.md +289 -0
- package/docs/rmt-vnext-primitive-lowering.md +108 -0
- package/docs/rmt-vnext-primitive-migration.md +119 -0
- package/docs/rmt-vnext-primitive-parser-ast.md +76 -0
- package/docs/rmt-vnext-primitive-semantic-graph.md +118 -0
- package/docs/rmt-vnext-primitives-compiler-backlog.md +742 -0
- package/docs/rmt-vnext-release-handoff.md +14 -0
- package/docs/rmt-vnext-source-to-sea-gate.md +629 -0
- package/docs/surface-manager-migration-guide.md +34 -6
- package/docs/surface-manager-overlay-bridge.md +9 -4
- package/docs/surface-manager-rmt-authoring.md +50 -34
- package/docs/surface-manager-workbench-fixture.md +1 -2
- package/docs/third-party-design-authoring.md +1 -1
- package/docs/type-exports.md +3 -3
- package/docs/utils/pageloader.js +811 -62
- package/docs/visual-browser-regression.md +1 -1
- package/docs/xtend-rmt-types.md +3 -2
- package/docs/xtendrmt-app-dsl.md +187 -122
- package/docs/xtendrmt-docs-shell-vnext.rmt +165 -0
- package/docs/xtendrmt-migration-guide.md +48 -17
- package/docs/xtendrmt-native-authoring.md +213 -217
- package/docs/xtendrmt-overview.md +81 -61
- package/docs/xtendrmt-parsedown-scheduling.md +23 -8
- package/fabric/package.json +1 -1
- package/package.json +684 -21
- package/tools/package.json +5 -1
- package/tools/rmt-editor/vscode/README.md +72 -5
- package/tools/rmt-editor/vscode/XTend-Logo.png +0 -0
- package/tools/rmt-editor/vscode/extension.d.ts +33 -0
- package/tools/rmt-editor/vscode/extension.js +1816 -7
- package/tools/rmt-editor/vscode/language-configuration.json +2 -1
- package/tools/rmt-editor/vscode/package.json +193 -2
- package/tools/rmt-editor/vscode/snippets/rmt.code-snippets +41 -0
- package/tools/rmt-editor/vscode/syntaxes/rmt.tmLanguage.json +103 -1
- package/tools/rmt-editor/vscode/templates/launch.json +70 -0
- package/tools/rmt-editor/vscode/templates/tasks.json +172 -0
- package/tools/rmt-editor/vscode/xtend-rmt-language-0.0.0-enterprise-readiness.vsix +0 -0
- package/tools/rmt-language/app-platform-tooling.d.ts +128 -0
- package/tools/rmt-language/app-platform-tooling.js +677 -0
- package/tools/rmt-language/completions.d.ts +5 -0
- package/tools/rmt-language/completions.js +185 -3
- package/tools/rmt-language/diagnostics.js +54 -0
- package/tools/rmt-language/hover.js +36 -0
- package/tools/rmt-language/rmt-tooling-public-types.d.ts +7 -0
- package/tools/rmt-language/rules/app-platform-policy.js +39 -0
- package/tools/rmt-language/rules/index.js +5 -1
- package/tools/rmt-language/semantic-graph.d.ts +6 -0
- package/tools/rmt-language/semantic-graph.js +928 -0
- package/tools/rmt-language/snippets/index.js +44 -0
- package/tools/rmt-language/snippets/rmt.code-snippets +41 -0
- package/tools/rmt-language/vnext-compatibility.d.ts +10 -0
- package/tools/rmt-language/vnext-compatibility.js +642 -0
- package/tools/rmt-language/vnext-compiler.d.ts +5 -0
- package/tools/rmt-language/vnext-compiler.js +863 -17
- package/tools/rmt-language/vnext-parser.js +725 -9
- package/tools/rmt-language/vnext-release.d.ts +1 -0
- package/tools/rmt-language/vnext-release.js +20 -0
- package/tools/rmt-language/vnext-source-to-sea.d.ts +33 -0
- package/tools/rmt-language/vnext-source-to-sea.js +2227 -0
- package/tools/rmt-language/vnext-surfaces.js +111 -52
- package/tools/rmt-language/vnext-tooling.d.ts +19 -1
- package/tools/rmt-language/vnext-tooling.js +1247 -5
- package/tools/rmt-language-server/protocol.js +3 -0
- package/tools/rmt-language-server/server.d.ts +2 -0
- package/tools/rmt-language-server/server.js +176 -22
- package/tools/rmt-linter/cli.d.ts +2 -0
- package/tools/rmt-linter/cli.js +62 -0
- package/xtend-builder/generators/registry.js +11 -0
- package/xtend-builder/generators/rmt-app-platform.js +239 -0
- package/xtend-builder/generators/rmt-lifecycle-demo.js +3 -11
- package/xtend-builder/lib/cli.js +38 -0
- package/xtend-builder/package.json +3 -3
- package/xtend-builder/scaffold.config.js +29 -2
- package/xtend.css +49 -2
- package/xtendrmt/package.json +49 -1
- package/xtendrmt/rmt-action-effect-runtime.d.ts +126 -0
- package/xtendrmt/rmt-action-effect-runtime.js +494 -0
- package/xtendrmt/rmt-component-capability-registry.d.ts +180 -0
- package/xtendrmt/rmt-component-capability-registry.js +636 -0
- package/xtendrmt/rmt-core.d.ts +6 -0
- package/xtendrmt/rmt-core.esm.js +32 -6
- package/xtendrmt/rmt-dom-descriptor-renderer.d.ts +107 -0
- package/xtendrmt/rmt-dom-descriptor-renderer.js +1066 -0
- package/xtendrmt/rmt-event-routing-runtime.d.ts +144 -0
- package/xtendrmt/rmt-event-routing-runtime.js +666 -0
- package/xtendrmt/rmt-lifecycle-demo.app.js +2 -2
- package/xtendrmt/rmt-lifecycle-demo.core.json +4 -0
- package/xtendrmt/rmt-lifecycle-demo.rmt-build.app.js +1 -1
- package/xtendrmt/rmt-lifecycle-demo.rmt-build.scaffold.json +2 -2
- package/xtendrmt/rmt-lifecycle-demo.scaffold.json +4 -4
- package/xtendrmt/rmt-native-shell-runtime.d.ts +77 -0
- package/xtendrmt/rmt-native-shell-runtime.js +309 -0
- package/xtendrmt/rmt-node-ssr-adapter.d.ts +197 -0
- package/xtendrmt/rmt-node-ssr-adapter.js +1006 -0
- package/xtendrmt/rmt-php-ssr-adapter.php +976 -0
- package/xtendrmt/rmt-runtime.browser.js +32 -6
- package/xtendrmt/rmt-runtime.esm.js +32 -6
- package/xtendrmt/rmt-state-selector-runtime.d.ts +166 -0
- package/xtendrmt/rmt-state-selector-runtime.js +866 -0
- package/xtendrmt/rmt-surface-resource-graph-runtime.d.ts +224 -0
- package/xtendrmt/rmt-surface-resource-graph-runtime.js +932 -0
- package/xtendrmt/rmt-vnext-enterprise-mfe-demo.core.json +3 -0
- package/xtendrmt/rmt-vnext-reference-demo.core.json +3 -0
- package/xtendrmt/xtendrmt-bestcase-demo.core.json +3420 -372
- package/xtendrmt/xtendrmt-bestcase-demo.js +424 -8
- 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
|
|
434
|
-
const
|
|
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,
|