@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,556 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Source Management
|
|
3
|
+
*
|
|
4
|
+
* Data source registry and management for surfaces
|
|
5
|
+
*
|
|
6
|
+
* Provides:
|
|
7
|
+
* - Static data sources (inline data)
|
|
8
|
+
* - API data sources (REST endpoints)
|
|
9
|
+
* - State data sources (from state module)
|
|
10
|
+
* - Caching integration
|
|
11
|
+
*
|
|
12
|
+
* @module @pwfabric/runtime/binding/datasource
|
|
13
|
+
*/
|
|
14
|
+
// ============================================================
|
|
15
|
+
// STATIC DATA SOURCE
|
|
16
|
+
// ============================================================
|
|
17
|
+
/**
|
|
18
|
+
* Static data source implementation
|
|
19
|
+
*/
|
|
20
|
+
export class StaticDataSource {
|
|
21
|
+
id;
|
|
22
|
+
type = 'static';
|
|
23
|
+
name;
|
|
24
|
+
description;
|
|
25
|
+
data;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.id = config.id;
|
|
28
|
+
this.name = config.name;
|
|
29
|
+
this.description = config.description;
|
|
30
|
+
this.data = config.data;
|
|
31
|
+
}
|
|
32
|
+
async fetch() {
|
|
33
|
+
return this.data;
|
|
34
|
+
}
|
|
35
|
+
isLoading() {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ============================================================
|
|
40
|
+
// API DATA SOURCE
|
|
41
|
+
// ============================================================
|
|
42
|
+
/**
|
|
43
|
+
* API data source implementation with caching and polling support
|
|
44
|
+
*/
|
|
45
|
+
export class ApiDataSource {
|
|
46
|
+
id;
|
|
47
|
+
type = 'api';
|
|
48
|
+
name;
|
|
49
|
+
description;
|
|
50
|
+
config;
|
|
51
|
+
cache;
|
|
52
|
+
listeners = new Set();
|
|
53
|
+
pollTimer;
|
|
54
|
+
loading = false;
|
|
55
|
+
lastData;
|
|
56
|
+
constructor(config, cache) {
|
|
57
|
+
this.id = config.id;
|
|
58
|
+
this.name = config.name;
|
|
59
|
+
this.description = config.description;
|
|
60
|
+
this.config = config;
|
|
61
|
+
this.cache = cache;
|
|
62
|
+
// Start polling if configured
|
|
63
|
+
if (config.pollInterval && config.pollInterval > 0) {
|
|
64
|
+
this.startPolling(config.pollInterval);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async fetch(params) {
|
|
68
|
+
// Check cache first
|
|
69
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
70
|
+
const cacheKey = this.getCacheKey(params);
|
|
71
|
+
const cached = await this.cache.get(cacheKey);
|
|
72
|
+
if (cached !== undefined) {
|
|
73
|
+
return cached;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.loading = true;
|
|
77
|
+
try {
|
|
78
|
+
const data = await this.fetchWithRetry(params);
|
|
79
|
+
// Apply transform
|
|
80
|
+
const transformed = this.config.transform ? this.config.transform(data) : data;
|
|
81
|
+
// Store in cache
|
|
82
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
83
|
+
const cacheKey = this.getCacheKey(params);
|
|
84
|
+
await this.cache.set(cacheKey, transformed, this.config.cache.ttl);
|
|
85
|
+
}
|
|
86
|
+
this.lastData = transformed;
|
|
87
|
+
this.notifyListeners(transformed);
|
|
88
|
+
return transformed;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
this.loading = false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
subscribe(listener) {
|
|
95
|
+
this.listeners.add(listener);
|
|
96
|
+
// Immediately notify with last data if available
|
|
97
|
+
if (this.lastData !== undefined) {
|
|
98
|
+
listener(this.lastData);
|
|
99
|
+
}
|
|
100
|
+
return () => {
|
|
101
|
+
this.listeners.delete(listener);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
invalidate() {
|
|
105
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
106
|
+
const cacheKey = this.getCacheKey();
|
|
107
|
+
this.cache.delete(cacheKey);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
isLoading() {
|
|
111
|
+
return this.loading;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Stop polling and clean up
|
|
115
|
+
*/
|
|
116
|
+
dispose() {
|
|
117
|
+
if (this.pollTimer) {
|
|
118
|
+
clearInterval(this.pollTimer);
|
|
119
|
+
this.pollTimer = undefined;
|
|
120
|
+
}
|
|
121
|
+
this.listeners.clear();
|
|
122
|
+
}
|
|
123
|
+
async fetchWithRetry(params) {
|
|
124
|
+
const maxAttempts = this.config.retry?.maxAttempts ?? 1;
|
|
125
|
+
const delay = this.config.retry?.delay ?? 1000;
|
|
126
|
+
const exponential = this.config.retry?.exponentialBackoff ?? false;
|
|
127
|
+
let lastError;
|
|
128
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
129
|
+
try {
|
|
130
|
+
return await this.doFetch(params);
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
lastError = e instanceof Error ? e : new Error(String(e));
|
|
134
|
+
if (attempt < maxAttempts - 1) {
|
|
135
|
+
const waitTime = exponential ? delay * Math.pow(2, attempt) : delay;
|
|
136
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
throw lastError;
|
|
141
|
+
}
|
|
142
|
+
async doFetch(params) {
|
|
143
|
+
const originalUrl = this.config.url;
|
|
144
|
+
let url = originalUrl;
|
|
145
|
+
// Track which params are used in URL replacement
|
|
146
|
+
const usedParams = new Set();
|
|
147
|
+
// Replace URL parameters
|
|
148
|
+
if (params) {
|
|
149
|
+
for (const [key, value] of Object.entries(params)) {
|
|
150
|
+
if (originalUrl.includes(`:${key}`) || originalUrl.includes(`{${key}}`)) {
|
|
151
|
+
url = url.replace(`:${key}`, String(value));
|
|
152
|
+
url = url.replace(`{${key}}`, String(value));
|
|
153
|
+
usedParams.add(key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Build query string
|
|
158
|
+
const queryParams = new URLSearchParams();
|
|
159
|
+
if (this.config.query) {
|
|
160
|
+
for (const [key, value] of Object.entries(this.config.query)) {
|
|
161
|
+
queryParams.append(key, String(value));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Add remaining params (not used in URL replacement) to query string
|
|
165
|
+
if (params) {
|
|
166
|
+
for (const [key, value] of Object.entries(params)) {
|
|
167
|
+
if (!usedParams.has(key)) {
|
|
168
|
+
queryParams.append(key, String(value));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const queryString = queryParams.toString();
|
|
173
|
+
if (queryString) {
|
|
174
|
+
url += (url.includes('?') ? '&' : '?') + queryString;
|
|
175
|
+
}
|
|
176
|
+
const requestInit = {
|
|
177
|
+
method: this.config.method ?? 'GET',
|
|
178
|
+
headers: {
|
|
179
|
+
'Content-Type': 'application/json',
|
|
180
|
+
...this.config.headers,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
if (this.config.body) {
|
|
184
|
+
requestInit.body = JSON.stringify(this.config.body);
|
|
185
|
+
}
|
|
186
|
+
const response = await fetch(url, requestInit);
|
|
187
|
+
if (!response.ok) {
|
|
188
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
189
|
+
}
|
|
190
|
+
return response.json();
|
|
191
|
+
}
|
|
192
|
+
getCacheKey(params) {
|
|
193
|
+
if (this.config.cache?.key) {
|
|
194
|
+
return this.config.cache.key;
|
|
195
|
+
}
|
|
196
|
+
const paramsKey = params ? JSON.stringify(params) : '';
|
|
197
|
+
return `datasource:${this.id}:${paramsKey}`;
|
|
198
|
+
}
|
|
199
|
+
startPolling(interval) {
|
|
200
|
+
this.pollTimer = setInterval(() => {
|
|
201
|
+
this.fetch().catch(() => {
|
|
202
|
+
// Polling errors are silently ignored
|
|
203
|
+
});
|
|
204
|
+
}, interval);
|
|
205
|
+
}
|
|
206
|
+
notifyListeners(data) {
|
|
207
|
+
for (const listener of this.listeners) {
|
|
208
|
+
try {
|
|
209
|
+
listener(data);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// Swallow errors from listeners
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ============================================================
|
|
218
|
+
// GRAPHQL DATA SOURCE
|
|
219
|
+
// ============================================================
|
|
220
|
+
/**
|
|
221
|
+
* GraphQL data source implementation with polling and caching support
|
|
222
|
+
*/
|
|
223
|
+
export class GraphQLDataSource {
|
|
224
|
+
id;
|
|
225
|
+
type = 'graphql';
|
|
226
|
+
name;
|
|
227
|
+
description;
|
|
228
|
+
config;
|
|
229
|
+
cache;
|
|
230
|
+
listeners = new Set();
|
|
231
|
+
pollTimer;
|
|
232
|
+
loading = false;
|
|
233
|
+
lastData;
|
|
234
|
+
constructor(config, cache) {
|
|
235
|
+
this.id = config.id;
|
|
236
|
+
this.name = config.name;
|
|
237
|
+
this.description = config.description;
|
|
238
|
+
this.config = config;
|
|
239
|
+
this.cache = cache;
|
|
240
|
+
if (config.pollInterval && config.pollInterval > 0) {
|
|
241
|
+
this.startPolling(config.pollInterval);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async fetch(params) {
|
|
245
|
+
// Check cache first
|
|
246
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
247
|
+
const cacheKey = this.getCacheKey(params);
|
|
248
|
+
const cached = await this.cache.get(cacheKey);
|
|
249
|
+
if (cached !== undefined) {
|
|
250
|
+
return cached;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
this.loading = true;
|
|
254
|
+
try {
|
|
255
|
+
const data = await this.executeQuery(params);
|
|
256
|
+
// Apply transform
|
|
257
|
+
const transformed = this.config.transform ? this.config.transform(data) : data;
|
|
258
|
+
// Store in cache
|
|
259
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
260
|
+
const cacheKey = this.getCacheKey(params);
|
|
261
|
+
await this.cache.set(cacheKey, transformed, this.config.cache.ttl);
|
|
262
|
+
}
|
|
263
|
+
this.lastData = transformed;
|
|
264
|
+
this.notifyListeners(transformed);
|
|
265
|
+
return transformed;
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
this.loading = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
subscribe(listener) {
|
|
272
|
+
this.listeners.add(listener);
|
|
273
|
+
if (this.lastData !== undefined) {
|
|
274
|
+
listener(this.lastData);
|
|
275
|
+
}
|
|
276
|
+
return () => {
|
|
277
|
+
this.listeners.delete(listener);
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
invalidate() {
|
|
281
|
+
if (this.config.cache?.enabled && this.cache) {
|
|
282
|
+
const cacheKey = this.getCacheKey();
|
|
283
|
+
this.cache.delete(cacheKey);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
isLoading() {
|
|
287
|
+
return this.loading;
|
|
288
|
+
}
|
|
289
|
+
dispose() {
|
|
290
|
+
if (this.pollTimer) {
|
|
291
|
+
clearInterval(this.pollTimer);
|
|
292
|
+
this.pollTimer = undefined;
|
|
293
|
+
}
|
|
294
|
+
this.listeners.clear();
|
|
295
|
+
}
|
|
296
|
+
async executeQuery(params) {
|
|
297
|
+
// Merge config variables with runtime params
|
|
298
|
+
const variables = { ...this.config.variables, ...params };
|
|
299
|
+
const response = await fetch(this.config.url, {
|
|
300
|
+
method: 'POST',
|
|
301
|
+
headers: {
|
|
302
|
+
'Content-Type': 'application/json',
|
|
303
|
+
...this.config.headers,
|
|
304
|
+
},
|
|
305
|
+
body: JSON.stringify({
|
|
306
|
+
query: this.config.query,
|
|
307
|
+
variables: Object.keys(variables).length > 0 ? variables : undefined,
|
|
308
|
+
}),
|
|
309
|
+
});
|
|
310
|
+
if (!response.ok) {
|
|
311
|
+
throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);
|
|
312
|
+
}
|
|
313
|
+
const result = (await response.json());
|
|
314
|
+
if (result.errors && result.errors.length > 0) {
|
|
315
|
+
const messages = result.errors.map((e) => e.message).join('; ');
|
|
316
|
+
throw new Error(`GraphQL errors: ${messages}`);
|
|
317
|
+
}
|
|
318
|
+
return result.data;
|
|
319
|
+
}
|
|
320
|
+
getCacheKey(params) {
|
|
321
|
+
if (this.config.cache?.key) {
|
|
322
|
+
return this.config.cache.key;
|
|
323
|
+
}
|
|
324
|
+
const paramsKey = params ? JSON.stringify(params) : '';
|
|
325
|
+
return `datasource:graphql:${this.id}:${paramsKey}`;
|
|
326
|
+
}
|
|
327
|
+
startPolling(interval) {
|
|
328
|
+
this.pollTimer = setInterval(() => {
|
|
329
|
+
this.fetch().catch(() => {
|
|
330
|
+
// Polling errors are silently ignored
|
|
331
|
+
});
|
|
332
|
+
}, interval);
|
|
333
|
+
}
|
|
334
|
+
notifyListeners(data) {
|
|
335
|
+
for (const listener of this.listeners) {
|
|
336
|
+
try {
|
|
337
|
+
listener(data);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Swallow errors from listeners
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ============================================================
|
|
346
|
+
// STATE DATA SOURCE
|
|
347
|
+
// ============================================================
|
|
348
|
+
/**
|
|
349
|
+
* State data source implementation - binds to state store
|
|
350
|
+
*/
|
|
351
|
+
export class StateDataSource {
|
|
352
|
+
id;
|
|
353
|
+
type = 'state';
|
|
354
|
+
name;
|
|
355
|
+
description;
|
|
356
|
+
config;
|
|
357
|
+
stateStore;
|
|
358
|
+
listeners = new Set();
|
|
359
|
+
unsubscribe;
|
|
360
|
+
constructor(config, stateStore) {
|
|
361
|
+
this.id = config.id;
|
|
362
|
+
this.name = config.name;
|
|
363
|
+
this.description = config.description;
|
|
364
|
+
this.config = config;
|
|
365
|
+
this.stateStore = stateStore;
|
|
366
|
+
// Subscribe to state changes
|
|
367
|
+
this.unsubscribe = stateStore.subscribe(config.stateKey, (value) => {
|
|
368
|
+
const transformed = this.config.transform ? this.config.transform(value) : value;
|
|
369
|
+
this.notifyListeners(transformed);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
async fetch() {
|
|
373
|
+
const value = this.stateStore.get(this.config.stateKey);
|
|
374
|
+
return this.config.transform ? this.config.transform(value) : value;
|
|
375
|
+
}
|
|
376
|
+
subscribe(listener) {
|
|
377
|
+
this.listeners.add(listener);
|
|
378
|
+
// Immediately notify with current state
|
|
379
|
+
const current = this.stateStore.get(this.config.stateKey);
|
|
380
|
+
if (current !== undefined) {
|
|
381
|
+
const transformed = this.config.transform
|
|
382
|
+
? this.config.transform(current)
|
|
383
|
+
: current;
|
|
384
|
+
listener(transformed);
|
|
385
|
+
}
|
|
386
|
+
return () => {
|
|
387
|
+
this.listeners.delete(listener);
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
isLoading() {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Clean up subscriptions
|
|
395
|
+
*/
|
|
396
|
+
dispose() {
|
|
397
|
+
if (this.unsubscribe) {
|
|
398
|
+
this.unsubscribe();
|
|
399
|
+
this.unsubscribe = undefined;
|
|
400
|
+
}
|
|
401
|
+
this.listeners.clear();
|
|
402
|
+
}
|
|
403
|
+
notifyListeners(data) {
|
|
404
|
+
for (const listener of this.listeners) {
|
|
405
|
+
try {
|
|
406
|
+
listener(data);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Swallow errors from listeners
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* In-memory data source registry implementation
|
|
416
|
+
*/
|
|
417
|
+
export class InMemoryDataSourceRegistry {
|
|
418
|
+
sources = new Map();
|
|
419
|
+
register(source) {
|
|
420
|
+
if (this.sources.has(source.id)) {
|
|
421
|
+
throw new Error(`Data source '${source.id}' is already registered`);
|
|
422
|
+
}
|
|
423
|
+
this.sources.set(source.id, source);
|
|
424
|
+
}
|
|
425
|
+
get(id) {
|
|
426
|
+
return this.sources.get(id);
|
|
427
|
+
}
|
|
428
|
+
has(id) {
|
|
429
|
+
return this.sources.has(id);
|
|
430
|
+
}
|
|
431
|
+
async fetch(id, params) {
|
|
432
|
+
const source = this.sources.get(id);
|
|
433
|
+
if (!source) {
|
|
434
|
+
throw new Error(`Data source '${id}' not found`);
|
|
435
|
+
}
|
|
436
|
+
return source.fetch(params);
|
|
437
|
+
}
|
|
438
|
+
unregister(id) {
|
|
439
|
+
const source = this.sources.get(id);
|
|
440
|
+
if (source) {
|
|
441
|
+
// Dispose if the source has a dispose method
|
|
442
|
+
if ('dispose' in source && typeof source.dispose === 'function') {
|
|
443
|
+
source.dispose();
|
|
444
|
+
}
|
|
445
|
+
return this.sources.delete(id);
|
|
446
|
+
}
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
449
|
+
ids() {
|
|
450
|
+
return Array.from(this.sources.keys());
|
|
451
|
+
}
|
|
452
|
+
clear() {
|
|
453
|
+
// Dispose all sources
|
|
454
|
+
for (const source of this.sources.values()) {
|
|
455
|
+
if ('dispose' in source && typeof source.dispose === 'function') {
|
|
456
|
+
source.dispose();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
this.sources.clear();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// ============================================================
|
|
463
|
+
// FACTORY FUNCTIONS
|
|
464
|
+
// ============================================================
|
|
465
|
+
/**
|
|
466
|
+
* Create a data source registry
|
|
467
|
+
*/
|
|
468
|
+
export function createDataSourceRegistry() {
|
|
469
|
+
return new InMemoryDataSourceRegistry();
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Create a data source from configuration
|
|
473
|
+
*/
|
|
474
|
+
export function createDataSource(config, dependencies) {
|
|
475
|
+
switch (config.type) {
|
|
476
|
+
case 'static':
|
|
477
|
+
return new StaticDataSource(config);
|
|
478
|
+
case 'api':
|
|
479
|
+
return new ApiDataSource(config, dependencies?.cache);
|
|
480
|
+
case 'state':
|
|
481
|
+
if (!dependencies?.stateStore) {
|
|
482
|
+
throw new Error('State store is required for state data sources');
|
|
483
|
+
}
|
|
484
|
+
return new StateDataSource(config, dependencies.stateStore);
|
|
485
|
+
case 'graphql':
|
|
486
|
+
return new GraphQLDataSource(config, dependencies?.cache);
|
|
487
|
+
default:
|
|
488
|
+
throw new Error(`Unknown data source type: ${config.type}`);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Create a static data source
|
|
493
|
+
*/
|
|
494
|
+
export function createStaticDataSource(id, data, options) {
|
|
495
|
+
const config = {
|
|
496
|
+
id,
|
|
497
|
+
type: 'static',
|
|
498
|
+
data,
|
|
499
|
+
};
|
|
500
|
+
if (options?.name !== undefined) {
|
|
501
|
+
;
|
|
502
|
+
config.name = options.name;
|
|
503
|
+
}
|
|
504
|
+
if (options?.description !== undefined) {
|
|
505
|
+
;
|
|
506
|
+
config.description = options.description;
|
|
507
|
+
}
|
|
508
|
+
return new StaticDataSource(config);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Create an API data source
|
|
512
|
+
*/
|
|
513
|
+
export function createApiDataSource(id, url, options, cache) {
|
|
514
|
+
return new ApiDataSource({
|
|
515
|
+
id,
|
|
516
|
+
type: 'api',
|
|
517
|
+
url,
|
|
518
|
+
...options,
|
|
519
|
+
}, cache);
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Create a state data source
|
|
523
|
+
*/
|
|
524
|
+
export function createStateDataSource(id, stateKey, stateStore, options) {
|
|
525
|
+
const config = {
|
|
526
|
+
id,
|
|
527
|
+
type: 'state',
|
|
528
|
+
stateKey,
|
|
529
|
+
};
|
|
530
|
+
if (options?.name !== undefined) {
|
|
531
|
+
;
|
|
532
|
+
config.name = options.name;
|
|
533
|
+
}
|
|
534
|
+
if (options?.description !== undefined) {
|
|
535
|
+
;
|
|
536
|
+
config.description = options.description;
|
|
537
|
+
}
|
|
538
|
+
if (options?.transform !== undefined) {
|
|
539
|
+
;
|
|
540
|
+
config.transform = options.transform;
|
|
541
|
+
}
|
|
542
|
+
return new StateDataSource(config, stateStore);
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Create a GraphQL data source
|
|
546
|
+
*/
|
|
547
|
+
export function createGraphQLDataSource(id, url, query, options, cache) {
|
|
548
|
+
return new GraphQLDataSource({
|
|
549
|
+
id,
|
|
550
|
+
type: 'graphql',
|
|
551
|
+
url,
|
|
552
|
+
query,
|
|
553
|
+
...options,
|
|
554
|
+
}, cache);
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=datasource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/binding/datasource.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Data Source Management\n *\n * Data source registry and management for surfaces\n *\n * Provides:\n * - Static data sources (inline data)\n * - API data sources (REST endpoints)\n * - State data sources (from state module)\n * - Caching integration\n *\n * @module @pwfabric/runtime/binding/datasource\n */\n\nimport type { CacheProvider } from '../cache/types.js'\nimport type { StateStore } from '../state/types.js'\n\n// ============================================================\n// DATA SOURCE TYPES\n// ============================================================\n\n/**\n * Data source types\n */\nexport type DataSourceType = 'static' | 'api' | 'graphql' | 'state'\n\n/**\n * Data source interface\n */\nexport interface DataSource<T = unknown> {\n /** Unique identifier for the data source */\n readonly id: string\n\n /** Type of data source */\n readonly type: DataSourceType\n\n /** Human-readable name */\n readonly name?: string | undefined\n\n /** Optional description */\n readonly description?: string | undefined\n\n /**\n * Fetch data from the source\n */\n fetch(params?: Record<string, unknown>): Promise<T>\n\n /**\n * Subscribe to data changes (if supported)\n * @returns Unsubscribe function, or undefined if not supported\n */\n subscribe?(listener: DataSourceListener<T>): () => void\n\n /**\n * Invalidate cached data (if caching is enabled)\n */\n invalidate?(): void\n\n /**\n * Check if the data source is loading\n */\n isLoading?(): boolean\n}\n\n/**\n * Listener for data source changes\n */\nexport type DataSourceListener<T> = (data: T) => void\n\n// ============================================================\n// DATA SOURCE CONFIGURATION\n// ============================================================\n\n/**\n * Base configuration for data sources\n */\nexport interface BaseDataSourceConfig {\n /** Unique identifier */\n readonly id: string\n\n /** Human-readable name */\n readonly name?: string | undefined\n\n /** Optional description */\n readonly description?: string | undefined\n\n /** Cache configuration */\n readonly cache?: DataSourceCacheConfig | undefined\n}\n\n/**\n * Cache configuration for data sources\n */\nexport interface DataSourceCacheConfig {\n /** Whether caching is enabled */\n readonly enabled: boolean\n\n /** Time-to-live in milliseconds */\n readonly ttl?: number\n\n /** Custom cache key */\n readonly key?: string\n}\n\n/**\n * Static data source configuration\n */\nexport interface StaticDataSourceConfig<T> extends BaseDataSourceConfig {\n readonly type: 'static'\n\n /** Static data */\n readonly data: T\n}\n\n/**\n * API data source configuration\n */\nexport interface ApiDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'api'\n\n /** API endpoint URL */\n readonly url: string\n\n /** HTTP method */\n readonly method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n /** Request headers */\n readonly headers?: Record<string, string>\n\n /** Request body (for POST/PUT/PATCH) */\n readonly body?: unknown\n\n /** Query parameters */\n readonly query?: Record<string, string | number | boolean>\n\n /** Transform response data */\n readonly transform?: (data: unknown) => unknown\n\n /** Polling interval in milliseconds (0 = no polling) */\n readonly pollInterval?: number\n\n /** Retry configuration */\n readonly retry?: DataSourceRetryConfig\n}\n\n/**\n * GraphQL data source configuration\n */\nexport interface GraphQLDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'graphql'\n\n /** GraphQL endpoint URL */\n readonly url: string\n\n /** GraphQL query */\n readonly query: string\n\n /** GraphQL variables */\n readonly variables?: Record<string, unknown>\n\n /** Request headers */\n readonly headers?: Record<string, string>\n\n /** Transform response data */\n readonly transform?: (data: unknown) => unknown\n\n /** Polling interval in milliseconds (0 = no polling) */\n readonly pollInterval?: number\n}\n\n/**\n * State data source configuration\n */\nexport interface StateDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'state'\n\n /** State key to bind to */\n readonly stateKey: string\n\n /** Transform state data */\n readonly transform?: ((data: unknown) => unknown) | undefined\n}\n\n/**\n * Union of all data source configurations\n */\nexport type DataSourceConfig<T = unknown> =\n | StaticDataSourceConfig<T>\n | ApiDataSourceConfig\n | GraphQLDataSourceConfig\n | StateDataSourceConfig\n\n/**\n * Retry configuration\n */\nexport interface DataSourceRetryConfig {\n /** Maximum number of retry attempts */\n readonly maxAttempts: number\n\n /** Delay between retries in milliseconds */\n readonly delay: number\n\n /** Whether to use exponential backoff */\n readonly exponentialBackoff?: boolean\n}\n\n// ============================================================\n// STATIC DATA SOURCE\n// ============================================================\n\n/**\n * Static data source implementation\n */\nexport class StaticDataSource<T> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'static'\n readonly name: string | undefined\n readonly description: string | undefined\n private readonly data: T\n\n constructor(config: StaticDataSourceConfig<T>) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.data = config.data\n }\n\n async fetch(): Promise<T> {\n return this.data\n }\n\n isLoading(): boolean {\n return false\n }\n}\n\n// ============================================================\n// API DATA SOURCE\n// ============================================================\n\n/**\n * API data source implementation with caching and polling support\n */\nexport class ApiDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'api'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: ApiDataSourceConfig\n private readonly cache: CacheProvider | undefined\n private readonly listeners = new Set<DataSourceListener<T>>()\n private pollTimer: ReturnType<typeof setInterval> | undefined\n private loading = false\n private lastData: T | undefined\n\n constructor(config: ApiDataSourceConfig, cache?: CacheProvider) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.cache = cache\n\n // Start polling if configured\n if (config.pollInterval && config.pollInterval > 0) {\n this.startPolling(config.pollInterval)\n }\n }\n\n async fetch(params?: Record<string, unknown>): Promise<T> {\n // Check cache first\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n const cached = await this.cache.get<T>(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n }\n\n this.loading = true\n\n try {\n const data = await this.fetchWithRetry(params)\n\n // Apply transform\n const transformed = this.config.transform ? (this.config.transform(data) as T) : (data as T)\n\n // Store in cache\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n await this.cache.set(cacheKey, transformed, this.config.cache.ttl)\n }\n\n this.lastData = transformed\n this.notifyListeners(transformed)\n\n return transformed\n } finally {\n this.loading = false\n }\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n // Immediately notify with last data if available\n if (this.lastData !== undefined) {\n listener(this.lastData)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n invalidate(): void {\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey()\n this.cache.delete(cacheKey)\n }\n }\n\n isLoading(): boolean {\n return this.loading\n }\n\n /**\n * Stop polling and clean up\n */\n dispose(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = undefined\n }\n this.listeners.clear()\n }\n\n private async fetchWithRetry(params?: Record<string, unknown>): Promise<unknown> {\n const maxAttempts = this.config.retry?.maxAttempts ?? 1\n const delay = this.config.retry?.delay ?? 1000\n const exponential = this.config.retry?.exponentialBackoff ?? false\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await this.doFetch(params)\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e))\n\n if (attempt < maxAttempts - 1) {\n const waitTime = exponential ? delay * Math.pow(2, attempt) : delay\n await new Promise((resolve) => setTimeout(resolve, waitTime))\n }\n }\n }\n\n throw lastError\n }\n\n private async doFetch(params?: Record<string, unknown>): Promise<unknown> {\n const originalUrl = this.config.url\n let url = originalUrl\n\n // Track which params are used in URL replacement\n const usedParams = new Set<string>()\n\n // Replace URL parameters\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (originalUrl.includes(`:${key}`) || originalUrl.includes(`{${key}}`)) {\n url = url.replace(`:${key}`, String(value))\n url = url.replace(`{${key}}`, String(value))\n usedParams.add(key)\n }\n }\n }\n\n // Build query string\n const queryParams = new URLSearchParams()\n if (this.config.query) {\n for (const [key, value] of Object.entries(this.config.query)) {\n queryParams.append(key, String(value))\n }\n }\n // Add remaining params (not used in URL replacement) to query string\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (!usedParams.has(key)) {\n queryParams.append(key, String(value))\n }\n }\n }\n const queryString = queryParams.toString()\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString\n }\n\n const requestInit: RequestInit = {\n method: this.config.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n }\n if (this.config.body) {\n requestInit.body = JSON.stringify(this.config.body)\n }\n const response = await fetch(url, requestInit)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n private getCacheKey(params?: Record<string, unknown>): string {\n if (this.config.cache?.key) {\n return this.config.cache.key\n }\n const paramsKey = params ? JSON.stringify(params) : ''\n return `datasource:${this.id}:${paramsKey}`\n }\n\n private startPolling(interval: number): void {\n this.pollTimer = setInterval(() => {\n this.fetch().catch(() => {\n // Polling errors are silently ignored\n })\n }, interval)\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// GRAPHQL DATA SOURCE\n// ============================================================\n\n/**\n * GraphQL data source implementation with polling and caching support\n */\nexport class GraphQLDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'graphql'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: GraphQLDataSourceConfig\n private readonly cache: CacheProvider | undefined\n private readonly listeners = new Set<DataSourceListener<T>>()\n private pollTimer: ReturnType<typeof setInterval> | undefined\n private loading = false\n private lastData: T | undefined\n\n constructor(config: GraphQLDataSourceConfig, cache?: CacheProvider) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.cache = cache\n\n if (config.pollInterval && config.pollInterval > 0) {\n this.startPolling(config.pollInterval)\n }\n }\n\n async fetch(params?: Record<string, unknown>): Promise<T> {\n // Check cache first\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n const cached = await this.cache.get<T>(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n }\n\n this.loading = true\n\n try {\n const data = await this.executeQuery(params)\n\n // Apply transform\n const transformed = this.config.transform ? (this.config.transform(data) as T) : (data as T)\n\n // Store in cache\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n await this.cache.set(cacheKey, transformed, this.config.cache.ttl)\n }\n\n this.lastData = transformed\n this.notifyListeners(transformed)\n\n return transformed\n } finally {\n this.loading = false\n }\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n if (this.lastData !== undefined) {\n listener(this.lastData)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n invalidate(): void {\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey()\n this.cache.delete(cacheKey)\n }\n }\n\n isLoading(): boolean {\n return this.loading\n }\n\n dispose(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = undefined\n }\n this.listeners.clear()\n }\n\n private async executeQuery(params?: Record<string, unknown>): Promise<unknown> {\n // Merge config variables with runtime params\n const variables = { ...this.config.variables, ...params }\n\n const response = await fetch(this.config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n query: this.config.query,\n variables: Object.keys(variables).length > 0 ? variables : undefined,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = (await response.json()) as {\n data?: unknown\n errors?: { message: string }[]\n }\n\n if (result.errors && result.errors.length > 0) {\n const messages = result.errors.map((e) => e.message).join('; ')\n throw new Error(`GraphQL errors: ${messages}`)\n }\n\n return result.data\n }\n\n private getCacheKey(params?: Record<string, unknown>): string {\n if (this.config.cache?.key) {\n return this.config.cache.key\n }\n const paramsKey = params ? JSON.stringify(params) : ''\n return `datasource:graphql:${this.id}:${paramsKey}`\n }\n\n private startPolling(interval: number): void {\n this.pollTimer = setInterval(() => {\n this.fetch().catch(() => {\n // Polling errors are silently ignored\n })\n }, interval)\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// STATE DATA SOURCE\n// ============================================================\n\n/**\n * State data source implementation - binds to state store\n */\nexport class StateDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'state'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: StateDataSourceConfig\n private readonly stateStore: StateStore\n private readonly listeners = new Set<DataSourceListener<T>>()\n private unsubscribe: (() => void) | undefined\n\n constructor(config: StateDataSourceConfig, stateStore: StateStore) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.stateStore = stateStore\n\n // Subscribe to state changes\n this.unsubscribe = stateStore.subscribe(config.stateKey, (value) => {\n const transformed = this.config.transform ? (this.config.transform(value) as T) : (value as T)\n this.notifyListeners(transformed)\n })\n }\n\n async fetch(): Promise<T> {\n const value = this.stateStore.get(this.config.stateKey)\n return this.config.transform ? (this.config.transform(value) as T) : (value as T)\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n // Immediately notify with current state\n const current = this.stateStore.get(this.config.stateKey)\n if (current !== undefined) {\n const transformed = this.config.transform\n ? (this.config.transform(current) as T)\n : (current as T)\n listener(transformed)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n isLoading(): boolean {\n return false\n }\n\n /**\n * Clean up subscriptions\n */\n dispose(): void {\n if (this.unsubscribe) {\n this.unsubscribe()\n this.unsubscribe = undefined\n }\n this.listeners.clear()\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// DATA SOURCE REGISTRY\n// ============================================================\n\n/**\n * Data source registry interface\n */\nexport interface DataSourceRegistry {\n /**\n * Register a data source\n */\n register<T>(source: DataSource<T>): void\n\n /**\n * Get a data source by ID\n */\n get<T>(id: string): DataSource<T> | undefined\n\n /**\n * Check if a data source exists\n */\n has(id: string): boolean\n\n /**\n * Fetch data from a source by ID\n */\n fetch<T>(id: string, params?: Record<string, unknown>): Promise<T>\n\n /**\n * Unregister a data source\n */\n unregister(id: string): boolean\n\n /**\n * Get all registered data source IDs\n */\n ids(): string[]\n\n /**\n * Clear all data sources\n */\n clear(): void\n}\n\n/**\n * In-memory data source registry implementation\n */\nexport class InMemoryDataSourceRegistry implements DataSourceRegistry {\n private readonly sources = new Map<string, DataSource>()\n\n register<T>(source: DataSource<T>): void {\n if (this.sources.has(source.id)) {\n throw new Error(`Data source '${source.id}' is already registered`)\n }\n this.sources.set(source.id, source as DataSource)\n }\n\n get<T>(id: string): DataSource<T> | undefined {\n return this.sources.get(id) as DataSource<T> | undefined\n }\n\n has(id: string): boolean {\n return this.sources.has(id)\n }\n\n async fetch<T>(id: string, params?: Record<string, unknown>): Promise<T> {\n const source = this.sources.get(id)\n if (!source) {\n throw new Error(`Data source '${id}' not found`)\n }\n return source.fetch(params) as Promise<T>\n }\n\n unregister(id: string): boolean {\n const source = this.sources.get(id)\n if (source) {\n // Dispose if the source has a dispose method\n if ('dispose' in source && typeof source.dispose === 'function') {\n source.dispose()\n }\n return this.sources.delete(id)\n }\n return false\n }\n\n ids(): string[] {\n return Array.from(this.sources.keys())\n }\n\n clear(): void {\n // Dispose all sources\n for (const source of this.sources.values()) {\n if ('dispose' in source && typeof source.dispose === 'function') {\n source.dispose()\n }\n }\n this.sources.clear()\n }\n}\n\n// ============================================================\n// FACTORY FUNCTIONS\n// ============================================================\n\n/**\n * Create a data source registry\n */\nexport function createDataSourceRegistry(): DataSourceRegistry {\n return new InMemoryDataSourceRegistry()\n}\n\n/**\n * Create a data source from configuration\n */\nexport function createDataSource<T>(\n config: DataSourceConfig<T>,\n dependencies?: {\n cache?: CacheProvider\n stateStore?: StateStore\n }\n): DataSource<T> {\n switch (config.type) {\n case 'static':\n return new StaticDataSource(config) as DataSource<T>\n\n case 'api':\n return new ApiDataSource(config, dependencies?.cache) as DataSource<T>\n\n case 'state':\n if (!dependencies?.stateStore) {\n throw new Error('State store is required for state data sources')\n }\n return new StateDataSource(config, dependencies.stateStore) as DataSource<T>\n\n case 'graphql':\n return new GraphQLDataSource(config, dependencies?.cache) as DataSource<T>\n\n default:\n throw new Error(`Unknown data source type: ${(config as DataSourceConfig).type}`)\n }\n}\n\n/**\n * Create a static data source\n */\nexport function createStaticDataSource<T>(\n id: string,\n data: T,\n options?: { name?: string; description?: string }\n): DataSource<T> {\n const config: StaticDataSourceConfig<T> = {\n id,\n type: 'static',\n data,\n }\n if (options?.name !== undefined) {\n ;(config as { name: string }).name = options.name\n }\n if (options?.description !== undefined) {\n ;(config as { description: string }).description = options.description\n }\n return new StaticDataSource(config)\n}\n\n/**\n * Create an API data source\n */\nexport function createApiDataSource<T>(\n id: string,\n url: string,\n options?: Omit<ApiDataSourceConfig, 'id' | 'type' | 'url'>,\n cache?: CacheProvider\n): DataSource<T> {\n return new ApiDataSource<T>(\n {\n id,\n type: 'api',\n url,\n ...options,\n },\n cache\n )\n}\n\n/**\n * Create a state data source\n */\nexport function createStateDataSource<T>(\n id: string,\n stateKey: string,\n stateStore: StateStore,\n options?: { name?: string; description?: string; transform?: (data: unknown) => T }\n): DataSource<T> {\n const config: StateDataSourceConfig = {\n id,\n type: 'state',\n stateKey,\n }\n if (options?.name !== undefined) {\n ;(config as { name: string }).name = options.name\n }\n if (options?.description !== undefined) {\n ;(config as { description: string }).description = options.description\n }\n if (options?.transform !== undefined) {\n ;(config as { transform: (data: unknown) => unknown }).transform = options.transform\n }\n return new StateDataSource<T>(config, stateStore)\n}\n\n/**\n * Create a GraphQL data source\n */\nexport function createGraphQLDataSource<T>(\n id: string,\n url: string,\n query: string,\n options?: Omit<GraphQLDataSourceConfig, 'id' | 'type' | 'url' | 'query'>,\n cache?: CacheProvider\n): DataSource<T> {\n return new GraphQLDataSource<T>(\n {\n id,\n type: 'graphql',\n url,\n query,\n ...options,\n },\n cache\n )\n}\n"]}
|