@ecopages/radiant 0.3.0-alpha.2 → 0.3.0-alpha.21
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/README.md +71 -60
- package/client/app-bootstrap.d.ts +19 -0
- package/client/app-bootstrap.js +3 -0
- package/client/app-bootstrap.js.map +10 -0
- package/{dist/client → client}/hydrator.d.ts +1 -1
- package/client/hydrator.js +3 -0
- package/client/hydrator.js.map +11 -0
- package/client/install-hydrator.js +3 -0
- package/client/install-hydrator.js.map +12 -0
- package/{dist/context → context}/context-consumer-bootstrap.d.ts +7 -6
- package/context/context-consumer-bootstrap.js +3 -0
- package/context/context-consumer-bootstrap.js.map +14 -0
- package/context/context-consumer-runtime.d.ts +47 -0
- package/context/context-consumer-runtime.js +3 -0
- package/context/context-consumer-runtime.js.map +12 -0
- package/context/context-host.d.ts +25 -0
- package/context/context-host.js +3 -0
- package/context/context-host.js.map +10 -0
- package/{dist/context → context}/context-provider.d.ts +10 -6
- package/context/context-provider.js +3 -0
- package/context/context-provider.js.map +15 -0
- package/context/context-ssr-bridge.js +3 -0
- package/{dist/chunk-t8xtvgyg.js.map → context/context-ssr-bridge.js.map} +2 -2
- package/context/create-context.js +3 -0
- package/{dist/chunk-30x4hggg.js.map → context/create-context.js.map} +2 -2
- package/{dist/context → context}/decorators/consume-context.d.ts +5 -2
- package/context/decorators/consume-context.js +3 -0
- package/context/decorators/consume-context.js.map +19 -0
- package/context/decorators/context-selection-delivery.d.ts +1 -0
- package/context/decorators/context-selection-delivery.js +3 -0
- package/context/decorators/context-selection-delivery.js.map +11 -0
- package/{dist/context → context}/decorators/context-selector.d.ts +6 -6
- package/context/decorators/context-selector.js +3 -0
- package/context/decorators/context-selector.js.map +21 -0
- package/context/decorators/legacy/consume-context.d.ts +3 -0
- package/context/decorators/legacy/consume-context.js +3 -0
- package/context/decorators/legacy/consume-context.js.map +16 -0
- package/{dist/context → context}/decorators/legacy/context-selector-field.d.ts +2 -2
- package/context/decorators/legacy/context-selector-field.js +3 -0
- package/context/decorators/legacy/context-selector-field.js.map +17 -0
- package/{dist/context → context}/decorators/legacy/context-selector.d.ts +2 -2
- package/context/decorators/legacy/context-selector.js +3 -0
- package/context/decorators/legacy/context-selector.js.map +17 -0
- package/{dist/context → context}/decorators/legacy/provide-context.d.ts +2 -2
- package/context/decorators/legacy/provide-context.js +3 -0
- package/context/decorators/legacy/provide-context.js.map +17 -0
- package/{dist/context → context}/decorators/on-context-update.d.ts +5 -5
- package/context/decorators/on-context-update.js +3 -0
- package/context/decorators/on-context-update.js.map +20 -0
- package/{dist/context → context}/decorators/provide-context.d.ts +5 -2
- package/context/decorators/provide-context.js +3 -0
- package/context/decorators/provide-context.js.map +20 -0
- package/context/decorators/standard/consume-context.d.ts +3 -0
- package/context/decorators/standard/consume-context.js +3 -0
- package/context/decorators/standard/consume-context.js.map +15 -0
- package/{dist/context → context}/decorators/standard/context-selector-field.d.ts +2 -2
- package/context/decorators/standard/context-selector-field.js +3 -0
- package/context/decorators/standard/context-selector-field.js.map +16 -0
- package/{dist/context → context}/decorators/standard/context-selector.d.ts +2 -3
- package/context/decorators/standard/context-selector.js +3 -0
- package/context/decorators/standard/context-selector.js.map +16 -0
- package/{dist/context → context}/decorators/standard/provide-context.d.ts +2 -2
- package/context/decorators/standard/provide-context.js +3 -0
- package/context/decorators/standard/provide-context.js.map +16 -0
- package/{dist/context → context}/events.d.ts +18 -11
- package/context/events.js +3 -0
- package/context/events.js.map +10 -0
- package/context/hydration-script.js +3 -0
- package/context/hydration-script.js.map +12 -0
- package/context/index.d.ts +8 -0
- package/context/index.js +3 -0
- package/context/index.js.map +35 -0
- package/controller-registry.d.ts +38 -0
- package/controller-registry.js +3 -0
- package/controller-registry.js.map +11 -0
- package/core/controller-metadata.d.ts +3 -0
- package/core/controller-metadata.js +3 -0
- package/core/controller-metadata.js.map +10 -0
- package/core/custom-element-metadata.d.ts +14 -0
- package/core/custom-element-metadata.js +3 -0
- package/core/custom-element-metadata.js.map +10 -0
- package/{dist/core → core}/hydration-codec.d.ts +8 -1
- package/core/hydration-codec.js +3 -0
- package/core/hydration-codec.js.map +11 -0
- package/core/radiant-controller.d.ts +151 -0
- package/core/radiant-controller.js +3 -0
- package/core/radiant-controller.js.map +17 -0
- package/core/radiant-element-ssr-host.d.ts +23 -0
- package/core/radiant-element-ssr-host.js +3 -0
- package/core/radiant-element-ssr-host.js.map +10 -0
- package/core/radiant-element-ssr-registry.d.ts +45 -0
- package/core/radiant-element-ssr-registry.js +3 -0
- package/core/radiant-element-ssr-registry.js.map +10 -0
- package/{dist/core/radiant-component-ssr.d.ts → core/radiant-element-ssr-service.d.ts} +5 -6
- package/core/radiant-element-ssr-service.js +3 -0
- package/core/radiant-element-ssr-service.js.map +14 -0
- package/{dist/core → core}/radiant-element.d.ts +55 -123
- package/core/radiant-element.js +3 -0
- package/core/radiant-element.js.map +24 -0
- package/{dist/core → core}/radiant-hydrator-state.d.ts +1 -1
- package/core/radiant-hydrator-state.js +3 -0
- package/core/radiant-hydrator-state.js.map +10 -0
- package/core/reactive-host.d.ts +133 -0
- package/core/reactive-host.js +3 -0
- package/core/reactive-host.js.map +13 -0
- package/{dist/core → core}/reactive-jsx-value.d.ts +2 -1
- package/core/reactive-jsx-value.js +3 -0
- package/core/reactive-jsx-value.js.map +10 -0
- package/core/reactive-prop-core.d.ts +42 -0
- package/core/reactive-prop-core.js +3 -0
- package/core/reactive-prop-core.js.map +11 -0
- package/{dist/core → core}/reactive-prop-metadata.d.ts +1 -1
- package/core/reactive-prop-metadata.js +3 -0
- package/core/reactive-prop-metadata.js.map +10 -0
- package/core/reactivity-adapter.d.ts +8 -0
- package/core/reactivity-adapter.js +3 -0
- package/core/reactivity-adapter.js.map +12 -0
- package/core/reactivity-contract.d.ts +39 -0
- package/core/reactivity-contract.js +2 -0
- package/{dist/chunk-vgtggzb6.js.map → core/reactivity-contract.js.map} +1 -1
- package/core/reactivity-runtime.d.ts +18 -0
- package/core/reactivity-runtime.js +3 -0
- package/core/reactivity-runtime.js.map +11 -0
- package/core/reactivity-signals.d.ts +10 -0
- package/core/reactivity-signals.js +3 -0
- package/core/reactivity-signals.js.map +10 -0
- package/core/render-runtime.d.ts +28 -0
- package/core/render-runtime.js +3 -0
- package/core/render-runtime.js.map +16 -0
- package/core/slot-projection-runtime.js +3 -0
- package/core/slot-projection-runtime.js.map +12 -0
- package/core/ssr-preparation.js +3 -0
- package/core/ssr-preparation.js.map +10 -0
- package/decorators/attr.d.ts +6 -0
- package/decorators/attr.js +3 -0
- package/decorators/attr.js.map +17 -0
- package/decorators/bound.d.ts +7 -0
- package/decorators/bound.js +3 -0
- package/decorators/bound.js.map +13 -0
- package/decorators/bridge.d.ts +12 -0
- package/decorators/bridge.js +3 -0
- package/decorators/bridge.js.map +10 -0
- package/decorators/controller.d.ts +2 -0
- package/decorators/controller.js +3 -0
- package/decorators/controller.js.map +12 -0
- package/{dist/decorators → decorators}/custom-element.d.ts +4 -2
- package/decorators/custom-element.js +3 -0
- package/decorators/custom-element.js.map +13 -0
- package/decorators/debounce.d.ts +9 -0
- package/decorators/debounce.js +3 -0
- package/decorators/debounce.js.map +14 -0
- package/{dist/decorators → decorators}/event.d.ts +5 -2
- package/decorators/event.js +3 -0
- package/decorators/event.js.map +16 -0
- package/decorators/legacy/attr.d.ts +2 -0
- package/decorators/legacy/attr.js +3 -0
- package/decorators/legacy/attr.js.map +14 -0
- package/decorators/legacy/bound.js +3 -0
- package/decorators/legacy/bound.js.map +10 -0
- package/decorators/legacy/custom-element.js +3 -0
- package/decorators/legacy/custom-element.js.map +11 -0
- package/decorators/legacy/debounce.js +3 -0
- package/decorators/legacy/debounce.js.map +11 -0
- package/decorators/legacy/event.js +3 -0
- package/decorators/legacy/event.js.map +13 -0
- package/decorators/legacy/instance-initializers.d.ts +32 -0
- package/decorators/legacy/instance-initializers.js +3 -0
- package/decorators/legacy/instance-initializers.js.map +10 -0
- package/{dist/decorators → decorators}/legacy/on-event.d.ts +2 -2
- package/decorators/legacy/on-event.js +3 -0
- package/decorators/legacy/on-event.js.map +13 -0
- package/decorators/legacy/on-updated.d.ts +11 -0
- package/decorators/legacy/on-updated.js +3 -0
- package/decorators/legacy/on-updated.js.map +11 -0
- package/decorators/legacy/query-slot.d.ts +3 -0
- package/decorators/legacy/query-slot.js +3 -0
- package/decorators/legacy/query-slot.js.map +13 -0
- package/{dist/decorators → decorators}/legacy/query.d.ts +7 -2
- package/decorators/legacy/query.js +3 -0
- package/decorators/legacy/query.js.map +12 -0
- package/{dist/decorators → decorators}/legacy/reactive-field.d.ts +2 -2
- package/decorators/legacy/reactive-field.js +3 -0
- package/decorators/legacy/reactive-field.js.map +11 -0
- package/decorators/legacy/reactive-prop.d.ts +14 -0
- package/decorators/legacy/reactive-prop.js +3 -0
- package/decorators/legacy/reactive-prop.js.map +14 -0
- package/{dist/decorators → decorators}/legacy/signal.d.ts +4 -3
- package/decorators/legacy/signal.js +3 -0
- package/decorators/legacy/signal.js.map +15 -0
- package/{dist/decorators → decorators}/on-event.d.ts +6 -3
- package/decorators/on-event.js +3 -0
- package/decorators/on-event.js.map +16 -0
- package/decorators/on-updated.d.ts +15 -0
- package/decorators/on-updated.js +3 -0
- package/decorators/on-updated.js.map +14 -0
- package/decorators/prop.d.ts +26 -0
- package/decorators/prop.js +3 -0
- package/decorators/prop.js.map +17 -0
- package/decorators/query-slot.d.ts +17 -0
- package/decorators/query-slot.js +3 -0
- package/decorators/query-slot.js.map +16 -0
- package/{dist/decorators → decorators}/query.d.ts +9 -2
- package/decorators/query.js +3 -0
- package/decorators/query.js.map +15 -0
- package/decorators/shared/reactive-attr.d.ts +25 -0
- package/decorators/shared/reactive-attr.js +3 -0
- package/decorators/shared/reactive-attr.js.map +12 -0
- package/decorators/signal.d.ts +29 -0
- package/decorators/signal.js +3 -0
- package/decorators/signal.js.map +17 -0
- package/decorators/standard/attr.d.ts +2 -0
- package/decorators/standard/attr.js +3 -0
- package/decorators/standard/attr.js.map +13 -0
- package/decorators/standard/bound.js +3 -0
- package/{dist/chunk-rkh1vkb9.js.map → decorators/standard/bound.js.map} +2 -2
- package/decorators/standard/custom-element.js +3 -0
- package/decorators/standard/custom-element.js.map +11 -0
- package/decorators/standard/debounce.js +3 -0
- package/decorators/standard/debounce.js.map +11 -0
- package/decorators/standard/event.js +3 -0
- package/decorators/standard/event.js.map +12 -0
- package/{dist/decorators → decorators}/standard/on-event.d.ts +2 -1
- package/decorators/standard/on-event.js +3 -0
- package/decorators/standard/on-event.js.map +12 -0
- package/decorators/standard/on-updated.d.ts +6 -0
- package/decorators/standard/on-updated.js +3 -0
- package/decorators/standard/on-updated.js.map +10 -0
- package/{dist/decorators → decorators}/standard/query-slot.d.ts +1 -2
- package/decorators/standard/query-slot.js +3 -0
- package/decorators/standard/query-slot.js.map +11 -0
- package/decorators/standard/query.d.ts +3 -0
- package/decorators/standard/query.js +3 -0
- package/decorators/standard/query.js.map +11 -0
- package/decorators/standard/reactive-field.d.ts +2 -0
- package/decorators/standard/reactive-field.js +3 -0
- package/decorators/standard/reactive-field.js.map +10 -0
- package/decorators/standard/reactive-prop.d.ts +13 -0
- package/decorators/standard/reactive-prop.js +3 -0
- package/decorators/standard/reactive-prop.js.map +13 -0
- package/{dist/decorators → decorators}/standard/signal.d.ts +4 -3
- package/decorators/standard/signal.js +3 -0
- package/decorators/standard/signal.js.map +14 -0
- package/decorators/state.d.ts +12 -0
- package/decorators/state.js +3 -0
- package/decorators/state.js.map +14 -0
- package/{dist/helpers → helpers}/create-event-listener.d.ts +11 -2
- package/helpers/create-event-listener.js +3 -0
- package/helpers/create-event-listener.js.map +11 -0
- package/helpers/create-event.js +3 -0
- package/helpers/create-event.js.map +11 -0
- package/{dist/helpers → helpers}/create-query-slot.d.ts +2 -3
- package/helpers/create-query-slot.js +3 -0
- package/helpers/create-query-slot.js.map +10 -0
- package/{dist/helpers → helpers}/create-query.d.ts +14 -3
- package/helpers/create-query.js +3 -0
- package/helpers/create-query.js.map +10 -0
- package/helpers/debounce.js +3 -0
- package/{dist/chunk-wd23rn4q.js.map → helpers/debounce.js.map} +2 -2
- package/helpers/index.js +3 -0
- package/helpers/index.js.map +16 -0
- package/index.d.ts +16 -0
- package/index.js +3 -0
- package/index.js.map +77 -0
- package/package.json +114 -120
- package/server/context-ssr.js +3 -0
- package/{dist/chunk-ssnnxzrj.js.map → server/context-ssr.js.map} +4 -3
- package/server/html-parser.js +3 -0
- package/{dist/chunk-5b1en9vz.js.map → server/html-parser.js.map} +2 -2
- package/server/install-light-dom-shim.js +3 -0
- package/server/install-light-dom-shim.js.map +12 -0
- package/{dist/server → server}/light-dom-shim.d.ts +9 -0
- package/server/light-dom-shim.js +3 -0
- package/server/light-dom-shim.js.map +11 -0
- package/server/project-root.js +3 -0
- package/{dist/server → server}/project-root.js.map +2 -2
- package/server/radiant-element-ssr-bridge.d.ts +21 -0
- package/server/radiant-element-ssr-bridge.js +3 -0
- package/server/radiant-element-ssr-bridge.js.map +19 -0
- package/server/radiant-element-ssr-extractor.d.ts +3 -0
- package/server/radiant-element-ssr-extractor.js +3 -0
- package/server/radiant-element-ssr-extractor.js.map +12 -0
- package/server/radiant-element-ssr-runtime.d.ts +1 -0
- package/server/radiant-element-ssr-runtime.js +3 -0
- package/server/radiant-element-ssr-runtime.js.map +19 -0
- package/{dist/server → server}/render-component.d.ts +5 -15
- package/server/render-component.js +3 -0
- package/server/render-component.js.map +23 -0
- package/server/render-controller.d.ts +57 -0
- package/server/render-controller.js +3 -0
- package/server/render-controller.js.map +26 -0
- package/server/slot-projection-html.js +3 -0
- package/server/slot-projection-html.js.map +14 -0
- package/signals/host-resource.js +3 -0
- package/{dist/signals → signals}/host-resource.js.map +2 -2
- package/{dist/signals → signals}/host-signal.d.ts +4 -2
- package/signals/host-signal.js +3 -0
- package/signals/host-signal.js.map +13 -0
- package/signals/hydration-script.js +3 -0
- package/signals/hydration-script.js.map +12 -0
- package/tools/escape-css-identifier.d.ts +1 -0
- package/tools/escape-css-identifier.js +3 -0
- package/tools/escape-css-identifier.js.map +10 -0
- package/tools/escape-script-json.js +3 -0
- package/{dist/chunk-nssj2x13.js.map → tools/escape-script-json.js.map} +2 -2
- package/tools/event-emitter.js +3 -0
- package/{dist/chunk-wvd1ffe4.js.map → tools/event-emitter.js.map} +2 -2
- package/{dist/tools → tools}/index.d.ts +1 -1
- package/tools/index.js +3 -0
- package/tools/index.js.map +13 -0
- package/tools/render-jsx-template.js +3 -0
- package/{dist/chunk-jkb2y7c8.js.map → tools/render-jsx-template.js.map} +2 -2
- package/types.js +3 -0
- package/{dist/types.js.map → types.js.map} +2 -2
- package/utils/attribute-utils.js +3 -0
- package/{dist/chunk-66e6s792.js.map → utils/attribute-utils.js.map} +2 -2
- package/utils/index.js +3 -0
- package/utils/index.js.map +10 -0
- package/dist/chunk-0bswvy25.js +0 -4
- package/dist/chunk-0bswvy25.js.map +0 -10
- package/dist/chunk-0btkzzyc.js +0 -4
- package/dist/chunk-0btkzzyc.js.map +0 -10
- package/dist/chunk-0g0j9re6.js +0 -4
- package/dist/chunk-0g0j9re6.js.map +0 -10
- package/dist/chunk-1x26p09c.js +0 -4
- package/dist/chunk-1x26p09c.js.map +0 -10
- package/dist/chunk-21a7jask.js +0 -4
- package/dist/chunk-21a7jask.js.map +0 -10
- package/dist/chunk-25zjh0kg.js +0 -4
- package/dist/chunk-25zjh0kg.js.map +0 -10
- package/dist/chunk-30x4hggg.js +0 -4
- package/dist/chunk-3ryr5wx2.js +0 -4
- package/dist/chunk-3ryr5wx2.js.map +0 -10
- package/dist/chunk-3xxvmd5c.js +0 -4
- package/dist/chunk-3xxvmd5c.js.map +0 -10
- package/dist/chunk-3ynk7e1e.js +0 -4
- package/dist/chunk-3ynk7e1e.js.map +0 -10
- package/dist/chunk-4e559cy5.js +0 -4
- package/dist/chunk-4e559cy5.js.map +0 -10
- package/dist/chunk-5b1en9vz.js +0 -4
- package/dist/chunk-5bkat72n.js +0 -4
- package/dist/chunk-5bkat72n.js.map +0 -10
- package/dist/chunk-5qeaq3tj.js +0 -4
- package/dist/chunk-5qeaq3tj.js.map +0 -10
- package/dist/chunk-66e6s792.js +0 -4
- package/dist/chunk-79jg8q67.js +0 -4
- package/dist/chunk-79jg8q67.js.map +0 -10
- package/dist/chunk-8d5ddvvf.js +0 -4
- package/dist/chunk-8d5ddvvf.js.map +0 -10
- package/dist/chunk-8e9fgtbn.js +0 -4
- package/dist/chunk-8e9fgtbn.js.map +0 -10
- package/dist/chunk-9mqtp3js.js +0 -4
- package/dist/chunk-9mqtp3js.js.map +0 -10
- package/dist/chunk-9rj2rwes.js +0 -4
- package/dist/chunk-9rj2rwes.js.map +0 -10
- package/dist/chunk-atms6yrh.js +0 -4
- package/dist/chunk-atms6yrh.js.map +0 -10
- package/dist/chunk-bk2nbmcd.js +0 -4
- package/dist/chunk-bk2nbmcd.js.map +0 -10
- package/dist/chunk-bk6qkvfp.js +0 -4
- package/dist/chunk-bk6qkvfp.js.map +0 -10
- package/dist/chunk-c0qyz98c.js +0 -4
- package/dist/chunk-c0qyz98c.js.map +0 -10
- package/dist/chunk-c52qhh0j.js +0 -4
- package/dist/chunk-c52qhh0j.js.map +0 -10
- package/dist/chunk-cnyxrh9r.js +0 -4
- package/dist/chunk-cnyxrh9r.js.map +0 -10
- package/dist/chunk-cvz9mrxa.js +0 -4
- package/dist/chunk-cvz9mrxa.js.map +0 -10
- package/dist/chunk-dabagjk6.js +0 -4
- package/dist/chunk-dabagjk6.js.map +0 -10
- package/dist/chunk-e0r6ca2g.js +0 -4
- package/dist/chunk-e0r6ca2g.js.map +0 -10
- package/dist/chunk-eevw1j2q.js +0 -4
- package/dist/chunk-eevw1j2q.js.map +0 -10
- package/dist/chunk-ek664x1c.js +0 -4
- package/dist/chunk-ek664x1c.js.map +0 -10
- package/dist/chunk-eyw14d6y.js +0 -4
- package/dist/chunk-eyw14d6y.js.map +0 -10
- package/dist/chunk-fs4j94bk.js +0 -4
- package/dist/chunk-fs4j94bk.js.map +0 -10
- package/dist/chunk-g2z3mm6b.js +0 -4
- package/dist/chunk-g2z3mm6b.js.map +0 -10
- package/dist/chunk-g5n3m11h.js +0 -4
- package/dist/chunk-g5n3m11h.js.map +0 -10
- package/dist/chunk-gdkte2vd.js +0 -4
- package/dist/chunk-gdkte2vd.js.map +0 -10
- package/dist/chunk-gg74gdpv.js +0 -4
- package/dist/chunk-gg74gdpv.js.map +0 -10
- package/dist/chunk-h9k7crjc.js +0 -4
- package/dist/chunk-h9k7crjc.js.map +0 -10
- package/dist/chunk-hpzgnxgq.js +0 -4
- package/dist/chunk-hpzgnxgq.js.map +0 -10
- package/dist/chunk-hrjc8b1y.js +0 -4
- package/dist/chunk-hrjc8b1y.js.map +0 -10
- package/dist/chunk-hvy4zvcc.js +0 -4
- package/dist/chunk-hvy4zvcc.js.map +0 -10
- package/dist/chunk-hztr86b4.js +0 -4
- package/dist/chunk-hztr86b4.js.map +0 -10
- package/dist/chunk-j3v7rca5.js +0 -4
- package/dist/chunk-j3v7rca5.js.map +0 -10
- package/dist/chunk-j864sv4w.js +0 -4
- package/dist/chunk-j864sv4w.js.map +0 -10
- package/dist/chunk-jkb2y7c8.js +0 -4
- package/dist/chunk-kakpjgzf.js +0 -4
- package/dist/chunk-kakpjgzf.js.map +0 -10
- package/dist/chunk-kmebacvv.js +0 -4
- package/dist/chunk-kmebacvv.js.map +0 -10
- package/dist/chunk-knqsm6v3.js +0 -4
- package/dist/chunk-knqsm6v3.js.map +0 -10
- package/dist/chunk-mp2vtrkg.js +0 -4
- package/dist/chunk-mp2vtrkg.js.map +0 -10
- package/dist/chunk-mpsj3cjs.js +0 -4
- package/dist/chunk-mpsj3cjs.js.map +0 -10
- package/dist/chunk-n4p2542b.js +0 -4
- package/dist/chunk-n4p2542b.js.map +0 -10
- package/dist/chunk-nctznxyz.js +0 -4
- package/dist/chunk-nctznxyz.js.map +0 -10
- package/dist/chunk-ndw3hc3v.js +0 -4
- package/dist/chunk-ndw3hc3v.js.map +0 -10
- package/dist/chunk-nnnb6pac.js +0 -4
- package/dist/chunk-nnnb6pac.js.map +0 -10
- package/dist/chunk-nssj2x13.js +0 -4
- package/dist/chunk-nvr37vma.js +0 -4
- package/dist/chunk-nvr37vma.js.map +0 -10
- package/dist/chunk-p8k4g99a.js +0 -4
- package/dist/chunk-p8k4g99a.js.map +0 -10
- package/dist/chunk-pkszgjqf.js +0 -4
- package/dist/chunk-pkszgjqf.js.map +0 -10
- package/dist/chunk-q9z6tnzw.js +0 -4
- package/dist/chunk-q9z6tnzw.js.map +0 -10
- package/dist/chunk-qdz5sncz.js +0 -4
- package/dist/chunk-qdz5sncz.js.map +0 -10
- package/dist/chunk-qe0eww1n.js +0 -4
- package/dist/chunk-qe0eww1n.js.map +0 -10
- package/dist/chunk-r33zvvda.js +0 -4
- package/dist/chunk-r33zvvda.js.map +0 -10
- package/dist/chunk-rkh1vkb9.js +0 -4
- package/dist/chunk-rrg759ht.js +0 -4
- package/dist/chunk-rrg759ht.js.map +0 -10
- package/dist/chunk-s09s5ayx.js +0 -4
- package/dist/chunk-s09s5ayx.js.map +0 -10
- package/dist/chunk-s5p5z3z4.js +0 -4
- package/dist/chunk-s5p5z3z4.js.map +0 -10
- package/dist/chunk-sf4a2gy5.js +0 -4
- package/dist/chunk-sf4a2gy5.js.map +0 -10
- package/dist/chunk-ssnnxzrj.js +0 -4
- package/dist/chunk-t8xtvgyg.js +0 -4
- package/dist/chunk-v3ta7hnv.js +0 -4
- package/dist/chunk-v3ta7hnv.js.map +0 -10
- package/dist/chunk-v92hp9g0.js +0 -4
- package/dist/chunk-v92hp9g0.js.map +0 -10
- package/dist/chunk-vgtggzb6.js +0 -4
- package/dist/chunk-vk48hgm4.js +0 -4
- package/dist/chunk-vk48hgm4.js.map +0 -10
- package/dist/chunk-w8s5fnsq.js +0 -4
- package/dist/chunk-w8s5fnsq.js.map +0 -10
- package/dist/chunk-wd23rn4q.js +0 -4
- package/dist/chunk-wds4href.js +0 -4
- package/dist/chunk-wds4href.js.map +0 -10
- package/dist/chunk-wvd1ffe4.js +0 -4
- package/dist/chunk-wwbjz9k4.js +0 -4
- package/dist/chunk-wwbjz9k4.js.map +0 -10
- package/dist/chunk-x2k0ngpz.js +0 -4
- package/dist/chunk-x2k0ngpz.js.map +0 -10
- package/dist/chunk-x457d0ap.js +0 -4
- package/dist/chunk-x457d0ap.js.map +0 -10
- package/dist/chunk-xbhtzkre.js +0 -4
- package/dist/chunk-xbhtzkre.js.map +0 -10
- package/dist/chunk-y139ycfm.js +0 -4
- package/dist/chunk-y139ycfm.js.map +0 -10
- package/dist/chunk-z9kxfckm.js +0 -4
- package/dist/chunk-z9kxfckm.js.map +0 -10
- package/dist/chunk-zx5txex8.js +0 -4
- package/dist/chunk-zx5txex8.js.map +0 -10
- package/dist/client/hydrator.js +0 -3
- package/dist/client/hydrator.js.map +0 -9
- package/dist/client/install-hydrator.js +0 -3
- package/dist/client/install-hydrator.js.map +0 -10
- package/dist/context/context-consumer-bootstrap.js +0 -3
- package/dist/context/context-consumer-bootstrap.js.map +0 -9
- package/dist/context/context-consumer-runtime.d.ts +0 -34
- package/dist/context/context-consumer-runtime.js +0 -3
- package/dist/context/context-consumer-runtime.js.map +0 -9
- package/dist/context/context-provider.js +0 -3
- package/dist/context/context-provider.js.map +0 -9
- package/dist/context/context-ssr-bridge.js +0 -3
- package/dist/context/context-ssr-bridge.js.map +0 -9
- package/dist/context/create-context.js +0 -3
- package/dist/context/create-context.js.map +0 -9
- package/dist/context/decorators/consume-context.js +0 -3
- package/dist/context/decorators/consume-context.js.map +0 -9
- package/dist/context/decorators/context-selection-delivery.d.ts +0 -1
- package/dist/context/decorators/context-selection-delivery.js +0 -3
- package/dist/context/decorators/context-selection-delivery.js.map +0 -9
- package/dist/context/decorators/context-selector.js +0 -3
- package/dist/context/decorators/context-selector.js.map +0 -9
- package/dist/context/decorators/legacy/consume-context.d.ts +0 -3
- package/dist/context/decorators/legacy/consume-context.js +0 -3
- package/dist/context/decorators/legacy/consume-context.js.map +0 -9
- package/dist/context/decorators/legacy/context-selector-field.js +0 -3
- package/dist/context/decorators/legacy/context-selector-field.js.map +0 -9
- package/dist/context/decorators/legacy/context-selector.js +0 -3
- package/dist/context/decorators/legacy/context-selector.js.map +0 -9
- package/dist/context/decorators/legacy/provide-context.js +0 -3
- package/dist/context/decorators/legacy/provide-context.js.map +0 -9
- package/dist/context/decorators/on-context-update.js +0 -3
- package/dist/context/decorators/on-context-update.js.map +0 -9
- package/dist/context/decorators/provide-context.js +0 -3
- package/dist/context/decorators/provide-context.js.map +0 -9
- package/dist/context/decorators/standard/consume-context.d.ts +0 -3
- package/dist/context/decorators/standard/consume-context.js +0 -3
- package/dist/context/decorators/standard/consume-context.js.map +0 -9
- package/dist/context/decorators/standard/context-selector-field.js +0 -3
- package/dist/context/decorators/standard/context-selector-field.js.map +0 -9
- package/dist/context/decorators/standard/context-selector.js +0 -3
- package/dist/context/decorators/standard/context-selector.js.map +0 -9
- package/dist/context/decorators/standard/provide-context.js +0 -3
- package/dist/context/decorators/standard/provide-context.js.map +0 -9
- package/dist/context/events.js +0 -3
- package/dist/context/events.js.map +0 -9
- package/dist/context/hydration-script.js +0 -3
- package/dist/context/hydration-script.js.map +0 -9
- package/dist/core/custom-element-metadata.d.ts +0 -3
- package/dist/core/custom-element-metadata.js +0 -3
- package/dist/core/custom-element-metadata.js.map +0 -9
- package/dist/core/hydration-codec.js +0 -3
- package/dist/core/hydration-codec.js.map +0 -9
- package/dist/core/radiant-component-ssr-registry.d.ts +0 -54
- package/dist/core/radiant-component-ssr-registry.js +0 -3
- package/dist/core/radiant-component-ssr-registry.js.map +0 -9
- package/dist/core/radiant-component-ssr.js +0 -3
- package/dist/core/radiant-component-ssr.js.map +0 -9
- package/dist/core/radiant-component.d.ts +0 -113
- package/dist/core/radiant-component.js +0 -3
- package/dist/core/radiant-component.js.map +0 -9
- package/dist/core/radiant-element.js +0 -3
- package/dist/core/radiant-element.js.map +0 -9
- package/dist/core/radiant-hydrator-state.js +0 -3
- package/dist/core/radiant-hydrator-state.js.map +0 -9
- package/dist/core/reactive-jsx-value.js +0 -3
- package/dist/core/reactive-jsx-value.js.map +0 -9
- package/dist/core/reactive-prop-metadata.js +0 -3
- package/dist/core/reactive-prop-metadata.js.map +0 -9
- package/dist/core/slot-projection-runtime.js +0 -3
- package/dist/core/slot-projection-runtime.js.map +0 -9
- package/dist/core/ssr-preparation.js +0 -3
- package/dist/core/ssr-preparation.js.map +0 -9
- package/dist/decorators/bound.d.ts +0 -5
- package/dist/decorators/bound.js +0 -3
- package/dist/decorators/bound.js.map +0 -9
- package/dist/decorators/bridge.d.ts +0 -8
- package/dist/decorators/bridge.js +0 -3
- package/dist/decorators/bridge.js.map +0 -9
- package/dist/decorators/custom-element.js +0 -3
- package/dist/decorators/custom-element.js.map +0 -9
- package/dist/decorators/debounce.d.ts +0 -6
- package/dist/decorators/debounce.js +0 -3
- package/dist/decorators/debounce.js.map +0 -9
- package/dist/decorators/event.js +0 -3
- package/dist/decorators/event.js.map +0 -9
- package/dist/decorators/legacy/bound.js +0 -3
- package/dist/decorators/legacy/bound.js.map +0 -9
- package/dist/decorators/legacy/custom-element.js +0 -3
- package/dist/decorators/legacy/custom-element.js.map +0 -9
- package/dist/decorators/legacy/debounce.js +0 -3
- package/dist/decorators/legacy/debounce.js.map +0 -9
- package/dist/decorators/legacy/event.js +0 -3
- package/dist/decorators/legacy/event.js.map +0 -9
- package/dist/decorators/legacy/instance-initializers.d.ts +0 -17
- package/dist/decorators/legacy/instance-initializers.js +0 -3
- package/dist/decorators/legacy/instance-initializers.js.map +0 -9
- package/dist/decorators/legacy/on-event.js +0 -3
- package/dist/decorators/legacy/on-event.js.map +0 -9
- package/dist/decorators/legacy/on-updated.d.ts +0 -6
- package/dist/decorators/legacy/on-updated.js +0 -3
- package/dist/decorators/legacy/on-updated.js.map +0 -9
- package/dist/decorators/legacy/query-slot.d.ts +0 -3
- package/dist/decorators/legacy/query-slot.js +0 -3
- package/dist/decorators/legacy/query-slot.js.map +0 -9
- package/dist/decorators/legacy/query.js +0 -3
- package/dist/decorators/legacy/query.js.map +0 -9
- package/dist/decorators/legacy/reactive-field.js +0 -3
- package/dist/decorators/legacy/reactive-field.js.map +0 -9
- package/dist/decorators/legacy/reactive-prop.d.ts +0 -20
- package/dist/decorators/legacy/reactive-prop.js +0 -3
- package/dist/decorators/legacy/reactive-prop.js.map +0 -9
- package/dist/decorators/legacy/signal.js +0 -3
- package/dist/decorators/legacy/signal.js.map +0 -9
- package/dist/decorators/on-event.js +0 -3
- package/dist/decorators/on-event.js.map +0 -9
- package/dist/decorators/on-updated.d.ts +0 -5
- package/dist/decorators/on-updated.js +0 -3
- package/dist/decorators/on-updated.js.map +0 -9
- package/dist/decorators/prop.d.ts +0 -14
- package/dist/decorators/prop.js +0 -3
- package/dist/decorators/prop.js.map +0 -9
- package/dist/decorators/query-slot.d.ts +0 -13
- package/dist/decorators/query-slot.js +0 -3
- package/dist/decorators/query-slot.js.map +0 -9
- package/dist/decorators/query.js +0 -3
- package/dist/decorators/query.js.map +0 -9
- package/dist/decorators/signal.d.ts +0 -23
- package/dist/decorators/signal.js +0 -3
- package/dist/decorators/signal.js.map +0 -9
- package/dist/decorators/standard/bound.js +0 -3
- package/dist/decorators/standard/bound.js.map +0 -9
- package/dist/decorators/standard/custom-element.js +0 -3
- package/dist/decorators/standard/custom-element.js.map +0 -9
- package/dist/decorators/standard/debounce.js +0 -3
- package/dist/decorators/standard/debounce.js.map +0 -9
- package/dist/decorators/standard/event.js +0 -3
- package/dist/decorators/standard/event.js.map +0 -9
- package/dist/decorators/standard/on-event.js +0 -3
- package/dist/decorators/standard/on-event.js.map +0 -9
- package/dist/decorators/standard/on-updated.d.ts +0 -2
- package/dist/decorators/standard/on-updated.js +0 -3
- package/dist/decorators/standard/on-updated.js.map +0 -9
- package/dist/decorators/standard/query-slot.js +0 -3
- package/dist/decorators/standard/query-slot.js.map +0 -9
- package/dist/decorators/standard/query.d.ts +0 -2
- package/dist/decorators/standard/query.js +0 -3
- package/dist/decorators/standard/query.js.map +0 -9
- package/dist/decorators/standard/reactive-field.d.ts +0 -2
- package/dist/decorators/standard/reactive-field.js +0 -3
- package/dist/decorators/standard/reactive-field.js.map +0 -9
- package/dist/decorators/standard/reactive-prop.d.ts +0 -2
- package/dist/decorators/standard/reactive-prop.js +0 -3
- package/dist/decorators/standard/reactive-prop.js.map +0 -9
- package/dist/decorators/standard/signal.js +0 -3
- package/dist/decorators/standard/signal.js.map +0 -9
- package/dist/decorators/state.d.ts +0 -11
- package/dist/decorators/state.js +0 -3
- package/dist/decorators/state.js.map +0 -9
- package/dist/helpers/create-event-listener.js +0 -3
- package/dist/helpers/create-event-listener.js.map +0 -9
- package/dist/helpers/create-event.js +0 -3
- package/dist/helpers/create-event.js.map +0 -9
- package/dist/helpers/create-query-slot.js +0 -3
- package/dist/helpers/create-query-slot.js.map +0 -9
- package/dist/helpers/create-query.js +0 -3
- package/dist/helpers/create-query.js.map +0 -9
- package/dist/helpers/debounce.js +0 -3
- package/dist/helpers/debounce.js.map +0 -9
- package/dist/helpers/index.js +0 -3
- package/dist/helpers/index.js.map +0 -9
- package/dist/index.d.ts +0 -25
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -9
- package/dist/server/context-ssr.js +0 -3
- package/dist/server/context-ssr.js.map +0 -9
- package/dist/server/html-parser.js +0 -3
- package/dist/server/html-parser.js.map +0 -9
- package/dist/server/install-light-dom-shim.js +0 -3
- package/dist/server/install-light-dom-shim.js.map +0 -10
- package/dist/server/light-dom-shim.js +0 -3
- package/dist/server/light-dom-shim.js.map +0 -9
- package/dist/server/project-root.js +0 -3
- package/dist/server/radiant-component-ssr-runtime.d.ts +0 -9
- package/dist/server/radiant-component-ssr-runtime.js +0 -3
- package/dist/server/radiant-component-ssr-runtime.js.map +0 -9
- package/dist/server/render-component.js +0 -3
- package/dist/server/render-component.js.map +0 -10
- package/dist/server/slot-projection-html.js +0 -3
- package/dist/server/slot-projection-html.js.map +0 -10
- package/dist/signals/host-resource.js +0 -3
- package/dist/signals/host-signal.js +0 -3
- package/dist/signals/host-signal.js.map +0 -9
- package/dist/signals/hydration-script.js +0 -3
- package/dist/signals/hydration-script.js.map +0 -9
- package/dist/tools/escape-script-json.js +0 -3
- package/dist/tools/escape-script-json.js.map +0 -9
- package/dist/tools/event-emitter.js +0 -3
- package/dist/tools/event-emitter.js.map +0 -9
- package/dist/tools/index.js +0 -3
- package/dist/tools/index.js.map +0 -9
- package/dist/tools/render-jsx-template.js +0 -3
- package/dist/tools/render-jsx-template.js.map +0 -9
- package/dist/tools/stringify-typed.d.ts +0 -16
- package/dist/tools/stringify-typed.js +0 -3
- package/dist/tools/stringify-typed.js.map +0 -9
- package/dist/types.js +0 -3
- package/dist/utils/attribute-utils.js +0 -3
- package/dist/utils/attribute-utils.js.map +0 -9
- package/dist/utils/index.js +0 -3
- package/dist/utils/index.js.map +0 -9
- package/size-budget.json +0 -16
- /package/{dist/client → client}/install-hydrator.d.ts +0 -0
- /package/{dist/context → context}/context-ssr-bridge.d.ts +0 -0
- /package/{dist/context → context}/create-context.d.ts +0 -0
- /package/{dist/context → context}/hydration-script.d.ts +0 -0
- /package/{dist/context → context}/types.d.ts +0 -0
- /package/{dist/context → context}/types.js +0 -0
- /package/{dist/context → context}/types.js.map +0 -0
- /package/{dist/core → core}/slot-projection-runtime.d.ts +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.d.ts +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.js +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.js.map +0 -0
- /package/{dist/core → core}/ssr-preparation.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/bound.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/custom-element.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/debounce.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/event.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/bound.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/custom-element.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/debounce.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/event.d.ts +0 -0
- /package/{dist/helpers → helpers}/create-event.d.ts +0 -0
- /package/{dist/helpers → helpers}/debounce.d.ts +0 -0
- /package/{dist/helpers → helpers}/index.d.ts +0 -0
- /package/{dist/server → server}/context-ssr.d.ts +0 -0
- /package/{dist/server → server}/html-parser.d.ts +0 -0
- /package/{dist/server → server}/install-light-dom-shim.d.ts +0 -0
- /package/{dist/server → server}/project-root.d.ts +0 -0
- /package/{dist/server → server}/slot-projection-html.d.ts +0 -0
- /package/{dist/signals → signals}/host-resource.d.ts +0 -0
- /package/{dist/signals → signals}/hydration-script.d.ts +0 -0
- /package/{dist/tools → tools}/escape-script-json.d.ts +0 -0
- /package/{dist/tools → tools}/event-emitter.d.ts +0 -0
- /package/{dist/tools → tools}/render-jsx-template.d.ts +0 -0
- /package/{dist/types.d.ts → types.d.ts} +0 -0
- /package/{dist/utils → utils}/attribute-utils.d.ts +0 -0
- /package/{dist/utils → utils}/index.d.ts +0 -0
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { EventEmitter } from '../tools';
|
|
2
2
|
import { type JsxRenderable, type SubscribableJsxValue } from '@ecopages/jsx';
|
|
3
|
+
import type { RenderToStringOptions } from '@ecopages/jsx/server';
|
|
3
4
|
import type { SsrSerializableContextProvider } from '../context/context-provider';
|
|
4
5
|
import type { UnknownContext } from '../context/types';
|
|
6
|
+
import { type ReactiveBindingOption, type ReactiveBindingValue, type ReactiveBindings, type ReactiveFieldOptions, type ReactiveProperty, type ReactivePropertyOptions } from './reactive-prop-core';
|
|
5
7
|
import type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';
|
|
6
|
-
|
|
8
|
+
export type { ReactiveBindingOption, ReactiveBindingValue, ReactiveBindings, ReactiveField, ReactiveFieldOptions, ReactiveProperty, ReactivePropertyOptions, } from './reactive-prop-core';
|
|
7
9
|
declare const RadiantElementBase: {
|
|
8
10
|
new (): HTMLElement;
|
|
9
11
|
prototype: HTMLElement;
|
|
10
12
|
};
|
|
11
|
-
type
|
|
13
|
+
type RadiantRenderTarget = HTMLElement | ShadowRoot;
|
|
12
14
|
/**
|
|
13
15
|
* Possible positions to insert a rendered template.
|
|
14
16
|
*/
|
|
@@ -22,79 +24,7 @@ export type RadiantElementEventListener = {
|
|
|
22
24
|
listener: EventListener;
|
|
23
25
|
options?: AddEventListenerOptions;
|
|
24
26
|
};
|
|
25
|
-
/**
|
|
26
|
-
* Represents a property metadata object.
|
|
27
|
-
*/
|
|
28
|
-
export interface ReactiveProperty<T = unknown> {
|
|
29
|
-
type: AttributeTypeConstant;
|
|
30
|
-
value?: T;
|
|
31
|
-
initialValue?: T;
|
|
32
|
-
name: string;
|
|
33
|
-
attribute: string;
|
|
34
|
-
converter: {
|
|
35
|
-
fromAttribute: (value: string) => ReadAttributeValueReturnType;
|
|
36
|
-
toAttribute: (value: any) => WriteAttributeValueReturnType;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Represents the options for a reactive property.
|
|
41
|
-
*/
|
|
42
|
-
export type ReactivePropertyOptions<T> = {
|
|
43
|
-
type: AttributeTypeConstant;
|
|
44
|
-
reflect?: boolean;
|
|
45
|
-
attribute?: string;
|
|
46
|
-
defaultValue?: T;
|
|
47
|
-
/**
|
|
48
|
-
* Exposes a JSX binding companion for the reactive property.
|
|
49
|
-
*
|
|
50
|
-
* - `true` creates a `$propertyName` accessor.
|
|
51
|
-
* - a string creates a custom accessor with that name.
|
|
52
|
-
* - `undefined` defers to the host default.
|
|
53
|
-
*
|
|
54
|
-
* The generated accessor returns a subscribable JSX child value so JSX can
|
|
55
|
-
* patch only the affected child part when the property changes.
|
|
56
|
-
*/
|
|
57
|
-
bind?: boolean | string;
|
|
58
|
-
};
|
|
59
|
-
export type ReactiveBindingOption = boolean | string;
|
|
60
|
-
export type ReactiveFieldOptions = {
|
|
61
|
-
/**
|
|
62
|
-
* Exposes a JSX binding companion for the reactive field.
|
|
63
|
-
*
|
|
64
|
-
* - `true` creates a `$fieldName` accessor.
|
|
65
|
-
* - a string creates a custom accessor with that name.
|
|
66
|
-
* - `undefined` defers to the host default.
|
|
67
|
-
*/
|
|
68
|
-
bind?: ReactiveBindingOption;
|
|
69
|
-
};
|
|
70
|
-
export type ReactiveField<T = unknown> = {
|
|
71
|
-
name: string;
|
|
72
|
-
value: T;
|
|
73
|
-
initialValue: T;
|
|
74
|
-
};
|
|
75
27
|
type StringPropertyKey<Value> = Extract<keyof Value, string>;
|
|
76
|
-
/**
|
|
77
|
-
* Value type produced by a JSX binding for a selected reactive member.
|
|
78
|
-
*
|
|
79
|
-
* Bindings preserve the original property type when it is already renderable by
|
|
80
|
-
* the Ecopages JSX runtime. For non-renderable values, the binding falls back
|
|
81
|
-
* to the broader `JsxRenderable` contract consumed by the renderer.
|
|
82
|
-
*/
|
|
83
|
-
export type ReactiveBindingValue<Host extends object, Property extends StringPropertyKey<Host>> = Host[Property] extends JsxRenderable ? Host[Property] : JsxRenderable;
|
|
84
|
-
/**
|
|
85
|
-
* Namespace of cached JSX bindings keyed by the explicit bindable shape.
|
|
86
|
-
*
|
|
87
|
-
* Radiant exposes this namespace twice on every host:
|
|
88
|
-
*
|
|
89
|
-
* - `host.bindings.key` for the explicit form
|
|
90
|
-
* - `host.$.key` for the short form
|
|
91
|
-
*
|
|
92
|
-
* Both aliases resolve through the same cached binding objects as
|
|
93
|
-
* `host.bind('key')`.
|
|
94
|
-
*/
|
|
95
|
-
export type ReactiveBindings<Bindings extends object> = {
|
|
96
|
-
readonly [Property in StringPropertyKey<Bindings>]: SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;
|
|
97
|
-
};
|
|
98
28
|
/**
|
|
99
29
|
* Represents an interface for a Radiant element.
|
|
100
30
|
* @typeParam Bindings - Explicit internal bindable shape used to type `bind()` and `getReactiveBinding()`.
|
|
@@ -225,30 +155,18 @@ export interface IRadiantElement<Bindings extends object = {}> {
|
|
|
225
155
|
* @implements IRadiantElement<Bindings>
|
|
226
156
|
*/
|
|
227
157
|
export declare class RadiantElement<Bindings extends object = {}> extends RadiantElementBase implements IRadiantElement<Bindings> {
|
|
228
|
-
readonly bindings: ReactiveBindings<Bindings>;
|
|
229
|
-
readonly $: ReactiveBindings<Bindings>;
|
|
230
|
-
/**
|
|
231
|
-
* A map of property metadata objects, it contains useful information about the properties configured via decorators.
|
|
232
|
-
*/
|
|
233
|
-
private reactiveProperties;
|
|
234
158
|
/**
|
|
235
|
-
*
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
*
|
|
240
|
-
* in tracked component renders.
|
|
241
|
-
*/
|
|
242
|
-
private reactiveDependencies;
|
|
243
|
-
/**
|
|
244
|
-
* Raw value readers for reactive members whose public getter should also
|
|
245
|
-
* register tracked render dependencies.
|
|
246
|
-
*/
|
|
247
|
-
private reactiveDependencyReaders;
|
|
248
|
-
/**
|
|
249
|
-
* Stable subscribable JSX bindings keyed by reactive property name.
|
|
159
|
+
* Controls where the JSX render lifecycle mounts the component view.
|
|
160
|
+
*
|
|
161
|
+
* Subclasses can override this with `'shadow'` to force an internal open
|
|
162
|
+
* shadow root for client-side rendering. Host SSR helpers remain light-DOM
|
|
163
|
+
* only and throw when shadow render mode is enabled.
|
|
250
164
|
*/
|
|
251
|
-
|
|
165
|
+
protected readonly renderRootMode: 'light' | 'shadow';
|
|
166
|
+
readonly bindings: ReactiveBindings<Bindings>;
|
|
167
|
+
readonly $: ReactiveBindings<Bindings>;
|
|
168
|
+
private readonly reactiveHost;
|
|
169
|
+
private readonly reactivePropertyState;
|
|
252
170
|
/**
|
|
253
171
|
* Registered context providers keyed by decorated property name.
|
|
254
172
|
*/
|
|
@@ -257,10 +175,6 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
257
175
|
* Registered keyed hydration payload producers appended to SSR host output.
|
|
258
176
|
*/
|
|
259
177
|
private hydrationBindings;
|
|
260
|
-
/**
|
|
261
|
-
* A map of property update callbacks. These callbacks are called when a property is updated.
|
|
262
|
-
*/
|
|
263
|
-
private updateCallbacks;
|
|
264
178
|
/**
|
|
265
179
|
* A map of event subscriptions used to manage event listeners on the Radiant element.
|
|
266
180
|
*/
|
|
@@ -269,25 +183,21 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
269
183
|
* A map for event emitters
|
|
270
184
|
*/
|
|
271
185
|
private eventEmitters;
|
|
272
|
-
/**
|
|
273
|
-
* Callbacks executed whenever the Radiant element is connected to the DOM.
|
|
274
|
-
*/
|
|
275
|
-
private onConnectedCallbacks;
|
|
276
|
-
/**
|
|
277
|
-
* An array of cleanup callbacks to be executed when the Radiant element is disconnected from the DOM.
|
|
278
|
-
*/
|
|
279
|
-
private onDisconnectedCallback;
|
|
280
186
|
/**
|
|
281
187
|
* A flag indicating whether the element has been connected to the DOM.
|
|
282
188
|
*/
|
|
283
189
|
private elementReady;
|
|
190
|
+
private isRendering;
|
|
191
|
+
private isFirstConnectPending;
|
|
192
|
+
private isRenderScheduled;
|
|
193
|
+
private needsRender;
|
|
194
|
+
private renderRuntime?;
|
|
284
195
|
constructor();
|
|
285
|
-
|
|
196
|
+
get slotProjectionVersion(): number;
|
|
286
197
|
connectedCallback(): void;
|
|
287
198
|
connectedContextCallback(_contextName: UnknownContext): void;
|
|
288
199
|
disconnectedCallback(): void;
|
|
289
200
|
notifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void;
|
|
290
|
-
private transformAttributeValue;
|
|
291
201
|
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
292
202
|
/**
|
|
293
203
|
* Renders a trusted HTML template string into the specified target element.
|
|
@@ -303,14 +213,18 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
303
213
|
insert?: RenderInsertPosition;
|
|
304
214
|
sanitize?: (html: string) => string;
|
|
305
215
|
}): void;
|
|
216
|
+
render(): JsxRenderable;
|
|
217
|
+
renderViewToString(options?: RenderToStringOptions): string;
|
|
218
|
+
hydrate(): void;
|
|
219
|
+
requestUpdate(): void;
|
|
220
|
+
update(): void;
|
|
306
221
|
registerReactiveProperty(config: ReactiveProperty): void;
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
registerReactiveDependencyReader(property: string, read: ReactiveDependencyReader): void;
|
|
222
|
+
getReactiveProperties(): ReactiveProperty[];
|
|
223
|
+
registerReactiveDependencyReader(property: string, read: () => unknown): void;
|
|
310
224
|
registerContextProvider(name: string, provider: SsrSerializableContextProvider): void;
|
|
311
225
|
registerHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void;
|
|
312
|
-
|
|
313
|
-
|
|
226
|
+
getContextProviders(): SsrSerializableContextProvider[];
|
|
227
|
+
getHydrationBindings(): SsrSerializableHydrationBinding[];
|
|
314
228
|
/**
|
|
315
229
|
* Flushes any deferred SSR-only preparation work before the host is
|
|
316
230
|
* serialized.
|
|
@@ -322,20 +236,22 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
322
236
|
/**
|
|
323
237
|
* Returns the default JSX binding policy for reactive members on this host.
|
|
324
238
|
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
239
|
+
* `RadiantElement` hosts default to automatic bindings for reactive members
|
|
240
|
+
* when no explicit `bind` option is supplied.
|
|
241
|
+
*
|
|
242
|
+
* Lower-level hosts can override this hook to opt out when they want binding
|
|
243
|
+
* creation to stay fully explicit across `@prop`, `@state`, and direct
|
|
244
|
+
* `createReactiveProp`/`createReactiveField` calls.
|
|
329
245
|
*/
|
|
330
246
|
protected shouldAutoBindReactiveMembers(): boolean;
|
|
247
|
+
protected shouldRunRenderLifecycle(): boolean;
|
|
248
|
+
/** Returns the DOM root used by client-side render and hydrate work. */
|
|
249
|
+
protected getRenderTarget(): RadiantRenderTarget;
|
|
331
250
|
registerUpdateCallback(property: string, update: (...rest: any[]) => any): () => void;
|
|
332
251
|
getReactiveBinding<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;
|
|
333
252
|
bind<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;
|
|
334
253
|
defineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;
|
|
335
|
-
private getReactiveDependency;
|
|
336
254
|
trackReactiveRead(property: string): void;
|
|
337
|
-
private readReactiveDependencyValue;
|
|
338
|
-
private readReactiveBindingValue;
|
|
339
255
|
subscribeEvents(events: RadiantElementEventListener[]): Array<() => void>;
|
|
340
256
|
subscribeEvent(eventConfig: RadiantElementEventListener): () => void;
|
|
341
257
|
private unsubscribeEvent;
|
|
@@ -355,7 +271,23 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
355
271
|
registerEventEmitter(name: string, emitter: EventEmitter): void;
|
|
356
272
|
getRef<T extends Element = Element>(ref: string, all: true): T[];
|
|
357
273
|
getRef<T extends Element = Element>(ref: string, all?: false): T | null;
|
|
274
|
+
getSlotElement<T extends Element = Element>(name?: string): T | null;
|
|
275
|
+
getSlotElements<T extends Element = Element>(name?: string): T[];
|
|
358
276
|
createReactiveField<T>(propertyName: string, initialValue: T, options?: ReactiveFieldOptions): void;
|
|
277
|
+
/**
|
|
278
|
+
* Defines a reactive custom-element property backed by a Radiant accessor.
|
|
279
|
+
*
|
|
280
|
+
* When the host was assigned a value before upgrade, that pre-upgrade value is
|
|
281
|
+
* preferred over attribute parsing and `defaultValue` so early `.prop = value`
|
|
282
|
+
* writes survive into the reactive lifecycle.
|
|
283
|
+
*/
|
|
359
284
|
createReactiveProp<T = unknown>(propertyName: string, options: ReactivePropertyOptions<T>): void;
|
|
285
|
+
getSlotProjectionScriptTag(): string | undefined;
|
|
286
|
+
getAuthoredHydrationScriptMarkup(): string | undefined;
|
|
287
|
+
resolveTrackedRenderOutput(): {
|
|
288
|
+
containsSlots: boolean;
|
|
289
|
+
value: JsxRenderable;
|
|
290
|
+
};
|
|
291
|
+
private getOrCreateRenderRuntime;
|
|
292
|
+
private resolveRenderSurface;
|
|
360
293
|
}
|
|
361
|
-
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var r0=(($)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy($,{get:(Q,X)=>(typeof require<"u"?require:Q)[X]}):$)(function($){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+$+'" is not supported')});var I=Symbol.for("@ecopages/radiant.legacy-instance-initializers"),R=Symbol.for("@ecopages/radiant.legacy-post-construction-initializers"),K0=Symbol.for("@ecopages/radiant.legacy-executed-post-construction-initializers");function e0($,Q){f($,I,Q)}function $2($,Q){f($,R,Q)}function T($){O($,I)}function H($){let Q=$;O($,R,Q[K0]??=new Set)}function f($,Q,X){let q=$,Z=Object.prototype.hasOwnProperty.call(q,Q)?q[Q]:void 0;if(Array.isArray(Z)){Z.push(X);return}Object.defineProperty(q,Q,{value:[X]})}function O($,Q,X,q=Object.getPrototypeOf($)){if(!q||q===Object.prototype)return;O($,Q,X,Object.getPrototypeOf(q));let Z=q[Q];if(!Array.isArray(Z))return;for(let W of Z){if(X?.has(W))continue;W($),X?.add(W)}}function V($){switch($){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function w0($){switch(typeof $){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}if(Array.isArray($))return"array";if(Object.prototype.toString.call($)==="[object Object]")return"object"}function D0($){switch($){case Number:return 0;case String:return"";case Boolean:return!1;default:return null}}function z0($){try{return JSON.parse($)}catch{throw TypeError("Invalid JSON string")}}var L0={array($){let Q=z0($);if(!Array.isArray(Q))throw TypeError(`Expected an array but got a value of type "${typeof Q}"`);return Q},boolean($){return!($==="0"||String($).toLowerCase()==="false")},number($){return Number($.replace(/_/g,""))},object($){let Q=JSON.parse($);if(Q===null||typeof Q!=="object"||Array.isArray(Q))throw TypeError(`expected value of type "object" but instead got value "${$}" of type "${w0(Q)}"`);return Q},string($){return $}},S={default:N,array:h,object:h};function h($){return JSON.stringify($)}function N($){return`${$}`}function K($,Q){let X=V(Q);if(!X)throw TypeError(`[radiant-element] Unknown type "${Q}"`);return L0[X]($)}function g($,Q){let X=V(Q);if(!X)throw TypeError(`[radiant-element] Unknown type "${Q}"`);return(S[X]??S.default??N)($)}function O0($){return typeof $==="boolean"}function P0($){return typeof $==="number"}function E0($){return typeof $==="string"}function j0($){return Array.isArray($)}function A0($){return typeof $==="object"&&!Array.isArray($)&&$!==null}function b($,Q){switch($){case Boolean:return O0(Q);case Number:return P0(Q);case String:return E0(Q);case Array:return j0(Q);case Object:return A0(Q);default:return!1}}var v=($,Q,X,q)=>{if(Q===Boolean){let W=$.getAttribute(X);if(W===null)return q;return W===""?!0:K(W,Q)}let Z=$.getAttribute(X);return Z!==null?K(Z,Q):q??D0(Q)};function m($,Q){if(Q!==void 0&&!b($,Q))throw Error(`defaultValue does not match the expected type for ${$.name}`)}function y($,Q,X,q){return{type:X,name:$,value:q,initialValue:q,attribute:Q,converter:{fromAttribute:(Z)=>K(Z,X),toAttribute:(Z)=>g(Z,X)}}}import{Computed as _0,subtle as k0,trackDependency as C0}from"@ecopages/signals";function I0($){return $}function c($){return $}var s={trackDependency($){C0(I0($))},createComputed($){return new _0($)},createWatcher($){let Q=new k0.Watcher($);return{watch(X){Q.watch(c(X))},unwatch(X){Q.unwatch(c(X))}}}};var u=s;function w(){return u}function R0($){u=$}function P($){w().trackDependency($)}function d($){return w().createComputed($)}function p($){return w().createWatcher($)}function i($){return $.replace(/&/g,"\\u0026").replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}var J="data-hydration",o="data-hydration-type",E="data-hydration-key";function Y2($){let Q=$.hydrationKey?` ${E}="${T0($.hydrationKey)}"`:"";return`<script type="application/json" ${J} ${o}="${$.type}"${Q}>${$.serializedValue}</script>`}function K2($){return i($)}function w2($,Q){let X=$.textContent;if(!X)return Q;try{return JSON.parse(X)}catch{if(typeof console<"u")console.warn(`[@ecopages/radiant] Failed to parse hydration payload from <script ${J}>:`,X.slice(0,120));return Q}}function D2($,Q,X){let q=$.children;if(!q||q.length===0){let Z=$.childNodes;if(!Z||Z.length===0)return null;for(let W=0;W<Z.length;W+=1){let G=Z[W];if(G.nodeType!==1)continue;let M=G;if(l(M,Q,X))return M}return null}for(let Z=0;Z<q.length;Z+=1)if(l(q[Z],Q,X))return q[Z];return null}function l($,Q,X){if($.tagName!=="SCRIPT"||!$.hasAttribute(J)||$.getAttribute(o)!==Q)return!1;if(X!==void 0)return $.getAttribute(E)===X;return!$.hasAttribute(E)}function T0($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")}import{createMarkupNodeLike as f0,isKeyedJsxValue as n,isSlotJsxValue as S0}from"@ecopages/jsx";var B="",z="data-radiant-slot-projection";function a($){let Q=new Map;for(let X of Array.from($.childNodes)){if(g0(X))continue;h0(Q,N0(X),X)}return Q}function r($){let Q;try{Q=JSON.parse($)}catch{if(typeof console<"u")console.warn("[@ecopages/radiant] Failed to parse slot projection payload:",$.slice(0,120));return new Map}let X=new Map;for(let[q,Z]of Object.entries(Q)){if(!Array.isArray(Z)||Z.length===0)continue;X.set(j(q),Z.map((W)=>f0(W)))}return X}function t($){let Q=Array.from($.childNodes).filter((X)=>Z0(X)).map((X)=>D(X)??"").filter((X)=>X!=="");return Q.length>0?Q.join(""):void 0}function e($){let Q={};for(let[X,q]of $.entries()){let Z=q.map((W)=>D(W)).filter((W)=>W!==void 0&&W!=="");if(Z.length>0)Q[X]=Z}return Object.keys(Q).length>0?JSON.stringify(Q):void 0}function $0($,Q){let X=!1,q=(W)=>{if(S0(W))return X=!0,v0(W,Q,q);if(n(W))return V0(W,q(W.value));if(b0(W))return{_$rType$:1,rootLocalName:W.rootLocalName,ssrIntrinsicProps:W.ssrIntrinsicProps,strings:W.strings,values:W.values.map((G)=>q(G))};if(X0(W))return Array.from(W,(G)=>q(G));return W},Z=q($);return{containsSlots:X,value:Z}}function Q0($){for(let Q of Array.from($.childNodes)){if(!q0(Q))continue;let X=Q.textContent??void 0;return Q.parentNode?.removeChild(Q),X}return}function h0($,Q,X){let q=$.get(Q);if(q){q.push(X);return}$.set(Q,[X])}function V0($,Q){return{...$,value:Q}}function N0($){if($ instanceof Element)return j($.getAttribute("slot"));return B}function X0($){return typeof $!=="string"&&typeof $==="object"&&$!==null&&Symbol.iterator in $}function q0($){return $ instanceof HTMLScriptElement&&$.hasAttribute(z)}function Z0($){return $ instanceof HTMLScriptElement&&$.hasAttribute(J)}function g0($){return q0($)||Z0($)}function b0($){return typeof $==="object"&&$!==null&&$._$rType$===1&&Array.isArray($.strings)&&Array.isArray($.values)}function j($){return $??B}function D($){if($===void 0||$===null||$===!1||$===!0)return;if(typeof Node<"u"&&$ instanceof Node){if($.nodeType===Node.TEXT_NODE)return $.textContent??"";return $.outerHTML??$.textContent??void 0}if(n($))return D($.value);if(typeof $==="string"||typeof $==="number"||typeof $==="bigint")return String($);if(typeof $==="object"&&$!==null&&"outerHTML"in $)return typeof $.outerHTML==="string"?$.outerHTML:$.textContent??void 0;if(X0($))return Array.from($,(Q)=>D(Q)??"").join("");return}function v0($,Q,X){let q=Q.get(j($.name));if(q&&q.length>0)return q.length===1?q[0]:q;if($.fallback===void 0)return"";return X($.fallback)}import{hydrate as m0,render as y0}from"@ecopages/jsx";class A{#$;#Q=new Map;#X;#Z;#q;#W=0;constructor($){this.#$=$,this.#Z=p(()=>{this.#$.requestUpdate()})}get slotProjectionVersion(){return this.#W}getSlotElements($){return this.ensureSlotProjectionState(),(this.#Q.get($??B)??[]).filter((Q)=>typeof Node<"u"&&Q instanceof Element)}getSlotProjectionScriptTag(){this.ensureSlotProjectionState();let $=e(this.#Q);if(!$)return;return`<script type="application/json" ${z}>${c0($)}</script>`}getAuthoredHydrationScriptMarkup(){return t(this.#$)??void 0}hydrate($){this.disconnectSlotProjectionObserver();try{m0(this.resolveTrackedRenderOutput().value,$)}finally{this.observeSlotProjection()}}render($){this.disconnectSlotProjectionObserver();try{y0(this.resolveTrackedRenderOutput().value,$)}finally{this.observeSlotProjection()}}observeSlotProjection(){if(typeof MutationObserver>"u"||this.#q||!this.#$.isConnected)return;this.#q=new MutationObserver(($)=>this.handleSlotProjectionMutations($)),this.#q.observe(this.#$,{childList:!0})}disconnectSlotProjectionObserver(){this.#q?.disconnect(),this.#q=void 0}disconnectRenderWatcher(){if(!this.#X)return;this.#Z.unwatch(this.#X),this.#X=void 0}resolveTrackedRenderOutput(){let $=d(()=>this.resolveRenderOutput()),Q=$.get();if(!this.#$.isConnected)return Q;if(this.#X)this.#Z.unwatch(this.#X);return this.#X=$,this.#Z.watch($),Q}dispose(){this.disconnectSlotProjectionObserver(),this.disconnectRenderWatcher()}ensureSlotProjectionState(){if(this.#Q.size>0)return;let $=this.#$.isConnected?Q0(this.#$):void 0;if(typeof $==="string"&&$!==""){this.#Q=r($),this.#W+=1;return}if(this.#$.childNodes.length>0)this.#Q=a(this.#$),this.#W+=1}handleSlotProjectionMutations($){let Q=!1;for(let X of $){for(let q of Array.from(X.removedNodes))if(this.removeProjectedSlotNode(q))Q=!0;for(let q of Array.from(X.addedNodes)){if(q.parentNode!==this.#$)continue;if(this.addProjectedSlotNode(q))Q=!0}}if(Q)this.#W+=1,this.#$.requestUpdate()}addProjectedSlotNode($){if($ instanceof HTMLScriptElement&&($.hasAttribute(z)||$.hasAttribute(J)))return!1;let Q=$ instanceof Element?$.getAttribute("slot")??B:B,X=this.#Q.get(Q);if(X){if(X.includes($))return!1;return X.push($),!0}return this.#Q.set(Q,[$]),!0}removeProjectedSlotNode($){for(let[Q,X]of this.#Q.entries()){let q=X.indexOf($);if(q===-1)continue;if(X.splice(q,1),X.length===0)this.#Q.delete(Q);return!0}return!1}resolveRenderOutput(){return this.ensureSlotProjectionState(),$0(this.#$.render(),this.#Q)}}function c0($){return $.replace(/</g,"\\u003c")}import{createSubscribableJsxValue as s0}from"@ecopages/jsx";class W0{read;subscribers=new Set;watcherListeners=new Set;version=0;constructor($){this.read=$}get(){return P(this),this.read()}subscribe($){return this.subscribers.add($),()=>{this.subscribers.delete($)}}addWatcher($){return this.watcherListeners.add($),()=>{this.watcherListeners.delete($)}}getVersion(){return this.version}notify($){this.version+=1;let Q;try{this.notifyWatchers()}catch(X){Q=X}if(this.publish($),Q)throw Q}publish($){for(let Q of this.subscribers)Q($)}notifyWatchers(){let $=[];for(let Q of this.watcherListeners)try{Q()}catch(X){$.push(X)}if($.length===1)throw $[0];if($.length>1)throw AggregateError($,"Multiple reactive dependency notifications failed.")}}function u0($){return typeof $==="object"&&$!==null&&typeof $.get==="function"}class _{host;access;shouldAutoBind;bindings;$;reactiveFields=new Map;reactiveDependencies=new Map;reactiveDependencyReaders=new Map;reactiveBindings=new Map;updateCallbacks=new Map;onConnectedCallbacks=[];onDisconnectedCallback=[];constructor($,Q,X){this.host=$;this.access=Q;this.shouldAutoBind=X;let q=this.createReactiveBindingNamespace();this.bindings=q,this.$=q}connectHost(){for(let $ of this.onConnectedCallbacks)$()}disconnectHost(){for(let $ of this.onDisconnectedCallback)$()}notifyUpdate($,Q,X){if(Q===X)return;this.reactiveDependencies.get($)?.notify(X);let q=this.updateCallbacks.get($);if(q)for(let Z of q)Z()}registerCleanupCallback($){this.onDisconnectedCallback.push($)}registerConnectedCallback($){this.onConnectedCallbacks.push($)}registerHydrationBinding($,Q){}registerReactiveDependencyReader($,Q){this.reactiveDependencyReaders.set($,Q)}registerUpdateCallback($,Q){if(!this.updateCallbacks.has($))this.updateCallbacks.set($,new Set);let X=this.updateCallbacks.get($);return X.add(Q),()=>{if(X.delete(Q),X.size===0)this.updateCallbacks.delete($)}}getReactiveBinding($){let Q=this.reactiveBindings.get($);if(Q)return Q;let X=s0({getValue:()=>this.readReactiveBindingValue($),subscribe:(q)=>this.registerUpdateCallback($,()=>{q(this.readReactiveBindingValue($))})});return this.reactiveBindings.set($,X),X}defineReactiveBinding($,Q=!0){let X=typeof Q==="string"?Q:Q?`$${$}`:void 0,q=this.access.getBindingTarget?.(this.host)??this.host;if(!X||this.access.hasProperty(this.host,X))return;this.access.defineProperty(q,X,{get:()=>this.getReactiveBinding($),enumerable:!1,configurable:!0})}trackReactiveRead($){P(this.getReactiveDependency($))}defineReactiveAccessor($,Q){let X=Q.bind??this.shouldAutoBind();if(this.defineReactiveBinding($,X),this.registerReactiveDependencyReader($,Q.getValue),this.access.defineProperty(this.host,$,{get:()=>{return this.trackReactiveRead($),Q.getValue()},set:(q)=>{let Z=Q.getValue();if(Z===q)return;Q.setValue(q),this.notifyUpdate($,Z,q)},enumerable:!0,configurable:!0}),Q.notifyInitialValue!==void 0)this.notifyUpdate($,void 0,Q.notifyInitialValue)}createReactiveField($,Q,X={}){let q={name:$,value:Q,initialValue:Q};this.reactiveFields.set($,q),this.defineReactiveAccessor($,{bind:X.bind,getValue:()=>this.reactiveFields.get($)?.value,setValue:(Z)=>{this.reactiveFields.set($,{...q,value:Z})},notifyInitialValue:Q})}createReactiveBindingNamespace(){return new Proxy(Object.create(null),{get:($,Q)=>{if(typeof Q!=="string")return;return this.getReactiveBinding(Q)}})}getReactiveDependency($){let Q=this.reactiveDependencies.get($);if(Q)return Q;let X=new W0(()=>this.readReactiveDependencyValue($));return this.reactiveDependencies.set($,X),X}readReactiveDependencyValue($){let Q=this.reactiveDependencyReaders.get($);if(Q)return Q();return this.readReactiveBindingValue($)}readReactiveBindingValue($){let Q=this.access.readProperty(this.host,$);if(u0(Q))return Q.get();return Q}}var k=Symbol.for("@ecopages/radiant.ssr-preparation-callbacks"),G0=Symbol.for("@ecopages/radiant.ssr-preparation-running");function T2($,Q){let q=$[k];if(Array.isArray(q)){q.push(Q);return}Object.defineProperty($,k,{value:[Q],configurable:!0})}function J0($){let Q=$,X=Q[k];if(!Array.isArray(X))return;Q[G0]=!0;try{for(let q of X)q()}finally{delete Q[G0]}}var C=Symbol.for("@ecopages/radiant.hydrator-installed");function S2(){globalThis[C]=!0}function h2(){delete globalThis[C]}function F0(){return globalThis[C]===!0}import{getActiveSsrScopeValue as d0,withActiveSsrScopeValue as p0}from"@ecopages/jsx/server";var x0=Symbol.for("@ecopages/radiant.element-ssr-runtime");function B0(){return d0(x0)}function g2($,Q){return p0(x0,$,Q)}import{hasHydrationMarkers as i0,jsx as l0}from"@ecopages/jsx";var o0=n0();function n0(){if(typeof HTMLElement<"u")return HTMLElement;throw Error("RadiantElement requires HTMLElement. Install '@ecopages/radiant/server/light-dom-shim' before SSR imports.")}class H0 extends o0{renderRootMode="light";bindings;$;reactiveHost;reactivePropertyState;contextProviders=new Map;hydrationBindings=new Map;eventSubscriptions=new Map;eventEmitters=new Map;elementReady=!1;isRendering=!1;isFirstConnectPending=!1;isRenderScheduled=!1;needsRender=!1;renderRuntime;constructor(){super();this.reactivePropertyState=new U0(this),this.reactiveHost=new _(this,{defineProperty:($,Q,X)=>Object.defineProperty($,Q,X),getBindingTarget:($)=>Object.getPrototypeOf($)??$,hasProperty:($,Q)=>(Q in $),readProperty:($,Q)=>$[Q]},()=>this.shouldAutoBindReactiveMembers()),this.bindings=this.reactiveHost.bindings,this.$=this.reactiveHost.$,T(this)}get slotProjectionVersion(){return this.renderRuntime?.slotProjectionVersion??0}connectedCallback(){H(this);let $=this.isFirstConnectPending;if(this.elementReady=!0,this.reactiveHost.connectHost(),$)return;this.isFirstConnectPending=!0,queueMicrotask(()=>{if(this.isFirstConnectPending=!1,!this.isConnected)return;if(!this.shouldRunRenderLifecycle())return;if(this.getOrCreateRenderRuntime().observeSlotProjection(),M0(this)){if(this.needsRender=!1,this.hydrate(),this.needsRender)this.update();return}this.update()})}connectedContextCallback($){}disconnectedCallback(){this.renderRuntime?.dispose(),this.renderRuntime=void 0,this.removeAllSubscribedEvents(),this.reactiveHost.disconnectHost()}notifyUpdate($,Q,X){this.reactiveHost.notifyUpdate($,Q,X)}attributeChangedCallback($,Q,X){if(Q===X||!this.elementReady)return;this.reactivePropertyState.applyAttributeChange($,Q,X)}renderTemplate({target:$=this,template:Q,insert:X="replace",sanitize:q}){let Z=q?q(Q):Q;switch(X){case"replace":$.innerHTML=Z;break;case"beforeend":$.insertAdjacentHTML("beforeend",Z);break;case"afterbegin":$.insertAdjacentHTML("afterbegin",Z);break;case"beforebegin":$.insertAdjacentHTML("beforebegin",Z);break;case"afterend":$.insertAdjacentHTML("afterend",Z);break}}render(){return l0("slot",{})}renderViewToString($={}){if(!this.shouldRunRenderLifecycle())return this.innerHTML;return H(this),this.prepareForSsr(),a0().renderView(this,$)}hydrate(){if(!this.shouldRunRenderLifecycle()||!this.isConnected||this.isRendering)return;let{renderTarget:$}=this.resolveRenderSurface(),Q=this.getOrCreateRenderRuntime();this.isRendering=!0;try{Q.hydrate($)}finally{this.isRendering=!1}}requestUpdate(){if(!this.shouldRunRenderLifecycle())return;if(this.needsRender=!0,this.isRenderScheduled)return;this.isRenderScheduled=!0,queueMicrotask(()=>{if(this.isRenderScheduled=!1,!this.needsRender)return;this.update()})}update(){if(!this.shouldRunRenderLifecycle())return;let{renderTarget:$}=this.resolveRenderSurface(),Q=this.getOrCreateRenderRuntime();if(this.needsRender=!0,!this.isConnected||this.isRendering)return;if(this.isFirstConnectPending&&M0(this))return;while(this.needsRender&&this.isConnected){this.needsRender=!1,this.isRendering=!0;try{Q.render($)}finally{this.isRendering=!1}}}registerReactiveProperty($){this.reactivePropertyState.register($)}getReactiveProperties(){return this.reactivePropertyState.getAll()}registerReactiveDependencyReader($,Q){this.reactiveHost.registerReactiveDependencyReader($,Q)}registerContextProvider($,Q){this.contextProviders.set($,Q),this.hydrationBindings.set($,Q)}registerHydrationBinding($,Q){this.hydrationBindings.set($,Q)}getContextProviders(){return H(this),[...this.contextProviders.values()]}getHydrationBindings(){return H(this),[...this.hydrationBindings.values()]}prepareForSsr(){J0(this)}shouldAutoBindReactiveMembers(){return!0}shouldRunRenderLifecycle(){return this.render!==H0.prototype.render}getRenderTarget(){if(this.renderRootMode!=="shadow")return this;if(this.shadowRoot)return this.shadowRoot;if(typeof this.attachShadow!=="function")throw Error("RadiantElement shadow render mode requires attachShadow().");return this.attachShadow({mode:"open"})}registerUpdateCallback($,Q){return this.reactiveHost.registerUpdateCallback($,Q)}getReactiveBinding($){return this.reactiveHost.getReactiveBinding($)}bind($){return this.reactiveHost.getReactiveBinding($)}defineReactiveBinding($,Q=!0){this.reactiveHost.defineReactiveBinding($,Q)}trackReactiveRead($){this.reactiveHost.trackReactiveRead($)}subscribeEvents($){let Q=[];for(let X of $)Q.push(this.subscribeEvent(X));return Q}subscribeEvent($){let{interactionTarget:Q}=this.resolveRenderSurface(),X=(Z)=>{if(Z.target&&Z.target.matches($.selector))$.listener.call(this,Z)},q=`${$.type}:${$.selector}`;return Q.addEventListener($.type,X,$.options),this.eventSubscriptions.set(q,{...$,listener:X,target:Q}),this.unsubscribeEvent.bind(this,q)}unsubscribeEvent($){let Q=this.eventSubscriptions.get($);if(Q)Q.target.removeEventListener(Q.type,Q.listener,Q.options),this.eventSubscriptions.delete($)}removeAllSubscribedEvents(){for(let $ of this.eventSubscriptions.values())$.target.removeEventListener($.type,$.listener,$.options);this.eventSubscriptions.clear()}registerCleanupCallback($){this.reactiveHost.registerCleanupCallback($)}registerConnectedCallback($){this.reactiveHost.registerConnectedCallback($)}registerEventEmitter($,Q){this.eventEmitters.set($,Q)}getRef($,Q=!1){let X=`[data-ref="${$}"]`,{queryRoot:q}=this.resolveRenderSurface();if(Q)return Array.from(q.querySelectorAll(X));return q.querySelector(X)??null}getSlotElement($){return this.getSlotElements($)[0]??null}getSlotElements($){return this.getOrCreateRenderRuntime().getSlotElements($)}createReactiveField($,Q,X={}){this.reactiveHost.createReactiveField($,Q,X)}createReactiveProp($,Q){this.reactivePropertyState.create($,Q,(X,q,Z)=>v(this,X,q,Z),(X,q)=>{this.reactiveHost.defineReactiveAccessor(X,q)})}getSlotProjectionScriptTag(){return this.getOrCreateRenderRuntime().getSlotProjectionScriptTag()}getAuthoredHydrationScriptMarkup(){return this.getOrCreateRenderRuntime().getAuthoredHydrationScriptMarkup()}resolveTrackedRenderOutput(){return this.getOrCreateRenderRuntime().resolveTrackedRenderOutput()}getOrCreateRenderRuntime(){if(this.renderRuntime)return this.renderRuntime;return this.renderRuntime=new A(this),this.renderRuntime}resolveRenderSurface(){let $=this.getRenderTarget(),Q=$ instanceof ShadowRoot?$:this;return{interactionTarget:Q,queryRoot:Q,renderTarget:$}}}function a0(){let $=B0();if(!$)throw Error("Radiant SSR runtime unavailable. Import `@ecopages/radiant/server/render-component` first.");return $}function M0($){return F0()&&i0($)}class U0{host;properties=new Map;preUpgradePropertyValues=new Map;constructor($){this.host=$;for(let Q of Object.getOwnPropertyNames($))this.preUpgradePropertyValues.set(Q,Reflect.get($,Q))}register($){this.properties.set($.name,$)}getAll(){return Array.from(this.properties.values())}applyAttributeChange($,Q,X){let q=this.properties.get($);if(!q)return;let Z=this.transformAttributeValue(X,q),W=this.transformAttributeValue(Q,q);Reflect.set(this.host,q.attribute,Z),this.host.notifyUpdate($,W,Z)}create($,Q,X,q){let{type:Z,attribute:W,reflect:G,defaultValue:M}=Q,F=W??$,L=this.preUpgradePropertyValues.has($),Y0=L?this.preUpgradePropertyValues.get($):void 0;m(Z,M);let U=L?Y0:X(Z,F,M);if(this.host.hasAttribute(F)&&(!G||U==null||U===""))this.host.removeAttribute(F);if(L&&Object.prototype.hasOwnProperty.call(this.host,$))Reflect.deleteProperty(this.host,$);let Y=y($,F,Z,U);if(this.register(Y),q($,{bind:Q.bind,getValue:()=>this.properties.get($)?.value,setValue:(x)=>{this.properties.set($,{...Y,value:x}),this.reflectValue(F,G,Y,x)}}),U!==void 0)queueMicrotask(()=>{let x=this.properties.get($)?.value;if(x===void 0)return;this.reflectValue(F,G,Y,x),this.host.notifyUpdate($,void 0,x)})}transformAttributeValue($,Q){return $!==null?Q.converter.fromAttribute($):$}reflectValue($,Q,X,q){if(!Q)return;if(q==null||q===""||q===!1){this.host.removeAttribute($);return}let Z=X.converter.toAttribute(q);this.host.setAttribute($,Z)}}export{H0 as RadiantElement};
|
|
2
|
+
|
|
3
|
+
//# debugId=5CB4B32FAD9B2A1F64756E2164756E21
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/decorators/legacy/instance-initializers.ts", "../src/utils/attribute-utils.ts", "../src/core/reactive-prop-core.ts", "../src/core/reactivity-signals.ts", "../src/core/reactivity-runtime.ts", "../src/core/reactivity-adapter.ts", "../src/tools/escape-script-json.ts", "../src/core/hydration-codec.ts", "../src/core/slot-projection-runtime.ts", "../src/core/render-runtime.ts", "../src/core/reactive-host.ts", "../src/core/ssr-preparation.ts", "../src/core/radiant-hydrator-state.ts", "../src/core/radiant-element-ssr-registry.ts", "../src/core/radiant-element.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"type LegacyInstanceInitializer<T extends object = object> = (instance: T) => void;\n\nconst LEGACY_INSTANCE_INITIALIZERS = Symbol.for('@ecopages/radiant.legacy-instance-initializers');\nconst LEGACY_POST_CONSTRUCTION_INITIALIZERS = Symbol.for('@ecopages/radiant.legacy-post-construction-initializers');\nconst LEGACY_EXECUTED_POST_CONSTRUCTION_INITIALIZERS = Symbol.for(\n\t'@ecopages/radiant.legacy-executed-post-construction-initializers',\n);\n\n/**\n * Registers per-instance initialization work for a legacy decorator.\n *\n * Legacy decorators execute against the prototype, so any initialization that\n * needs the concrete element instance must be deferred until construction time.\n */\nexport function registerLegacyInstanceInitializer<T extends object>(\n\tproto: T,\n\tinitializer: LegacyInstanceInitializer<T>,\n): void {\n\tregisterInitializer(proto, LEGACY_INSTANCE_INITIALIZERS, initializer);\n}\n\n/**\n * Registers post-construction work for a legacy decorator.\n *\n * This phase exists for decorators that eagerly write instance fields. With\n * legacy decorators plus `useDefineForClassFields`, subclass field definition\n * can overwrite values written during the base-class constructor.\n */\nexport function registerLegacyPostConstructionInitializer<T extends object>(\n\tproto: T,\n\tinitializer: LegacyInstanceInitializer<T>,\n): void {\n\tregisterInitializer(proto, LEGACY_POST_CONSTRUCTION_INITIALIZERS, initializer);\n}\n\n/**\n * Runs all legacy decorator initializers for a newly constructed element.\n *\n * Initializers are collected from the prototype chain and executed from base to\n * derived class so inherited setup remains stable.\n */\nexport function runLegacyInstanceInitializers<T extends object>(instance: T): void {\n\trunLegacyInitializers(instance, LEGACY_INSTANCE_INITIALIZERS);\n}\n\n/**\n * Runs legacy decorator setup that must happen after subclass field\n * initialization has completed.\n *\n * Each initializer runs at most once per instance even if multiple lifecycle\n * entrypoints call this helper.\n */\nexport function runLegacyPostConstructionInitializers<T extends object>(instance: T): void {\n\tconst target = instance as Record<PropertyKey, unknown>;\n\n\trunLegacyInitializers(\n\t\tinstance,\n\t\tLEGACY_POST_CONSTRUCTION_INITIALIZERS,\n\t\t(target[LEGACY_EXECUTED_POST_CONSTRUCTION_INITIALIZERS] ??= new Set()) as Set<LegacyInstanceInitializer<T>>,\n\t);\n}\n\nfunction registerInitializer<T extends object>(proto: T, key: symbol, initializer: LegacyInstanceInitializer<T>): void {\n\tconst target = proto as Record<PropertyKey, unknown>;\n\tconst ownInitializers = Object.prototype.hasOwnProperty.call(target, key) ? target[key] : undefined;\n\n\tif (Array.isArray(ownInitializers)) {\n\t\townInitializers.push(initializer);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(target, key, {\n\t\tvalue: [initializer],\n\t});\n}\n\nfunction runLegacyInitializers<T extends object>(\n\tinstance: T,\n\tkey: symbol,\n\texecutedInitializers?: Set<LegacyInstanceInitializer<T>>,\n\tprototype: object | null = Object.getPrototypeOf(instance),\n): void {\n\tif (!prototype || prototype === Object.prototype) {\n\t\treturn;\n\t}\n\n\trunLegacyInitializers(instance, key, executedInitializers, Object.getPrototypeOf(prototype));\n\n\tconst initializers = (prototype as Record<PropertyKey, unknown>)[key] as LegacyInstanceInitializer<T>[] | undefined;\n\n\tif (!Array.isArray(initializers)) {\n\t\treturn;\n\t}\n\n\tfor (const initializer of initializers) {\n\t\tif (executedInitializers?.has(initializer)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tinitializer(instance);\n\t\texecutedInitializers?.add(initializer);\n\t}\n}\n",
|
|
6
|
+
"import type { RadiantElement } from '../core/radiant-element';\n\nexport type AttributeTypeConstant = typeof Array | typeof Boolean | typeof Number | typeof Object | typeof String;\n\nexport type AttributeTypeDefault = Array<unknown> | boolean | number | Record<string, unknown> | string;\n\n/**\n * Parses the given attribute type constant and returns its corresponding string representation.\n *\n * @param constant - The attribute type constant to parse.\n * @returns The string representation of the attribute type constant.\n */\nexport function parseAttributeTypeConstant(constant?: AttributeTypeConstant) {\n\tswitch (constant) {\n\t\tcase Array:\n\t\t\treturn 'array';\n\t\tcase Boolean:\n\t\t\treturn 'boolean';\n\t\tcase Number:\n\t\t\treturn 'number';\n\t\tcase Object:\n\t\t\treturn 'object';\n\t\tcase String:\n\t\t\treturn 'string';\n\t}\n}\n\n/**\n * Parses the attribute type default value and returns its type as a string.\n *\n * @param defaultValue - The default value of the attribute type.\n * @returns The type of the default value as a string.\n */\nexport function parseAttributeTypeDefault(defaultValue?: AttributeTypeDefault) {\n\tswitch (typeof defaultValue) {\n\t\tcase 'boolean':\n\t\t\treturn 'boolean';\n\t\tcase 'number':\n\t\t\treturn 'number';\n\t\tcase 'string':\n\t\t\treturn 'string';\n\t}\n\n\tif (Array.isArray(defaultValue)) return 'array';\n\tif (Object.prototype.toString.call(defaultValue) === '[object Object]') return 'object';\n}\n\n/**\n * Returns the default value for a given attribute type.\n *\n * @param type - The attribute type constant.\n * @returns The default value for the specified attribute type.\n */\nexport function defaultValueForType(type: AttributeTypeConstant): unknown {\n\tswitch (type) {\n\t\tcase Number:\n\t\t\treturn 0;\n\t\tcase String:\n\t\t\treturn '';\n\t\tcase Boolean:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\ntype Reader = (value: string) => number | string | boolean | object | unknown[];\n\n/**\n * Utility function to parse a JSON string safely\n */\nfunction parseJSON<T>(value: string): T {\n\ttry {\n\t\treturn JSON.parse(value);\n\t} catch {\n\t\tthrow new TypeError('Invalid JSON string');\n\t}\n}\n\n/**\n * Object that maps attribute types to reader functions.\n * @type {Object.<string, Reader>}\n */\nconst readers: { [type: string]: Reader } = {\n\tarray(value: string): unknown[] {\n\t\tconst array = parseJSON<unknown[]>(value);\n\t\tif (!Array.isArray(array)) {\n\t\t\tthrow new TypeError(`Expected an array but got a value of type \"${typeof array}\"`);\n\t\t}\n\t\treturn array;\n\t},\n\n\tboolean(value: string): boolean {\n\t\treturn !(value === '0' || String(value).toLowerCase() === 'false');\n\t},\n\n\tnumber(value: string): number {\n\t\tconst number = Number(value.replace(/_/g, ''));\n\t\treturn number;\n\t},\n\n\tobject(value: string): object {\n\t\tconst object = JSON.parse(value);\n\t\tif (object === null || typeof object !== 'object' || Array.isArray(object)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseAttributeTypeDefault(\n\t\t\t\t\tobject,\n\t\t\t\t)}\"`,\n\t\t\t);\n\t\t}\n\t\treturn object;\n\t},\n\n\tstring(value: string): string {\n\t\treturn value;\n\t},\n};\n\ntype Writer = (value: unknown) => string;\n\n/**\n * Object that maps attribute types to writer functions.\n * @type {Object.<string, Writer>}\n */\nconst writers: { [type: string]: Writer } = {\n\tdefault: writeString,\n\tarray: writeJSON,\n\tobject: writeJSON,\n};\n\nfunction writeJSON(value: unknown) {\n\treturn JSON.stringify(value);\n}\n\nfunction writeString(value: unknown) {\n\treturn `${value}`;\n}\n\n/**\n * Reads the attribute value based on the provided type.\n * @param value - The attribute value to be read.\n * @param type - The type of the attribute.\n * @returns The parsed attribute value.\n * @throws {TypeError} If the provided type is unknown.\n */\nexport function readAttributeValue(value: string, type: AttributeTypeConstant) {\n\tconst readerType = parseAttributeTypeConstant(type);\n\tif (!readerType) throw new TypeError(`[radiant-element] Unknown type \"${type}\"`);\n\treturn readers[readerType]!(value);\n}\n\nexport type ReadAttributeValueReturnType = ReturnType<typeof readAttributeValue>;\n\n/**\n * Writes the attribute value based on the provided type.\n *\n * @param value - The value to be written.\n * @param type - The type of the attribute.\n * @returns The written attribute value.\n * @throws {TypeError} If the provided type is unknown.\n */\nexport function writeAttributeValue(value: unknown, type: AttributeTypeConstant) {\n\tconst writerType = parseAttributeTypeConstant(type);\n\tif (!writerType) throw new TypeError(`[radiant-element] Unknown type \"${type}\"`);\n\tconst writer: Writer = writers[writerType] ?? writers.default ?? writeString;\n\treturn writer(value);\n}\n\nexport type WriteAttributeValueReturnType = ReturnType<typeof writeAttributeValue>;\n\n/*\n * Type guard functions for each type in AttributeTypeConstant\n */\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean';\n}\n\nfunction isNumber(value: unknown): value is number {\n\treturn typeof value === 'number';\n}\n\nfunction isString(value: unknown): value is string {\n\treturn typeof value === 'string';\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n\treturn Array.isArray(value);\n}\n\nfunction isObject(value: unknown): value is object {\n\treturn typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n\n/*\n * Check function to ensure defaultValue matches the type\n */\nexport function isValueOfType(type: AttributeTypeConstant, defaultValue: unknown): boolean {\n\tswitch (type) {\n\t\tcase Boolean:\n\t\t\treturn isBoolean(defaultValue);\n\t\tcase Number:\n\t\t\treturn isNumber(defaultValue);\n\t\tcase String:\n\t\t\treturn isString(defaultValue);\n\t\tcase Array:\n\t\t\treturn isArray(defaultValue);\n\t\tcase Object:\n\t\t\treturn isObject(defaultValue);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport const getInitialValue = (\n\ttarget: RadiantElement,\n\ttype: AttributeTypeConstant,\n\tattributeKey: string,\n\tdefaultValue: unknown,\n) => {\n\tif (type === Boolean) {\n\t\tconst attributeValue = target.getAttribute(attributeKey);\n\t\tif (attributeValue === null) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\treturn attributeValue === '' ? true : readAttributeValue(attributeValue, type);\n\t}\n\n\tconst attributeValue = target.getAttribute(attributeKey);\n\treturn attributeValue !== null\n\t\t? readAttributeValue(attributeValue, type)\n\t\t: (defaultValue ?? (defaultValueForType(type) as typeof defaultValue));\n};\n",
|
|
7
|
+
"import type { JsxRenderable, SubscribableJsxValue } from '@ecopages/jsx';\nimport {\n\ttype AttributeTypeConstant,\n\ttype ReadAttributeValueReturnType,\n\ttype WriteAttributeValueReturnType,\n\tisValueOfType,\n\treadAttributeValue,\n\twriteAttributeValue,\n} from '../utils/attribute-utils';\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\n\nexport interface ReactiveProperty<T = unknown> {\n\ttype: AttributeTypeConstant;\n\tvalue?: T;\n\tinitialValue?: T;\n\tname: string;\n\tattribute: string;\n\tconverter: {\n\t\tfromAttribute: (value: string) => ReadAttributeValueReturnType;\n\t\ttoAttribute: (value: any) => WriteAttributeValueReturnType;\n\t};\n}\n\nexport type ReactivePropertyOptions<T> = {\n\ttype: AttributeTypeConstant;\n\treflect?: boolean;\n\tattribute?: string;\n\tdefaultValue?: T;\n\tbind?: boolean | string;\n};\n\nexport type ReactiveBindingOption = boolean | string;\n\nexport type ReactiveFieldOptions = {\n\tbind?: ReactiveBindingOption;\n};\n\nexport type ReactiveField<T = unknown> = {\n\tname: string;\n\tvalue: T;\n\tinitialValue: T;\n};\n\nexport type ReactiveBindingValue<\n\tHost extends object,\n\tProperty extends StringPropertyKey<Host>,\n> = Host[Property] extends JsxRenderable ? Host[Property] : JsxRenderable;\n\nexport type ReactiveBindings<Bindings extends object> = {\n\treadonly [Property in StringPropertyKey<Bindings>]: SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n};\n\nexport type ReactiveAccessorDefinition<T> = {\n\tbind?: ReactiveBindingOption;\n\tgetValue: () => T | undefined;\n\tsetValue: (value: T) => void;\n};\n\nexport function validateReactivePropertyDefault(type: AttributeTypeConstant, defaultValue: unknown): void {\n\tif (defaultValue !== undefined && !isValueOfType(type, defaultValue)) {\n\t\tthrow new Error(`defaultValue does not match the expected type for ${type.name}`);\n\t}\n}\n\nexport function createReactivePropertyMapping<T>(\n\tpropertyName: string,\n\tattributeKey: string,\n\ttype: AttributeTypeConstant,\n\tinitialValue: T | undefined,\n): ReactiveProperty<T> {\n\treturn {\n\t\ttype,\n\t\tname: propertyName,\n\t\tvalue: initialValue,\n\t\tinitialValue,\n\t\tattribute: attributeKey,\n\t\tconverter: {\n\t\t\tfromAttribute: (value) => readAttributeValue(value, type),\n\t\t\ttoAttribute: (value) => writeAttributeValue(value, type),\n\t\t},\n\t};\n}\n",
|
|
8
|
+
"import {\n\tComputed as SignalsComputed,\n\tsubtle,\n\ttrackDependency,\n\ttype DependencyNode as SignalsDependencyNode,\n} from '@ecopages/signals';\nimport type { ReactiveComputed, ReactiveDependencyNode, ReactiveRuntime, ReactiveWatcher } from './reactivity-contract';\n\nfunction asSignalsDependencyNode(node: ReactiveDependencyNode): SignalsDependencyNode {\n\treturn node as SignalsDependencyNode;\n}\n\nfunction asSignalsComputed(signal: ReactiveComputed<unknown>): SignalsComputed<unknown> {\n\treturn signal as SignalsComputed<unknown>;\n}\n\n/**\n * Default Signals-backed implementation of Radiant's internal reactivity\n * runtime contract.\n *\n * This is the only core module that imports `@ecopages/signals` directly. The\n * rest of core consumes the narrower runtime contract through the adapter and\n * runtime holder modules.\n */\nexport const signalsReactiveRuntime: ReactiveRuntime = {\n\ttrackDependency(node) {\n\t\ttrackDependency(asSignalsDependencyNode(node));\n\t},\n\tcreateComputed<T>(read: () => T): ReactiveComputed<T> {\n\t\treturn new SignalsComputed(read);\n\t},\n\tcreateWatcher(notify: () => void): ReactiveWatcher {\n\t\tconst watcher = new subtle.Watcher(notify);\n\n\t\treturn {\n\t\t\twatch(signal) {\n\t\t\t\twatcher.watch(asSignalsComputed(signal));\n\t\t\t},\n\t\t\tunwatch(signal) {\n\t\t\t\twatcher.unwatch(asSignalsComputed(signal));\n\t\t\t},\n\t\t};\n\t},\n};\n",
|
|
9
|
+
"import type { ReactiveRuntime } from './reactivity-contract';\nimport { signalsReactiveRuntime } from './reactivity-signals';\n\nlet activeReactiveRuntime: ReactiveRuntime = signalsReactiveRuntime;\n\n/**\n * Returns the currently active internal reactivity runtime.\n *\n * The current implementation still defaults to the Signals-backed runtime, so\n * importing this module preserves today's behavior. A stricter optional-runtime\n * architecture would move that default installation into an explicit bootstrap\n * step instead of this eager default.\n */\nexport function getReactiveRuntime(): ReactiveRuntime {\n\treturn activeReactiveRuntime;\n}\n\n/**\n * Replaces the active internal reactivity runtime used by Radiant core.\n *\n * This is an internal seam for alternate runtime experiments and tests. It does\n * not yet make Signals optional at module-load time because this module still\n * imports the default Signals-backed runtime eagerly.\n */\nexport function setReactiveRuntime(runtime: ReactiveRuntime): void {\n\tactiveReactiveRuntime = runtime;\n}\n",
|
|
10
|
+
"import { getReactiveRuntime } from './reactivity-runtime';\nexport type {\n\tReactiveComputed,\n\tReactiveDependencyNode,\n\tReactiveRuntime,\n\tReactiveSubscriber,\n\tReactiveWatcher,\n} from './reactivity-contract';\nexport { setReactiveRuntime } from './reactivity-runtime';\n\n/** Tracks one dependency-node read against the active internal reactivity runtime. */\nexport function trackReactiveDependency(node: import('./reactivity-contract').ReactiveDependencyNode): void {\n\tgetReactiveRuntime().trackDependency(node);\n}\n\n/** Creates a computed value using the currently selected internal reactivity runtime. */\nexport function createReactiveComputed<T>(read: () => T): import('./reactivity-contract').ReactiveComputed<T> {\n\treturn getReactiveRuntime().createComputed(read);\n}\n\n/** Creates a watcher using the currently selected internal reactivity runtime. */\nexport function createReactiveWatcher(notify: () => void): import('./reactivity-contract').ReactiveWatcher {\n\treturn getReactiveRuntime().createWatcher(notify);\n}\n",
|
|
11
|
+
"/**\n * Escapes serialized JSON so it remains safe when embedded inside an HTML\n * `<script>` tag.\n */\nexport function escapeScriptJson(value: string): string {\n\treturn value\n\t\t.replace(/&/g, '\\\\u0026')\n\t\t.replace(/</g, '\\\\u003c')\n\t\t.replace(/>/g, '\\\\u003e')\n\t\t.replace(/\\u2028/g, '\\\\u2028')\n\t\t.replace(/\\u2029/g, '\\\\u2029');\n}\n",
|
|
12
|
+
"import { escapeScriptJson } from '../tools/escape-script-json';\n\n/** Attribute marker used to identify hydration payloads inside a host. */\nexport const HYDRATION_ATTRIBUTE = 'data-hydration';\n/** Discriminator that scopes a hydration payload to a specific feature. */\nexport const HYDRATION_TYPE_ATTRIBUTE = 'data-hydration-type';\n/** Optional key that scopes a hydration payload to a specific decorated field. */\nexport const HYDRATION_KEY_ATTRIBUTE = 'data-hydration-key';\n\nexport type HydrationPayloadType = 'signal' | 'context';\n\ntype HydrationScriptHost = {\n\tchildren?: ArrayLike<Element> | undefined;\n\tchildNodes?: ArrayLike<{ nodeType: number }> | undefined;\n};\n\n/** Creates a `<script type=\"application/json\">` tag for a hydration payload. */\nexport function createHydrationScriptTag(options: {\n\ttype: HydrationPayloadType;\n\thydrationKey?: string;\n\tserializedValue: string;\n}): string {\n\tconst keyAttribute = options.hydrationKey\n\t\t? ` ${HYDRATION_KEY_ATTRIBUTE}=\"${escapeHtmlAttribute(options.hydrationKey)}\"`\n\t\t: '';\n\n\treturn `<script type=\"application/json\" ${HYDRATION_ATTRIBUTE} ${HYDRATION_TYPE_ATTRIBUTE}=\"${options.type}\"${keyAttribute}>${options.serializedValue}</script>`;\n}\n\n/** Escapes serialized JSON so it remains safe inside an HTML script tag. */\nexport function escapeHydrationJson(value: string): string {\n\treturn escapeScriptJson(value);\n}\n\n/** Parses JSON from a hydration script element, returning the fallback on failure. */\nexport function parseHydrationPayload<T>(element: Element, fallback: T): T {\n\tconst textContent = element.textContent;\n\n\tif (!textContent) {\n\t\treturn fallback;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(textContent) as T;\n\t} catch {\n\t\tif (typeof console !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t`[@ecopages/radiant] Failed to parse hydration payload from <script ${HYDRATION_ATTRIBUTE}>:`,\n\t\t\t\ttextContent.slice(0, 120),\n\t\t\t);\n\t\t}\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Finds a hydration script element inside a host by type and optional key.\n *\n * When a key is provided, looks for an exact `data-hydration-key` match.\n * Otherwise, returns the first unkeyed script matching the type.\n */\nexport function findHydrationScript(\n\thost: HydrationScriptHost,\n\ttype: HydrationPayloadType,\n\thydrationKey?: string,\n): Element | null {\n\tconst children = host.children;\n\n\tif (!children || children.length === 0) {\n\t\tconst childNodes = (host as Partial<{ childNodes: ArrayLike<{ nodeType: number }> }>).childNodes;\n\n\t\tif (!childNodes || childNodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (let i = 0; i < childNodes.length; i += 1) {\n\t\t\tconst node = childNodes[i]!;\n\n\t\t\tif (node.nodeType !== 1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst element = node as unknown as Element;\n\n\t\t\tif (matchesHydrationScript(element, type, hydrationKey)) {\n\t\t\t\treturn element;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfor (let i = 0; i < children.length; i += 1) {\n\t\tif (matchesHydrationScript(children[i]!, type, hydrationKey)) {\n\t\t\treturn children[i]!;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction matchesHydrationScript(element: Element, type: HydrationPayloadType, hydrationKey?: string): boolean {\n\tif (\n\t\telement.tagName !== 'SCRIPT' ||\n\t\t!element.hasAttribute(HYDRATION_ATTRIBUTE) ||\n\t\telement.getAttribute(HYDRATION_TYPE_ATTRIBUTE) !== type\n\t) {\n\t\treturn false;\n\t}\n\n\tif (hydrationKey !== undefined) {\n\t\treturn element.getAttribute(HYDRATION_KEY_ATTRIBUTE) === hydrationKey;\n\t}\n\n\treturn !element.hasAttribute(HYDRATION_KEY_ATTRIBUTE);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n\treturn value.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n",
|
|
13
|
+
"import {\n\tcreateMarkupNodeLike,\n\tisKeyedJsxValue,\n\tisSlotJsxValue,\n\ttype JsxRenderable,\n\ttype KeyedJsxValue,\n\ttype SlotJsxValue,\n\ttype TemplateResultLike,\n} from '@ecopages/jsx';\n\nimport { HYDRATION_ATTRIBUTE } from './hydration-codec';\n\nexport const DEFAULT_SLOT_NAME = '';\nexport const SLOT_PROJECTION_SCRIPT_ATTRIBUTE = 'data-radiant-slot-projection';\n\ntype ResolvedSlotProjection = {\n\tcontainsSlots: boolean;\n\tvalue: JsxRenderable;\n};\n\nexport function captureProjectedSlotRenderables(host: HTMLElement): Map<string, JsxRenderable[]> {\n\tconst projectedContent = new Map<string, JsxRenderable[]>();\n\n\tfor (const node of Array.from(host.childNodes)) {\n\t\tif (isIgnoredProjectedNode(node)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tappendProjectedRenderable(projectedContent, getNodeSlotName(node), node);\n\t}\n\n\treturn projectedContent;\n}\n\nexport function deserializeProjectedSlotRenderables(payload: string): Map<string, JsxRenderable[]> {\n\tlet parsedPayload: Record<string, string[]>;\n\n\ttry {\n\t\tparsedPayload = JSON.parse(payload) as Record<string, string[]>;\n\t} catch {\n\t\tif (typeof console !== 'undefined') {\n\t\t\tconsole.warn('[@ecopages/radiant] Failed to parse slot projection payload:', payload.slice(0, 120));\n\t\t}\n\t\treturn new Map();\n\t}\n\n\tconst projectedContent = new Map<string, JsxRenderable[]>();\n\n\tfor (const [slotName, fragments] of Object.entries(parsedPayload)) {\n\t\tif (!Array.isArray(fragments) || fragments.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tprojectedContent.set(\n\t\t\tnormalizeSlotName(slotName),\n\t\t\tfragments.map((fragment) => createMarkupNodeLike(fragment)),\n\t\t);\n\t}\n\n\treturn projectedContent;\n}\n\nexport function collectAuthoredHydrationScriptMarkup(host: HTMLElement): string | undefined {\n\tconst fragments = Array.from(host.childNodes)\n\t\t.filter((node): node is HTMLScriptElement => isHydrationScriptNode(node))\n\t\t.map((node) => renderableToHtmlFragment(node) ?? '')\n\t\t.filter((fragment) => fragment !== '');\n\n\treturn fragments.length > 0 ? fragments.join('') : undefined;\n}\n\nexport function serializeProjectedSlotRenderables(\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n): string | undefined {\n\tconst payload: Record<string, string[]> = {};\n\n\tfor (const [slotName, renderables] of projectedContent.entries()) {\n\t\tconst fragments = renderables\n\t\t\t.map((renderable) => renderableToHtmlFragment(renderable))\n\t\t\t.filter((fragment): fragment is string => fragment !== undefined && fragment !== '');\n\n\t\tif (fragments.length > 0) {\n\t\t\tpayload[slotName] = fragments;\n\t\t}\n\t}\n\n\treturn Object.keys(payload).length > 0 ? JSON.stringify(payload) : undefined;\n}\n\nexport function resolveSlotProjection(\n\tvalue: JsxRenderable,\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n): ResolvedSlotProjection {\n\tlet containsSlots = false;\n\n\tconst resolveValue = (currentValue: JsxRenderable): JsxRenderable => {\n\t\tif (isSlotJsxValue(currentValue)) {\n\t\t\tcontainsSlots = true;\n\t\t\treturn resolveSlotValue(currentValue, projectedContent, resolveValue);\n\t\t}\n\n\t\tif (isKeyedJsxValue(currentValue)) {\n\t\t\treturn cloneKeyedJsxValue(currentValue, resolveValue(currentValue.value));\n\t\t}\n\n\t\tif (isTemplateResultLike(currentValue)) {\n\t\t\treturn {\n\t\t\t\t_$rType$: 1,\n\t\t\t\trootLocalName: currentValue.rootLocalName,\n\t\t\t\tssrIntrinsicProps: currentValue.ssrIntrinsicProps,\n\t\t\t\tstrings: currentValue.strings,\n\t\t\t\tvalues: currentValue.values.map((entry) => resolveValue(entry as JsxRenderable)),\n\t\t\t} satisfies TemplateResultLike;\n\t\t}\n\n\t\tif (isIterableRenderable(currentValue)) {\n\t\t\treturn Array.from(currentValue, (entry) => resolveValue(entry as JsxRenderable));\n\t\t}\n\n\t\treturn currentValue;\n\t};\n\n\tconst resolvedValue = resolveValue(value);\n\n\treturn {\n\t\tcontainsSlots,\n\t\tvalue: resolvedValue,\n\t};\n}\n\nexport function takeSlotProjectionScriptPayload(host: HTMLElement): string | undefined {\n\tfor (const node of Array.from(host.childNodes)) {\n\t\tif (!isSlotProjectionScriptNode(node)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst payload = node.textContent ?? undefined;\n\t\tnode.parentNode?.removeChild(node);\n\t\treturn payload;\n\t}\n\n\treturn undefined;\n}\n\nfunction appendProjectedRenderable(\n\tprojectedContent: Map<string, JsxRenderable[]>,\n\tslotName: string,\n\trenderable: JsxRenderable,\n): void {\n\tconst existingRenderables = projectedContent.get(slotName);\n\n\tif (existingRenderables) {\n\t\texistingRenderables.push(renderable);\n\t\treturn;\n\t}\n\n\tprojectedContent.set(slotName, [renderable]);\n}\n\nfunction cloneKeyedJsxValue(value: KeyedJsxValue, nextValue: JsxRenderable): KeyedJsxValue {\n\treturn {\n\t\t...value,\n\t\tvalue: nextValue,\n\t};\n}\n\nfunction getNodeSlotName(node: Node): string {\n\tif (node instanceof Element) {\n\t\treturn normalizeSlotName(node.getAttribute('slot'));\n\t}\n\n\treturn DEFAULT_SLOT_NAME;\n}\n\nfunction isIterableRenderable(value: JsxRenderable): value is Iterable<JsxRenderable> {\n\treturn typeof value !== 'string' && typeof value === 'object' && value !== null && Symbol.iterator in value;\n}\n\nfunction isSlotProjectionScriptNode(node: Node): node is HTMLScriptElement {\n\treturn node instanceof HTMLScriptElement && node.hasAttribute(SLOT_PROJECTION_SCRIPT_ATTRIBUTE);\n}\n\nfunction isHydrationScriptNode(node: Node): node is HTMLScriptElement {\n\treturn node instanceof HTMLScriptElement && node.hasAttribute(HYDRATION_ATTRIBUTE);\n}\n\nfunction isIgnoredProjectedNode(node: Node): boolean {\n\treturn isSlotProjectionScriptNode(node) || isHydrationScriptNode(node);\n}\n\nfunction isTemplateResultLike(value: JsxRenderable): value is TemplateResultLike {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t(value as Partial<TemplateResultLike>)['_$rType$'] === 1 &&\n\t\tArray.isArray((value as Partial<TemplateResultLike>).strings) &&\n\t\tArray.isArray((value as Partial<TemplateResultLike>).values)\n\t);\n}\n\nfunction normalizeSlotName(name: string | undefined | null): string {\n\treturn name ?? DEFAULT_SLOT_NAME;\n}\n\nfunction renderableToHtmlFragment(renderable: JsxRenderable): string | undefined {\n\tif (renderable === undefined || renderable === null || renderable === false || renderable === true) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof Node !== 'undefined' && renderable instanceof Node) {\n\t\tif (renderable.nodeType === Node.TEXT_NODE) {\n\t\t\treturn renderable.textContent ?? '';\n\t\t}\n\n\t\treturn (renderable as Element).outerHTML ?? renderable.textContent ?? undefined;\n\t}\n\n\tif (isKeyedJsxValue(renderable)) {\n\t\treturn renderableToHtmlFragment(renderable.value);\n\t}\n\n\tif (typeof renderable === 'string' || typeof renderable === 'number' || typeof renderable === 'bigint') {\n\t\treturn String(renderable);\n\t}\n\n\tif (typeof renderable === 'object' && renderable !== null && 'outerHTML' in renderable) {\n\t\treturn typeof renderable.outerHTML === 'string' ? renderable.outerHTML : (renderable.textContent ?? undefined);\n\t}\n\n\tif (isIterableRenderable(renderable)) {\n\t\treturn Array.from(renderable, (entry) => renderableToHtmlFragment(entry as JsxRenderable) ?? '').join('');\n\t}\n\n\treturn undefined;\n}\n\nfunction resolveSlotValue(\n\tvalue: SlotJsxValue,\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n\tresolveValue: (value: JsxRenderable) => JsxRenderable,\n): JsxRenderable {\n\tconst assignedContent = projectedContent.get(normalizeSlotName(value.name));\n\n\tif (assignedContent && assignedContent.length > 0) {\n\t\treturn assignedContent.length === 1 ? assignedContent[0] : (assignedContent as JsxRenderable);\n\t}\n\n\tif (value.fallback === undefined) {\n\t\treturn '';\n\t}\n\n\treturn resolveValue(value.fallback);\n}\n",
|
|
14
|
+
"import { hydrate as hydrateJsx, render as renderJsx, type JsxRenderable } from '@ecopages/jsx';\nimport {\n\tcreateReactiveComputed,\n\tcreateReactiveWatcher,\n\ttype ReactiveComputed,\n\ttype ReactiveWatcher,\n} from './reactivity-adapter';\n\nimport { HYDRATION_ATTRIBUTE } from './hydration-codec';\nimport {\n\tDEFAULT_SLOT_NAME,\n\tSLOT_PROJECTION_SCRIPT_ATTRIBUTE,\n\tcollectAuthoredHydrationScriptMarkup,\n\tcaptureProjectedSlotRenderables,\n\tdeserializeProjectedSlotRenderables,\n\tresolveSlotProjection,\n\tserializeProjectedSlotRenderables,\n\ttakeSlotProjectionScriptPayload,\n} from './slot-projection-runtime';\n\nexport type RenderRuntimeHost = HTMLElement & {\n\trender(): JsxRenderable;\n\trequestUpdate(): void;\n};\n\nexport class RenderRuntime {\n\t#host: RenderRuntimeHost;\n\t#projectedSlotContent = new Map<string, JsxRenderable[]>();\n\t#renderSignal?: ReactiveComputed<{ containsSlots: boolean; value: JsxRenderable }>;\n\treadonly #renderWatcher: ReactiveWatcher;\n\t#slotProjectionObserver?: MutationObserver;\n\t#slotProjectionVersion = 0;\n\n\tconstructor(host: RenderRuntimeHost) {\n\t\tthis.#host = host;\n\t\tthis.#renderWatcher = createReactiveWatcher(() => {\n\t\t\tthis.#host.requestUpdate();\n\t\t});\n\t}\n\n\tget slotProjectionVersion(): number {\n\t\treturn this.#slotProjectionVersion;\n\t}\n\n\tgetSlotElements<T extends Element = Element>(name?: string): T[] {\n\t\tthis.ensureSlotProjectionState();\n\n\t\treturn (this.#projectedSlotContent.get(name ?? DEFAULT_SLOT_NAME) ?? []).filter(\n\t\t\t(renderable): renderable is T => typeof Node !== 'undefined' && renderable instanceof Element,\n\t\t);\n\t}\n\n\tgetSlotProjectionScriptTag(): string | undefined {\n\t\tthis.ensureSlotProjectionState();\n\t\tconst payload = serializeProjectedSlotRenderables(this.#projectedSlotContent);\n\n\t\tif (!payload) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn `<script type=\"application/json\" ${SLOT_PROJECTION_SCRIPT_ATTRIBUTE}>${escapeScriptText(payload)}</script>`;\n\t}\n\n\tgetAuthoredHydrationScriptMarkup(): string | undefined {\n\t\treturn collectAuthoredHydrationScriptMarkup(this.#host) ?? undefined;\n\t}\n\n\thydrate(renderTarget: HTMLElement): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\n\t\ttry {\n\t\t\thydrateJsx(this.resolveTrackedRenderOutput().value, renderTarget);\n\t\t} finally {\n\t\t\tthis.observeSlotProjection();\n\t\t}\n\t}\n\n\trender(renderTarget: HTMLElement): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\n\t\ttry {\n\t\t\trenderJsx(this.resolveTrackedRenderOutput().value, renderTarget);\n\t\t} finally {\n\t\t\tthis.observeSlotProjection();\n\t\t}\n\t}\n\n\tobserveSlotProjection(): void {\n\t\tif (typeof MutationObserver === 'undefined' || this.#slotProjectionObserver || !this.#host.isConnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#slotProjectionObserver = new MutationObserver((records) => this.handleSlotProjectionMutations(records));\n\t\tthis.#slotProjectionObserver.observe(this.#host, { childList: true });\n\t}\n\n\tdisconnectSlotProjectionObserver(): void {\n\t\tthis.#slotProjectionObserver?.disconnect();\n\t\tthis.#slotProjectionObserver = undefined;\n\t}\n\n\tdisconnectRenderWatcher(): void {\n\t\tif (!this.#renderSignal) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#renderWatcher.unwatch(this.#renderSignal);\n\t\tthis.#renderSignal = undefined;\n\t}\n\n\tresolveTrackedRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\tconst nextRenderSignal = createReactiveComputed(() => this.resolveRenderOutput());\n\t\tconst output = nextRenderSignal.get();\n\n\t\tif (!this.#host.isConnected) {\n\t\t\treturn output;\n\t\t}\n\n\t\tif (this.#renderSignal) {\n\t\t\tthis.#renderWatcher.unwatch(this.#renderSignal);\n\t\t}\n\n\t\tthis.#renderSignal = nextRenderSignal;\n\t\tthis.#renderWatcher.watch(nextRenderSignal);\n\t\treturn output;\n\t}\n\n\tdispose(): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\t\tthis.disconnectRenderWatcher();\n\t}\n\n\tprivate ensureSlotProjectionState(): void {\n\t\tif (this.#projectedSlotContent.size > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scriptPayload = this.#host.isConnected ? takeSlotProjectionScriptPayload(this.#host) : undefined;\n\n\t\tif (typeof scriptPayload === 'string' && scriptPayload !== '') {\n\t\t\tthis.#projectedSlotContent = deserializeProjectedSlotRenderables(scriptPayload);\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#host.childNodes.length > 0) {\n\t\t\tthis.#projectedSlotContent = captureProjectedSlotRenderables(this.#host);\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t}\n\t}\n\n\tprivate handleSlotProjectionMutations(records: MutationRecord[]): void {\n\t\tlet hasProjectionChanges = false;\n\n\t\tfor (const record of records) {\n\t\t\tfor (const removedNode of Array.from(record.removedNodes)) {\n\t\t\t\tif (this.removeProjectedSlotNode(removedNode)) {\n\t\t\t\t\thasProjectionChanges = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const addedNode of Array.from(record.addedNodes)) {\n\t\t\t\tif (addedNode.parentNode !== this.#host) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (this.addProjectedSlotNode(addedNode)) {\n\t\t\t\t\thasProjectionChanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasProjectionChanges) {\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t\tthis.#host.requestUpdate();\n\t\t}\n\t}\n\n\tprivate addProjectedSlotNode(node: Node): boolean {\n\t\tif (\n\t\t\tnode instanceof HTMLScriptElement &&\n\t\t\t(node.hasAttribute(SLOT_PROJECTION_SCRIPT_ATTRIBUTE) || node.hasAttribute(HYDRATION_ATTRIBUTE))\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst slotName = node instanceof Element ? (node.getAttribute('slot') ?? DEFAULT_SLOT_NAME) : DEFAULT_SLOT_NAME;\n\t\tconst bucket = this.#projectedSlotContent.get(slotName);\n\n\t\tif (bucket) {\n\t\t\tif (bucket.includes(node)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tbucket.push(node);\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.#projectedSlotContent.set(slotName, [node]);\n\t\treturn true;\n\t}\n\n\tprivate removeProjectedSlotNode(node: Node): boolean {\n\t\tfor (const [slotName, bucket] of this.#projectedSlotContent.entries()) {\n\t\t\tconst nodeIndex = bucket.indexOf(node);\n\n\t\t\tif (nodeIndex === -1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbucket.splice(nodeIndex, 1);\n\n\t\t\tif (bucket.length === 0) {\n\t\t\t\tthis.#projectedSlotContent.delete(slotName);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate resolveRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\tthis.ensureSlotProjectionState();\n\t\treturn resolveSlotProjection(this.#host.render(), this.#projectedSlotContent);\n\t}\n}\n\nfunction escapeScriptText(value: string): string {\n\treturn value.replace(/</g, '\\\\u003c');\n}\n",
|
|
15
|
+
"import { createSubscribableJsxValue, type SubscribableJsxValue } from '@ecopages/jsx';\nimport { trackReactiveDependency, type ReactiveDependencyNode, type ReactiveSubscriber } from './reactivity-adapter';\nimport type {\n\tReactiveBindingOption,\n\tReactiveBindingValue,\n\tReactiveBindings,\n\tReactiveFieldOptions,\n} from './reactive-prop-core';\nimport type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\ntype ReactiveDependencyReader = () => unknown;\n\ntype ReactiveHostAccess<Host extends object> = {\n\tdefineProperty(target: object, property: string, descriptor: PropertyDescriptor): void;\n\tgetBindingTarget?(host: Host): object;\n\thasProperty(host: Host, property: string): boolean;\n\treadProperty(host: Host, property: string): unknown;\n};\n\ntype ReactiveField<T = unknown> = {\n\tname: string;\n\tvalue: T;\n\tinitialValue: T;\n};\n\ntype ReactiveAccessorOptions<T> = {\n\tbind?: ReactiveBindingOption;\n\tgetValue: () => T | undefined;\n\tsetValue: (value: T) => void;\n\tnotifyInitialValue?: T;\n};\n\n/**\n * Shared reactive-host contract consumed by decorators and host adapters.\n *\n * `RadiantElement` and `RadiantController` both implement this surface so the\n * decorator layer can define fields, bindings, context reactions, and tracked\n * reads without depending on a specific host class.\n */\nexport interface ReactiveHostLike<Bindings extends object = {}> {\n\treadonly bindings: ReactiveBindings<Bindings>;\n\treadonly $: ReactiveBindings<Bindings>;\n\tbind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n\tgetReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n\tcreateReactiveField<T>(propertyName: string, initialValue: T, options?: ReactiveFieldOptions): void;\n\tdefineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void;\n\tregisterCleanupCallback(callback: () => void): void;\n\tregisterConnectedCallback(callback: () => void): void;\n\tregisterHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void;\n\tregisterReactiveDependencyReader(property: string, read: () => unknown): void;\n\ttrackReactiveRead(property: string): void;\n}\n\n/**\n * Internal dependency node that bridges Radiant host members into the signals\n * tracking graph.\n */\nclass ReactiveHostDependency implements ReactiveDependencyNode {\n\tprivate readonly subscribers = new Set<ReactiveSubscriber<unknown>>();\n\tprivate readonly watcherListeners = new Set<() => void>();\n\tprivate version = 0;\n\n\tconstructor(private readonly read: ReactiveDependencyReader) {}\n\n\tpublic get(): unknown {\n\t\ttrackReactiveDependency(this);\n\t\treturn this.read();\n\t}\n\n\tpublic subscribe(notify: ReactiveSubscriber<unknown>): () => void {\n\t\tthis.subscribers.add(notify);\n\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(notify);\n\t\t};\n\t}\n\n\tpublic addWatcher(notify: () => void): () => void {\n\t\tthis.watcherListeners.add(notify);\n\n\t\treturn () => {\n\t\t\tthis.watcherListeners.delete(notify);\n\t\t};\n\t}\n\n\tpublic getVersion(): number {\n\t\treturn this.version;\n\t}\n\n\tpublic notify(nextValue: unknown): void {\n\t\tthis.version += 1;\n\t\tlet watcherError: unknown;\n\n\t\ttry {\n\t\t\tthis.notifyWatchers();\n\t\t} catch (error) {\n\t\t\twatcherError = error;\n\t\t}\n\n\t\tthis.publish(nextValue);\n\n\t\tif (watcherError) {\n\t\t\tthrow watcherError;\n\t\t}\n\t}\n\n\tprivate publish(nextValue: unknown): void {\n\t\tfor (const subscriber of this.subscribers) {\n\t\t\tsubscriber(nextValue);\n\t\t}\n\t}\n\n\tprivate notifyWatchers(): void {\n\t\tconst errors: unknown[] = [];\n\n\t\tfor (const listener of this.watcherListeners) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch (error) {\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t}\n\n\t\tif (errors.length === 1) {\n\t\t\tthrow errors[0];\n\t\t}\n\n\t\tif (errors.length > 1) {\n\t\t\tthrow new AggregateError(errors, 'Multiple reactive dependency notifications failed.');\n\t\t}\n\t}\n}\n\nfunction isSignalLikeBindingValue(value: unknown): value is { get(): unknown } {\n\treturn typeof value === 'object' && value !== null && typeof (value as { get?: unknown }).get === 'function';\n}\n\n/**\n * Shared reactivity engine used by both `RadiantElement` and\n * `RadiantController`.\n *\n * This class owns three pieces of shared behavior:\n *\n * - defining reactive accessors on the host object\n * - exposing cached JSX bindings such as `bindings.count` and `$count`\n * - publishing tracked updates into the signals graph and update callbacks\n *\n * Host-specific concerns such as attribute reflection, render lifecycles, and\n * custom-element APIs stay in the outer host classes.\n */\nexport class ReactiveHost<Host extends object, Bindings extends object = {}> {\n\tpublic readonly bindings: ReactiveBindings<Bindings>;\n\tpublic readonly $: ReactiveBindings<Bindings>;\n\n\tprivate reactiveFields = new Map<string, ReactiveField>();\n\tprivate reactiveDependencies = new Map<string, ReactiveHostDependency>();\n\tprivate reactiveDependencyReaders = new Map<string, ReactiveDependencyReader>();\n\tprivate reactiveBindings = new Map<string, SubscribableJsxValue>();\n\tprivate updateCallbacks = new Map<string, Set<(...rest: any[]) => any>>();\n\tprivate onConnectedCallbacks: (() => void)[] = [];\n\tprivate onDisconnectedCallback: (() => void)[] = [];\n\n\tconstructor(\n\t\tprivate readonly host: Host,\n\t\tprivate readonly access: ReactiveHostAccess<Host>,\n\t\tprivate readonly shouldAutoBind: () => boolean,\n\t) {\n\t\tconst bindingNamespace = this.createReactiveBindingNamespace();\n\t\tthis.bindings = bindingNamespace;\n\t\tthis.$ = bindingNamespace;\n\t}\n\n\t/**\n\t * Runs all connection callbacks registered by decorators or host adapters.\n\t */\n\tpublic connectHost(): void {\n\t\tfor (const callback of this.onConnectedCallbacks) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\t/**\n\t * Runs all cleanup callbacks registered for host disconnect.\n\t */\n\tpublic disconnectHost(): void {\n\t\tfor (const cleanup of this.onDisconnectedCallback) {\n\t\t\tcleanup();\n\t\t}\n\t}\n\n\t/**\n\t * Publishes a reactive member change to tracked dependencies and explicit\n\t * update callbacks.\n\t */\n\tpublic notifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void {\n\t\tif (oldValue === value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reactiveDependencies.get(changedProperty)?.notify(value);\n\t\tconst updates = this.updateCallbacks.get(changedProperty);\n\n\t\tif (updates) {\n\t\t\tfor (const update of updates) {\n\t\t\t\tupdate();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Registers a callback that should run when the outer host disconnects.\n\t */\n\tpublic registerCleanupCallback(callback: () => void): void {\n\t\tthis.onDisconnectedCallback.push(callback);\n\t}\n\n\t/**\n\t * Registers a callback that should run whenever the outer host connects.\n\t */\n\tpublic registerConnectedCallback(callback: () => void): void {\n\t\tthis.onConnectedCallbacks.push(callback);\n\t}\n\n\t/**\n\t * Placeholder hydration hook so shared decorators can target both host types.\n\t *\n\t * `ReactiveHost` itself does not persist hydration bindings; concrete hosts\n\t * such as `RadiantElement` can override this behavior at the outer layer.\n\t */\n\tpublic registerHydrationBinding(_name: string, _binding: SsrSerializableHydrationBinding): void {}\n\n\t/**\n\t * Registers a raw reader for a reactive member so tracked dependency reads do\n\t * not need to go back through the public accessor.\n\t */\n\tpublic registerReactiveDependencyReader(property: string, read: ReactiveDependencyReader): void {\n\t\tthis.reactiveDependencyReaders.set(property, read);\n\t}\n\n\t/**\n\t * Registers a callback that runs whenever a named reactive member changes.\n\t *\n\t * Returns a disposer that removes the callback.\n\t */\n\tpublic registerUpdateCallback(property: string, update: (...rest: any[]) => any): () => void {\n\t\tif (!this.updateCallbacks.has(property)) {\n\t\t\tthis.updateCallbacks.set(property, new Set());\n\t\t}\n\n\t\tconst callbacks = this.updateCallbacks.get(property)!;\n\t\tcallbacks.add(update);\n\n\t\treturn () => {\n\t\t\tcallbacks.delete(update);\n\n\t\t\tif (callbacks.size === 0) {\n\t\t\t\tthis.updateCallbacks.delete(property);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Returns the cached JSX binding object for a named reactive member.\n\t */\n\tpublic getReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>> {\n\t\tconst cachedBinding = this.reactiveBindings.get(property);\n\n\t\tif (cachedBinding) {\n\t\t\treturn cachedBinding as SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n\t\t}\n\n\t\tconst binding = createSubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>({\n\t\t\tgetValue: () => this.readReactiveBindingValue(property) as ReactiveBindingValue<Bindings, Property>,\n\t\t\tsubscribe: (notify) =>\n\t\t\t\tthis.registerUpdateCallback(property, () => {\n\t\t\t\t\tnotify(this.readReactiveBindingValue(property) as ReactiveBindingValue<Bindings, Property>);\n\t\t\t\t}),\n\t\t});\n\n\t\tthis.reactiveBindings.set(property, binding);\n\t\treturn binding;\n\t}\n\n\t/**\n\t * Defines a stable binding companion property such as `$count` on the host or\n\t * its chosen binding target.\n\t */\n\tpublic defineReactiveBinding(property: string, bind: ReactiveBindingOption = true): void {\n\t\tconst bindingPropertyName = typeof bind === 'string' ? bind : bind ? `$${property}` : undefined;\n\t\tconst bindingTarget = this.access.getBindingTarget?.(this.host) ?? this.host;\n\n\t\tif (!bindingPropertyName || this.access.hasProperty(this.host, bindingPropertyName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.access.defineProperty(bindingTarget, bindingPropertyName, {\n\t\t\tget: () => this.getReactiveBinding(property as StringPropertyKey<Bindings>),\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\n\t/**\n\t * Records a dependency read for the named reactive member.\n\t */\n\tpublic trackReactiveRead(property: string): void {\n\t\ttrackReactiveDependency(this.getReactiveDependency(property));\n\t}\n\n\t/**\n\t * Defines a reactive getter/setter pair on the host and wires it into\n\t * bindings, dependency tracking, and update notifications.\n\t */\n\tpublic defineReactiveAccessor<T>(propertyName: string, options: ReactiveAccessorOptions<T>): void {\n\t\tconst bind = options.bind ?? this.shouldAutoBind();\n\n\t\tthis.defineReactiveBinding(propertyName, bind);\n\t\tthis.registerReactiveDependencyReader(propertyName, options.getValue);\n\n\t\tthis.access.defineProperty(this.host, propertyName, {\n\t\t\tget: () => {\n\t\t\t\tthis.trackReactiveRead(propertyName);\n\t\t\t\treturn options.getValue();\n\t\t\t},\n\t\t\tset: (newValue: T) => {\n\t\t\t\tconst oldValue = options.getValue();\n\n\t\t\t\tif (oldValue === newValue) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\toptions.setValue(newValue);\n\t\t\t\tthis.notifyUpdate(propertyName, oldValue, newValue);\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\n\t\tif (options.notifyInitialValue !== undefined) {\n\t\t\tthis.notifyUpdate(propertyName, undefined, options.notifyInitialValue);\n\t\t}\n\t}\n\n\t/**\n\t * Defines a controller- or element-local reactive field with optional JSX\n\t * binding exposure.\n\t */\n\tpublic createReactiveField<T>(propertyName: string, initialValue: T, options: ReactiveFieldOptions = {}): void {\n\t\tconst reactiveField: ReactiveField<T> = {\n\t\t\tname: propertyName,\n\t\t\tvalue: initialValue,\n\t\t\tinitialValue,\n\t\t};\n\n\t\tthis.reactiveFields.set(propertyName, reactiveField);\n\n\t\tthis.defineReactiveAccessor(propertyName, {\n\t\t\tbind: options.bind,\n\t\t\tgetValue: () => this.reactiveFields.get(propertyName)?.value as T | undefined,\n\t\t\tsetValue: (newValue: T) => {\n\t\t\t\tthis.reactiveFields.set(propertyName, { ...reactiveField, value: newValue });\n\t\t\t},\n\t\t\tnotifyInitialValue: initialValue,\n\t\t});\n\t}\n\n\tprivate createReactiveBindingNamespace(): ReactiveBindings<Bindings> {\n\t\treturn new Proxy(Object.create(null) as ReactiveBindings<Bindings>, {\n\t\t\tget: (_target, property) => {\n\t\t\t\tif (typeof property !== 'string') {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn this.getReactiveBinding(property as StringPropertyKey<Bindings>);\n\t\t\t},\n\t\t}) as ReactiveBindings<Bindings>;\n\t}\n\n\tprivate getReactiveDependency(property: string): ReactiveHostDependency {\n\t\tconst cachedDependency = this.reactiveDependencies.get(property);\n\n\t\tif (cachedDependency) {\n\t\t\treturn cachedDependency;\n\t\t}\n\n\t\tconst dependency = new ReactiveHostDependency(() => this.readReactiveDependencyValue(property));\n\t\tthis.reactiveDependencies.set(property, dependency);\n\t\treturn dependency;\n\t}\n\n\tprivate readReactiveDependencyValue(property: string): unknown {\n\t\tconst reader = this.reactiveDependencyReaders.get(property);\n\n\t\tif (reader) {\n\t\t\treturn reader();\n\t\t}\n\n\t\treturn this.readReactiveBindingValue(property as StringPropertyKey<Bindings>);\n\t}\n\n\tprivate readReactiveBindingValue<Property extends StringPropertyKey<Bindings>>(property: Property): unknown {\n\t\tconst value = this.access.readProperty(this.host, property);\n\n\t\tif (isSignalLikeBindingValue(value)) {\n\t\t\treturn value.get();\n\t\t}\n\n\t\treturn value;\n\t}\n}\n",
|
|
16
|
+
"type SsrPreparationCallback = () => void;\n\nconst SSR_PREPARATION_CALLBACKS = Symbol.for('@ecopages/radiant.ssr-preparation-callbacks');\nexport const SSR_PREPARATION_RUNNING = Symbol.for('@ecopages/radiant.ssr-preparation-running');\n\n/**\n * Registers instance-local SSR preparation work that should run immediately\n * before a Radiant host serializes its first server render.\n *\n * Decorators use this to defer SSR-only setup until after class fields,\n * reactive props, and authored host content have all been applied.\n */\nexport function registerSsrPreparationCallback(host: object, callback: SsrPreparationCallback): void {\n\tconst target = host as Record<PropertyKey, unknown>;\n\tconst existingCallbacks = target[SSR_PREPARATION_CALLBACKS];\n\n\tif (Array.isArray(existingCallbacks)) {\n\t\texistingCallbacks.push(callback);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(host, SSR_PREPARATION_CALLBACKS, {\n\t\tvalue: [callback],\n\t\tconfigurable: true,\n\t});\n}\n\n/**\n * Runs all registered SSR preparation callbacks for the provided host.\n *\n * The callbacks are intentionally retained so repeated SSR serializations stay\n * deterministic after later host mutations.\n */\nexport function runSsrPreparationCallbacks(host: object): void {\n\tconst target = host as Record<PropertyKey, unknown>;\n\tconst callbacks = target[SSR_PREPARATION_CALLBACKS];\n\n\tif (!Array.isArray(callbacks)) {\n\t\treturn;\n\t}\n\n\ttarget[SSR_PREPARATION_RUNNING] = true;\n\n\ttry {\n\t\tfor (const callback of callbacks as SsrPreparationCallback[]) {\n\t\t\tcallback();\n\t\t}\n\t} finally {\n\t\tdelete target[SSR_PREPARATION_RUNNING];\n\t}\n}\n",
|
|
17
|
+
"const RADIANT_HYDRATOR_INSTALLED_SYMBOL = Symbol.for('@ecopages/radiant.hydrator-installed');\n\ntype GlobalHydratorState = typeof globalThis & Record<PropertyKey, unknown>;\n\n/**\n * Marks the current JavaScript environment as hydration-enabled for first\n * custom-element connect.\n *\n * `RadiantElement` reads this flag before deciding whether SSR markup should\n * hydrate in place or be replaced by a fresh client render.\n */\nexport function installRadiantHydratorState(): void {\n\t(globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] = true;\n}\n\n/**\n * Clears the explicit hydration-enabled flag from `globalThis`.\n *\n * This is mainly used by tests so they can assert both hydrated and non-\n * hydrated first-connect behavior deterministically.\n */\nexport function uninstallRadiantHydratorState(): void {\n\tdelete (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL];\n}\n\n/**\n * Returns whether first-connect hydration is currently enabled for this\n * JavaScript environment.\n */\nexport function isRadiantHydratorInstalled(): boolean {\n\treturn (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] === true;\n}\n",
|
|
18
|
+
"import type { JsxRenderable } from '@ecopages/jsx';\nimport { getActiveSsrScopeValue, type RenderToStringOptions, withActiveSsrScopeValue } from '@ecopages/jsx/server';\n\nexport type RadiantElementRenderBridge = {\n\trenderHost?: () => JsxRenderable;\n\trenderHostToString?: (options?: RenderToStringOptions) => string;\n};\n\n/**\n * SSR host shape used by explicit server rendering entrypoints.\n *\n * Server-side attribute serialization is derived from ordinary host state in\n * the server pipeline rather than through a dedicated host SSR hook.\n */\nexport type RadiantElementServerRenderSsrCapable = object;\n\n/**\n * SSR host shape required when the server runtime renders the tracked component\n * view directly.\n */\nexport type RadiantElementTrackedRenderSsrCapable = object;\n\n/**\n * Shared SSR runtime contract carried on the active JSX SSR render scope.\n *\n * Server entrypoints install one implementation that both direct component SSR\n * and nested JSX custom-element SSR can reuse without importing client-only\n * internals into every call site.\n */\nexport type RadiantElementSsrRuntime = {\n\tgetHostAttributes(component: RadiantElementServerRenderSsrCapable): Record<string, string>;\n\trenderHost(component: RadiantElementServerRenderSsrCapable): JsxRenderable;\n\trenderHostToString(component: RadiantElementServerRenderSsrCapable, options?: RenderToStringOptions): string;\n\tresolveRenderBridge(component: object): RadiantElementRenderBridge | undefined;\n\trenderView(component: RadiantElementTrackedRenderSsrCapable, options?: RenderToStringOptions): string;\n};\n\nconst RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL = Symbol.for('@ecopages/radiant.element-ssr-runtime');\n\n/**\n * Reads the active Radiant SSR runtime from the current render scope.\n *\n * Returns `undefined` when no server render is currently in progress.\n */\nexport function getRadiantElementSsrRuntime(): RadiantElementSsrRuntime | undefined {\n\treturn getActiveSsrScopeValue<RadiantElementSsrRuntime>(RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL);\n}\n\n/**\n * Runs work within an active Radiant SSR runtime scope.\n *\n * The runtime remains visible across built entrypoint boundaries through the\n * active JSX SSR render scope, but only for the duration of the active render call.\n */\nexport function withRadiantElementSsrRuntime<T>(runtime: RadiantElementSsrRuntime, render: () => T): T {\n\treturn withActiveSsrScopeValue(RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL, runtime, render);\n}\n",
|
|
19
|
+
"import type { EventEmitter } from '../tools';\nimport { hasHydrationMarkers, jsx, type JsxRenderable, type SubscribableJsxValue } from '@ecopages/jsx';\nimport type { RenderToStringOptions } from '@ecopages/jsx/server';\nimport type { SsrSerializableContextProvider } from '../context/context-provider';\nimport type { UnknownContext } from '../context/types';\nimport {\n\trunLegacyInstanceInitializers,\n\trunLegacyPostConstructionInitializers,\n} from '../decorators/legacy/instance-initializers';\nimport {\n\tcreateReactivePropertyMapping,\n\ttype ReactiveAccessorDefinition,\n\ttype ReactiveBindingOption,\n\ttype ReactiveBindingValue,\n\ttype ReactiveBindings,\n\ttype ReactiveFieldOptions,\n\ttype ReactiveProperty,\n\ttype ReactivePropertyOptions,\n\tvalidateReactivePropertyDefault,\n} from './reactive-prop-core';\nimport { RenderRuntime, type RenderRuntimeHost } from './render-runtime';\nimport type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';\nimport { ReactiveHost } from './reactive-host';\nimport { runSsrPreparationCallbacks } from './ssr-preparation';\nimport { isRadiantHydratorInstalled } from './radiant-hydrator-state';\nimport { getRadiantElementSsrRuntime } from './radiant-element-ssr-registry';\nimport { type AttributeTypeConstant, getInitialValue } from '../utils/attribute-utils';\n\nexport type {\n\tReactiveBindingOption,\n\tReactiveBindingValue,\n\tReactiveBindings,\n\tReactiveField,\n\tReactiveFieldOptions,\n\tReactiveProperty,\n\tReactivePropertyOptions,\n} from './reactive-prop-core';\n\nconst RadiantElementBase = resolveRadiantElementBase();\n\ntype RadiantRenderTarget = HTMLElement | ShadowRoot;\ntype RadiantInteractionTarget = HTMLElement | ShadowRoot;\ntype RadiantRenderSurface = {\n\trenderTarget: RadiantRenderTarget;\n\tinteractionTarget: RadiantInteractionTarget;\n\tqueryRoot: ParentNode;\n};\ntype ReactivePropertyStateHost = HTMLElement & {\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void;\n};\n\nfunction resolveRadiantElementBase(): typeof HTMLElement {\n\tif (typeof HTMLElement !== 'undefined') {\n\t\treturn HTMLElement;\n\t}\n\n\tthrow new Error(\n\t\t\"RadiantElement requires HTMLElement. Install '@ecopages/radiant/server/light-dom-shim' before SSR imports.\",\n\t);\n}\n\n/**\n * Possible positions to insert a rendered template.\n */\nexport type RenderInsertPosition = 'replace' | 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend';\n\n/**\n * Represents a Radiant element event listener.\n */\nexport type RadiantElementEventListener = {\n\tselector: string;\n\ttype: string;\n\tlistener: EventListener;\n\toptions?: AddEventListenerOptions;\n};\n\ntype RadiantElementEventSubscription = RadiantElementEventListener & {\n\ttarget: EventTarget;\n};\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\n\n/**\n * Represents an interface for a Radiant element.\n * @typeParam Bindings - Explicit internal bindable shape used to type `bind()` and `getReactiveBinding()`.\n *\n * This shape describes which reactive members are exposed through `bindings`,\n * `$`, and `bind(...)`. It does not automatically define the public JSX\n * attribute contract for the custom element.\n */\nexport interface IRadiantElement<Bindings extends object = {}> {\n\t/**\n\t * Namespace of cached JSX bindings keyed by the explicit bindable shape.\n\t */\n\treadonly bindings: ReactiveBindings<Bindings>;\n\n\t/**\n\t * Short alias for {@link bindings}.\n\t */\n\treadonly $: ReactiveBindings<Bindings>;\n\n\t/**\n\t * Called when a property of the element is updated.\n\t * @param changedProperty - The name of the changed property.\n\t * @param oldValue - The old value of the property.\n\t * @param newValue - The new value of the property.\n\t */\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, newValue: unknown): void;\n\n\t/**\n\t * Subscribes to a Radiant element event.\n\t * @param event - The event listener to subscribe to.\n\t */\n\tsubscribeEvent(event: RadiantElementEventListener): void;\n\n\t/**\n\t * Registers a callback to be invoked when a reactive property or field changes.\n\t *\n\t * @returns A cleanup function that unregisters the callback.\n\t */\n\tregisterUpdateCallback(property: string, update: (...rest: any[]) => any): () => void;\n\n\t/**\n\t * Returns a subscribable JSX child binding for a reactive property or field.\n\t *\n\t * Prefer `this.bindings.key` or `this.$.key` in JSX render code when you want\n\t * property access syntax without string literals.\n\t */\n\tbind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n\n\t/**\n\t * Returns a subscribable JSX child binding for a reactive property or field.\n\t *\n\t * This is the primitive lookup used by `bind()`, `bindings.key`, and `$.key`.\n\t */\n\tgetReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>>;\n\n\t/**\n\t * Defines a stable JSX binding companion accessor for a reactive member.\n\t *\n\t * Companion bindings create properties such as `$count` directly on the host.\n\t * Prefer the `bindings` or `$` namespace for new code when you want typed,\n\t * explicit access to the configured bindable shape.\n\t */\n\tdefineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;\n\n\t/**\n\t * Subscribes to multiple Radiant element events.\n\t * @param events - The array of event listeners to subscribe to.\n\t */\n\tsubscribeEvents(events: RadiantElementEventListener[]): void;\n\n\t/**\n\t * It adds a callback to be executed when the Radiant element is disconnected from the DOM.\n\t */\n\tregisterCleanupCallback(callback: () => void): void;\n\n\t/**\n\t * Registers a callback to run on each future host connection.\n\t *\n\t * The callback is only invoked from `connectedCallback()`. Registering it\n\t * after the host is already connected does not invoke it immediately.\n\t */\n\tregisterConnectedCallback(callback: () => void): void;\n\n\t/**\n\t * Registers a raw value reader for a reactive member so that tracked render\n\t * dependencies can read the underlying value without triggering the public\n\t * getter's dependency tracking.\n\t */\n\tregisterReactiveDependencyReader(property: string, read: () => unknown): void;\n\n\t/**\n\t * Records a tracked read of a reactive member during a component render,\n\t * allowing the signals runtime to re-render only the affected parts.\n\t */\n\ttrackReactiveRead(property: string): void;\n\n\t/**\n\t * Renders a trusted HTML template string into the specified target element.\n\t *\n\t * **Security:** The `template` string is written to the DOM via `innerHTML`\n\t * or `insertAdjacentHTML` without built-in sanitization. Callers are\n\t * responsible for ensuring the input is trusted. Supply a `sanitize`\n\t * function to transform the template before insertion.\n\t *\n\t * @param options - The rendering options.\n\t * @param options.target - The target element to render the template into.\n\t * @param options.template - The template string to render.\n\t * @param options.insert - The position to insert the rendered template. (optional)\n\t * @param options.sanitize - An optional function that transforms the template string before insertion.\n\t */\n\trenderTemplate(options: {\n\t\ttarget: HTMLElement;\n\t\ttemplate: string;\n\t\tinsert?: RenderInsertPosition;\n\t\tsanitize?: (html: string) => string;\n\t}): void;\n\n\t/**\n\t * Called when the Radiant element is connected to a context.\n\t * @param context - The connected context.\n\t */\n\tconnectedContextCallback(context: UnknownContext): void;\n\n\t/**\n\t * Gets a reference to a child element by its data-ref attribute.\n\t * @param ref - The data-ref attribute value of the element to get.\n\t * @param all - Whether to get all elements with the specified data-ref attribute value.\n\t * @returns The element with the specified data-ref attribute value, an array of elements or null if no element was found.\n\t */\n\tgetRef<T extends Element = Element>(ref: string, all: true): T[];\n\tgetRef<T extends Element = Element>(ref: string, all?: false): T | null;\n}\n\n/**\n * A base class for creating custom elements with reactive properties and event subscriptions.\n * @typeParam Bindings - Explicit internal bindable shape. Include only the\n * prop/state keys that JSX bindings should accept.\n *\n * Prefer a separate public props type for custom-element JSX declarations when\n * the external attribute contract differs from the component's internal\n * reactive state. Reuse the same type only when the public props and bindable\n * members are intentionally identical.\n * @extends HTMLElement\n * @implements IRadiantElement<Bindings>\n */\nexport class RadiantElement<Bindings extends object = {}>\n\textends RadiantElementBase\n\timplements IRadiantElement<Bindings>\n{\n\t/**\n\t * Controls where the JSX render lifecycle mounts the component view.\n\t *\n\t * Subclasses can override this with `'shadow'` to force an internal open\n\t * shadow root for client-side rendering. Host SSR helpers remain light-DOM\n\t * only and throw when shadow render mode is enabled.\n\t */\n\tprotected readonly renderRootMode: 'light' | 'shadow' = 'light';\n\tpublic readonly bindings: ReactiveBindings<Bindings>;\n\tpublic readonly $: ReactiveBindings<Bindings>;\n\tprivate readonly reactiveHost: ReactiveHost<this, Bindings>;\n\tprivate readonly reactivePropertyState: ReactivePropertyState;\n\n\t/**\n\t * Registered context providers keyed by decorated property name.\n\t */\n\tprivate contextProviders = new Map<string, SsrSerializableContextProvider>();\n\n\t/**\n\t * Registered keyed hydration payload producers appended to SSR host output.\n\t */\n\tprivate hydrationBindings = new Map<string, SsrSerializableHydrationBinding>();\n\n\t/**\n\t * A map of event subscriptions used to manage event listeners on the Radiant element.\n\t */\n\tprivate eventSubscriptions = new Map<string, RadiantElementEventSubscription>();\n\n\t/**\n\t * A map for event emitters\n\t */\n\tprivate eventEmitters = new Map<string, EventEmitter>();\n\n\t/**\n\t * A flag indicating whether the element has been connected to the DOM.\n\t */\n\tprivate elementReady = false;\n\tprivate isRendering = false;\n\tprivate isFirstConnectPending = false;\n\tprivate isRenderScheduled = false;\n\tprivate needsRender = false;\n\tprivate renderRuntime?: RenderRuntime;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.reactivePropertyState = new ReactivePropertyState(this);\n\n\t\tthis.reactiveHost = new ReactiveHost<this, Bindings>(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tdefineProperty: (target, property, descriptor) => Object.defineProperty(target, property, descriptor),\n\t\t\t\tgetBindingTarget: (target) => Object.getPrototypeOf(target) ?? target,\n\t\t\t\thasProperty: (target, property) => property in target,\n\t\t\t\treadProperty: (target, property) => (target as Record<string, unknown>)[property],\n\t\t\t},\n\t\t\t() => this.shouldAutoBindReactiveMembers(),\n\t\t);\n\t\tthis.bindings = this.reactiveHost.bindings;\n\t\tthis.$ = this.reactiveHost.$;\n\t\trunLegacyInstanceInitializers(this);\n\t}\n\n\tpublic get slotProjectionVersion(): number {\n\t\treturn this.renderRuntime?.slotProjectionVersion ?? 0;\n\t}\n\n\tconnectedCallback() {\n\t\trunLegacyPostConstructionInitializers(this);\n\t\tconst isReconnectDuringPendingFirstConnect = this.isFirstConnectPending;\n\n\t\tthis.elementReady = true;\n\n\t\tthis.reactiveHost.connectHost();\n\n\t\tif (isReconnectDuringPendingFirstConnect) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isFirstConnectPending = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.isFirstConnectPending = false;\n\n\t\t\tif (!this.isConnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst renderRuntime = this.getOrCreateRenderRuntime();\n\t\t\trenderRuntime.observeSlotProjection();\n\n\t\t\tif (shouldHydrateOnConnect(this)) {\n\t\t\t\tthis.needsRender = false;\n\t\t\t\tthis.hydrate();\n\n\t\t\t\tif (this.needsRender) {\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.update();\n\t\t});\n\t}\n\n\tconnectedContextCallback(_contextName: UnknownContext): void {}\n\n\tdisconnectedCallback() {\n\t\tthis.renderRuntime?.dispose();\n\t\tthis.renderRuntime = undefined;\n\t\tthis.removeAllSubscribedEvents();\n\t\tthis.reactiveHost.disconnectHost();\n\t}\n\n\tpublic notifyUpdate(changedProperty: string, oldValue: unknown, value: unknown) {\n\t\tthis.reactiveHost.notifyUpdate(changedProperty, oldValue, value);\n\t}\n\n\tattributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n\t\tif (oldValue === newValue || !this.elementReady) return;\n\n\t\tthis.reactivePropertyState.applyAttributeChange(name, oldValue, newValue);\n\t}\n\n\t/**\n\t * Renders a trusted HTML template string into the specified target element.\n\t *\n\t * **Security:** The `template` string is written to the DOM via `innerHTML`\n\t * or `insertAdjacentHTML` without built-in sanitization. Callers are\n\t * responsible for ensuring the input is trusted. Supply a `sanitize`\n\t * function to transform the template before insertion.\n\t */\n\tpublic renderTemplate({\n\t\ttarget = this,\n\t\ttemplate,\n\t\tinsert = 'replace',\n\t\tsanitize,\n\t}: {\n\t\ttarget: HTMLElement;\n\t\ttemplate: string;\n\t\tinsert?: RenderInsertPosition;\n\t\tsanitize?: (html: string) => string;\n\t}) {\n\t\tconst html = sanitize ? sanitize(template) : template;\n\t\tswitch (insert) {\n\t\t\tcase 'replace':\n\t\t\t\ttarget.innerHTML = html;\n\t\t\t\tbreak;\n\t\t\tcase 'beforeend':\n\t\t\t\ttarget.insertAdjacentHTML('beforeend', html);\n\t\t\t\tbreak;\n\t\t\tcase 'afterbegin':\n\t\t\t\ttarget.insertAdjacentHTML('afterbegin', html);\n\t\t\t\tbreak;\n\t\t\tcase 'beforebegin':\n\t\t\t\ttarget.insertAdjacentHTML('beforebegin', html);\n\t\t\t\tbreak;\n\t\t\tcase 'afterend':\n\t\t\t\ttarget.insertAdjacentHTML('afterend', html);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic render(): JsxRenderable {\n\t\treturn jsx('slot', {});\n\t}\n\n\tpublic renderViewToString(options: RenderToStringOptions = {}): string {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn this.innerHTML;\n\t\t}\n\n\t\trunLegacyPostConstructionInitializers(this);\n\t\tthis.prepareForSsr();\n\n\t\treturn requireRadiantElementSsrRuntime().renderView(this, options);\n\t}\n\n\tpublic hydrate(): void {\n\t\tif (!this.shouldRunRenderLifecycle() || !this.isConnected || this.isRendering) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { renderTarget } = this.resolveRenderSurface();\n\t\tconst renderRuntime = this.getOrCreateRenderRuntime();\n\n\t\tthis.isRendering = true;\n\n\t\ttry {\n\t\t\trenderRuntime.hydrate(renderTarget as HTMLElement);\n\t\t} finally {\n\t\t\tthis.isRendering = false;\n\t\t}\n\t}\n\n\tpublic requestUpdate(): void {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.needsRender = true;\n\n\t\tif (this.isRenderScheduled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isRenderScheduled = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.isRenderScheduled = false;\n\n\t\t\tif (!this.needsRender) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.update();\n\t\t});\n\t}\n\n\tpublic update(): void {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { renderTarget } = this.resolveRenderSurface();\n\t\tconst renderRuntime = this.getOrCreateRenderRuntime();\n\n\t\tthis.needsRender = true;\n\n\t\tif (!this.isConnected || this.isRendering) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.isFirstConnectPending && shouldHydrateOnConnect(this)) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.needsRender && this.isConnected) {\n\t\t\tthis.needsRender = false;\n\t\t\tthis.isRendering = true;\n\n\t\t\ttry {\n\t\t\t\trenderRuntime.render(renderTarget as HTMLElement);\n\t\t\t} finally {\n\t\t\t\tthis.isRendering = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic registerReactiveProperty(config: ReactiveProperty) {\n\t\tthis.reactivePropertyState.register(config);\n\t}\n\n\tpublic getReactiveProperties(): ReactiveProperty[] {\n\t\treturn this.reactivePropertyState.getAll();\n\t}\n\n\tpublic registerReactiveDependencyReader(property: string, read: () => unknown): void {\n\t\tthis.reactiveHost.registerReactiveDependencyReader(property, read);\n\t}\n\n\tpublic registerContextProvider(name: string, provider: SsrSerializableContextProvider): void {\n\t\tthis.contextProviders.set(name, provider);\n\t\tthis.hydrationBindings.set(name, provider);\n\t}\n\n\tpublic registerHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void {\n\t\tthis.hydrationBindings.set(name, binding);\n\t}\n\n\tpublic getContextProviders(): SsrSerializableContextProvider[] {\n\t\trunLegacyPostConstructionInitializers(this);\n\t\treturn [...this.contextProviders.values()];\n\t}\n\n\tpublic getHydrationBindings(): SsrSerializableHydrationBinding[] {\n\t\trunLegacyPostConstructionInitializers(this);\n\t\treturn [...this.hydrationBindings.values()];\n\t}\n\n\t/**\n\t * Flushes any deferred SSR-only preparation work before the host is\n\t * serialized.\n\t *\n\t * Radiant uses this to reapply SSR consumer state after construction so the\n\t * first server render sees finalized fields, props, and authored content.\n\t */\n\tprotected prepareForSsr(): void {\n\t\trunSsrPreparationCallbacks(this);\n\t}\n\n\t/**\n\t * Returns the default JSX binding policy for reactive members on this host.\n\t *\n\t * `RadiantElement` hosts default to automatic bindings for reactive members\n\t * when no explicit `bind` option is supplied.\n\t *\n\t * Lower-level hosts can override this hook to opt out when they want binding\n\t * creation to stay fully explicit across `@prop`, `@state`, and direct\n\t * `createReactiveProp`/`createReactiveField` calls.\n\t */\n\tprotected shouldAutoBindReactiveMembers(): boolean {\n\t\treturn true;\n\t}\n\n\tprotected shouldRunRenderLifecycle(): boolean {\n\t\treturn this.render !== RadiantElement.prototype.render;\n\t}\n\n\t/** Returns the DOM root used by client-side render and hydrate work. */\n\tprotected getRenderTarget(): RadiantRenderTarget {\n\t\tif (this.renderRootMode !== 'shadow') {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.shadowRoot) {\n\t\t\treturn this.shadowRoot;\n\t\t}\n\n\t\tif (typeof this.attachShadow !== 'function') {\n\t\t\tthrow new Error('RadiantElement shadow render mode requires attachShadow().');\n\t\t}\n\n\t\treturn this.attachShadow({ mode: 'open' });\n\t}\n\n\tpublic registerUpdateCallback(property: string, update: (...rest: any[]) => any): () => void {\n\t\treturn this.reactiveHost.registerUpdateCallback(property, update);\n\t}\n\n\tpublic getReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>> {\n\t\treturn this.reactiveHost.getReactiveBinding(property);\n\t}\n\n\tpublic bind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValue<ReactiveBindingValue<Bindings, Property>> {\n\t\treturn this.reactiveHost.getReactiveBinding(property);\n\t}\n\n\tpublic defineReactiveBinding(property: string, bind: ReactiveBindingOption = true): void {\n\t\tthis.reactiveHost.defineReactiveBinding(property, bind);\n\t}\n\n\tpublic trackReactiveRead(property: string): void {\n\t\tthis.reactiveHost.trackReactiveRead(property);\n\t}\n\n\tpublic subscribeEvents(events: RadiantElementEventListener[]): Array<() => void> {\n\t\tconst unsubscribers: Array<() => void> = [];\n\t\tfor (const event of events) {\n\t\t\tunsubscribers.push(this.subscribeEvent(event));\n\t\t}\n\t\treturn unsubscribers;\n\t}\n\n\tpublic subscribeEvent(eventConfig: RadiantElementEventListener): () => void {\n\t\tconst { interactionTarget } = this.resolveRenderSurface();\n\t\tconst delegatedListener = (delegatedEvent: Event) => {\n\t\t\tif (delegatedEvent.target && (delegatedEvent.target as Element).matches(eventConfig.selector)) {\n\t\t\t\teventConfig.listener.call(this, delegatedEvent);\n\t\t\t}\n\t\t};\n\t\tconst subscriptionId = `${eventConfig.type}:${eventConfig.selector}`;\n\t\tinteractionTarget.addEventListener(eventConfig.type, delegatedListener, eventConfig.options);\n\t\tthis.eventSubscriptions.set(subscriptionId, {\n\t\t\t...eventConfig,\n\t\t\tlistener: delegatedListener,\n\t\t\ttarget: interactionTarget,\n\t\t});\n\n\t\treturn this.unsubscribeEvent.bind(this, subscriptionId);\n\t}\n\n\tprivate unsubscribeEvent(id: string): void {\n\t\tconst eventSubscription = this.eventSubscriptions.get(id);\n\t\tif (eventSubscription) {\n\t\t\teventSubscription.target.removeEventListener(\n\t\t\t\teventSubscription.type,\n\t\t\t\teventSubscription.listener,\n\t\t\t\teventSubscription.options,\n\t\t\t);\n\t\t\tthis.eventSubscriptions.delete(id);\n\t\t}\n\t}\n\n\tprivate removeAllSubscribedEvents(): void {\n\t\tfor (const eventSubscription of this.eventSubscriptions.values()) {\n\t\t\teventSubscription.target.removeEventListener(\n\t\t\t\teventSubscription.type,\n\t\t\t\teventSubscription.listener,\n\t\t\t\teventSubscription.options,\n\t\t\t);\n\t\t}\n\t\tthis.eventSubscriptions.clear();\n\t}\n\n\t/**\n\t * Registers a callback that runs on every future disconnect.\n\t */\n\tpublic registerCleanupCallback(callback: () => void): void {\n\t\tthis.reactiveHost.registerCleanupCallback(callback);\n\t}\n\n\t/**\n\t * Registers a callback that runs from `connectedCallback()` on future host\n\t * connections.\n\t *\n\t * Registering after the host is already connected does not invoke the\n\t * callback immediately.\n\t */\n\tpublic registerConnectedCallback(callback: () => void): void {\n\t\tthis.reactiveHost.registerConnectedCallback(callback);\n\t}\n\n\tpublic registerEventEmitter(name: string, emitter: EventEmitter) {\n\t\tthis.eventEmitters.set(name, emitter);\n\t}\n\n\tpublic getRef<T extends Element = Element>(ref: string, all: true): T[];\n\tpublic getRef<T extends Element = Element>(ref: string, all?: false): T | null;\n\tpublic getRef<T extends Element = Element>(ref: string, all = false): T | T[] | null {\n\t\tconst selector = `[data-ref=\"${ref}\"]`;\n\t\tconst { queryRoot } = this.resolveRenderSurface();\n\t\tif (all) {\n\t\t\treturn Array.from(queryRoot.querySelectorAll(selector)) as T[];\n\t\t}\n\t\treturn (queryRoot.querySelector(selector) as T) ?? null;\n\t}\n\n\tpublic getSlotElement<T extends Element = Element>(name?: string): T | null {\n\t\treturn (this.getSlotElements<T>(name)[0] ?? null) as T | null;\n\t}\n\n\tpublic getSlotElements<T extends Element = Element>(name?: string): T[] {\n\t\treturn this.getOrCreateRenderRuntime().getSlotElements<T>(name);\n\t}\n\n\tpublic createReactiveField<T>(propertyName: string, initialValue: T, options: ReactiveFieldOptions = {}): void {\n\t\tthis.reactiveHost.createReactiveField(propertyName, initialValue, options);\n\t}\n\n\t/**\n\t * Defines a reactive custom-element property backed by a Radiant accessor.\n\t *\n\t * When the host was assigned a value before upgrade, that pre-upgrade value is\n\t * preferred over attribute parsing and `defaultValue` so early `.prop = value`\n\t * writes survive into the reactive lifecycle.\n\t */\n\tpublic createReactiveProp<T = unknown>(propertyName: string, options: ReactivePropertyOptions<T>): void {\n\t\tthis.reactivePropertyState.create(\n\t\t\tpropertyName,\n\t\t\toptions,\n\t\t\t(type, attributeKey, defaultValue) => getInitialValue(this, type, attributeKey, defaultValue) as T,\n\t\t\t(name, config) => {\n\t\t\t\tthis.reactiveHost.defineReactiveAccessor(name, config);\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic getSlotProjectionScriptTag(): string | undefined {\n\t\treturn this.getOrCreateRenderRuntime().getSlotProjectionScriptTag();\n\t}\n\n\tpublic getAuthoredHydrationScriptMarkup(): string | undefined {\n\t\treturn this.getOrCreateRenderRuntime().getAuthoredHydrationScriptMarkup();\n\t}\n\n\tpublic resolveTrackedRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\treturn this.getOrCreateRenderRuntime().resolveTrackedRenderOutput();\n\t}\n\n\tprivate getOrCreateRenderRuntime() {\n\t\tif (this.renderRuntime) {\n\t\t\treturn this.renderRuntime;\n\t\t}\n\n\t\tthis.renderRuntime = new RenderRuntime(this as RenderRuntimeHost);\n\t\treturn this.renderRuntime;\n\t}\n\n\tprivate resolveRenderSurface(): RadiantRenderSurface {\n\t\tconst renderTarget = this.getRenderTarget();\n\t\tconst interactionTarget = renderTarget instanceof ShadowRoot ? renderTarget : this;\n\n\t\treturn {\n\t\t\tinteractionTarget,\n\t\t\tqueryRoot: interactionTarget,\n\t\t\trenderTarget,\n\t\t};\n\t}\n}\n\nfunction requireRadiantElementSsrRuntime() {\n\tconst runtime = getRadiantElementSsrRuntime();\n\n\tif (!runtime) {\n\t\tthrow new Error('Radiant SSR runtime unavailable. Import `@ecopages/radiant/server/render-component` first.');\n\t}\n\n\treturn runtime;\n}\n\nfunction shouldHydrateOnConnect(component: HTMLElement): boolean {\n\treturn isRadiantHydratorInstalled() && hasHydrationMarkers(component);\n}\n\nclass ReactivePropertyState {\n\tprivate readonly properties = new Map<string, ReactiveProperty>();\n\tprivate readonly preUpgradePropertyValues = new Map<string, unknown>();\n\n\tconstructor(private readonly host: ReactivePropertyStateHost) {\n\t\tfor (const propertyName of Object.getOwnPropertyNames(host)) {\n\t\t\tthis.preUpgradePropertyValues.set(propertyName, Reflect.get(host, propertyName));\n\t\t}\n\t}\n\n\tpublic register(config: ReactiveProperty): void {\n\t\tthis.properties.set(config.name, config);\n\t}\n\n\tpublic getAll(): ReactiveProperty[] {\n\t\treturn Array.from(this.properties.values());\n\t}\n\n\tpublic applyAttributeChange(name: string, oldValue: string | null, newValue: string | null): void {\n\t\tconst config = this.properties.get(name);\n\n\t\tif (!config) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transformedValue = this.transformAttributeValue(newValue, config);\n\t\tconst transformedOldValue = this.transformAttributeValue(oldValue, config);\n\n\t\tReflect.set(this.host, config.attribute, transformedValue);\n\t\tthis.host.notifyUpdate(name, transformedOldValue, transformedValue);\n\t}\n\n\tpublic create<T>(\n\t\tpropertyName: string,\n\t\toptions: ReactivePropertyOptions<T>,\n\t\tresolveInitialValue: (type: AttributeTypeConstant, attributeKey: string, defaultValue: unknown) => T,\n\t\tdefineReactiveAccessor: (propertyName: string, config: ReactiveAccessorDefinition<T>) => void,\n\t): void {\n\t\tconst { type, attribute, reflect, defaultValue } = options;\n\t\tconst attributeKey = attribute ?? propertyName;\n\t\tconst hasPreUpgradeValue = this.preUpgradePropertyValues.has(propertyName);\n\t\tconst preUpgradeValue = hasPreUpgradeValue ? (this.preUpgradePropertyValues.get(propertyName) as T) : undefined;\n\n\t\tvalidateReactivePropertyDefault(type, defaultValue);\n\n\t\tconst initialValue: T | undefined = hasPreUpgradeValue\n\t\t\t? preUpgradeValue\n\t\t\t: resolveInitialValue(type, attributeKey, defaultValue);\n\n\t\tif (this.host.hasAttribute(attributeKey) && (!reflect || initialValue == null || initialValue === '')) {\n\t\t\tthis.host.removeAttribute(attributeKey);\n\t\t}\n\n\t\tif (hasPreUpgradeValue && Object.prototype.hasOwnProperty.call(this.host, propertyName)) {\n\t\t\tReflect.deleteProperty(this.host, propertyName);\n\t\t}\n\n\t\tconst propertyMapping = createReactivePropertyMapping(propertyName, attributeKey, type, initialValue);\n\n\t\tthis.register(propertyMapping);\n\n\t\tdefineReactiveAccessor(propertyName, {\n\t\t\tbind: options.bind,\n\t\t\tgetValue: () => this.properties.get(propertyName)?.value as T | undefined,\n\t\t\tsetValue: (newValue: T) => {\n\t\t\t\tthis.properties.set(propertyName, { ...propertyMapping, value: newValue });\n\t\t\t\tthis.reflectValue(attributeKey, reflect, propertyMapping, newValue);\n\t\t\t},\n\t\t});\n\n\t\tif (initialValue !== undefined) {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst currentValue = this.properties.get(propertyName)?.value as T | undefined;\n\t\t\t\tif (currentValue === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.reflectValue(attributeKey, reflect, propertyMapping, currentValue);\n\t\t\t\tthis.host.notifyUpdate(propertyName, undefined, currentValue);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate transformAttributeValue(value: string | null, config: ReactiveProperty): unknown {\n\t\treturn value !== null ? config.converter.fromAttribute(value) : value;\n\t}\n\n\tprivate reflectValue<T>(\n\t\tattributeKey: string,\n\t\treflect: boolean | undefined,\n\t\tproperty: ReactiveProperty<T>,\n\t\tvalue: T,\n\t): void {\n\t\tif (!reflect) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value == null || value === '' || value === false) {\n\t\t\tthis.host.removeAttribute(attributeKey);\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributeValue = property.converter.toAttribute(value);\n\t\tthis.host.setAttribute(attributeKey, attributeValue);\n\t}\n}\n"
|
|
20
|
+
],
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "5CB4B32FAD9B2A1F64756E2164756E21",
|
|
23
|
+
"names": []
|
|
24
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Marks the current JavaScript environment as hydration-enabled for first
|
|
3
3
|
* custom-element connect.
|
|
4
4
|
*
|
|
5
|
-
* `
|
|
5
|
+
* `RadiantElement` reads this flag before deciding whether SSR markup should
|
|
6
6
|
* hydrate in place or be replaced by a fresh client render.
|
|
7
7
|
*/
|
|
8
8
|
export declare function installRadiantHydratorState(): void;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var e=((a)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(c,d)=>(typeof require<"u"?require:c)[d]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var b=Symbol.for("@ecopages/radiant.hydrator-installed");function g(){globalThis[b]=!0}function h(){delete globalThis[b]}function i(){return globalThis[b]===!0}export{h as uninstallRadiantHydratorState,i as isRadiantHydratorInstalled,g as installRadiantHydratorState};
|
|
2
|
+
|
|
3
|
+
//# debugId=33042759F4F3200364756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/radiant-hydrator-state.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"const RADIANT_HYDRATOR_INSTALLED_SYMBOL = Symbol.for('@ecopages/radiant.hydrator-installed');\n\ntype GlobalHydratorState = typeof globalThis & Record<PropertyKey, unknown>;\n\n/**\n * Marks the current JavaScript environment as hydration-enabled for first\n * custom-element connect.\n *\n * `RadiantElement` reads this flag before deciding whether SSR markup should\n * hydrate in place or be replaced by a fresh client render.\n */\nexport function installRadiantHydratorState(): void {\n\t(globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] = true;\n}\n\n/**\n * Clears the explicit hydration-enabled flag from `globalThis`.\n *\n * This is mainly used by tests so they can assert both hydrated and non-\n * hydrated first-connect behavior deterministically.\n */\nexport function uninstallRadiantHydratorState(): void {\n\tdelete (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL];\n}\n\n/**\n * Returns whether first-connect hydration is currently enabled for this\n * JavaScript environment.\n */\nexport function isRadiantHydratorInstalled(): boolean {\n\treturn (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] === true;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "2PAAA,IAAM,EAAoC,OAAO,IAAI,sCAAsC,EAWpF,SAAS,CAA2B,EAAS,CAClD,WAAmC,GAAqC,GASnE,SAAS,CAA6B,EAAS,CACrD,OAAQ,WAAmC,GAOrC,SAAS,CAA0B,EAAY,CACrD,OAAQ,WAAmC,KAAuC",
|
|
8
|
+
"debugId": "33042759F4F3200364756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|