@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,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image Adapter Types
|
|
3
|
+
*
|
|
4
|
+
* Standardized interface for framework-specific image optimizations.
|
|
5
|
+
* Enables Next.js Image, Astro Image, etc. while keeping surface
|
|
6
|
+
* definitions framework-agnostic.
|
|
7
|
+
*
|
|
8
|
+
* @module @pwfabric/runtime/adapters/types
|
|
9
|
+
*/
|
|
10
|
+
import type { CSSProperties, ComponentType } from 'react';
|
|
11
|
+
/**
|
|
12
|
+
* Props passed to image adapter components
|
|
13
|
+
*
|
|
14
|
+
* These props are extracted from ImageBlock's block props and
|
|
15
|
+
* normalized for adapter consumption. Adapters can use or ignore
|
|
16
|
+
* specific props based on their framework capabilities.
|
|
17
|
+
*/
|
|
18
|
+
export interface ImageAdapterProps {
|
|
19
|
+
/** Image source URL */
|
|
20
|
+
readonly src: string;
|
|
21
|
+
/** Alt text for accessibility */
|
|
22
|
+
readonly alt: string;
|
|
23
|
+
/** Image width (number for pixels, string for CSS units) */
|
|
24
|
+
readonly width?: number | string;
|
|
25
|
+
/** Image height (number for pixels, string for CSS units) */
|
|
26
|
+
readonly height?: number | string;
|
|
27
|
+
/** Loading strategy */
|
|
28
|
+
readonly loading?: 'lazy' | 'eager';
|
|
29
|
+
/** CSS object-fit property */
|
|
30
|
+
readonly objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
|
|
31
|
+
/** CSS aspect-ratio property */
|
|
32
|
+
readonly aspectRatio?: string;
|
|
33
|
+
/** Border radius (number for pixels, string for CSS units) */
|
|
34
|
+
readonly borderRadius?: number | string;
|
|
35
|
+
/** Additional CSS class names */
|
|
36
|
+
readonly className?: string;
|
|
37
|
+
/** Inline styles */
|
|
38
|
+
readonly style?: CSSProperties;
|
|
39
|
+
/** Marks image as priority/above-the-fold (derived from loading === 'eager') */
|
|
40
|
+
readonly priority?: boolean;
|
|
41
|
+
/** Placeholder type for blur-up effect */
|
|
42
|
+
readonly placeholder?: 'blur' | 'empty';
|
|
43
|
+
/** Base64 blur data URL for placeholder */
|
|
44
|
+
readonly blurDataURL?: string;
|
|
45
|
+
/** Block ID for data attributes */
|
|
46
|
+
readonly blockId?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Image adapter component type
|
|
50
|
+
*
|
|
51
|
+
* Any React component that accepts ImageAdapterProps can be used
|
|
52
|
+
* as an image adapter.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* const MyAdapter: ImageAdapter = ({ src, alt, width, height }) => (
|
|
57
|
+
* <img src={src} alt={alt} width={width} height={height} />
|
|
58
|
+
* )
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export type ImageAdapter = ComponentType<ImageAdapterProps>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image Adapter Types
|
|
3
|
+
*
|
|
4
|
+
* Standardized interface for framework-specific image optimizations.
|
|
5
|
+
* Enables Next.js Image, Astro Image, etc. while keeping surface
|
|
6
|
+
* definitions framework-agnostic.
|
|
7
|
+
*
|
|
8
|
+
* @module @pwfabric/runtime/adapters/types
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * Image Adapter Types\n *\n * Standardized interface for framework-specific image optimizations.\n * Enables Next.js Image, Astro Image, etc. while keeping surface\n * definitions framework-agnostic.\n *\n * @module @pwfabric/runtime/adapters/types\n */\n\nimport type { CSSProperties, ComponentType } from 'react'\n\n/**\n * Props passed to image adapter components\n *\n * These props are extracted from ImageBlock's block props and\n * normalized for adapter consumption. Adapters can use or ignore\n * specific props based on their framework capabilities.\n */\nexport interface ImageAdapterProps {\n /** Image source URL */\n readonly src: string\n /** Alt text for accessibility */\n readonly alt: string\n /** Image width (number for pixels, string for CSS units) */\n readonly width?: number | string\n /** Image height (number for pixels, string for CSS units) */\n readonly height?: number | string\n /** Loading strategy */\n readonly loading?: 'lazy' | 'eager'\n /** CSS object-fit property */\n readonly objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down'\n /** CSS aspect-ratio property */\n readonly aspectRatio?: string\n /** Border radius (number for pixels, string for CSS units) */\n readonly borderRadius?: number | string\n /** Additional CSS class names */\n readonly className?: string\n /** Inline styles */\n readonly style?: CSSProperties\n\n // Framework-specific hints (adapters may use these)\n\n /** Marks image as priority/above-the-fold (derived from loading === 'eager') */\n readonly priority?: boolean\n /** Placeholder type for blur-up effect */\n readonly placeholder?: 'blur' | 'empty'\n /** Base64 blur data URL for placeholder */\n readonly blurDataURL?: string\n /** Block ID for data attributes */\n readonly blockId?: string\n}\n\n/**\n * Image adapter component type\n *\n * Any React component that accepts ImageAdapterProps can be used\n * as an image adapter.\n *\n * @example\n * ```tsx\n * const MyAdapter: ImageAdapter = ({ src, alt, width, height }) => (\n * <img src={src} alt={alt} width={width} height={height} />\n * )\n * ```\n */\nexport type ImageAdapter = ComponentType<ImageAdapterProps>\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Module
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic event tracking via adapter pattern
|
|
5
|
+
*
|
|
6
|
+
* Exports:
|
|
7
|
+
* - Types: AnalyticsEvent, PageViewEvent, InteractionEvent, AnalyticsAdapter, etc.
|
|
8
|
+
* - Implementations: DefaultAnalyticsCapability, InMemoryAnalyticsAdapter
|
|
9
|
+
* - Factory functions: createAnalyticsCapability, createInMemoryAdapter
|
|
10
|
+
*
|
|
11
|
+
* @module @pwfabric/runtime/analytics
|
|
12
|
+
*/
|
|
13
|
+
export type { AnalyticsEvent, PageViewEvent, InteractionEvent, InteractionType, AnalyticsAdapter, AnalyticsConfig, AnalyticsCapability, } from './types.js';
|
|
14
|
+
export { DefaultAnalyticsCapability, InMemoryAnalyticsAdapter, createAnalyticsCapability, createInMemoryAdapter, } from './tracker.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Module
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic event tracking via adapter pattern
|
|
5
|
+
*
|
|
6
|
+
* Exports:
|
|
7
|
+
* - Types: AnalyticsEvent, PageViewEvent, InteractionEvent, AnalyticsAdapter, etc.
|
|
8
|
+
* - Implementations: DefaultAnalyticsCapability, InMemoryAnalyticsAdapter
|
|
9
|
+
* - Factory functions: createAnalyticsCapability, createInMemoryAdapter
|
|
10
|
+
*
|
|
11
|
+
* @module @pwfabric/runtime/analytics
|
|
12
|
+
*/
|
|
13
|
+
// Implementations
|
|
14
|
+
export { DefaultAnalyticsCapability, InMemoryAnalyticsAdapter, createAnalyticsCapability, createInMemoryAdapter, } from './tracker.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,kBAAkB;AAClB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,cAAc,CAAA","sourcesContent":["/**\n * Analytics Capability Module\n *\n * Provider-agnostic event tracking via adapter pattern\n *\n * Exports:\n * - Types: AnalyticsEvent, PageViewEvent, InteractionEvent, AnalyticsAdapter, etc.\n * - Implementations: DefaultAnalyticsCapability, InMemoryAnalyticsAdapter\n * - Factory functions: createAnalyticsCapability, createInMemoryAdapter\n *\n * @module @pwfabric/runtime/analytics\n */\n\n// Types\nexport type {\n AnalyticsEvent,\n PageViewEvent,\n InteractionEvent,\n InteractionType,\n AnalyticsAdapter,\n AnalyticsConfig,\n AnalyticsCapability,\n} from './types.js'\n\n// Implementations\nexport {\n DefaultAnalyticsCapability,\n InMemoryAnalyticsAdapter,\n createAnalyticsCapability,\n createInMemoryAdapter,\n} from './tracker.js'\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic event tracking via adapter pattern
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/analytics/tracker
|
|
7
|
+
*/
|
|
8
|
+
import type { AnalyticsCapability, AnalyticsAdapter, AnalyticsEvent, PageViewEvent, InteractionEvent, AnalyticsConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Default analytics capability implementation
|
|
11
|
+
*
|
|
12
|
+
* Dispatches events to all registered adapters. Supports
|
|
13
|
+
* event buffering, global properties, and allow/deny lists.
|
|
14
|
+
*/
|
|
15
|
+
export declare class DefaultAnalyticsCapability implements AnalyticsCapability {
|
|
16
|
+
private readonly adapters;
|
|
17
|
+
private readonly buffer;
|
|
18
|
+
private readonly config;
|
|
19
|
+
private enabled;
|
|
20
|
+
constructor(config?: AnalyticsConfig);
|
|
21
|
+
addAdapter(adapter: AnalyticsAdapter): void;
|
|
22
|
+
removeAdapter(name: string): boolean;
|
|
23
|
+
trackEvent(event: AnalyticsEvent): void;
|
|
24
|
+
trackPageView(event: PageViewEvent): void;
|
|
25
|
+
trackInteraction(event: InteractionEvent): void;
|
|
26
|
+
identify(userId: string, traits?: Readonly<Record<string, unknown>>): void;
|
|
27
|
+
reset(): void;
|
|
28
|
+
flush(): Promise<void>;
|
|
29
|
+
getAdapterNames(): readonly string[];
|
|
30
|
+
isEnabled(): boolean;
|
|
31
|
+
setEnabled(enabled: boolean): void;
|
|
32
|
+
getBuffer(): readonly AnalyticsEvent[];
|
|
33
|
+
clear(): void;
|
|
34
|
+
private enrichEvent;
|
|
35
|
+
private isEventAllowed;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* In-memory analytics adapter for testing and debugging
|
|
39
|
+
*/
|
|
40
|
+
export declare class InMemoryAnalyticsAdapter implements AnalyticsAdapter {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly events: AnalyticsEvent[];
|
|
43
|
+
readonly pageViews: PageViewEvent[];
|
|
44
|
+
readonly interactions: InteractionEvent[];
|
|
45
|
+
private userId;
|
|
46
|
+
private userTraits;
|
|
47
|
+
constructor(name?: string);
|
|
48
|
+
trackEvent(event: AnalyticsEvent): void;
|
|
49
|
+
trackPageView(event: PageViewEvent): void;
|
|
50
|
+
trackInteraction(event: InteractionEvent): void;
|
|
51
|
+
identify(userId: string, traits?: Readonly<Record<string, unknown>>): void;
|
|
52
|
+
reset(): void;
|
|
53
|
+
flush(): Promise<void>;
|
|
54
|
+
getUserId(): string | undefined;
|
|
55
|
+
getUserTraits(): Readonly<Record<string, unknown>> | undefined;
|
|
56
|
+
clear(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create an analytics capability instance
|
|
60
|
+
*/
|
|
61
|
+
export declare function createAnalyticsCapability(config?: AnalyticsConfig): AnalyticsCapability;
|
|
62
|
+
/**
|
|
63
|
+
* Create an in-memory analytics adapter (for testing)
|
|
64
|
+
*/
|
|
65
|
+
export declare function createInMemoryAdapter(name?: string): InMemoryAnalyticsAdapter;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic event tracking via adapter pattern
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/analytics/tracker
|
|
7
|
+
*/
|
|
8
|
+
// ============================================================
|
|
9
|
+
// DEFAULT ANALYTICS CAPABILITY
|
|
10
|
+
// ============================================================
|
|
11
|
+
/**
|
|
12
|
+
* Default analytics capability implementation
|
|
13
|
+
*
|
|
14
|
+
* Dispatches events to all registered adapters. Supports
|
|
15
|
+
* event buffering, global properties, and allow/deny lists.
|
|
16
|
+
*/
|
|
17
|
+
export class DefaultAnalyticsCapability {
|
|
18
|
+
adapters = new Map();
|
|
19
|
+
buffer = [];
|
|
20
|
+
config;
|
|
21
|
+
enabled;
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
this.enabled = config.enabled ?? true;
|
|
24
|
+
this.config = {
|
|
25
|
+
enabled: this.enabled,
|
|
26
|
+
bufferEvents: config.bufferEvents ?? false,
|
|
27
|
+
maxBufferSize: config.maxBufferSize ?? 100,
|
|
28
|
+
globalProperties: config.globalProperties ?? {},
|
|
29
|
+
allowList: config.allowList ?? [],
|
|
30
|
+
denyList: config.denyList ?? [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
addAdapter(adapter) {
|
|
34
|
+
if (this.adapters.has(adapter.name)) {
|
|
35
|
+
throw new Error(`Analytics adapter '${adapter.name}' is already registered`);
|
|
36
|
+
}
|
|
37
|
+
this.adapters.set(adapter.name, adapter);
|
|
38
|
+
}
|
|
39
|
+
removeAdapter(name) {
|
|
40
|
+
return this.adapters.delete(name);
|
|
41
|
+
}
|
|
42
|
+
trackEvent(event) {
|
|
43
|
+
if (!this.enabled)
|
|
44
|
+
return;
|
|
45
|
+
if (!this.isEventAllowed(event.name))
|
|
46
|
+
return;
|
|
47
|
+
const enriched = this.enrichEvent(event);
|
|
48
|
+
if (this.config.bufferEvents) {
|
|
49
|
+
this.buffer.push(enriched);
|
|
50
|
+
if (this.buffer.length >= this.config.maxBufferSize) {
|
|
51
|
+
void this.flush();
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
for (const adapter of this.adapters.values()) {
|
|
56
|
+
try {
|
|
57
|
+
adapter.trackEvent(enriched);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Swallow adapter errors to prevent one adapter from breaking others
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
trackPageView(event) {
|
|
65
|
+
if (!this.enabled)
|
|
66
|
+
return;
|
|
67
|
+
const enriched = {
|
|
68
|
+
...event,
|
|
69
|
+
timestamp: event.timestamp ?? Date.now(),
|
|
70
|
+
properties: {
|
|
71
|
+
...this.config.globalProperties,
|
|
72
|
+
...event.properties,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
for (const adapter of this.adapters.values()) {
|
|
76
|
+
try {
|
|
77
|
+
adapter.trackPageView(enriched);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Swallow adapter errors
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
trackInteraction(event) {
|
|
85
|
+
if (!this.enabled)
|
|
86
|
+
return;
|
|
87
|
+
const enriched = {
|
|
88
|
+
...event,
|
|
89
|
+
timestamp: event.timestamp ?? Date.now(),
|
|
90
|
+
};
|
|
91
|
+
for (const adapter of this.adapters.values()) {
|
|
92
|
+
try {
|
|
93
|
+
adapter.trackInteraction(enriched);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Swallow adapter errors
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
identify(userId, traits) {
|
|
101
|
+
for (const adapter of this.adapters.values()) {
|
|
102
|
+
try {
|
|
103
|
+
adapter.identify?.(userId, traits);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Swallow adapter errors
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
reset() {
|
|
111
|
+
for (const adapter of this.adapters.values()) {
|
|
112
|
+
try {
|
|
113
|
+
adapter.reset?.();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Swallow adapter errors
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async flush() {
|
|
121
|
+
// Flush buffered events
|
|
122
|
+
const events = [...this.buffer];
|
|
123
|
+
this.buffer.length = 0;
|
|
124
|
+
for (const event of events) {
|
|
125
|
+
for (const adapter of this.adapters.values()) {
|
|
126
|
+
try {
|
|
127
|
+
adapter.trackEvent(event);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Swallow adapter errors
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Call flush on each adapter
|
|
135
|
+
const flushPromises = [];
|
|
136
|
+
for (const adapter of this.adapters.values()) {
|
|
137
|
+
if (adapter.flush) {
|
|
138
|
+
flushPromises.push(adapter.flush().catch(() => {
|
|
139
|
+
// Swallow flush errors
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
await Promise.all(flushPromises);
|
|
144
|
+
}
|
|
145
|
+
getAdapterNames() {
|
|
146
|
+
return Array.from(this.adapters.keys());
|
|
147
|
+
}
|
|
148
|
+
isEnabled() {
|
|
149
|
+
return this.enabled;
|
|
150
|
+
}
|
|
151
|
+
setEnabled(enabled) {
|
|
152
|
+
this.enabled = enabled;
|
|
153
|
+
}
|
|
154
|
+
getBuffer() {
|
|
155
|
+
return [...this.buffer];
|
|
156
|
+
}
|
|
157
|
+
clear() {
|
|
158
|
+
this.adapters.clear();
|
|
159
|
+
this.buffer.length = 0;
|
|
160
|
+
}
|
|
161
|
+
// ============================================================
|
|
162
|
+
// PRIVATE METHODS
|
|
163
|
+
// ============================================================
|
|
164
|
+
enrichEvent(event) {
|
|
165
|
+
return {
|
|
166
|
+
...event,
|
|
167
|
+
timestamp: event.timestamp ?? Date.now(),
|
|
168
|
+
properties: {
|
|
169
|
+
...this.config.globalProperties,
|
|
170
|
+
...event.properties,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
isEventAllowed(eventName) {
|
|
175
|
+
// Check deny list first
|
|
176
|
+
if (this.config.denyList.length > 0 && this.config.denyList.includes(eventName)) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
// Check allow list (empty = allow all)
|
|
180
|
+
if (this.config.allowList.length > 0 && !this.config.allowList.includes(eventName)) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ============================================================
|
|
187
|
+
// IN-MEMORY ADAPTER (FOR TESTING)
|
|
188
|
+
// ============================================================
|
|
189
|
+
/**
|
|
190
|
+
* In-memory analytics adapter for testing and debugging
|
|
191
|
+
*/
|
|
192
|
+
export class InMemoryAnalyticsAdapter {
|
|
193
|
+
name;
|
|
194
|
+
events = [];
|
|
195
|
+
pageViews = [];
|
|
196
|
+
interactions = [];
|
|
197
|
+
userId = undefined;
|
|
198
|
+
userTraits = undefined;
|
|
199
|
+
constructor(name = 'in-memory') {
|
|
200
|
+
this.name = name;
|
|
201
|
+
}
|
|
202
|
+
trackEvent(event) {
|
|
203
|
+
this.events.push(event);
|
|
204
|
+
}
|
|
205
|
+
trackPageView(event) {
|
|
206
|
+
this.pageViews.push(event);
|
|
207
|
+
}
|
|
208
|
+
trackInteraction(event) {
|
|
209
|
+
this.interactions.push(event);
|
|
210
|
+
}
|
|
211
|
+
identify(userId, traits) {
|
|
212
|
+
this.userId = userId;
|
|
213
|
+
this.userTraits = traits;
|
|
214
|
+
}
|
|
215
|
+
reset() {
|
|
216
|
+
this.userId = undefined;
|
|
217
|
+
this.userTraits = undefined;
|
|
218
|
+
}
|
|
219
|
+
async flush() {
|
|
220
|
+
// No-op for in-memory adapter
|
|
221
|
+
}
|
|
222
|
+
getUserId() {
|
|
223
|
+
return this.userId;
|
|
224
|
+
}
|
|
225
|
+
getUserTraits() {
|
|
226
|
+
return this.userTraits;
|
|
227
|
+
}
|
|
228
|
+
clear() {
|
|
229
|
+
this.events.length = 0;
|
|
230
|
+
this.pageViews.length = 0;
|
|
231
|
+
this.interactions.length = 0;
|
|
232
|
+
this.userId = undefined;
|
|
233
|
+
this.userTraits = undefined;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ============================================================
|
|
237
|
+
// FACTORY FUNCTION
|
|
238
|
+
// ============================================================
|
|
239
|
+
/**
|
|
240
|
+
* Create an analytics capability instance
|
|
241
|
+
*/
|
|
242
|
+
export function createAnalyticsCapability(config) {
|
|
243
|
+
return new DefaultAnalyticsCapability(config);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create an in-memory analytics adapter (for testing)
|
|
247
|
+
*/
|
|
248
|
+
export function createInMemoryAdapter(name) {
|
|
249
|
+
return new InMemoryAnalyticsAdapter(name);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Capability Implementation\n *\n * Provider-agnostic event tracking via adapter pattern\n *\n * @module @pwfabric/runtime/analytics/tracker\n */\n\nimport type {\n AnalyticsCapability,\n AnalyticsAdapter,\n AnalyticsEvent,\n PageViewEvent,\n InteractionEvent,\n AnalyticsConfig,\n} from './types.js'\n\n// ============================================================\n// DEFAULT ANALYTICS CAPABILITY\n// ============================================================\n\n/**\n * Default analytics capability implementation\n *\n * Dispatches events to all registered adapters. Supports\n * event buffering, global properties, and allow/deny lists.\n */\nexport class DefaultAnalyticsCapability implements AnalyticsCapability {\n private readonly adapters = new Map<string, AnalyticsAdapter>()\n private readonly buffer: AnalyticsEvent[] = []\n private readonly config: Required<AnalyticsConfig>\n private enabled: boolean\n\n constructor(config: AnalyticsConfig = {}) {\n this.enabled = config.enabled ?? true\n this.config = {\n enabled: this.enabled,\n bufferEvents: config.bufferEvents ?? false,\n maxBufferSize: config.maxBufferSize ?? 100,\n globalProperties: config.globalProperties ?? {},\n allowList: config.allowList ?? [],\n denyList: config.denyList ?? [],\n }\n }\n\n addAdapter(adapter: AnalyticsAdapter): void {\n if (this.adapters.has(adapter.name)) {\n throw new Error(`Analytics adapter '${adapter.name}' is already registered`)\n }\n this.adapters.set(adapter.name, adapter)\n }\n\n removeAdapter(name: string): boolean {\n return this.adapters.delete(name)\n }\n\n trackEvent(event: AnalyticsEvent): void {\n if (!this.enabled) return\n if (!this.isEventAllowed(event.name)) return\n\n const enriched = this.enrichEvent(event)\n\n if (this.config.bufferEvents) {\n this.buffer.push(enriched)\n if (this.buffer.length >= this.config.maxBufferSize) {\n void this.flush()\n }\n return\n }\n\n for (const adapter of this.adapters.values()) {\n try {\n adapter.trackEvent(enriched)\n } catch {\n // Swallow adapter errors to prevent one adapter from breaking others\n }\n }\n }\n\n trackPageView(event: PageViewEvent): void {\n if (!this.enabled) return\n\n const enriched: PageViewEvent = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n properties: {\n ...this.config.globalProperties,\n ...event.properties,\n },\n }\n\n for (const adapter of this.adapters.values()) {\n try {\n adapter.trackPageView(enriched)\n } catch {\n // Swallow adapter errors\n }\n }\n }\n\n trackInteraction(event: InteractionEvent): void {\n if (!this.enabled) return\n\n const enriched: InteractionEvent = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n }\n\n for (const adapter of this.adapters.values()) {\n try {\n adapter.trackInteraction(enriched)\n } catch {\n // Swallow adapter errors\n }\n }\n }\n\n identify(userId: string, traits?: Readonly<Record<string, unknown>>): void {\n for (const adapter of this.adapters.values()) {\n try {\n adapter.identify?.(userId, traits)\n } catch {\n // Swallow adapter errors\n }\n }\n }\n\n reset(): void {\n for (const adapter of this.adapters.values()) {\n try {\n adapter.reset?.()\n } catch {\n // Swallow adapter errors\n }\n }\n }\n\n async flush(): Promise<void> {\n // Flush buffered events\n const events = [...this.buffer]\n this.buffer.length = 0\n\n for (const event of events) {\n for (const adapter of this.adapters.values()) {\n try {\n adapter.trackEvent(event)\n } catch {\n // Swallow adapter errors\n }\n }\n }\n\n // Call flush on each adapter\n const flushPromises: Promise<void>[] = []\n for (const adapter of this.adapters.values()) {\n if (adapter.flush) {\n flushPromises.push(\n adapter.flush().catch(() => {\n // Swallow flush errors\n })\n )\n }\n }\n\n await Promise.all(flushPromises)\n }\n\n getAdapterNames(): readonly string[] {\n return Array.from(this.adapters.keys())\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n getBuffer(): readonly AnalyticsEvent[] {\n return [...this.buffer]\n }\n\n clear(): void {\n this.adapters.clear()\n this.buffer.length = 0\n }\n\n // ============================================================\n // PRIVATE METHODS\n // ============================================================\n\n private enrichEvent(event: AnalyticsEvent): AnalyticsEvent {\n return {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n properties: {\n ...this.config.globalProperties,\n ...event.properties,\n },\n }\n }\n\n private isEventAllowed(eventName: string): boolean {\n // Check deny list first\n if (this.config.denyList.length > 0 && this.config.denyList.includes(eventName)) {\n return false\n }\n\n // Check allow list (empty = allow all)\n if (this.config.allowList.length > 0 && !this.config.allowList.includes(eventName)) {\n return false\n }\n\n return true\n }\n}\n\n// ============================================================\n// IN-MEMORY ADAPTER (FOR TESTING)\n// ============================================================\n\n/**\n * In-memory analytics adapter for testing and debugging\n */\nexport class InMemoryAnalyticsAdapter implements AnalyticsAdapter {\n readonly name: string\n readonly events: AnalyticsEvent[] = []\n readonly pageViews: PageViewEvent[] = []\n readonly interactions: InteractionEvent[] = []\n private userId: string | undefined = undefined\n private userTraits: Readonly<Record<string, unknown>> | undefined = undefined\n\n constructor(name = 'in-memory') {\n this.name = name\n }\n\n trackEvent(event: AnalyticsEvent): void {\n this.events.push(event)\n }\n\n trackPageView(event: PageViewEvent): void {\n this.pageViews.push(event)\n }\n\n trackInteraction(event: InteractionEvent): void {\n this.interactions.push(event)\n }\n\n identify(userId: string, traits?: Readonly<Record<string, unknown>>): void {\n this.userId = userId\n this.userTraits = traits\n }\n\n reset(): void {\n this.userId = undefined\n this.userTraits = undefined\n }\n\n async flush(): Promise<void> {\n // No-op for in-memory adapter\n }\n\n getUserId(): string | undefined {\n return this.userId\n }\n\n getUserTraits(): Readonly<Record<string, unknown>> | undefined {\n return this.userTraits\n }\n\n clear(): void {\n this.events.length = 0\n this.pageViews.length = 0\n this.interactions.length = 0\n this.userId = undefined\n this.userTraits = undefined\n }\n}\n\n// ============================================================\n// FACTORY FUNCTION\n// ============================================================\n\n/**\n * Create an analytics capability instance\n */\nexport function createAnalyticsCapability(config?: AnalyticsConfig): AnalyticsCapability {\n return new DefaultAnalyticsCapability(config)\n}\n\n/**\n * Create an in-memory analytics adapter (for testing)\n */\nexport function createInMemoryAdapter(name?: string): InMemoryAnalyticsAdapter {\n return new InMemoryAnalyticsAdapter(name)\n}\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Types
|
|
3
|
+
*
|
|
4
|
+
* Event tracking, page views, and user interaction tracking
|
|
5
|
+
*
|
|
6
|
+
* Provider-agnostic via adapter pattern (GA, Mixpanel, etc.)
|
|
7
|
+
*
|
|
8
|
+
* @module @pwfabric/runtime/analytics/types
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Analytics event
|
|
12
|
+
*/
|
|
13
|
+
export interface AnalyticsEvent {
|
|
14
|
+
/** Event name/action */
|
|
15
|
+
readonly name: string;
|
|
16
|
+
/** Event category */
|
|
17
|
+
readonly category?: string;
|
|
18
|
+
/** Event label for further classification */
|
|
19
|
+
readonly label?: string;
|
|
20
|
+
/** Numeric value associated with the event */
|
|
21
|
+
readonly value?: number;
|
|
22
|
+
/** Additional event properties */
|
|
23
|
+
readonly properties?: Readonly<Record<string, unknown>>;
|
|
24
|
+
/** Timestamp (defaults to Date.now()) */
|
|
25
|
+
readonly timestamp?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Page view event
|
|
29
|
+
*/
|
|
30
|
+
export interface PageViewEvent {
|
|
31
|
+
/** Page path */
|
|
32
|
+
readonly path: string;
|
|
33
|
+
/** Page title */
|
|
34
|
+
readonly title?: string;
|
|
35
|
+
/** Referrer URL */
|
|
36
|
+
readonly referrer?: string;
|
|
37
|
+
/** Additional page properties */
|
|
38
|
+
readonly properties?: Readonly<Record<string, unknown>>;
|
|
39
|
+
/** Timestamp */
|
|
40
|
+
readonly timestamp?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* User interaction event
|
|
44
|
+
*/
|
|
45
|
+
export interface InteractionEvent {
|
|
46
|
+
/** Type of interaction */
|
|
47
|
+
readonly type: InteractionType;
|
|
48
|
+
/** Target element or component identifier */
|
|
49
|
+
readonly target: string;
|
|
50
|
+
/** Additional interaction data */
|
|
51
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
52
|
+
/** Timestamp */
|
|
53
|
+
readonly timestamp?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Supported interaction types
|
|
57
|
+
*/
|
|
58
|
+
export type InteractionType = 'click' | 'submit' | 'scroll' | 'focus' | 'blur' | 'hover' | 'drag' | 'resize' | 'custom';
|
|
59
|
+
/**
|
|
60
|
+
* Analytics adapter interface for provider integration
|
|
61
|
+
*
|
|
62
|
+
* Implement this interface to connect to a specific analytics
|
|
63
|
+
* provider (Google Analytics, Mixpanel, Amplitude, etc.)
|
|
64
|
+
*/
|
|
65
|
+
export interface AnalyticsAdapter {
|
|
66
|
+
/** Adapter identifier */
|
|
67
|
+
readonly name: string;
|
|
68
|
+
/** Initialize the adapter */
|
|
69
|
+
initialize?(config: Readonly<Record<string, unknown>>): void | Promise<void>;
|
|
70
|
+
/** Track a custom event */
|
|
71
|
+
trackEvent(event: AnalyticsEvent): void;
|
|
72
|
+
/** Track a page view */
|
|
73
|
+
trackPageView(event: PageViewEvent): void;
|
|
74
|
+
/** Track a user interaction */
|
|
75
|
+
trackInteraction(event: InteractionEvent): void;
|
|
76
|
+
/** Set user identity */
|
|
77
|
+
identify?(userId: string, traits?: Readonly<Record<string, unknown>>): void;
|
|
78
|
+
/** Reset/clear user identity */
|
|
79
|
+
reset?(): void;
|
|
80
|
+
/** Flush any buffered events */
|
|
81
|
+
flush?(): Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Analytics capability configuration
|
|
85
|
+
*/
|
|
86
|
+
export interface AnalyticsConfig {
|
|
87
|
+
/** Whether analytics is enabled */
|
|
88
|
+
readonly enabled?: boolean;
|
|
89
|
+
/** Whether to buffer events before sending */
|
|
90
|
+
readonly bufferEvents?: boolean;
|
|
91
|
+
/** Maximum buffer size before auto-flush */
|
|
92
|
+
readonly maxBufferSize?: number;
|
|
93
|
+
/** Global properties to attach to all events */
|
|
94
|
+
readonly globalProperties?: Readonly<Record<string, unknown>>;
|
|
95
|
+
/** Event name filter (only track matching events) */
|
|
96
|
+
readonly allowList?: readonly string[];
|
|
97
|
+
/** Event name filter (exclude matching events) */
|
|
98
|
+
readonly denyList?: readonly string[];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Analytics capability interface
|
|
102
|
+
*/
|
|
103
|
+
export interface AnalyticsCapability {
|
|
104
|
+
/** Register an analytics adapter (provider) */
|
|
105
|
+
addAdapter(adapter: AnalyticsAdapter): void;
|
|
106
|
+
/** Remove an adapter by name */
|
|
107
|
+
removeAdapter(name: string): boolean;
|
|
108
|
+
/** Track a custom event */
|
|
109
|
+
trackEvent(event: AnalyticsEvent): void;
|
|
110
|
+
/** Track a page view */
|
|
111
|
+
trackPageView(event: PageViewEvent): void;
|
|
112
|
+
/** Track a user interaction */
|
|
113
|
+
trackInteraction(event: InteractionEvent): void;
|
|
114
|
+
/** Set user identity across all adapters */
|
|
115
|
+
identify(userId: string, traits?: Readonly<Record<string, unknown>>): void;
|
|
116
|
+
/** Reset identity across all adapters */
|
|
117
|
+
reset(): void;
|
|
118
|
+
/** Flush all buffered events */
|
|
119
|
+
flush(): Promise<void>;
|
|
120
|
+
/** Get registered adapter names */
|
|
121
|
+
getAdapterNames(): readonly string[];
|
|
122
|
+
/** Check if analytics is enabled */
|
|
123
|
+
isEnabled(): boolean;
|
|
124
|
+
/** Enable or disable analytics */
|
|
125
|
+
setEnabled(enabled: boolean): void;
|
|
126
|
+
/** Get buffered events (if buffering is enabled) */
|
|
127
|
+
getBuffer(): readonly AnalyticsEvent[];
|
|
128
|
+
/** Clear all adapters and state */
|
|
129
|
+
clear(): void;
|
|
130
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Capability Types
|
|
3
|
+
*
|
|
4
|
+
* Event tracking, page views, and user interaction tracking
|
|
5
|
+
*
|
|
6
|
+
* Provider-agnostic via adapter pattern (GA, Mixpanel, etc.)
|
|
7
|
+
*
|
|
8
|
+
* @module @pwfabric/runtime/analytics/types
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * Analytics Capability Types\n *\n * Event tracking, page views, and user interaction tracking\n *\n * Provider-agnostic via adapter pattern (GA, Mixpanel, etc.)\n *\n * @module @pwfabric/runtime/analytics/types\n */\n\n// ============================================================\n// ANALYTICS EVENTS\n// ============================================================\n\n/**\n * Analytics event\n */\nexport interface AnalyticsEvent {\n /** Event name/action */\n readonly name: string\n\n /** Event category */\n readonly category?: string\n\n /** Event label for further classification */\n readonly label?: string\n\n /** Numeric value associated with the event */\n readonly value?: number\n\n /** Additional event properties */\n readonly properties?: Readonly<Record<string, unknown>>\n\n /** Timestamp (defaults to Date.now()) */\n readonly timestamp?: number\n}\n\n/**\n * Page view event\n */\nexport interface PageViewEvent {\n /** Page path */\n readonly path: string\n\n /** Page title */\n readonly title?: string\n\n /** Referrer URL */\n readonly referrer?: string\n\n /** Additional page properties */\n readonly properties?: Readonly<Record<string, unknown>>\n\n /** Timestamp */\n readonly timestamp?: number\n}\n\n/**\n * User interaction event\n */\nexport interface InteractionEvent {\n /** Type of interaction */\n readonly type: InteractionType\n\n /** Target element or component identifier */\n readonly target: string\n\n /** Additional interaction data */\n readonly data?: Readonly<Record<string, unknown>>\n\n /** Timestamp */\n readonly timestamp?: number\n}\n\n/**\n * Supported interaction types\n */\nexport type InteractionType =\n | 'click'\n | 'submit'\n | 'scroll'\n | 'focus'\n | 'blur'\n | 'hover'\n | 'drag'\n | 'resize'\n | 'custom'\n\n// ============================================================\n// ANALYTICS ADAPTER (PROVIDER PATTERN)\n// ============================================================\n\n/**\n * Analytics adapter interface for provider integration\n *\n * Implement this interface to connect to a specific analytics\n * provider (Google Analytics, Mixpanel, Amplitude, etc.)\n */\nexport interface AnalyticsAdapter {\n /** Adapter identifier */\n readonly name: string\n\n /** Initialize the adapter */\n initialize?(config: Readonly<Record<string, unknown>>): void | Promise<void>\n\n /** Track a custom event */\n trackEvent(event: AnalyticsEvent): void\n\n /** Track a page view */\n trackPageView(event: PageViewEvent): void\n\n /** Track a user interaction */\n trackInteraction(event: InteractionEvent): void\n\n /** Set user identity */\n identify?(userId: string, traits?: Readonly<Record<string, unknown>>): void\n\n /** Reset/clear user identity */\n reset?(): void\n\n /** Flush any buffered events */\n flush?(): Promise<void>\n}\n\n// ============================================================\n// ANALYTICS CONFIGURATION\n// ============================================================\n\n/**\n * Analytics capability configuration\n */\nexport interface AnalyticsConfig {\n /** Whether analytics is enabled */\n readonly enabled?: boolean\n\n /** Whether to buffer events before sending */\n readonly bufferEvents?: boolean\n\n /** Maximum buffer size before auto-flush */\n readonly maxBufferSize?: number\n\n /** Global properties to attach to all events */\n readonly globalProperties?: Readonly<Record<string, unknown>>\n\n /** Event name filter (only track matching events) */\n readonly allowList?: readonly string[]\n\n /** Event name filter (exclude matching events) */\n readonly denyList?: readonly string[]\n}\n\n// ============================================================\n// ANALYTICS CAPABILITY INTERFACE\n// ============================================================\n\n/**\n * Analytics capability interface\n */\nexport interface AnalyticsCapability {\n /** Register an analytics adapter (provider) */\n addAdapter(adapter: AnalyticsAdapter): void\n\n /** Remove an adapter by name */\n removeAdapter(name: string): boolean\n\n /** Track a custom event */\n trackEvent(event: AnalyticsEvent): void\n\n /** Track a page view */\n trackPageView(event: PageViewEvent): void\n\n /** Track a user interaction */\n trackInteraction(event: InteractionEvent): void\n\n /** Set user identity across all adapters */\n identify(userId: string, traits?: Readonly<Record<string, unknown>>): void\n\n /** Reset identity across all adapters */\n reset(): void\n\n /** Flush all buffered events */\n flush(): Promise<void>\n\n /** Get registered adapter names */\n getAdapterNames(): readonly string[]\n\n /** Check if analytics is enabled */\n isEnabled(): boolean\n\n /** Enable or disable analytics */\n setEnabled(enabled: boolean): void\n\n /** Get buffered events (if buffering is enabled) */\n getBuffer(): readonly AnalyticsEvent[]\n\n /** Clear all adapters and state */\n clear(): void\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Module
|
|
3
|
+
*
|
|
4
|
+
* Authentication provider interface + implementations (MSAL/API-key).
|
|
5
|
+
*
|
|
6
|
+
* RBAC, session management and SSO (OIDC/SAML) are not part of this module:
|
|
7
|
+
* they belong to the host that serves the app. Keeping them here would also
|
|
8
|
+
* ship Node-only code (SAML's `node:util`/`node:zlib` XML parsing) inside
|
|
9
|
+
* the browser-facing `embed.js` IIFE.
|
|
10
|
+
*
|
|
11
|
+
* @module @pwfabric/runtime/auth
|
|
12
|
+
*/
|
|
13
|
+
export type { AuthProviderType, AuthState, UserIdentity, AuthToken, AuthSession, AuthProviderConfig, MsalConfig, OAuth2Config, ApiKeyConfig, AuthResult, TokenResult, AuthError, } from './types.js';
|
|
14
|
+
export type { AuthProvider, LoginOptions } from './provider.js';
|
|
15
|
+
export { MsalAuthProvider, ApiKeyAuthProvider, createAuthProvider } from './provider.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Module
|
|
3
|
+
*
|
|
4
|
+
* Authentication provider interface + implementations (MSAL/API-key).
|
|
5
|
+
*
|
|
6
|
+
* RBAC, session management and SSO (OIDC/SAML) are not part of this module:
|
|
7
|
+
* they belong to the host that serves the app. Keeping them here would also
|
|
8
|
+
* ship Node-only code (SAML's `node:util`/`node:zlib` XML parsing) inside
|
|
9
|
+
* the browser-facing `embed.js` IIFE.
|
|
10
|
+
*
|
|
11
|
+
* @module @pwfabric/runtime/auth
|
|
12
|
+
*/
|
|
13
|
+
export { MsalAuthProvider, ApiKeyAuthProvider, createAuthProvider } from './provider.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA","sourcesContent":["/**\n * Authentication Module\n *\n * Authentication provider interface + implementations (MSAL/API-key).\n *\n * RBAC, session management and SSO (OIDC/SAML) are not part of this module:\n * they belong to the host that serves the app. Keeping them here would also\n * ship Node-only code (SAML's `node:util`/`node:zlib` XML parsing) inside\n * the browser-facing `embed.js` IIFE.\n *\n * @module @pwfabric/runtime/auth\n */\n\n// Types\nexport type {\n AuthProviderType,\n AuthState,\n UserIdentity,\n AuthToken,\n AuthSession,\n AuthProviderConfig,\n MsalConfig,\n OAuth2Config,\n ApiKeyConfig,\n AuthResult,\n TokenResult,\n AuthError,\n} from './types.js'\n\n// Provider\nexport type { AuthProvider, LoginOptions } from './provider.js'\nexport { MsalAuthProvider, ApiKeyAuthProvider, createAuthProvider } from './provider.js'\n"]}
|