@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
|
@@ -0,0 +1,1066 @@
|
|
|
1
|
+
(function attachRmtDomDescriptorRenderer(globalTarget) {
|
|
2
|
+
const RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA = 'xtend.epic18.rmt-dom-descriptor-renderer.v1';
|
|
3
|
+
const RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA = 'xtend.epic18.rmt-dom-renderer-diagnostic.v1';
|
|
4
|
+
const TRUSTED_DOM_BOUNDARY = 'xtend.rmt.trusted-dom-boundary.explicit';
|
|
5
|
+
const DEFAULT_DIAGNOSTIC_CHANNEL = 'rmt.app_platform.dom_descriptor';
|
|
6
|
+
const SAFE_TAG_NAME = /^[a-z][a-z0-9.-]*$/u;
|
|
7
|
+
const URL_ATTRIBUTE_NAMES = new Set(['href', 'src', 'action', 'formaction', 'poster']);
|
|
8
|
+
const BLOCKED_ATTRIBUTE_NAMES = new Set(['srcdoc']);
|
|
9
|
+
const BLOCKED_PROPERTY_NAMES = new Set(['innerHTML', 'outerHTML', 'insertAdjacentHTML']);
|
|
10
|
+
const MANUAL_HTML_PATTERNS = Object.freeze([
|
|
11
|
+
{ id: 'root.innerHTML', pattern: /\broot\s*\.\s*innerHTML\s*=/u },
|
|
12
|
+
{ id: 'element.innerHTML', pattern: /\belement\s*\.\s*innerHTML\s*=/u },
|
|
13
|
+
{ id: 'template.innerHTML', pattern: /\btemplate\s*\.\s*innerHTML\s*=/u },
|
|
14
|
+
{ id: 'any.innerHTML', pattern: /\.\s*innerHTML\s*=/u },
|
|
15
|
+
{ id: 'outerHTML', pattern: /\.\s*outerHTML\s*=/u },
|
|
16
|
+
{ id: 'insertAdjacentHTML', pattern: /\.\s*insertAdjacentHTML\s*\(/u },
|
|
17
|
+
{ id: 'document.write', pattern: /\bdocument\s*\.\s*write\s*\(/u },
|
|
18
|
+
{ id: 'createContextualFragment', pattern: /\bcreateContextualFragment\s*\(/u }
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
function clampString(value, fallback = '') {
|
|
22
|
+
const normalized = String(value == null ? '' : value).trim();
|
|
23
|
+
return normalized || fallback;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function toArray(value) {
|
|
27
|
+
return Array.isArray(value) ? value : (value == null ? [] : [value]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function objectRecord(value) {
|
|
31
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function isNodeLike(value) {
|
|
35
|
+
return !!value && typeof value === 'object' && (
|
|
36
|
+
typeof value.nodeType === 'number'
|
|
37
|
+
|| typeof value.appendChild === 'function'
|
|
38
|
+
|| typeof value.replaceChildren === 'function'
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function resolveDocumentTarget(deps = {}) {
|
|
43
|
+
if (deps.documentTarget && typeof deps.documentTarget.createElement === 'function') {
|
|
44
|
+
return deps.documentTarget;
|
|
45
|
+
}
|
|
46
|
+
const globalDocument = globalTarget && globalTarget.document;
|
|
47
|
+
if (globalDocument && typeof globalDocument.createElement === 'function') {
|
|
48
|
+
return globalDocument;
|
|
49
|
+
}
|
|
50
|
+
throw new Error('RMT DOM Descriptor Renderer benoetigt ein documentTarget mit createElement().');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function createDiagnosticsRecorder(deps = {}) {
|
|
54
|
+
const diagnostics = [];
|
|
55
|
+
const diagnosticsHub = deps.diagnosticsHub || null;
|
|
56
|
+
const channel = clampString(deps.diagnosticChannel, DEFAULT_DIAGNOSTIC_CHANNEL);
|
|
57
|
+
|
|
58
|
+
function publish(diagnostic) {
|
|
59
|
+
diagnostics.push(diagnostic);
|
|
60
|
+
if (diagnosticsHub && typeof diagnosticsHub.publish === 'function') {
|
|
61
|
+
diagnosticsHub.publish(channel, diagnostic, {
|
|
62
|
+
schema: RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return diagnostic;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
diagnostics,
|
|
70
|
+
publish
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function safeSource(source = {}) {
|
|
75
|
+
return {
|
|
76
|
+
documentId: clampString(source.documentId, ''),
|
|
77
|
+
templateId: clampString(source.templateId, ''),
|
|
78
|
+
nodeId: clampString(source.nodeId, ''),
|
|
79
|
+
pointer: clampString(source.pointer, ''),
|
|
80
|
+
line: Number.isFinite(source.line) ? source.line : null,
|
|
81
|
+
column: Number.isFinite(source.column) ? source.column : null
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function createDiagnostic(code, message, descriptor = {}, context = {}, severity = 'error') {
|
|
86
|
+
return {
|
|
87
|
+
schema: RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA,
|
|
88
|
+
code,
|
|
89
|
+
message,
|
|
90
|
+
severity,
|
|
91
|
+
source: safeSource({
|
|
92
|
+
...(context.source || {}),
|
|
93
|
+
...(descriptor.source || {}),
|
|
94
|
+
templateId: descriptor.templateId || (descriptor.source && descriptor.source.templateId) || (context.source && context.source.templateId),
|
|
95
|
+
nodeId: descriptor.id || descriptor.nodeId || (context.source && context.source.nodeId),
|
|
96
|
+
pointer: descriptor.pointer || (descriptor.source && descriptor.source.pointer) || (context.source && context.source.pointer)
|
|
97
|
+
})
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function createRendererError(code, message, descriptor = {}, context = {}) {
|
|
102
|
+
const diagnostic = createDiagnostic(code, message, descriptor, context);
|
|
103
|
+
const error = new Error(message);
|
|
104
|
+
error.code = code;
|
|
105
|
+
error.diagnostic = diagnostic;
|
|
106
|
+
return error;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function isSafeUrl(value) {
|
|
110
|
+
const normalized = String(value == null ? '' : value).trim().toLowerCase();
|
|
111
|
+
if (!normalized) return true;
|
|
112
|
+
if (normalized.startsWith('#') || normalized.startsWith('/') || normalized.startsWith('./') || normalized.startsWith('../')) return true;
|
|
113
|
+
return /^(https?:|mailto:|tel:|blob:)/u.test(normalized);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function isSafeAttributeName(name) {
|
|
117
|
+
const normalized = clampString(name).toLowerCase();
|
|
118
|
+
if (!normalized) return false;
|
|
119
|
+
if (normalized.startsWith('on')) return false;
|
|
120
|
+
if (BLOCKED_ATTRIBUTE_NAMES.has(normalized)) return false;
|
|
121
|
+
return /^[a-z_:][a-z0-9_.:-]*$/u.test(normalized);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isSafePropertyName(name) {
|
|
125
|
+
const normalized = clampString(name);
|
|
126
|
+
if (!normalized) return false;
|
|
127
|
+
if (normalized.startsWith('on')) return false;
|
|
128
|
+
return !BLOCKED_PROPERTY_NAMES.has(normalized);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function createText(documentTarget, value) {
|
|
132
|
+
if (typeof documentTarget.createTextNode === 'function') {
|
|
133
|
+
return documentTarget.createTextNode(String(value == null ? '' : value));
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
nodeType: 3,
|
|
137
|
+
textContent: String(value == null ? '' : value),
|
|
138
|
+
parentNode: null
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function createFragment(documentTarget) {
|
|
143
|
+
if (typeof documentTarget.createDocumentFragment === 'function') {
|
|
144
|
+
return documentTarget.createDocumentFragment();
|
|
145
|
+
}
|
|
146
|
+
const fragment = {
|
|
147
|
+
nodeType: 11,
|
|
148
|
+
childNodes: [],
|
|
149
|
+
appendChild(child) {
|
|
150
|
+
this.childNodes.push(child);
|
|
151
|
+
child.parentNode = this;
|
|
152
|
+
return child;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
return fragment;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function appendNodes(parent, nodes) {
|
|
159
|
+
toArray(nodes).forEach((node) => {
|
|
160
|
+
if (node && typeof parent.appendChild === 'function') {
|
|
161
|
+
parent.appendChild(node);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function replaceChildren(parent, nodes) {
|
|
167
|
+
const normalizedNodes = toArray(nodes).filter(Boolean);
|
|
168
|
+
if (typeof parent.replaceChildren === 'function') {
|
|
169
|
+
parent.replaceChildren(...normalizedNodes);
|
|
170
|
+
return normalizedNodes;
|
|
171
|
+
}
|
|
172
|
+
while (parent.firstChild && typeof parent.removeChild === 'function') {
|
|
173
|
+
parent.removeChild(parent.firstChild);
|
|
174
|
+
}
|
|
175
|
+
if (Array.isArray(parent.childNodes)) {
|
|
176
|
+
parent.childNodes.slice().forEach((child) => {
|
|
177
|
+
if (typeof parent.removeChild === 'function') {
|
|
178
|
+
parent.removeChild(child);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
if (!parent.removeChild) parent.childNodes = [];
|
|
182
|
+
}
|
|
183
|
+
appendNodes(parent, normalizedNodes);
|
|
184
|
+
return normalizedNodes;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function setAttributeSafe(element, name, value, descriptor, context) {
|
|
188
|
+
const normalizedName = clampString(name);
|
|
189
|
+
if (!isSafeAttributeName(normalizedName)) {
|
|
190
|
+
throw createRendererError('rmt.dom.attribute.unsafe', `Unsicheres Attribut ${normalizedName}`, descriptor, context);
|
|
191
|
+
}
|
|
192
|
+
const resolvedValue = resolveValue(value, context, context.item);
|
|
193
|
+
if (URL_ATTRIBUTE_NAMES.has(normalizedName.toLowerCase()) && !isSafeUrl(resolvedValue)) {
|
|
194
|
+
throw createRendererError('rmt.dom.attribute.url-unsafe', `Unsichere URL fuer Attribut ${normalizedName}`, descriptor, context);
|
|
195
|
+
}
|
|
196
|
+
if (resolvedValue === false || resolvedValue === null || typeof resolvedValue === 'undefined') {
|
|
197
|
+
if (typeof element.removeAttribute === 'function') element.removeAttribute(normalizedName);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (typeof element.setAttribute === 'function') {
|
|
201
|
+
element.setAttribute(normalizedName, resolvedValue === true ? '' : String(resolvedValue));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function applyStyleObject(element, styleRecord, descriptor, context) {
|
|
206
|
+
if (!styleRecord || typeof styleRecord !== 'object' || Array.isArray(styleRecord)) {
|
|
207
|
+
throw createRendererError('rmt.dom.style.invalid', 'Style darf nur als strukturiertes Objekt gesetzt werden.', descriptor, context);
|
|
208
|
+
}
|
|
209
|
+
Object.entries(styleRecord).forEach(([name, value]) => {
|
|
210
|
+
const normalizedName = clampString(name);
|
|
211
|
+
if (!/^(--[a-z0-9-]+|[a-z][a-z0-9-]*)$/u.test(normalizedName)) {
|
|
212
|
+
throw createRendererError('rmt.dom.style.unsafe-name', `Unsicherer Style-Name ${normalizedName}`, descriptor, context);
|
|
213
|
+
}
|
|
214
|
+
if (element.style && typeof element.style.setProperty === 'function') {
|
|
215
|
+
element.style.setProperty(normalizedName, String(resolveValue(value, context, context.item) == null ? '' : resolveValue(value, context, context.item)));
|
|
216
|
+
} else if (element.style && typeof element.style === 'object') {
|
|
217
|
+
element.style[normalizedName] = String(resolveValue(value, context, context.item) == null ? '' : resolveValue(value, context, context.item));
|
|
218
|
+
} else {
|
|
219
|
+
setAttributeSafe(element, `data-style-${normalizedName.replace(/^--/u, '')}`, value, descriptor, context);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function normalizeClassTokens(value, context, item) {
|
|
225
|
+
if (!value) return [];
|
|
226
|
+
if (typeof value === 'string') {
|
|
227
|
+
const resolved = resolveValue(value, context, item);
|
|
228
|
+
return String(resolved == null ? '' : resolved).split(/\s+/u).filter(Boolean);
|
|
229
|
+
}
|
|
230
|
+
if (Array.isArray(value)) {
|
|
231
|
+
return value.flatMap((entry) => normalizeClassTokens(entry, context, item));
|
|
232
|
+
}
|
|
233
|
+
if (typeof value === 'object') {
|
|
234
|
+
return Object.entries(value)
|
|
235
|
+
.filter(([, enabled]) => !!resolveValue(enabled, context, item))
|
|
236
|
+
.map(([className]) => className);
|
|
237
|
+
}
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function applyClassPrimitive(element, descriptor, context) {
|
|
242
|
+
const tokens = [
|
|
243
|
+
...normalizeClassTokens(descriptor.class, context, context.item),
|
|
244
|
+
...normalizeClassTokens(descriptor.className, context, context.item),
|
|
245
|
+
...normalizeClassTokens(descriptor.classes, context, context.item)
|
|
246
|
+
].filter((token, index, allTokens) => allTokens.indexOf(token) === index);
|
|
247
|
+
if (!tokens.length) return;
|
|
248
|
+
tokens.forEach((token) => {
|
|
249
|
+
if (!/^-?[_a-zA-Z]+[_a-zA-Z0-9-:]*$/u.test(token)) {
|
|
250
|
+
throw createRendererError('rmt.dom.class.unsafe', `Unsichere Klasse ${token}`, descriptor, context);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
setAttributeSafe(element, 'class', tokens.join(' '), descriptor, context);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function normalizePartTokens(value, context, item) {
|
|
257
|
+
return normalizeClassTokens(value, context, item);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function applyPartPrimitive(element, descriptor, context) {
|
|
261
|
+
const tokens = [
|
|
262
|
+
...normalizePartTokens(descriptor.part, context, context.item),
|
|
263
|
+
...normalizePartTokens(descriptor.parts, context, context.item)
|
|
264
|
+
].filter((token, index, allTokens) => allTokens.indexOf(token) === index);
|
|
265
|
+
if (!tokens.length) return;
|
|
266
|
+
tokens.forEach((token) => {
|
|
267
|
+
if (!/^[a-z][a-z0-9-]*$/u.test(token)) {
|
|
268
|
+
throw createRendererError('rmt.dom.part.unsafe', `Unsicherer Part ${token}`, descriptor, context);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
setAttributeSafe(element, 'part', tokens.join(' '), descriptor, context);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function normalizeStyleTokenName(name) {
|
|
275
|
+
const normalized = clampString(name).replace(/[A-Z]/gu, (match) => `-${match.toLowerCase()}`).toLowerCase();
|
|
276
|
+
return /^[a-z][a-z0-9-]*$/u.test(normalized) ? normalized : '';
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function applyStyleTokens(element, descriptor, context) {
|
|
280
|
+
const tokens = {
|
|
281
|
+
...objectRecord(descriptor.styleToken),
|
|
282
|
+
...objectRecord(descriptor.styleTokens),
|
|
283
|
+
...objectRecord(descriptor['style-token'])
|
|
284
|
+
};
|
|
285
|
+
Object.entries(tokens).forEach(([name, value]) => {
|
|
286
|
+
const tokenName = normalizeStyleTokenName(name);
|
|
287
|
+
if (!tokenName) {
|
|
288
|
+
throw createRendererError('rmt.dom.style-token.unsafe-name', `Unsicherer Style-Token ${name}`, descriptor, context);
|
|
289
|
+
}
|
|
290
|
+
const resolvedValue = resolveValue(value, context, context.item);
|
|
291
|
+
setAttributeSafe(element, `data-style-token-${tokenName}`, resolvedValue, descriptor, context);
|
|
292
|
+
if (element.style && typeof element.style.setProperty === 'function') {
|
|
293
|
+
element.style.setProperty(`--xtend-${tokenName}`, String(resolvedValue == null ? '' : resolvedValue));
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function applyRefPrimitive(element, descriptor, context) {
|
|
299
|
+
const ref = clampString(resolveValue(descriptor.ref || descriptor.nodeRef, context, context.item));
|
|
300
|
+
if (!ref) return;
|
|
301
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_.:-]*$/u.test(ref)) {
|
|
302
|
+
throw createRendererError('rmt.dom.ref.unsafe', `Unsichere Ref ${ref}`, descriptor, context);
|
|
303
|
+
}
|
|
304
|
+
setAttributeSafe(element, 'data-rmt-ref', ref, descriptor, context);
|
|
305
|
+
if (context.refs && typeof context.refs.set === 'function') {
|
|
306
|
+
context.refs.set(ref, element);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function applyAttributes(element, attributes, descriptor, context) {
|
|
311
|
+
Object.entries(attributes || {}).forEach(([name, value]) => {
|
|
312
|
+
if (name === 'style') {
|
|
313
|
+
applyStyleObject(element, value, descriptor, context);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
setAttributeSafe(element, name, value, descriptor, context);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function applyProperties(element, properties, descriptor, context) {
|
|
321
|
+
Object.entries(properties || {}).forEach(([name, value]) => {
|
|
322
|
+
const normalizedName = clampString(name);
|
|
323
|
+
if (!isSafePropertyName(normalizedName)) {
|
|
324
|
+
throw createRendererError('rmt.dom.property.unsafe', `Unsichere Property ${normalizedName}`, descriptor, context);
|
|
325
|
+
}
|
|
326
|
+
const resolvedValue = resolveValue(value, context, context.item);
|
|
327
|
+
try {
|
|
328
|
+
element[normalizedName] = resolvedValue;
|
|
329
|
+
} catch (_) {
|
|
330
|
+
setAttributeSafe(element, normalizedName, resolvedValue, descriptor, context);
|
|
331
|
+
}
|
|
332
|
+
if (typeof resolvedValue === 'string' || typeof resolvedValue === 'number' || typeof resolvedValue === 'boolean') {
|
|
333
|
+
setAttributeSafe(element, normalizedName, resolvedValue, descriptor, context);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function applyEvents(element, events, descriptor, context) {
|
|
339
|
+
Object.entries(events || {}).forEach(([eventName, actionId]) => {
|
|
340
|
+
const normalizedEvent = clampString(eventName);
|
|
341
|
+
if (!normalizedEvent || normalizedEvent.toLowerCase().startsWith('on')) {
|
|
342
|
+
throw createRendererError('rmt.dom.event.unsafe', `Unsicherer Event-Name ${normalizedEvent}`, descriptor, context);
|
|
343
|
+
}
|
|
344
|
+
if (typeof element.addEventListener !== 'function') return;
|
|
345
|
+
element.addEventListener(normalizedEvent, (event) => {
|
|
346
|
+
if (typeof context.dispatchEvent === 'function') {
|
|
347
|
+
context.dispatchEvent({
|
|
348
|
+
id: actionId,
|
|
349
|
+
eventName: normalizedEvent,
|
|
350
|
+
nativeEvent: event,
|
|
351
|
+
source: descriptor.id || descriptor.component || descriptor.tag || ''
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function normalizePathSegments(path) {
|
|
359
|
+
return String(path || '')
|
|
360
|
+
.replace(/\[([0-9]+)\]/gu, '.$1')
|
|
361
|
+
.split('.')
|
|
362
|
+
.filter(Boolean);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function readPath(model, path) {
|
|
366
|
+
const parts = normalizePathSegments(path);
|
|
367
|
+
let cursor = model;
|
|
368
|
+
for (const part of parts) {
|
|
369
|
+
if (cursor == null) return undefined;
|
|
370
|
+
if (part === 'length' && (Array.isArray(cursor) || typeof cursor === 'string')) return cursor.length;
|
|
371
|
+
cursor = cursor[part];
|
|
372
|
+
}
|
|
373
|
+
return cursor;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function isEmptyValue(value) {
|
|
377
|
+
return value === null || typeof value === 'undefined' || value === '';
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function applyFallback(value, fallback, context, item) {
|
|
381
|
+
return isEmptyValue(value) && typeof fallback !== 'undefined'
|
|
382
|
+
? resolveValue(fallback, context, item)
|
|
383
|
+
: value;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function compareValues(left, right, op, options = {}) {
|
|
387
|
+
const normalizedOp = clampString(op, 'equals');
|
|
388
|
+
if ((right === '' || right == null) && options.empty === 'pass') return true;
|
|
389
|
+
if (normalizedOp === 'equals' || normalizedOp === 'eq') return left === right;
|
|
390
|
+
if (normalizedOp === 'not-equals' || normalizedOp === 'neq') return left !== right;
|
|
391
|
+
if (normalizedOp === 'truthy') return !!left;
|
|
392
|
+
if (normalizedOp === 'falsy') return !left;
|
|
393
|
+
if (normalizedOp === 'gt') return Number(left) > Number(right);
|
|
394
|
+
if (normalizedOp === 'gte') return Number(left) >= Number(right);
|
|
395
|
+
if (normalizedOp === 'lt') return Number(left) < Number(right);
|
|
396
|
+
if (normalizedOp === 'lte') return Number(left) <= Number(right);
|
|
397
|
+
if (normalizedOp === 'in') return Array.isArray(right) && right.includes(left);
|
|
398
|
+
if (normalizedOp === 'includes' || normalizedOp === 'contains') {
|
|
399
|
+
if (Array.isArray(left)) return left.includes(right);
|
|
400
|
+
const leftText = String(left == null ? '' : left);
|
|
401
|
+
const rightText = String(right == null ? '' : right);
|
|
402
|
+
return options.ignoreCase ? leftText.toLowerCase().includes(rightText.toLowerCase()) : leftText.includes(rightText);
|
|
403
|
+
}
|
|
404
|
+
return left === right;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function evaluateRule(rule, context, item) {
|
|
408
|
+
if (typeof rule === 'string') return !!resolveValue(rule, context, item);
|
|
409
|
+
const record = objectRecord(rule);
|
|
410
|
+
const left = record.left
|
|
411
|
+
? resolveValue(record.left, context, item)
|
|
412
|
+
: readPath(item, record.path || record.field || '');
|
|
413
|
+
const right = Object.prototype.hasOwnProperty.call(record, 'right')
|
|
414
|
+
? resolveValue(record.right, context, item)
|
|
415
|
+
: resolveValue(record.value, context, item);
|
|
416
|
+
return compareValues(left, right, record.op || record.operator, record);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function formatBytes(value) {
|
|
420
|
+
const bytes = Number(value);
|
|
421
|
+
if (!Number.isFinite(bytes)) return '';
|
|
422
|
+
if (bytes === 0) return '0 B';
|
|
423
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
424
|
+
const index = Math.min(Math.floor(Math.log(Math.abs(bytes)) / Math.log(1024)), units.length - 1);
|
|
425
|
+
const amount = bytes / Math.pow(1024, index);
|
|
426
|
+
const precision = index === 0 || Math.abs(amount) >= 10 ? 0 : 1;
|
|
427
|
+
return `${amount.toFixed(precision)} ${units[index]}`;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function formatDateShort(value) {
|
|
431
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
432
|
+
if (Number.isNaN(date.getTime())) return '';
|
|
433
|
+
return date.toISOString().slice(0, 10);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function formatDuration(value) {
|
|
437
|
+
const totalSeconds = Math.max(0, Math.floor(Number(value) || 0));
|
|
438
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
439
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
440
|
+
const seconds = totalSeconds % 60;
|
|
441
|
+
const padded = (entry) => String(entry).padStart(2, '0');
|
|
442
|
+
return hours > 0 ? `${hours}:${padded(minutes)}:${padded(seconds)}` : `${minutes}:${padded(seconds)}`;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function resolvePathExpression(path, context, item) {
|
|
446
|
+
const expression = clampString(path, '');
|
|
447
|
+
if (!expression) return undefined;
|
|
448
|
+
if (expression === '$item') return item;
|
|
449
|
+
if (expression.startsWith('$item.')) return readPath(item, expression.slice(6));
|
|
450
|
+
if (expression.startsWith('$selector.')) {
|
|
451
|
+
const selectorKey = `selector.${expression.slice(10)}`;
|
|
452
|
+
if (context.selectorValues && Object.prototype.hasOwnProperty.call(context.selectorValues, selectorKey)) return context.selectorValues[selectorKey];
|
|
453
|
+
return readPath(context.model, selectorKey);
|
|
454
|
+
}
|
|
455
|
+
if (expression.startsWith('selector.') && context.selectorValues && Object.prototype.hasOwnProperty.call(context.selectorValues, expression)) {
|
|
456
|
+
return context.selectorValues[expression];
|
|
457
|
+
}
|
|
458
|
+
if (expression.startsWith('$derive.')) {
|
|
459
|
+
const deriveKey = `derive.${expression.slice(8)}`;
|
|
460
|
+
return readPath(context.model, deriveKey);
|
|
461
|
+
}
|
|
462
|
+
if (expression.startsWith('$state.')) return readPath(context.model, expression.slice(7));
|
|
463
|
+
if (expression.startsWith('$model.')) return readPath(context.model, expression.slice(7));
|
|
464
|
+
if (Object.prototype.hasOwnProperty.call(context.model || {}, expression)) return context.model[expression];
|
|
465
|
+
return readPath(context.model, expression);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function interpolateString(value, context, item) {
|
|
469
|
+
return String(value).replace(/\$\{([^}]+)\}/gu, (_, expression) => {
|
|
470
|
+
const normalized = clampString(expression, '');
|
|
471
|
+
const resolved = resolveValue(normalized.startsWith('$') ? normalized : `$${normalized}`, context, item);
|
|
472
|
+
return String(resolved == null ? '' : resolved);
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function evaluateExpression(record, context, item) {
|
|
477
|
+
const op = clampString(record.op || record.operator || record.kind || record.format, '');
|
|
478
|
+
const hasValue = Object.prototype.hasOwnProperty.call(record, 'value') || Object.prototype.hasOwnProperty.call(record, 'from') || Object.prototype.hasOwnProperty.call(record, 'source');
|
|
479
|
+
const sourceExpression = Object.prototype.hasOwnProperty.call(record, 'value')
|
|
480
|
+
? record.value
|
|
481
|
+
: (Object.prototype.hasOwnProperty.call(record, 'from') ? record.from : record.source);
|
|
482
|
+
const source = hasValue ? resolveValue(sourceExpression, context, item) : (record.path ? resolvePathExpression(record.path, context, item) : undefined);
|
|
483
|
+
let result;
|
|
484
|
+
|
|
485
|
+
switch (op) {
|
|
486
|
+
case '':
|
|
487
|
+
case 'path':
|
|
488
|
+
result = record.path ? resolvePathExpression(record.path, context, item) : source;
|
|
489
|
+
break;
|
|
490
|
+
case 'fallback':
|
|
491
|
+
result = applyFallback(source, record.fallback, context, item);
|
|
492
|
+
break;
|
|
493
|
+
case 'uppercase':
|
|
494
|
+
case 'upper':
|
|
495
|
+
result = String(source == null ? '' : source).toUpperCase();
|
|
496
|
+
break;
|
|
497
|
+
case 'lowercase':
|
|
498
|
+
case 'lower':
|
|
499
|
+
result = String(source == null ? '' : source).toLowerCase();
|
|
500
|
+
break;
|
|
501
|
+
case 'replace': {
|
|
502
|
+
const search = resolveValue(record.search, context, item);
|
|
503
|
+
const replacement = resolveValue(record.replacement, context, item);
|
|
504
|
+
result = String(source == null ? '' : source).replace(new RegExp(String(search == null ? '' : search), record.flags || 'gu'), String(replacement == null ? '' : replacement));
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
case 'concat':
|
|
508
|
+
case 'interpolate':
|
|
509
|
+
result = toArray(record.values || record.parts || source).map((entry) => resolveValue(entry, context, item)).join(record.separator || '');
|
|
510
|
+
break;
|
|
511
|
+
case 'slice':
|
|
512
|
+
result = Array.isArray(source) || typeof source === 'string'
|
|
513
|
+
? source.slice(Number(resolveValue(record.start || 0, context, item)), typeof record.end === 'undefined' ? undefined : Number(resolveValue(record.end, context, item)))
|
|
514
|
+
: [];
|
|
515
|
+
break;
|
|
516
|
+
case 'contains':
|
|
517
|
+
case 'includes':
|
|
518
|
+
result = compareValues(source, resolveValue(record.search || record.item || record.right, context, item), 'contains', record);
|
|
519
|
+
break;
|
|
520
|
+
case 'map':
|
|
521
|
+
result = Array.isArray(source)
|
|
522
|
+
? source.map((entry) => record.path ? readPath(entry, record.path) : resolveValue(record.expression || '$item', { ...context, item: entry }, entry))
|
|
523
|
+
: [];
|
|
524
|
+
break;
|
|
525
|
+
case 'filter':
|
|
526
|
+
result = Array.isArray(source)
|
|
527
|
+
? source.filter((entry) => toArray(record.where || record.filter || record.rules).every((rule) => evaluateRule(rule, context, entry)))
|
|
528
|
+
: [];
|
|
529
|
+
break;
|
|
530
|
+
case 'reduce':
|
|
531
|
+
if (record.mode === 'sum') {
|
|
532
|
+
result = Array.isArray(source) ? source.reduce((sum, entry) => sum + Number(record.path ? readPath(entry, record.path) : entry || 0), 0) : 0;
|
|
533
|
+
} else {
|
|
534
|
+
result = Array.isArray(source) || typeof source === 'string' ? source.length : Object.keys(objectRecord(source)).length;
|
|
535
|
+
}
|
|
536
|
+
break;
|
|
537
|
+
case 'countBy':
|
|
538
|
+
case 'count-by':
|
|
539
|
+
result = {};
|
|
540
|
+
if (Array.isArray(source)) {
|
|
541
|
+
source.forEach((entry) => {
|
|
542
|
+
const key = clampString(record.path ? readPath(entry, record.path) : resolveValue(record.key || '$item', { ...context, item: entry }, entry), 'unknown');
|
|
543
|
+
result[key] = (result[key] || 0) + 1;
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
break;
|
|
547
|
+
case 'formatBytes':
|
|
548
|
+
case 'bytes':
|
|
549
|
+
result = formatBytes(source);
|
|
550
|
+
break;
|
|
551
|
+
case 'formatDateShort':
|
|
552
|
+
case 'dateShort':
|
|
553
|
+
result = formatDateShort(source);
|
|
554
|
+
break;
|
|
555
|
+
case 'formatDuration':
|
|
556
|
+
case 'duration':
|
|
557
|
+
result = formatDuration(source);
|
|
558
|
+
break;
|
|
559
|
+
default:
|
|
560
|
+
result = hasValue ? source : record;
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return applyFallback(result, record.fallback, context, item);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function resolveValue(value, context, item) {
|
|
568
|
+
if (Array.isArray(value)) return value.map((entry) => resolveValue(entry, context, item));
|
|
569
|
+
if (value && typeof value === 'object' && !isNodeLike(value)) return evaluateExpression(value, context, item);
|
|
570
|
+
if (typeof value !== 'string') return value;
|
|
571
|
+
if (value.includes('${')) return interpolateString(value, context, item);
|
|
572
|
+
const resolved = resolvePathExpression(value, context, item);
|
|
573
|
+
return typeof resolved === 'undefined' ? value : resolved;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function resolveComponent(descriptor, context) {
|
|
577
|
+
const componentId = descriptor.component || descriptor.ref || descriptor.id || '';
|
|
578
|
+
const component = componentId && context.components ? context.components.get(componentId) : null;
|
|
579
|
+
const registry = context.componentRegistry || null;
|
|
580
|
+
const requestedTag = clampString(descriptor.tag || descriptor.componentTag || (component && component.tag) || componentId, '');
|
|
581
|
+
const capability = registry && typeof registry.resolveComponentCapability === 'function'
|
|
582
|
+
? registry.resolveComponentCapability(requestedTag) || registry.resolveComponentCapability(componentId)
|
|
583
|
+
: null;
|
|
584
|
+
const registryDescriptor = capability && typeof registry.buildComponentDescriptor === 'function'
|
|
585
|
+
? registry.buildComponentDescriptor({
|
|
586
|
+
...descriptor,
|
|
587
|
+
id: descriptor.id || componentId || capability.tag,
|
|
588
|
+
component: componentId || capability.tag,
|
|
589
|
+
tag: descriptor.tag || capability.tag
|
|
590
|
+
}, {
|
|
591
|
+
source: context.source || null
|
|
592
|
+
})
|
|
593
|
+
: null;
|
|
594
|
+
return {
|
|
595
|
+
id: componentId,
|
|
596
|
+
tag: clampString(descriptor.tag || (component && component.tag) || (capability && capability.tag), 'div'),
|
|
597
|
+
capability,
|
|
598
|
+
attributes: {
|
|
599
|
+
...objectRecord(registryDescriptor && registryDescriptor.attributes),
|
|
600
|
+
...objectRecord(component && component.attributes),
|
|
601
|
+
...(descriptor.attributes || {})
|
|
602
|
+
},
|
|
603
|
+
properties: {
|
|
604
|
+
...objectRecord(registryDescriptor && registryDescriptor.properties),
|
|
605
|
+
...objectRecord(component && component.properties),
|
|
606
|
+
...objectRecord(component && component.props),
|
|
607
|
+
...(descriptor.properties || descriptor.props || {})
|
|
608
|
+
},
|
|
609
|
+
slots: {
|
|
610
|
+
...objectRecord(component && component.slots),
|
|
611
|
+
...objectRecord(descriptor.slots)
|
|
612
|
+
},
|
|
613
|
+
parts: [
|
|
614
|
+
...toArray(registryDescriptor && registryDescriptor.parts),
|
|
615
|
+
...toArray(component && component.parts),
|
|
616
|
+
...toArray(descriptor.parts || descriptor.part)
|
|
617
|
+
],
|
|
618
|
+
classes: [
|
|
619
|
+
...toArray(component && (component.class || component.className || component.classes)),
|
|
620
|
+
...toArray(descriptor.class || descriptor.className || descriptor.classes)
|
|
621
|
+
],
|
|
622
|
+
styleTokens: {
|
|
623
|
+
...objectRecord(component && (component.styleTokens || component.styleToken || component['style-token'])),
|
|
624
|
+
...objectRecord(descriptor.styleTokens || descriptor.styleToken || descriptor['style-token'])
|
|
625
|
+
},
|
|
626
|
+
events: {
|
|
627
|
+
...objectRecord(registryDescriptor && registryDescriptor.events),
|
|
628
|
+
...objectRecord(component && component.events),
|
|
629
|
+
...objectRecord(descriptor.events)
|
|
630
|
+
}
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
function renderTemplate(templateId, context, item) {
|
|
635
|
+
const template = context.templates ? context.templates.get(templateId) : null;
|
|
636
|
+
if (!template) {
|
|
637
|
+
throw createRendererError('rmt.dom.template.missing', `RMT Template ${templateId} wurde nicht gefunden.`, {
|
|
638
|
+
id: templateId
|
|
639
|
+
}, context);
|
|
640
|
+
}
|
|
641
|
+
return renderNode(template.root || template.node || template, {
|
|
642
|
+
...context,
|
|
643
|
+
source: {
|
|
644
|
+
...(context.source || {}),
|
|
645
|
+
templateId
|
|
646
|
+
},
|
|
647
|
+
item
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
function renderSlot(slotId, context, item) {
|
|
652
|
+
const slot = context.slots ? context.slots.get(slotId) : null;
|
|
653
|
+
if (!slot) {
|
|
654
|
+
throw createRendererError('rmt.dom.slot.missing', `RMT Slot ${slotId} wurde nicht gefunden.`, {
|
|
655
|
+
id: slotId
|
|
656
|
+
}, context);
|
|
657
|
+
}
|
|
658
|
+
return renderTemplate(slot.template, context, item);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
function renderSlotContent(slotContent, context, item) {
|
|
662
|
+
if (typeof slotContent === 'string') {
|
|
663
|
+
return renderSlot(slotContent, context, item);
|
|
664
|
+
}
|
|
665
|
+
if (!slotContent || typeof slotContent !== 'object') {
|
|
666
|
+
return createFragment(context.documentTarget);
|
|
667
|
+
}
|
|
668
|
+
if (slotContent.template) return renderTemplate(slotContent.template, context, item);
|
|
669
|
+
if (slotContent.component) return renderNode({ type: 'component', ...slotContent }, context);
|
|
670
|
+
if (Object.prototype.hasOwnProperty.call(slotContent, 'text')) {
|
|
671
|
+
return createText(context.documentTarget, resolveValue(slotContent.text, context, item));
|
|
672
|
+
}
|
|
673
|
+
return renderNode(slotContent.descriptor || slotContent.node || slotContent.children || slotContent, context);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
function renderTrustedHtml(descriptor, context) {
|
|
677
|
+
if (descriptor.trustedBoundary !== TRUSTED_DOM_BOUNDARY) {
|
|
678
|
+
throw createRendererError('rmt.dom.trusted-boundary.missing', 'Trusted HTML benoetigt die explizite Trusted-DOM-Boundary.', descriptor, context);
|
|
679
|
+
}
|
|
680
|
+
if (typeof context.trustedDomRenderer !== 'function') {
|
|
681
|
+
throw createRendererError('rmt.dom.trusted-renderer.missing', 'Trusted HTML benoetigt einen expliziten trustedDomRenderer ausserhalb des Standard-Renderers.', descriptor, context);
|
|
682
|
+
}
|
|
683
|
+
const rendered = context.trustedDomRenderer(descriptor, context);
|
|
684
|
+
if (!isNodeLike(rendered) && !Array.isArray(rendered)) {
|
|
685
|
+
throw createRendererError('rmt.dom.trusted-renderer.invalid', 'trustedDomRenderer muss Node oder Node[] liefern.', descriptor, context);
|
|
686
|
+
}
|
|
687
|
+
return rendered;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
function materializeChildren(element, children, context, item) {
|
|
691
|
+
const rendered = [];
|
|
692
|
+
toArray(children).forEach((child, index) => {
|
|
693
|
+
const childNodes = renderNode(child, {
|
|
694
|
+
...context,
|
|
695
|
+
source: {
|
|
696
|
+
...(context.source || {}),
|
|
697
|
+
pointer: `${(context.source && context.source.pointer) || ''}/children/${index}`
|
|
698
|
+
},
|
|
699
|
+
item
|
|
700
|
+
});
|
|
701
|
+
rendered.push(...toArray(childNodes));
|
|
702
|
+
});
|
|
703
|
+
replaceChildren(element, rendered);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
function renderElement(descriptor, context) {
|
|
707
|
+
const tag = clampString(descriptor.tag, 'div');
|
|
708
|
+
if (!SAFE_TAG_NAME.test(tag)) {
|
|
709
|
+
throw createRendererError('rmt.dom.tag.unsafe', `Unsicherer oder ungueltiger Tag ${tag}`, descriptor, context);
|
|
710
|
+
}
|
|
711
|
+
const element = context.documentTarget.createElement(tag);
|
|
712
|
+
if (descriptor.id) setAttributeSafe(element, 'data-rmt-node', descriptor.id, descriptor, context);
|
|
713
|
+
if (descriptor.key) setAttributeSafe(element, 'data-rmt-key', resolveValue(descriptor.key, context, context.item), descriptor, context);
|
|
714
|
+
applyAttributes(element, descriptor.attributes || {}, descriptor, context);
|
|
715
|
+
applyProperties(element, descriptor.properties || descriptor.props || {}, descriptor, context);
|
|
716
|
+
applyClassPrimitive(element, descriptor, context);
|
|
717
|
+
applyPartPrimitive(element, descriptor, context);
|
|
718
|
+
applyStyleTokens(element, descriptor, context);
|
|
719
|
+
applyRefPrimitive(element, descriptor, context);
|
|
720
|
+
applyEvents(element, descriptor.events || {}, descriptor, context);
|
|
721
|
+
if (Object.prototype.hasOwnProperty.call(descriptor, 'text')) {
|
|
722
|
+
appendNodes(element, [createText(context.documentTarget, resolveValue(descriptor.text, context, context.item))]);
|
|
723
|
+
}
|
|
724
|
+
if (descriptor.children) {
|
|
725
|
+
materializeChildren(element, descriptor.children, context, context.item);
|
|
726
|
+
}
|
|
727
|
+
return element;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
function renderComponent(descriptor, context) {
|
|
731
|
+
const component = resolveComponent(descriptor, context);
|
|
732
|
+
const element = renderElement({
|
|
733
|
+
...descriptor,
|
|
734
|
+
tag: component.tag,
|
|
735
|
+
attributes: {
|
|
736
|
+
'data-rmt-component': component.id,
|
|
737
|
+
...component.attributes,
|
|
738
|
+
...(descriptor.attributes || {})
|
|
739
|
+
},
|
|
740
|
+
properties: component.properties,
|
|
741
|
+
class: component.classes,
|
|
742
|
+
parts: component.parts,
|
|
743
|
+
styleTokens: component.styleTokens,
|
|
744
|
+
events: component.events
|
|
745
|
+
}, context);
|
|
746
|
+
Object.entries(component.slots || {}).forEach(([slotName, slotId]) => {
|
|
747
|
+
const slotContainer = context.documentTarget.createElement('div');
|
|
748
|
+
if (slotName !== 'default') setAttributeSafe(slotContainer, 'slot', slotName, descriptor, context);
|
|
749
|
+
appendNodes(slotContainer, renderSlotContent(slotId, context, context.item));
|
|
750
|
+
element.appendChild(slotContainer);
|
|
751
|
+
});
|
|
752
|
+
if (descriptor.bindings) {
|
|
753
|
+
setAttributeSafe(element, 'data-rmt-bindings', toArray(descriptor.bindings).join(' '), descriptor, context);
|
|
754
|
+
}
|
|
755
|
+
if (context.componentRegistry && typeof context.componentRegistry.bindComponentInstance === 'function') {
|
|
756
|
+
context.componentRegistry.bindComponentInstance(element, {
|
|
757
|
+
tag: component.tag,
|
|
758
|
+
events: component.events,
|
|
759
|
+
dispatchEvent: context.dispatchEvent,
|
|
760
|
+
stateBridge: context.stateBridge
|
|
761
|
+
}, context.componentBindingOptions || {});
|
|
762
|
+
}
|
|
763
|
+
return element;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
function evaluateCondition(descriptor, context) {
|
|
767
|
+
const key = descriptor.test || descriptor.when;
|
|
768
|
+
const explicitValue = resolveValue(key, context, context.item);
|
|
769
|
+
if (typeof explicitValue === 'boolean') return explicitValue;
|
|
770
|
+
if (typeof key === 'string' && context.selectors && context.selectors.has(key)) {
|
|
771
|
+
return !!context.selectorValues[key];
|
|
772
|
+
}
|
|
773
|
+
return !!explicitValue;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
function resolveRepeatKey(keyExpression, context, item, index) {
|
|
777
|
+
if (!keyExpression) return index;
|
|
778
|
+
const expression = String(keyExpression);
|
|
779
|
+
const resolved = expression.startsWith('$')
|
|
780
|
+
? resolveValue(expression, context, item)
|
|
781
|
+
: resolveValue(`$item.${expression.replace(/^item\./u, '')}`, context, item);
|
|
782
|
+
return resolved == null || resolved === '' ? index : resolved;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
function renderRepeat(descriptor, context) {
|
|
786
|
+
const sourceValue = resolveValue(descriptor.source, context, context.item);
|
|
787
|
+
const items = Array.isArray(sourceValue) ? sourceValue : [];
|
|
788
|
+
const fragment = createFragment(context.documentTarget);
|
|
789
|
+
items.forEach((item, index) => {
|
|
790
|
+
const rendered = descriptor.item
|
|
791
|
+
? renderTemplate(descriptor.item, context, item)
|
|
792
|
+
: renderNode(descriptor.template || descriptor.node || descriptor.children || { type: 'text', text: '$item' }, {
|
|
793
|
+
...context,
|
|
794
|
+
item
|
|
795
|
+
});
|
|
796
|
+
toArray(rendered).forEach((node) => {
|
|
797
|
+
if (node && node.nodeType !== 11 && descriptor.key) {
|
|
798
|
+
setAttributeSafe(node, 'data-rmt-key', resolveRepeatKey(descriptor.key, context, item, index), descriptor, context);
|
|
799
|
+
}
|
|
800
|
+
fragment.appendChild(node);
|
|
801
|
+
});
|
|
802
|
+
});
|
|
803
|
+
return fragment;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
function renderNode(descriptor, context) {
|
|
807
|
+
if (descriptor == null || descriptor === false) return createFragment(context.documentTarget);
|
|
808
|
+
if (Array.isArray(descriptor)) {
|
|
809
|
+
const fragment = createFragment(context.documentTarget);
|
|
810
|
+
descriptor.forEach((child, index) => {
|
|
811
|
+
appendNodes(fragment, renderNode(child, {
|
|
812
|
+
...context,
|
|
813
|
+
source: {
|
|
814
|
+
...(context.source || {}),
|
|
815
|
+
pointer: `${(context.source && context.source.pointer) || ''}/array/${index}`
|
|
816
|
+
}
|
|
817
|
+
}));
|
|
818
|
+
});
|
|
819
|
+
return fragment;
|
|
820
|
+
}
|
|
821
|
+
if (typeof descriptor === 'string' || typeof descriptor === 'number') {
|
|
822
|
+
return createText(context.documentTarget, descriptor);
|
|
823
|
+
}
|
|
824
|
+
if (isNodeLike(descriptor)) return descriptor;
|
|
825
|
+
|
|
826
|
+
const nodeType = clampString(descriptor.type || (descriptor.component ? 'component' : descriptor.tag ? 'element' : descriptor.template ? 'template' : 'fragment'), 'fragment');
|
|
827
|
+
switch (nodeType) {
|
|
828
|
+
case 'text':
|
|
829
|
+
return createText(context.documentTarget, resolveValue(descriptor.text, context, context.item));
|
|
830
|
+
case 'element':
|
|
831
|
+
return renderElement(descriptor, context);
|
|
832
|
+
case 'component':
|
|
833
|
+
return renderComponent(descriptor, context);
|
|
834
|
+
case 'template':
|
|
835
|
+
return renderTemplate(descriptor.template || descriptor.id, context, context.item);
|
|
836
|
+
case 'slot':
|
|
837
|
+
return renderSlot(descriptor.slot || descriptor.id, context, context.item);
|
|
838
|
+
case 'when':
|
|
839
|
+
return evaluateCondition(descriptor, context)
|
|
840
|
+
? renderNode(descriptor.then, context)
|
|
841
|
+
: renderNode(descriptor.else || descriptor.fallback, context);
|
|
842
|
+
case 'repeat':
|
|
843
|
+
return renderRepeat(descriptor, context);
|
|
844
|
+
case 'empty':
|
|
845
|
+
return descriptor.template
|
|
846
|
+
? renderTemplate(descriptor.template, context, context.item)
|
|
847
|
+
: renderNode(descriptor.fallback || descriptor.children || descriptor.then || null, context);
|
|
848
|
+
case 'fallback':
|
|
849
|
+
return descriptor.template
|
|
850
|
+
? renderTemplate(descriptor.template, context, context.item)
|
|
851
|
+
: renderNode(descriptor.node || descriptor.children || descriptor.text || null, context);
|
|
852
|
+
case 'trusted_html':
|
|
853
|
+
return renderTrustedHtml(descriptor, context);
|
|
854
|
+
case 'fragment': {
|
|
855
|
+
const fragment = createFragment(context.documentTarget);
|
|
856
|
+
toArray(descriptor.children || descriptor.nodes).forEach((child, index) => {
|
|
857
|
+
appendNodes(fragment, renderNode(child, {
|
|
858
|
+
...context,
|
|
859
|
+
source: {
|
|
860
|
+
...(context.source || {}),
|
|
861
|
+
pointer: `${(context.source && context.source.pointer) || ''}/nodes/${index}`
|
|
862
|
+
}
|
|
863
|
+
}));
|
|
864
|
+
});
|
|
865
|
+
return fragment;
|
|
866
|
+
}
|
|
867
|
+
default:
|
|
868
|
+
throw createRendererError('rmt.dom.node-type.unsupported', `Nicht unterstuetzter DOM Descriptor Type ${nodeType}`, descriptor, context);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
function getChildren(parent) {
|
|
873
|
+
return Array.from(parent.children || parent.childNodes || []);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
function keyForDescriptor(descriptor, context, index) {
|
|
877
|
+
if (!descriptor || typeof descriptor !== 'object') return String(index);
|
|
878
|
+
const directKey = descriptor.key || (descriptor.attributes && descriptor.attributes['data-rmt-key']);
|
|
879
|
+
const resolved = resolveValue(directKey, context, context.item);
|
|
880
|
+
return clampString(resolved, String(index));
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
function patchExistingElement(element, descriptor, context) {
|
|
884
|
+
if (!element || !descriptor || typeof descriptor !== 'object') return element;
|
|
885
|
+
const next = descriptor.type === 'component'
|
|
886
|
+
? {
|
|
887
|
+
...descriptor,
|
|
888
|
+
tag: resolveComponent(descriptor, context).tag
|
|
889
|
+
}
|
|
890
|
+
: descriptor;
|
|
891
|
+
applyAttributes(element, next.attributes || {}, next, context);
|
|
892
|
+
applyProperties(element, next.properties || next.props || {}, next, context);
|
|
893
|
+
if (Object.prototype.hasOwnProperty.call(next, 'text')) {
|
|
894
|
+
replaceChildren(element, [createText(context.documentTarget, resolveValue(next.text, context, context.item))]);
|
|
895
|
+
} else if (next.children) {
|
|
896
|
+
materializeChildren(element, next.children, context, context.item);
|
|
897
|
+
}
|
|
898
|
+
return element;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
function renderKeyed(root, descriptors, context) {
|
|
902
|
+
const existingByKey = new Map();
|
|
903
|
+
getChildren(root).forEach((child) => {
|
|
904
|
+
const key = child && typeof child.getAttribute === 'function'
|
|
905
|
+
? child.getAttribute('data-rmt-key')
|
|
906
|
+
: child && child.attributes && child.attributes['data-rmt-key'];
|
|
907
|
+
if (key) existingByKey.set(String(key), child);
|
|
908
|
+
});
|
|
909
|
+
const nextNodes = toArray(descriptors).map((descriptor, index) => {
|
|
910
|
+
const key = keyForDescriptor(descriptor, context, index);
|
|
911
|
+
const existing = existingByKey.get(key);
|
|
912
|
+
if (existing) {
|
|
913
|
+
setAttributeSafe(existing, 'data-rmt-key', key, descriptor, context);
|
|
914
|
+
return patchExistingElement(existing, descriptor, context);
|
|
915
|
+
}
|
|
916
|
+
const node = renderNode({
|
|
917
|
+
...descriptor,
|
|
918
|
+
attributes: {
|
|
919
|
+
...(descriptor.attributes || {}),
|
|
920
|
+
'data-rmt-key': key
|
|
921
|
+
}
|
|
922
|
+
}, context);
|
|
923
|
+
return node;
|
|
924
|
+
});
|
|
925
|
+
replaceChildren(root, nextNodes);
|
|
926
|
+
return nextNodes;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
function createMap(records) {
|
|
930
|
+
return new Map(toArray(records).map((record) => [record.id, record]));
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
function createRenderContext(documentTarget, options = {}, diagnosticsRecorder) {
|
|
934
|
+
return {
|
|
935
|
+
documentTarget,
|
|
936
|
+
model: options.model || {},
|
|
937
|
+
selectorValues: options.selectorValues || {},
|
|
938
|
+
components: options.components instanceof Map ? options.components : createMap(options.components),
|
|
939
|
+
templates: options.templates instanceof Map ? options.templates : createMap(options.templates),
|
|
940
|
+
slots: options.slots instanceof Map ? options.slots : createMap(options.slots),
|
|
941
|
+
selectors: options.selectors instanceof Map ? options.selectors : createMap(options.selectors),
|
|
942
|
+
componentRegistry: options.componentRegistry || options.registry || null,
|
|
943
|
+
componentBindingOptions: options.componentBindingOptions || {},
|
|
944
|
+
stateBridge: options.stateBridge || null,
|
|
945
|
+
refs: options.refs instanceof Map ? options.refs : new Map(),
|
|
946
|
+
dispatchEvent: options.dispatchEvent,
|
|
947
|
+
trustedDomRenderer: options.trustedDomRenderer,
|
|
948
|
+
diagnostics: diagnosticsRecorder.diagnostics,
|
|
949
|
+
publishDiagnostic: diagnosticsRecorder.publish,
|
|
950
|
+
source: options.source || {}
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
function createNoManualHtmlGate(options = {}) {
|
|
955
|
+
const allowedFiles = new Set(toArray(options.allowedFiles));
|
|
956
|
+
const allowedPatternIds = new Set(toArray(options.allowedPatternIds));
|
|
957
|
+
|
|
958
|
+
function scanText(sourceText, scanOptions = {}) {
|
|
959
|
+
const filePath = clampString(scanOptions.filePath, 'inline');
|
|
960
|
+
if (allowedFiles.has(filePath)) return [];
|
|
961
|
+
return MANUAL_HTML_PATTERNS
|
|
962
|
+
.filter((record) => !allowedPatternIds.has(record.id) && record.pattern.test(String(sourceText || '')))
|
|
963
|
+
.map((record) => ({
|
|
964
|
+
schema: RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA,
|
|
965
|
+
code: 'rmt.dom.manual-html-sink',
|
|
966
|
+
severity: 'error',
|
|
967
|
+
sink: record.id,
|
|
968
|
+
filePath,
|
|
969
|
+
message: `Manueller HTML-Sink ${record.id} ist in normaler RMT App-UI nicht erlaubt.`
|
|
970
|
+
}));
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
return Object.freeze({
|
|
974
|
+
schema: 'xtend.epic18.no-manual-html-gate.v1',
|
|
975
|
+
scanText,
|
|
976
|
+
scanFiles(files = {}) {
|
|
977
|
+
return Object.entries(files).flatMap(([filePath, sourceText]) => scanText(sourceText, { filePath }));
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
function createRmtDomDescriptorRenderer(deps = {}) {
|
|
983
|
+
const documentTarget = resolveDocumentTarget(deps);
|
|
984
|
+
const diagnosticsRecorder = createDiagnosticsRecorder(deps);
|
|
985
|
+
|
|
986
|
+
function runWithDiagnostics(fn) {
|
|
987
|
+
try {
|
|
988
|
+
return fn();
|
|
989
|
+
} catch (error) {
|
|
990
|
+
if (error && error.diagnostic) {
|
|
991
|
+
diagnosticsRecorder.publish(error.diagnostic);
|
|
992
|
+
}
|
|
993
|
+
throw error;
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
return Object.freeze({
|
|
998
|
+
schema: RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA,
|
|
999
|
+
trustedDomBoundary: TRUSTED_DOM_BOUNDARY,
|
|
1000
|
+
render(root, descriptor, options = {}) {
|
|
1001
|
+
return runWithDiagnostics(() => {
|
|
1002
|
+
if (!root || typeof root.replaceChildren !== 'function') {
|
|
1003
|
+
throw createRendererError('rmt.dom.root.invalid', 'RMT Render Root benoetigt replaceChildren().', descriptor, {
|
|
1004
|
+
source: options.source || {}
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
const context = createRenderContext(documentTarget, options, diagnosticsRecorder);
|
|
1008
|
+
const rendered = renderNode(descriptor, context);
|
|
1009
|
+
const nodes = rendered && rendered.nodeType === 11 ? getChildren(rendered) : toArray(rendered);
|
|
1010
|
+
replaceChildren(root, nodes);
|
|
1011
|
+
if (typeof root.setAttribute === 'function') {
|
|
1012
|
+
root.setAttribute('data-rmt-rendered-shell', 'true');
|
|
1013
|
+
root.setAttribute('data-rmt-renderer-schema', RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA);
|
|
1014
|
+
}
|
|
1015
|
+
return {
|
|
1016
|
+
schema: 'xtend.epic18.rmt-dom-render-result.v1',
|
|
1017
|
+
root,
|
|
1018
|
+
nodeCount: nodes.length,
|
|
1019
|
+
diagnostics: diagnosticsRecorder.diagnostics.slice()
|
|
1020
|
+
};
|
|
1021
|
+
});
|
|
1022
|
+
},
|
|
1023
|
+
renderNode(descriptor, options = {}) {
|
|
1024
|
+
return runWithDiagnostics(() => renderNode(descriptor, createRenderContext(documentTarget, options, diagnosticsRecorder)));
|
|
1025
|
+
},
|
|
1026
|
+
renderKeyed(root, descriptors, options = {}) {
|
|
1027
|
+
return runWithDiagnostics(() => renderKeyed(root, descriptors, createRenderContext(documentTarget, options, diagnosticsRecorder)));
|
|
1028
|
+
},
|
|
1029
|
+
resolveValue(value, options = {}) {
|
|
1030
|
+
return runWithDiagnostics(() => {
|
|
1031
|
+
const context = createRenderContext(documentTarget, options, diagnosticsRecorder);
|
|
1032
|
+
return resolveValue(value, context, options.item);
|
|
1033
|
+
});
|
|
1034
|
+
},
|
|
1035
|
+
createNoManualHtmlGate,
|
|
1036
|
+
listDiagnostics() {
|
|
1037
|
+
return diagnosticsRecorder.diagnostics.slice();
|
|
1038
|
+
}
|
|
1039
|
+
});
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
const api = {
|
|
1043
|
+
RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA,
|
|
1044
|
+
RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA,
|
|
1045
|
+
TRUSTED_DOM_BOUNDARY,
|
|
1046
|
+
createNoManualHtmlGate,
|
|
1047
|
+
createRmtDomDescriptorRenderer
|
|
1048
|
+
};
|
|
1049
|
+
|
|
1050
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
1051
|
+
module.exports = api;
|
|
1052
|
+
}
|
|
1053
|
+
if (globalTarget) {
|
|
1054
|
+
globalTarget.XTendRmtDomDescriptorRenderer = api;
|
|
1055
|
+
}
|
|
1056
|
+
})(typeof globalThis !== 'undefined' ? globalThis : (typeof window !== 'undefined' ? window : this));
|
|
1057
|
+
|
|
1058
|
+
const __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__ = globalThis.XTendRmtDomDescriptorRenderer;
|
|
1059
|
+
|
|
1060
|
+
export const RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA = __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__.RMT_DOM_DESCRIPTOR_RENDERER_DIAGNOSTIC_SCHEMA;
|
|
1061
|
+
export const RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA = __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__.RMT_DOM_DESCRIPTOR_RENDERER_SCHEMA;
|
|
1062
|
+
export const TRUSTED_DOM_BOUNDARY = __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__.TRUSTED_DOM_BOUNDARY;
|
|
1063
|
+
export const createNoManualHtmlGate = __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__.createNoManualHtmlGate;
|
|
1064
|
+
export const createRmtDomDescriptorRenderer = __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__.createRmtDomDescriptorRenderer;
|
|
1065
|
+
|
|
1066
|
+
export default __XTEND_RMT_DOM_DESCRIPTOR_RENDERER_API__;
|