@pwfabric/runtime 0.0.0-stage → 1.0.0-rc.1
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/LICENSE +90 -0
- package/README.md +43 -2
- package/dist/a11y/announcer.d.ts +65 -0
- package/dist/a11y/announcer.js +140 -0
- package/dist/a11y/announcer.js.map +1 -0
- package/dist/a11y/contrast.d.ts +54 -0
- package/dist/a11y/contrast.js +93 -0
- package/dist/a11y/contrast.js.map +1 -0
- package/dist/a11y/focus.d.ts +123 -0
- package/dist/a11y/focus.js +282 -0
- package/dist/a11y/focus.js.map +1 -0
- package/dist/a11y/index.d.ts +21 -0
- package/dist/a11y/index.js +18 -0
- package/dist/a11y/index.js.map +1 -0
- package/dist/a11y/keyboard.d.ts +144 -0
- package/dist/a11y/keyboard.js +317 -0
- package/dist/a11y/keyboard.js.map +1 -0
- package/dist/adapters/default-image.d.ts +25 -0
- package/dist/adapters/default-image.js +37 -0
- package/dist/adapters/default-image.js.map +1 -0
- package/dist/adapters/index.d.ts +27 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/next-image.d.ts +38 -0
- package/dist/adapters/next-image.js +124 -0
- package/dist/adapters/next-image.js.map +1 -0
- package/dist/adapters/types.d.ts +61 -0
- package/dist/adapters/types.js +11 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/analytics/index.d.ts +14 -0
- package/dist/analytics/index.js +15 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +65 -0
- package/dist/analytics/tracker.js +251 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/analytics/types.d.ts +130 -0
- package/dist/analytics/types.js +11 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/provider.d.ts +132 -0
- package/dist/auth/provider.js +473 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/types.d.ts +117 -0
- package/dist/auth/types.js +9 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/binding/collection.d.ts +190 -0
- package/dist/binding/collection.js +358 -0
- package/dist/binding/collection.js.map +1 -0
- package/dist/binding/datasource.d.ts +319 -0
- package/dist/binding/datasource.js +556 -0
- package/dist/binding/datasource.js.map +1 -0
- package/dist/binding/engine.d.ts +65 -0
- package/dist/binding/engine.js +268 -0
- package/dist/binding/engine.js.map +1 -0
- package/dist/binding/expression.d.ts +150 -0
- package/dist/binding/expression.js +787 -0
- package/dist/binding/expression.js.map +1 -0
- package/dist/binding/index.d.ts +19 -0
- package/dist/binding/index.js +14 -0
- package/dist/binding/index.js.map +1 -0
- package/dist/binding/two-way.d.ts +149 -0
- package/dist/binding/two-way.js +462 -0
- package/dist/binding/two-way.js.map +1 -0
- package/dist/binding/types.d.ts +119 -0
- package/dist/binding/types.js +9 -0
- package/dist/binding/types.js.map +1 -0
- package/dist/blocks/component-types.d.ts +81 -0
- package/dist/blocks/component-types.js +11 -0
- package/dist/blocks/component-types.js.map +1 -0
- package/dist/blocks/composition-rules.d.ts +168 -0
- package/dist/blocks/composition-rules.js +391 -0
- package/dist/blocks/composition-rules.js.map +1 -0
- package/dist/blocks/hooks.d.ts +31 -0
- package/dist/blocks/hooks.js +42 -0
- package/dist/blocks/hooks.js.map +1 -0
- package/dist/blocks/index.d.ts +14 -0
- package/dist/blocks/index.js +23 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/registry.d.ts +84 -0
- package/dist/blocks/registry.js +136 -0
- package/dist/blocks/registry.js.map +1 -0
- package/dist/blocks/rule-engine.d.ts +131 -0
- package/dist/blocks/rule-engine.js +321 -0
- package/dist/blocks/rule-engine.js.map +1 -0
- package/dist/blocks/surface-event-context.d.ts +13 -0
- package/dist/blocks/surface-event-context.js +14 -0
- package/dist/blocks/surface-event-context.js.map +1 -0
- package/dist/blocks/surface-id-context.d.ts +13 -0
- package/dist/blocks/surface-id-context.js +15 -0
- package/dist/blocks/surface-id-context.js.map +1 -0
- package/dist/bus.d.ts +41 -0
- package/dist/bus.js +158 -0
- package/dist/bus.js.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.js +10 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory.d.ts +32 -0
- package/dist/cache/memory.js +138 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/types.d.ts +62 -0
- package/dist/cache/types.js +9 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/capability/index.d.ts +72 -0
- package/dist/capability/index.js +87 -0
- package/dist/capability/index.js.map +1 -0
- package/dist/capability/kernel-capabilities.d.ts +31 -0
- package/dist/capability/kernel-capabilities.js +36 -0
- package/dist/capability/kernel-capabilities.js.map +1 -0
- package/dist/capability/platform-capabilities.d.ts +71 -0
- package/dist/capability/platform-capabilities.js +267 -0
- package/dist/capability/platform-capabilities.js.map +1 -0
- package/dist/capability/type-mapping.d.ts +70 -0
- package/dist/capability/type-mapping.js +107 -0
- package/dist/capability/type-mapping.js.map +1 -0
- package/dist/capability/validation.d.ts +46 -0
- package/dist/capability/validation.js +54 -0
- package/dist/capability/validation.js.map +1 -0
- package/dist/connectors/declared-connector.d.ts +48 -0
- package/dist/connectors/declared-connector.js +333 -0
- package/dist/connectors/declared-connector.js.map +1 -0
- package/dist/connectors/engine-registry.d.ts +50 -0
- package/dist/connectors/engine-registry.js +135 -0
- package/dist/connectors/engine-registry.js.map +1 -0
- package/dist/connectors/index.d.ts +14 -0
- package/dist/connectors/index.js +14 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/module-loader.d.ts +70 -0
- package/dist/connectors/module-loader.js +143 -0
- package/dist/connectors/module-loader.js.map +1 -0
- package/dist/connectors/types.d.ts +174 -0
- package/dist/connectors/types.js +23 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/data/DataCapabilityProvider.d.ts +39 -0
- package/dist/data/DataCapabilityProvider.js +58 -0
- package/dist/data/DataCapabilityProvider.js.map +1 -0
- package/dist/data/index.d.ts +17 -0
- package/dist/data/index.js +18 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/manager.d.ts +40 -0
- package/dist/data/manager.js +442 -0
- package/dist/data/manager.js.map +1 -0
- package/dist/data/types.d.ts +218 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/entity/aggregate.d.ts +8 -0
- package/dist/entity/aggregate.js +24 -0
- package/dist/entity/aggregate.js.map +1 -0
- package/dist/entity/apply-query.d.ts +58 -0
- package/dist/entity/apply-query.js +264 -0
- package/dist/entity/apply-query.js.map +1 -0
- package/dist/entity/behavior.d.ts +94 -0
- package/dist/entity/behavior.js +78 -0
- package/dist/entity/behavior.js.map +1 -0
- package/dist/entity/connector.d.ts +141 -0
- package/dist/entity/connector.js +89 -0
- package/dist/entity/connector.js.map +1 -0
- package/dist/entity/connectors/index.d.ts +12 -0
- package/dist/entity/connectors/index.js +11 -0
- package/dist/entity/connectors/index.js.map +1 -0
- package/dist/entity/connectors/static.d.ts +51 -0
- package/dist/entity/connectors/static.js +245 -0
- package/dist/entity/connectors/static.js.map +1 -0
- package/dist/entity/entity-datasource.d.ts +50 -0
- package/dist/entity/entity-datasource.js +33 -0
- package/dist/entity/entity-datasource.js.map +1 -0
- package/dist/entity/facade.d.ts +70 -0
- package/dist/entity/facade.js +70 -0
- package/dist/entity/facade.js.map +1 -0
- package/dist/entity/http-connector.d.ts +123 -0
- package/dist/entity/http-connector.js +295 -0
- package/dist/entity/http-connector.js.map +1 -0
- package/dist/entity/index.d.ts +38 -0
- package/dist/entity/index.js +31 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/postgres-connector.d.ts +64 -0
- package/dist/entity/postgres-connector.js +239 -0
- package/dist/entity/postgres-connector.js.map +1 -0
- package/dist/entity/registry.d.ts +59 -0
- package/dist/entity/registry.js +90 -0
- package/dist/entity/registry.js.map +1 -0
- package/dist/entity/store.d.ts +66 -0
- package/dist/entity/store.js +349 -0
- package/dist/entity/store.js.map +1 -0
- package/dist/entity/types.d.ts +180 -0
- package/dist/entity/types.js +10 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/execution-context.d.ts +88 -0
- package/dist/execution-context.js +146 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/executor.d.ts +27 -0
- package/dist/executor.js +33 -0
- package/dist/executor.js.map +1 -0
- package/dist/forms/form-entity-bridge.d.ts +94 -0
- package/dist/forms/form-entity-bridge.js +96 -0
- package/dist/forms/form-entity-bridge.js.map +1 -0
- package/dist/forms/form-write-target.d.ts +34 -0
- package/dist/forms/form-write-target.js +81 -0
- package/dist/forms/form-write-target.js.map +1 -0
- package/dist/forms/index.d.ts +22 -0
- package/dist/forms/index.js +25 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/named-control-values.d.ts +27 -0
- package/dist/forms/named-control-values.js +42 -0
- package/dist/forms/named-control-values.js.map +1 -0
- package/dist/forms/processor.d.ts +55 -0
- package/dist/forms/processor.js +154 -0
- package/dist/forms/processor.js.map +1 -0
- package/dist/forms/types.d.ts +174 -0
- package/dist/forms/types.js +33 -0
- package/dist/forms/types.js.map +1 -0
- package/dist/forms/validator.d.ts +61 -0
- package/dist/forms/validator.js +218 -0
- package/dist/forms/validator.js.map +1 -0
- package/dist/graph/index.d.ts +10 -0
- package/dist/graph/index.js +9 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/resolver.d.ts +66 -0
- package/dist/graph/resolver.js +243 -0
- package/dist/graph/resolver.js.map +1 -0
- package/dist/graph/types.d.ts +125 -0
- package/dist/graph/types.js +9 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/hooks/useInstalledAtoms.d.ts +96 -0
- package/dist/hooks/useInstalledAtoms.js +92 -0
- package/dist/hooks/useInstalledAtoms.js.map +1 -0
- package/dist/i18n/index.d.ts +15 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/translator.d.ts +76 -0
- package/dist/i18n/translator.js +357 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/i18n/types.d.ts +93 -0
- package/dist/i18n/types.js +9 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +47 -0
- package/dist/kernel.js +258 -0
- package/dist/kernel.js.map +1 -0
- package/dist/perf/budget.d.ts +92 -0
- package/dist/perf/budget.js +122 -0
- package/dist/perf/budget.js.map +1 -0
- package/dist/perf/index.d.ts +16 -0
- package/dist/perf/index.js +13 -0
- package/dist/perf/index.js.map +1 -0
- package/dist/perf/render-timer.d.ts +90 -0
- package/dist/perf/render-timer.js +136 -0
- package/dist/perf/render-timer.js.map +1 -0
- package/dist/perf/reporter.d.ts +126 -0
- package/dist/perf/reporter.js +241 -0
- package/dist/perf/reporter.js.map +1 -0
- package/dist/perf/web-vitals.d.ts +111 -0
- package/dist/perf/web-vitals.js +268 -0
- package/dist/perf/web-vitals.js.map +1 -0
- package/dist/registry.d.ts +63 -0
- package/dist/registry.js +126 -0
- package/dist/registry.js.map +1 -0
- package/dist/render/BehaviorSurfaceProvider.d.ts +65 -0
- package/dist/render/BehaviorSurfaceProvider.js +185 -0
- package/dist/render/BehaviorSurfaceProvider.js.map +1 -0
- package/dist/render/BlockErrorBoundary.d.ts +26 -0
- package/dist/render/BlockErrorBoundary.js +41 -0
- package/dist/render/BlockErrorBoundary.js.map +1 -0
- package/dist/render/DataBoundSurfaceRenderer.d.ts +78 -0
- package/dist/render/DataBoundSurfaceRenderer.js +998 -0
- package/dist/render/DataBoundSurfaceRenderer.js.map +1 -0
- package/dist/render/DynamicBlockWrapper.d.ts +23 -0
- package/dist/render/DynamicBlockWrapper.js +117 -0
- package/dist/render/DynamicBlockWrapper.js.map +1 -0
- package/dist/render/appearance-resolver.d.ts +50 -0
- package/dist/render/appearance-resolver.js +78 -0
- package/dist/render/appearance-resolver.js.map +1 -0
- package/dist/render/capability-gate.d.ts +69 -0
- package/dist/render/capability-gate.js +94 -0
- package/dist/render/capability-gate.js.map +1 -0
- package/dist/render/conditional-states-css.d.ts +41 -0
- package/dist/render/conditional-states-css.js +82 -0
- package/dist/render/conditional-states-css.js.map +1 -0
- package/dist/render/connections-context.d.ts +31 -0
- package/dist/render/connections-context.js +34 -0
- package/dist/render/connections-context.js.map +1 -0
- package/dist/render/dark-theme-css.d.ts +36 -0
- package/dist/render/dark-theme-css.js +67 -0
- package/dist/render/dark-theme-css.js.map +1 -0
- package/dist/render/data-binding-types.d.ts +191 -0
- package/dist/render/data-binding-types.js +11 -0
- package/dist/render/data-binding-types.js.map +1 -0
- package/dist/render/data-cache.d.ts +30 -0
- package/dist/render/data-cache.js +37 -0
- package/dist/render/data-cache.js.map +1 -0
- package/dist/render/derive-dark-theme.d.ts +17 -0
- package/dist/render/derive-dark-theme.js +18 -0
- package/dist/render/derive-dark-theme.js.map +1 -0
- package/dist/render/dynamic-artifact-context.d.ts +77 -0
- package/dist/render/dynamic-artifact-context.js +89 -0
- package/dist/render/dynamic-artifact-context.js.map +1 -0
- package/dist/render/dynamic-block-loader.d.ts +80 -0
- package/dist/render/dynamic-block-loader.js +197 -0
- package/dist/render/dynamic-block-loader.js.map +1 -0
- package/dist/render/endpoint.d.ts +18 -0
- package/dist/render/endpoint.js +109 -0
- package/dist/render/endpoint.js.map +1 -0
- package/dist/render/entity-facade-context.d.ts +34 -0
- package/dist/render/entity-facade-context.js +37 -0
- package/dist/render/entity-facade-context.js.map +1 -0
- package/dist/render/group-states-css.d.ts +41 -0
- package/dist/render/group-states-css.js +73 -0
- package/dist/render/group-states-css.js.map +1 -0
- package/dist/render/hooks/useSurfaceEvents.d.ts +8 -0
- package/dist/render/hooks/useSurfaceEvents.js +9 -0
- package/dist/render/hooks/useSurfaceEvents.js.map +1 -0
- package/dist/render/hooks/useSurfaceId.d.ts +8 -0
- package/dist/render/hooks/useSurfaceId.js +9 -0
- package/dist/render/hooks/useSurfaceId.js.map +1 -0
- package/dist/render/index.d.ts +48 -0
- package/dist/render/index.js +61 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/interaction-rule-engine.d.ts +12 -0
- package/dist/render/interaction-rule-engine.js +47 -0
- package/dist/render/interaction-rule-engine.js.map +1 -0
- package/dist/render/keyframes-css.d.ts +31 -0
- package/dist/render/keyframes-css.js +44 -0
- package/dist/render/keyframes-css.js.map +1 -0
- package/dist/render/query-state.d.ts +3 -0
- package/dist/render/query-state.js +70 -0
- package/dist/render/query-state.js.map +1 -0
- package/dist/render/renderer.d.ts +44 -0
- package/dist/render/renderer.js +937 -0
- package/dist/render/renderer.js.map +1 -0
- package/dist/render/resolve-expressions.d.ts +37 -0
- package/dist/render/resolve-expressions.js +309 -0
- package/dist/render/resolve-expressions.js.map +1 -0
- package/dist/render/responsive-style-css.d.ts +42 -0
- package/dist/render/responsive-style-css.js +123 -0
- package/dist/render/responsive-style-css.js.map +1 -0
- package/dist/render/responsive.d.ts +49 -0
- package/dist/render/responsive.js +99 -0
- package/dist/render/responsive.js.map +1 -0
- package/dist/render/scoped-css.d.ts +71 -0
- package/dist/render/scoped-css.js +102 -0
- package/dist/render/scoped-css.js.map +1 -0
- package/dist/render/shell-selection.d.ts +69 -0
- package/dist/render/shell-selection.js +117 -0
- package/dist/render/shell-selection.js.map +1 -0
- package/dist/render/states-css.d.ts +32 -0
- package/dist/render/states-css.js +63 -0
- package/dist/render/states-css.js.map +1 -0
- package/dist/render/surface-data-context.d.ts +18 -0
- package/dist/render/surface-data-context.js +21 -0
- package/dist/render/surface-data-context.js.map +1 -0
- package/dist/render/surface-event-bus.d.ts +19 -0
- package/dist/render/surface-event-bus.js +68 -0
- package/dist/render/surface-event-bus.js.map +1 -0
- package/dist/render/surface-event-context.d.ts +11 -0
- package/dist/render/surface-event-context.js +12 -0
- package/dist/render/surface-event-context.js.map +1 -0
- package/dist/render/surface-id-context.d.ts +8 -0
- package/dist/render/surface-id-context.js +9 -0
- package/dist/render/surface-id-context.js.map +1 -0
- package/dist/render/theme-utils.d.ts +14 -0
- package/dist/render/theme-utils.js +15 -0
- package/dist/render/theme-utils.js.map +1 -0
- package/dist/render/types.d.ts +282 -0
- package/dist/render/types.js +9 -0
- package/dist/render/types.js.map +1 -0
- package/dist/render/visibility-css.d.ts +42 -0
- package/dist/render/visibility-css.js +119 -0
- package/dist/render/visibility-css.js.map +1 -0
- package/dist/render/width-scope.d.ts +34 -0
- package/dist/render/width-scope.js +44 -0
- package/dist/render/width-scope.js.map +1 -0
- package/dist/render/write-only-sources.d.ts +33 -0
- package/dist/render/write-only-sources.js +99 -0
- package/dist/render/write-only-sources.js.map +1 -0
- package/dist/routing/index.d.ts +14 -0
- package/dist/routing/index.js +15 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/router.d.ts +42 -0
- package/dist/routing/router.js +218 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/routing/types.d.ts +124 -0
- package/dist/routing/types.js +9 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/seo/generator.d.ts +39 -0
- package/dist/seo/generator.js +236 -0
- package/dist/seo/generator.js.map +1 -0
- package/dist/seo/index.d.ts +14 -0
- package/dist/seo/index.js +15 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/types.d.ts +181 -0
- package/dist/seo/types.js +9 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/state/index.d.ts +15 -0
- package/dist/state/index.js +16 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/manager.d.ts +33 -0
- package/dist/state/manager.js +81 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/store.d.ts +40 -0
- package/dist/state/store.js +145 -0
- package/dist/state/store.js.map +1 -0
- package/dist/state/types.d.ts +107 -0
- package/dist/state/types.js +9 -0
- package/dist/state/types.js.map +1 -0
- package/dist/surface/expression.d.ts +65 -0
- package/dist/surface/expression.js +179 -0
- package/dist/surface/expression.js.map +1 -0
- package/dist/surface/index.d.ts +32 -0
- package/dist/surface/index.js +25 -0
- package/dist/surface/index.js.map +1 -0
- package/dist/surface/interpreter.d.ts +96 -0
- package/dist/surface/interpreter.js +231 -0
- package/dist/surface/interpreter.js.map +1 -0
- package/dist/surface/layout.d.ts +54 -0
- package/dist/surface/layout.js +288 -0
- package/dist/surface/layout.js.map +1 -0
- package/dist/surface/output.d.ts +90 -0
- package/dist/surface/output.js +104 -0
- package/dist/surface/output.js.map +1 -0
- package/dist/surface/primitives.d.ts +180 -0
- package/dist/surface/primitives.js +339 -0
- package/dist/surface/primitives.js.map +1 -0
- package/dist/surface/renderer.d.ts +96 -0
- package/dist/surface/renderer.js +190 -0
- package/dist/surface/renderer.js.map +1 -0
- package/dist/surface/schemas.d.ts +181 -0
- package/dist/surface/schemas.js +142 -0
- package/dist/surface/schemas.js.map +1 -0
- package/dist/surface/transforms.d.ts +144 -0
- package/dist/surface/transforms.js +120 -0
- package/dist/surface/transforms.js.map +1 -0
- package/dist/surface/types.d.ts +160 -0
- package/dist/surface/types.js +51 -0
- package/dist/surface/types.js.map +1 -0
- package/dist/surface/validation.d.ts +123 -0
- package/dist/surface/validation.js +147 -0
- package/dist/surface/validation.js.map +1 -0
- package/dist/validator.d.ts +55 -0
- package/dist/validator.js +100 -0
- package/dist/validator.js.map +1 -0
- package/package.json +106 -3
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding Engine
|
|
3
|
+
*
|
|
4
|
+
* Resolves and manages capability bindings for surfaces
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/binding/engine
|
|
7
|
+
*/
|
|
8
|
+
import type { SurfaceId } from '@pwfabric/contracts';
|
|
9
|
+
import type { FabricKernel } from '../kernel.js';
|
|
10
|
+
import type { BindingConfig, BoundCapability, BindingContext, BindingResult, SurfaceBindingResult, AuthContext } from './types.js';
|
|
11
|
+
import type { CacheProvider } from '../cache/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Binding engine interface
|
|
14
|
+
*/
|
|
15
|
+
export interface BindingEngine {
|
|
16
|
+
/**
|
|
17
|
+
* Bind a capability to a surface
|
|
18
|
+
*/
|
|
19
|
+
bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>;
|
|
20
|
+
/**
|
|
21
|
+
* Bind all capabilities for a surface
|
|
22
|
+
*/
|
|
23
|
+
bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult;
|
|
24
|
+
/**
|
|
25
|
+
* Get a bound capability
|
|
26
|
+
*/
|
|
27
|
+
get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Unbind a capability
|
|
30
|
+
*/
|
|
31
|
+
unbind(surfaceId: SurfaceId, alias: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Unbind all capabilities for a surface
|
|
34
|
+
*/
|
|
35
|
+
unbindAll(surfaceId: SurfaceId): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get binding context for a surface
|
|
38
|
+
*/
|
|
39
|
+
getContext(surfaceId: SurfaceId): BindingContext | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Set authentication context
|
|
42
|
+
*/
|
|
43
|
+
setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Runtime binding engine implementation
|
|
47
|
+
*/
|
|
48
|
+
export declare class RuntimeBindingEngine implements BindingEngine {
|
|
49
|
+
private readonly fabric;
|
|
50
|
+
private readonly cache;
|
|
51
|
+
private readonly contexts;
|
|
52
|
+
constructor(fabric: FabricKernel, cache?: CacheProvider);
|
|
53
|
+
bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>;
|
|
54
|
+
bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult;
|
|
55
|
+
get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined;
|
|
56
|
+
unbind(surfaceId: SurfaceId, alias: string): boolean;
|
|
57
|
+
unbindAll(surfaceId: SurfaceId): void;
|
|
58
|
+
getContext(surfaceId: SurfaceId): BindingContext | undefined;
|
|
59
|
+
setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void;
|
|
60
|
+
private createBoundCapability;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a binding engine
|
|
64
|
+
*/
|
|
65
|
+
export declare function createBindingEngine(fabric: FabricKernel, cache?: CacheProvider): BindingEngine;
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding Engine
|
|
3
|
+
*
|
|
4
|
+
* Resolves and manages capability bindings for surfaces
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/binding/engine
|
|
7
|
+
*/
|
|
8
|
+
import { executionErr } from '@pwfabric/contracts';
|
|
9
|
+
// ============================================================
|
|
10
|
+
// RUNTIME BINDING ENGINE
|
|
11
|
+
// ============================================================
|
|
12
|
+
/**
|
|
13
|
+
* Runtime binding engine implementation
|
|
14
|
+
*/
|
|
15
|
+
export class RuntimeBindingEngine {
|
|
16
|
+
fabric;
|
|
17
|
+
cache;
|
|
18
|
+
contexts = new Map();
|
|
19
|
+
constructor(fabric, cache) {
|
|
20
|
+
this.fabric = fabric;
|
|
21
|
+
this.cache = cache;
|
|
22
|
+
}
|
|
23
|
+
bind(surfaceId, config) {
|
|
24
|
+
// Resolve capability from fabric
|
|
25
|
+
const resolution = this.fabric.resolve(config.capabilityId);
|
|
26
|
+
if (!resolution.found) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
error: {
|
|
30
|
+
type: 'resolution_failed',
|
|
31
|
+
message: `Capability ${config.capabilityId} not found`,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const alias = config.alias ?? config.capabilityId;
|
|
36
|
+
// Create bound capability
|
|
37
|
+
const boundCapability = this.createBoundCapability(surfaceId, alias, resolution.capability, config);
|
|
38
|
+
// Get or create context
|
|
39
|
+
let context = this.contexts.get(surfaceId);
|
|
40
|
+
if (!context) {
|
|
41
|
+
context = {
|
|
42
|
+
surfaceId,
|
|
43
|
+
data: {},
|
|
44
|
+
bindings: new Map(),
|
|
45
|
+
};
|
|
46
|
+
this.contexts.set(surfaceId, context);
|
|
47
|
+
}
|
|
48
|
+
// Add to bindings
|
|
49
|
+
context.bindings.set(alias, boundCapability);
|
|
50
|
+
return { success: true, binding: boundCapability };
|
|
51
|
+
}
|
|
52
|
+
bindAll(surfaceId, configs) {
|
|
53
|
+
const errors = [];
|
|
54
|
+
for (const config of configs) {
|
|
55
|
+
const result = this.bind(surfaceId, config);
|
|
56
|
+
if (!result.success) {
|
|
57
|
+
errors.push(result.error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (errors.length > 0) {
|
|
61
|
+
return { success: false, errors };
|
|
62
|
+
}
|
|
63
|
+
const context = this.contexts.get(surfaceId);
|
|
64
|
+
if (!context) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
errors: [{ type: 'resolution_failed', message: 'Context not created' }],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { success: true, context };
|
|
71
|
+
}
|
|
72
|
+
get(surfaceId, alias) {
|
|
73
|
+
return this.contexts.get(surfaceId)?.bindings.get(alias);
|
|
74
|
+
}
|
|
75
|
+
unbind(surfaceId, alias) {
|
|
76
|
+
const context = this.contexts.get(surfaceId);
|
|
77
|
+
if (!context)
|
|
78
|
+
return false;
|
|
79
|
+
return context.bindings.delete(alias);
|
|
80
|
+
}
|
|
81
|
+
unbindAll(surfaceId) {
|
|
82
|
+
this.contexts.delete(surfaceId);
|
|
83
|
+
}
|
|
84
|
+
getContext(surfaceId) {
|
|
85
|
+
return this.contexts.get(surfaceId);
|
|
86
|
+
}
|
|
87
|
+
setAuthContext(surfaceId, auth) {
|
|
88
|
+
const existing = this.contexts.get(surfaceId);
|
|
89
|
+
if (existing) {
|
|
90
|
+
const updated = {
|
|
91
|
+
...existing,
|
|
92
|
+
auth,
|
|
93
|
+
};
|
|
94
|
+
this.contexts.set(surfaceId, updated);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.contexts.set(surfaceId, {
|
|
98
|
+
surfaceId,
|
|
99
|
+
auth,
|
|
100
|
+
data: {},
|
|
101
|
+
bindings: new Map(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
createBoundCapability(surfaceId, alias, _capability, config) {
|
|
106
|
+
let state = 'bound';
|
|
107
|
+
let lastExecuted;
|
|
108
|
+
let lastResult;
|
|
109
|
+
let lastInput;
|
|
110
|
+
let error;
|
|
111
|
+
const execute = async (input) => {
|
|
112
|
+
state = 'binding';
|
|
113
|
+
lastInput = input;
|
|
114
|
+
try {
|
|
115
|
+
// Apply input transform if configured
|
|
116
|
+
let transformedInput = input;
|
|
117
|
+
if (config.transform?.input) {
|
|
118
|
+
try {
|
|
119
|
+
transformedInput = config.transform.input(input);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
state = 'error';
|
|
123
|
+
error = {
|
|
124
|
+
type: 'transform_failed',
|
|
125
|
+
message: `Input transform failed: ${e}`,
|
|
126
|
+
cause: e,
|
|
127
|
+
};
|
|
128
|
+
const execError = {
|
|
129
|
+
type: 'execution_error',
|
|
130
|
+
message: error.message,
|
|
131
|
+
capabilityId: config.capabilityId,
|
|
132
|
+
};
|
|
133
|
+
return executionErr(execError);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Check cache if enabled
|
|
137
|
+
if (config.cache?.enabled && this.cache) {
|
|
138
|
+
const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`;
|
|
139
|
+
const cached = await this.cache.get(cacheKey);
|
|
140
|
+
if (cached !== undefined) {
|
|
141
|
+
state = 'bound';
|
|
142
|
+
lastExecuted = Date.now();
|
|
143
|
+
lastResult = { success: true, data: cached };
|
|
144
|
+
return lastResult;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Execute capability
|
|
148
|
+
const result = await this.fabric.execute(config.capabilityId, transformedInput);
|
|
149
|
+
if (result.success) {
|
|
150
|
+
// Apply output transform if configured
|
|
151
|
+
let output = result.data;
|
|
152
|
+
if (config.transform?.output) {
|
|
153
|
+
try {
|
|
154
|
+
output = config.transform.output(output);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
state = 'error';
|
|
158
|
+
error = {
|
|
159
|
+
type: 'transform_failed',
|
|
160
|
+
message: `Output transform failed: ${e}`,
|
|
161
|
+
cause: e,
|
|
162
|
+
};
|
|
163
|
+
const execError = {
|
|
164
|
+
type: 'execution_error',
|
|
165
|
+
message: error.message,
|
|
166
|
+
capabilityId: config.capabilityId,
|
|
167
|
+
};
|
|
168
|
+
return executionErr(execError);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Store in cache if enabled
|
|
172
|
+
if (config.cache?.enabled && this.cache) {
|
|
173
|
+
const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`;
|
|
174
|
+
await this.cache.set(cacheKey, output, config.cache.ttl);
|
|
175
|
+
}
|
|
176
|
+
state = 'bound';
|
|
177
|
+
lastExecuted = Date.now();
|
|
178
|
+
lastResult = { success: true, data: output };
|
|
179
|
+
return lastResult;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
state = 'error';
|
|
183
|
+
error = {
|
|
184
|
+
type: 'execution_failed',
|
|
185
|
+
message: result.error.message,
|
|
186
|
+
cause: result.error,
|
|
187
|
+
};
|
|
188
|
+
lastResult = result;
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
state = 'error';
|
|
194
|
+
error = {
|
|
195
|
+
type: 'execution_failed',
|
|
196
|
+
message: `Execution failed: ${e}`,
|
|
197
|
+
cause: e,
|
|
198
|
+
};
|
|
199
|
+
const execError = {
|
|
200
|
+
type: 'execution_error',
|
|
201
|
+
message: error.message,
|
|
202
|
+
capabilityId: config.capabilityId,
|
|
203
|
+
};
|
|
204
|
+
return executionErr(execError);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const refresh = async () => {
|
|
208
|
+
if (lastInput === undefined) {
|
|
209
|
+
const execError = {
|
|
210
|
+
type: 'execution_error',
|
|
211
|
+
message: 'No previous input to refresh',
|
|
212
|
+
capabilityId: config.capabilityId,
|
|
213
|
+
};
|
|
214
|
+
return executionErr(execError);
|
|
215
|
+
}
|
|
216
|
+
return execute(lastInput);
|
|
217
|
+
};
|
|
218
|
+
const invalidate = () => {
|
|
219
|
+
state = 'stale';
|
|
220
|
+
if (config.cache?.enabled && this.cache) {
|
|
221
|
+
const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(lastInput)}`;
|
|
222
|
+
this.cache.delete(cacheKey);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
const boundCapability = {
|
|
226
|
+
get id() {
|
|
227
|
+
return `${surfaceId}:${alias}`;
|
|
228
|
+
},
|
|
229
|
+
capabilityId: config.capabilityId,
|
|
230
|
+
get state() {
|
|
231
|
+
return state;
|
|
232
|
+
},
|
|
233
|
+
config,
|
|
234
|
+
execute,
|
|
235
|
+
refresh,
|
|
236
|
+
invalidate,
|
|
237
|
+
};
|
|
238
|
+
// Use Object.defineProperties for optional getters to satisfy exactOptionalPropertyTypes
|
|
239
|
+
Object.defineProperties(boundCapability, {
|
|
240
|
+
lastExecuted: {
|
|
241
|
+
get() {
|
|
242
|
+
return lastExecuted;
|
|
243
|
+
},
|
|
244
|
+
enumerable: true,
|
|
245
|
+
},
|
|
246
|
+
lastResult: {
|
|
247
|
+
get() {
|
|
248
|
+
return lastResult;
|
|
249
|
+
},
|
|
250
|
+
enumerable: true,
|
|
251
|
+
},
|
|
252
|
+
error: {
|
|
253
|
+
get() {
|
|
254
|
+
return error;
|
|
255
|
+
},
|
|
256
|
+
enumerable: true,
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
return boundCapability;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Create a binding engine
|
|
264
|
+
*/
|
|
265
|
+
export function createBindingEngine(fabric, cache) {
|
|
266
|
+
return new RuntimeBindingEngine(fabric, cache);
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/binding/engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Binding Engine\n *\n * Resolves and manages capability bindings for surfaces\n *\n * @module @pwfabric/runtime/binding/engine\n */\n\nimport type { SurfaceId, Capability, ExecutionResult, ExecutionError } from '@pwfabric/contracts'\nimport { executionErr } from '@pwfabric/contracts'\nimport type { FabricKernel } from '../kernel.js'\nimport type {\n BindingConfig,\n BoundCapability,\n BindingState,\n BindingError,\n BindingContext,\n BindingResult,\n SurfaceBindingResult,\n AuthContext,\n} from './types.js'\nimport type { CacheProvider } from '../cache/types.js'\n\n// ============================================================\n// BINDING ENGINE\n// ============================================================\n\n/**\n * Binding engine interface\n */\nexport interface BindingEngine {\n /**\n * Bind a capability to a surface\n */\n bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>\n\n /**\n * Bind all capabilities for a surface\n */\n bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult\n\n /**\n * Get a bound capability\n */\n get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined\n\n /**\n * Unbind a capability\n */\n unbind(surfaceId: SurfaceId, alias: string): boolean\n\n /**\n * Unbind all capabilities for a surface\n */\n unbindAll(surfaceId: SurfaceId): void\n\n /**\n * Get binding context for a surface\n */\n getContext(surfaceId: SurfaceId): BindingContext | undefined\n\n /**\n * Set authentication context\n */\n setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void\n}\n\n// ============================================================\n// RUNTIME BINDING ENGINE\n// ============================================================\n\n/**\n * Runtime binding engine implementation\n */\nexport class RuntimeBindingEngine implements BindingEngine {\n private readonly fabric: FabricKernel\n private readonly cache: CacheProvider | undefined\n private readonly contexts = new Map<SurfaceId, BindingContext>()\n\n constructor(fabric: FabricKernel, cache?: CacheProvider) {\n this.fabric = fabric\n this.cache = cache\n }\n\n bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput> {\n // Resolve capability from fabric\n const resolution = this.fabric.resolve(config.capabilityId)\n if (!resolution.found) {\n return {\n success: false,\n error: {\n type: 'resolution_failed',\n message: `Capability ${config.capabilityId} not found`,\n },\n }\n }\n\n const alias = config.alias ?? config.capabilityId\n\n // Create bound capability\n const boundCapability = this.createBoundCapability<unknown, TOutput>(\n surfaceId,\n alias,\n resolution.capability,\n config\n )\n\n // Get or create context\n let context = this.contexts.get(surfaceId)\n if (!context) {\n context = {\n surfaceId,\n data: {},\n bindings: new Map(),\n }\n this.contexts.set(surfaceId, context)\n }\n\n // Add to bindings\n context.bindings.set(alias, boundCapability as BoundCapability)\n\n return { success: true, binding: boundCapability }\n }\n\n bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult {\n const errors: BindingError[] = []\n\n for (const config of configs) {\n const result = this.bind(surfaceId, config)\n if (!result.success) {\n errors.push(result.error)\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors }\n }\n\n const context = this.contexts.get(surfaceId)\n if (!context) {\n return {\n success: false,\n errors: [{ type: 'resolution_failed', message: 'Context not created' }],\n }\n }\n\n return { success: true, context }\n }\n\n get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined {\n return this.contexts.get(surfaceId)?.bindings.get(alias)\n }\n\n unbind(surfaceId: SurfaceId, alias: string): boolean {\n const context = this.contexts.get(surfaceId)\n if (!context) return false\n return context.bindings.delete(alias)\n }\n\n unbindAll(surfaceId: SurfaceId): void {\n this.contexts.delete(surfaceId)\n }\n\n getContext(surfaceId: SurfaceId): BindingContext | undefined {\n return this.contexts.get(surfaceId)\n }\n\n setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void {\n const existing = this.contexts.get(surfaceId)\n if (existing) {\n const updated: BindingContext = {\n ...existing,\n auth,\n }\n this.contexts.set(surfaceId, updated)\n } else {\n this.contexts.set(surfaceId, {\n surfaceId,\n auth,\n data: {},\n bindings: new Map(),\n })\n }\n }\n\n private createBoundCapability<TInput, TOutput>(\n surfaceId: SurfaceId,\n alias: string,\n _capability: Capability,\n config: BindingConfig\n ): BoundCapability<TInput, TOutput> {\n let state: BindingState = 'bound'\n let lastExecuted: number | undefined\n let lastResult: ExecutionResult<TOutput> | undefined\n let lastInput: TInput | undefined\n let error: BindingError | undefined\n\n const execute = async (input: TInput): Promise<ExecutionResult<TOutput>> => {\n state = 'binding'\n lastInput = input\n\n try {\n // Apply input transform if configured\n let transformedInput = input\n if (config.transform?.input) {\n try {\n transformedInput = config.transform.input(input) as TInput\n } catch (e) {\n state = 'error'\n error = {\n type: 'transform_failed',\n message: `Input transform failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n // Check cache if enabled\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`\n const cached = await this.cache.get<TOutput>(cacheKey)\n if (cached !== undefined) {\n state = 'bound'\n lastExecuted = Date.now()\n lastResult = { success: true, data: cached }\n return lastResult\n }\n }\n\n // Execute capability\n const result = await this.fabric.execute<TInput, TOutput>(\n config.capabilityId,\n transformedInput\n )\n\n if (result.success) {\n // Apply output transform if configured\n let output = result.data\n if (config.transform?.output) {\n try {\n output = config.transform.output(output) as TOutput\n } catch (e) {\n state = 'error'\n error = {\n type: 'transform_failed',\n message: `Output transform failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n // Store in cache if enabled\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`\n await this.cache.set(cacheKey, output, config.cache.ttl)\n }\n\n state = 'bound'\n lastExecuted = Date.now()\n lastResult = { success: true, data: output }\n return lastResult\n } else {\n state = 'error'\n error = {\n type: 'execution_failed',\n message: result.error.message,\n cause: result.error,\n }\n lastResult = result\n return result\n }\n } catch (e) {\n state = 'error'\n error = {\n type: 'execution_failed',\n message: `Execution failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n const refresh = async (): Promise<ExecutionResult<TOutput>> => {\n if (lastInput === undefined) {\n const execError: ExecutionError = {\n type: 'execution_error',\n message: 'No previous input to refresh',\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n return execute(lastInput)\n }\n\n const invalidate = (): void => {\n state = 'stale'\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(lastInput)}`\n this.cache.delete(cacheKey)\n }\n }\n\n const boundCapability: BoundCapability<TInput, TOutput> = {\n get id() {\n return `${surfaceId}:${alias}`\n },\n capabilityId: config.capabilityId,\n get state() {\n return state\n },\n config,\n execute,\n refresh,\n invalidate,\n }\n\n // Use Object.defineProperties for optional getters to satisfy exactOptionalPropertyTypes\n Object.defineProperties(boundCapability, {\n lastExecuted: {\n get() {\n return lastExecuted\n },\n enumerable: true,\n },\n lastResult: {\n get() {\n return lastResult\n },\n enumerable: true,\n },\n error: {\n get() {\n return error\n },\n enumerable: true,\n },\n })\n\n return boundCapability\n }\n}\n\n/**\n * Create a binding engine\n */\nexport function createBindingEngine(fabric: FabricKernel, cache?: CacheProvider): BindingEngine {\n return new RuntimeBindingEngine(fabric, cache)\n}\n"]}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression Evaluator for Data Binding
|
|
3
|
+
*
|
|
4
|
+
* Enhanced expression evaluation for data binding in surfaces
|
|
5
|
+
*
|
|
6
|
+
* This module extends the base expression evaluator with:
|
|
7
|
+
* - Arithmetic operations (+, -, *, /, %)
|
|
8
|
+
* - Data/state/params context separation
|
|
9
|
+
* - Dependency extraction for reactive updates
|
|
10
|
+
* - Safe null-coalescing operators
|
|
11
|
+
*
|
|
12
|
+
* @module @pwfabric/runtime/binding/expression
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Context for expression evaluation in data binding
|
|
16
|
+
*/
|
|
17
|
+
export interface BindingExpressionContext {
|
|
18
|
+
/** Data from data sources */
|
|
19
|
+
readonly data: Record<string, unknown>;
|
|
20
|
+
/** State from state stores */
|
|
21
|
+
readonly state: Record<string, unknown>;
|
|
22
|
+
/** URL/route parameters */
|
|
23
|
+
readonly params: Record<string, unknown>;
|
|
24
|
+
/** Custom helper functions */
|
|
25
|
+
readonly helpers?: Record<string, (...args: unknown[]) => unknown>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result of expression evaluation
|
|
29
|
+
*/
|
|
30
|
+
export type ExpressionEvalResult<T = unknown> = {
|
|
31
|
+
readonly success: true;
|
|
32
|
+
readonly value: T;
|
|
33
|
+
} | {
|
|
34
|
+
readonly success: false;
|
|
35
|
+
readonly error: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Expression evaluator interface for data binding
|
|
39
|
+
*/
|
|
40
|
+
export interface ExpressionEvaluator {
|
|
41
|
+
/**
|
|
42
|
+
* Evaluate an expression in the given context
|
|
43
|
+
*/
|
|
44
|
+
evaluate(expression: string, context: BindingExpressionContext): unknown;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a value is an expression (contains {{...}})
|
|
47
|
+
*/
|
|
48
|
+
isExpression(value: unknown): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Extract dependencies from an expression for reactive updates
|
|
51
|
+
*/
|
|
52
|
+
extractDependencies(expression: string): ExpressionDependency[];
|
|
53
|
+
/**
|
|
54
|
+
* Interpolate expressions in a template string
|
|
55
|
+
*/
|
|
56
|
+
interpolate(template: string, context: BindingExpressionContext): string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Dependency extracted from an expression
|
|
60
|
+
*/
|
|
61
|
+
export interface ExpressionDependency {
|
|
62
|
+
/** The source of the dependency */
|
|
63
|
+
readonly source: 'data' | 'state' | 'params';
|
|
64
|
+
/** The path within the source */
|
|
65
|
+
readonly path: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Read one named property off a value, stepping into a list of one record.
|
|
69
|
+
*
|
|
70
|
+
* A LIST SOURCE ALWAYS BINDS AS A LIST (DataBoundSurfaceRenderer): a `rest`,
|
|
71
|
+
* `entity` or `graphql` source answering with ONE object is bound as `[obj]`,
|
|
72
|
+
* so `{{src[0].field}}` and `{{src.length}}` behave the same whatever the
|
|
73
|
+
* endpoint returned. But a detail page is authored as `{{product.title}}`, and
|
|
74
|
+
* a property read on an array finds nothing — such a page would render blank
|
|
75
|
+
* (`{{rows.name}}` → empty while `{{rows[0].name}}` → "banana").
|
|
76
|
+
*
|
|
77
|
+
* So: when the value is an array of EXACTLY ONE element and the array itself
|
|
78
|
+
* does not carry the key (not `length`, not an index, not an array method),
|
|
79
|
+
* the read continues into that one element. A list of two or more is a list —
|
|
80
|
+
* its `.title` stays undefined, as it always was. Both evaluators (this one
|
|
81
|
+
* and surface/expression) read properties through here, so a path means the
|
|
82
|
+
* same thing in a binding and in a block prop.
|
|
83
|
+
*/
|
|
84
|
+
export declare function readProperty(target: unknown, key: string): unknown;
|
|
85
|
+
/**
|
|
86
|
+
* Resolve a dotted path in an object, handling nested properties and array indices
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* resolvePath({ user: { name: 'John' } }, 'user.name') // 'John'
|
|
90
|
+
* resolvePath({ items: ['a', 'b'] }, 'items[0]') // 'a'
|
|
91
|
+
* resolvePath({ users: [{ name: 'John' }] }, 'users[0].name') // 'John'
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolvePath(obj: unknown, path: string): unknown;
|
|
94
|
+
/** Lexical options — the only grammar differences between the two callers. */
|
|
95
|
+
export interface ExpressionSyntaxOptions {
|
|
96
|
+
/**
|
|
97
|
+
* `hero-stats-data.0.text` is ONE name. Surface data-source ids are
|
|
98
|
+
* hyphenated, and the surface evaluator always read them as paths, so in
|
|
99
|
+
* that mode a `-` between two name characters with no space around it is
|
|
100
|
+
* part of the name. Subtraction needs spaces there: `a - b`.
|
|
101
|
+
*/
|
|
102
|
+
readonly hyphenNames?: boolean;
|
|
103
|
+
/** The binding evaluator has always read the literal `undefined` as `null`. */
|
|
104
|
+
readonly undefinedAsNull?: boolean;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* How a bare name and a call resolve. The grammar is shared; the scope is the
|
|
108
|
+
* caller's: bindings see `data` / `state` / `params`, block props see the
|
|
109
|
+
* surface's expression data (`state`, source ids, `item`, `__errors`, …).
|
|
110
|
+
*/
|
|
111
|
+
export interface NameResolver {
|
|
112
|
+
/** The value of a bare name. */
|
|
113
|
+
lookup(name: string): unknown;
|
|
114
|
+
/** The helper a call names, or undefined when there is none. */
|
|
115
|
+
helper(name: string): ((...args: unknown[]) => unknown) | undefined;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Evaluate one expression (the text between `{{` and `}}`) against a scope.
|
|
119
|
+
* Throws on a syntax error, an unknown helper or an unsupported method — the
|
|
120
|
+
* two public evaluators turn that into `{ success: false }`.
|
|
121
|
+
*/
|
|
122
|
+
export declare function evaluateWithScope(expression: string, scope: NameResolver, opts?: ExpressionSyntaxOptions): unknown;
|
|
123
|
+
/**
|
|
124
|
+
* Evaluate an expression with full context support
|
|
125
|
+
*/
|
|
126
|
+
export declare function evaluateExpression(expression: string, context: BindingExpressionContext): ExpressionEvalResult;
|
|
127
|
+
/**
|
|
128
|
+
* Extract dependencies from an expression for reactive updates
|
|
129
|
+
*/
|
|
130
|
+
export declare function extractDependencies(expression: string): ExpressionDependency[];
|
|
131
|
+
/**
|
|
132
|
+
* Check if a value contains expression syntax
|
|
133
|
+
*/
|
|
134
|
+
export declare function isExpression(value: unknown): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Interpolate expressions within a template string
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* interpolate('Hello, {{user.name}}!', context) // 'Hello, John!'
|
|
140
|
+
* interpolate('Total: {{price * quantity}}', context) // 'Total: 100'
|
|
141
|
+
*/
|
|
142
|
+
export declare function interpolate(template: string, context: BindingExpressionContext): string;
|
|
143
|
+
/**
|
|
144
|
+
* Default helper functions for expressions
|
|
145
|
+
*/
|
|
146
|
+
export declare const DEFAULT_BINDING_HELPERS: Record<string, (...args: unknown[]) => unknown>;
|
|
147
|
+
/**
|
|
148
|
+
* Create an expression evaluator with context and helpers
|
|
149
|
+
*/
|
|
150
|
+
export declare function createExpressionEvaluator(additionalHelpers?: Record<string, (...args: unknown[]) => unknown>): ExpressionEvaluator;
|