@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,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Types
|
|
3
|
+
*
|
|
4
|
+
* Authentication system types
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/auth/types
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Authentication provider type
|
|
10
|
+
*/
|
|
11
|
+
export type AuthProviderType = 'msal' | 'oauth2' | 'api-key' | 'custom';
|
|
12
|
+
/**
|
|
13
|
+
* Authentication state
|
|
14
|
+
*/
|
|
15
|
+
export type AuthState = 'unauthenticated' | 'authenticating' | 'authenticated' | 'error' | 'expired';
|
|
16
|
+
/**
|
|
17
|
+
* User identity
|
|
18
|
+
*/
|
|
19
|
+
export interface UserIdentity {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly name?: string;
|
|
22
|
+
readonly email?: string;
|
|
23
|
+
readonly worldId?: string;
|
|
24
|
+
readonly roles?: readonly string[];
|
|
25
|
+
readonly claims?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Authentication token
|
|
29
|
+
*/
|
|
30
|
+
export interface AuthToken {
|
|
31
|
+
readonly accessToken: string;
|
|
32
|
+
readonly refreshToken?: string;
|
|
33
|
+
readonly idToken?: string;
|
|
34
|
+
readonly expiresAt: number;
|
|
35
|
+
readonly scopes: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Authentication session
|
|
39
|
+
*/
|
|
40
|
+
export interface AuthSession {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly state: AuthState;
|
|
43
|
+
readonly user?: UserIdentity;
|
|
44
|
+
readonly token?: AuthToken;
|
|
45
|
+
readonly provider: AuthProviderType;
|
|
46
|
+
readonly createdAt: number;
|
|
47
|
+
readonly expiresAt?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Base auth provider configuration
|
|
51
|
+
*/
|
|
52
|
+
export interface AuthProviderConfig {
|
|
53
|
+
readonly type: AuthProviderType;
|
|
54
|
+
readonly clientId?: string;
|
|
55
|
+
readonly authority?: string;
|
|
56
|
+
readonly scopes?: readonly string[];
|
|
57
|
+
readonly redirectUri?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* MSAL configuration
|
|
61
|
+
*/
|
|
62
|
+
export interface MsalConfig extends AuthProviderConfig {
|
|
63
|
+
readonly type: 'msal';
|
|
64
|
+
readonly clientId: string;
|
|
65
|
+
readonly authority: string;
|
|
66
|
+
readonly scopes: readonly string[];
|
|
67
|
+
readonly redirectUri: string;
|
|
68
|
+
readonly worldId?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* OAuth2 configuration
|
|
72
|
+
*/
|
|
73
|
+
export interface OAuth2Config extends AuthProviderConfig {
|
|
74
|
+
readonly type: 'oauth2';
|
|
75
|
+
readonly authorizationEndpoint: string;
|
|
76
|
+
readonly tokenEndpoint: string;
|
|
77
|
+
readonly clientId: string;
|
|
78
|
+
readonly scopes: readonly string[];
|
|
79
|
+
readonly redirectUri: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* API Key configuration
|
|
83
|
+
*/
|
|
84
|
+
export interface ApiKeyConfig extends AuthProviderConfig {
|
|
85
|
+
readonly type: 'api-key';
|
|
86
|
+
readonly headerName: string;
|
|
87
|
+
readonly keyPrefix?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Authentication result
|
|
91
|
+
*/
|
|
92
|
+
export type AuthResult = {
|
|
93
|
+
readonly success: true;
|
|
94
|
+
readonly session: AuthSession;
|
|
95
|
+
} | {
|
|
96
|
+
readonly success: false;
|
|
97
|
+
readonly error: AuthError;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Token acquisition result
|
|
101
|
+
*/
|
|
102
|
+
export type TokenResult = {
|
|
103
|
+
readonly success: true;
|
|
104
|
+
readonly token: AuthToken;
|
|
105
|
+
} | {
|
|
106
|
+
readonly success: false;
|
|
107
|
+
readonly error: AuthError;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Authentication error
|
|
111
|
+
*/
|
|
112
|
+
export interface AuthError {
|
|
113
|
+
readonly type: 'invalid_config' | 'network_error' | 'invalid_credentials' | 'token_expired' | 'insufficient_scope' | 'provider_error';
|
|
114
|
+
readonly message: string;
|
|
115
|
+
readonly code?: string;
|
|
116
|
+
readonly cause?: unknown;
|
|
117
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Authentication Types\n *\n * Authentication system types\n *\n * @module @pwfabric/runtime/auth/types\n */\n\n// ============================================================\n// AUTH PROVIDER TYPES\n// ============================================================\n\n/**\n * Authentication provider type\n */\nexport type AuthProviderType = 'msal' | 'oauth2' | 'api-key' | 'custom'\n\n/**\n * Authentication state\n */\nexport type AuthState = 'unauthenticated' | 'authenticating' | 'authenticated' | 'error' | 'expired'\n\n/**\n * User identity\n */\nexport interface UserIdentity {\n readonly id: string\n readonly name?: string\n readonly email?: string\n readonly worldId?: string\n readonly roles?: readonly string[]\n readonly claims?: Record<string, unknown>\n}\n\n/**\n * Authentication token\n */\nexport interface AuthToken {\n readonly accessToken: string\n readonly refreshToken?: string\n readonly idToken?: string\n readonly expiresAt: number\n readonly scopes: readonly string[]\n}\n\n/**\n * Authentication session\n */\nexport interface AuthSession {\n readonly id: string\n readonly state: AuthState\n readonly user?: UserIdentity\n readonly token?: AuthToken\n readonly provider: AuthProviderType\n readonly createdAt: number\n readonly expiresAt?: number\n}\n\n// ============================================================\n// AUTH CONFIGURATION\n// ============================================================\n\n/**\n * Base auth provider configuration\n */\nexport interface AuthProviderConfig {\n readonly type: AuthProviderType\n readonly clientId?: string\n readonly authority?: string\n readonly scopes?: readonly string[]\n readonly redirectUri?: string\n}\n\n/**\n * MSAL configuration\n */\nexport interface MsalConfig extends AuthProviderConfig {\n readonly type: 'msal'\n readonly clientId: string\n readonly authority: string\n readonly scopes: readonly string[]\n readonly redirectUri: string\n readonly worldId?: string\n}\n\n/**\n * OAuth2 configuration\n */\nexport interface OAuth2Config extends AuthProviderConfig {\n readonly type: 'oauth2'\n readonly authorizationEndpoint: string\n readonly tokenEndpoint: string\n readonly clientId: string\n readonly scopes: readonly string[]\n readonly redirectUri: string\n}\n\n/**\n * API Key configuration\n */\nexport interface ApiKeyConfig extends AuthProviderConfig {\n readonly type: 'api-key'\n readonly headerName: string\n readonly keyPrefix?: string\n}\n\n// ============================================================\n// AUTH RESULT TYPES\n// ============================================================\n\n/**\n * Authentication result\n */\nexport type AuthResult =\n | { readonly success: true; readonly session: AuthSession }\n | { readonly success: false; readonly error: AuthError }\n\n/**\n * Token acquisition result\n */\nexport type TokenResult =\n | { readonly success: true; readonly token: AuthToken }\n | { readonly success: false; readonly error: AuthError }\n\n/**\n * Authentication error\n */\nexport interface AuthError {\n readonly type:\n | 'invalid_config'\n | 'network_error'\n | 'invalid_credentials'\n | 'token_expired'\n | 'insufficient_scope'\n | 'provider_error'\n readonly message: string\n readonly code?: string\n readonly cause?: unknown\n}\n\n"]}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collection Binding
|
|
3
|
+
*
|
|
4
|
+
* Reactive collection binding for arrays/lists in surfaces
|
|
5
|
+
*
|
|
6
|
+
* Provides:
|
|
7
|
+
* - Reactive array subscriptions
|
|
8
|
+
* - Filter, sort, map operations
|
|
9
|
+
* - Item change tracking (add, remove, update)
|
|
10
|
+
* - Derived/computed collections
|
|
11
|
+
*
|
|
12
|
+
* @module @pwfabric/runtime/binding/collection
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Types of changes that can occur to a collection
|
|
16
|
+
*/
|
|
17
|
+
export type CollectionChangeType = 'add' | 'remove' | 'update' | 'reset' | 'reorder';
|
|
18
|
+
/**
|
|
19
|
+
* Event emitted when collection changes
|
|
20
|
+
*/
|
|
21
|
+
export interface CollectionChangeEvent<T> {
|
|
22
|
+
/** Type of change */
|
|
23
|
+
readonly type: CollectionChangeType;
|
|
24
|
+
/** Index where change occurred (-1 for reset/reorder) */
|
|
25
|
+
readonly index: number;
|
|
26
|
+
/** Item that was affected (undefined for reset) */
|
|
27
|
+
readonly item?: T | undefined;
|
|
28
|
+
/** Previous items (for reset) */
|
|
29
|
+
readonly previousItems?: readonly T[] | undefined;
|
|
30
|
+
/** Timestamp of the change */
|
|
31
|
+
readonly timestamp: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Listener for collection changes
|
|
35
|
+
*/
|
|
36
|
+
export type CollectionChangeListener<T> = (items: readonly T[], event: CollectionChangeEvent<T>) => void;
|
|
37
|
+
/**
|
|
38
|
+
* Reactive collection binding interface
|
|
39
|
+
*/
|
|
40
|
+
export interface CollectionBinding<T> {
|
|
41
|
+
/** Current items in the collection */
|
|
42
|
+
readonly items: readonly T[];
|
|
43
|
+
/** Field used as unique key for items */
|
|
44
|
+
readonly keyField: string;
|
|
45
|
+
/** Number of items */
|
|
46
|
+
readonly length: number;
|
|
47
|
+
/**
|
|
48
|
+
* Subscribe to collection changes
|
|
49
|
+
* @returns Unsubscribe function
|
|
50
|
+
*/
|
|
51
|
+
subscribe(listener: CollectionChangeListener<T>): () => void;
|
|
52
|
+
/**
|
|
53
|
+
* Create a filtered view of the collection
|
|
54
|
+
*/
|
|
55
|
+
filter(predicate: (item: T, index: number) => boolean): CollectionBinding<T>;
|
|
56
|
+
/**
|
|
57
|
+
* Create a sorted view of the collection
|
|
58
|
+
*/
|
|
59
|
+
sort(comparator: (a: T, b: T) => number): CollectionBinding<T>;
|
|
60
|
+
/**
|
|
61
|
+
* Create a mapped view of the collection
|
|
62
|
+
*/
|
|
63
|
+
map<U>(mapper: (item: T, index: number) => U): CollectionBinding<U>;
|
|
64
|
+
/**
|
|
65
|
+
* Create a sliced view of the collection
|
|
66
|
+
*/
|
|
67
|
+
slice(start?: number, end?: number): CollectionBinding<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Get item by key value
|
|
70
|
+
*/
|
|
71
|
+
getByKey(keyValue: unknown): T | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Get item at index
|
|
74
|
+
*/
|
|
75
|
+
at(index: number): T | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Find first item matching predicate
|
|
78
|
+
*/
|
|
79
|
+
find(predicate: (item: T, index: number) => boolean): T | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Find index of first item matching predicate
|
|
82
|
+
*/
|
|
83
|
+
findIndex(predicate: (item: T, index: number) => boolean): number;
|
|
84
|
+
/**
|
|
85
|
+
* Check if any item matches predicate
|
|
86
|
+
*/
|
|
87
|
+
some(predicate: (item: T, index: number) => boolean): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Check if all items match predicate
|
|
90
|
+
*/
|
|
91
|
+
every(predicate: (item: T, index: number) => boolean): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Reduce collection to single value
|
|
94
|
+
*/
|
|
95
|
+
reduce<U>(reducer: (acc: U, item: T, index: number) => U, initial: U): U;
|
|
96
|
+
/**
|
|
97
|
+
* Dispose of the collection and all subscriptions
|
|
98
|
+
*/
|
|
99
|
+
dispose(): void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Mutable collection binding interface
|
|
103
|
+
*/
|
|
104
|
+
export interface MutableCollectionBinding<T> extends CollectionBinding<T> {
|
|
105
|
+
/**
|
|
106
|
+
* Add item to collection
|
|
107
|
+
*/
|
|
108
|
+
add(item: T): void;
|
|
109
|
+
/**
|
|
110
|
+
* Add multiple items to collection
|
|
111
|
+
*/
|
|
112
|
+
addMany(items: readonly T[]): void;
|
|
113
|
+
/**
|
|
114
|
+
* Remove item by key value
|
|
115
|
+
*/
|
|
116
|
+
remove(keyValue: unknown): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Remove item at index
|
|
119
|
+
*/
|
|
120
|
+
removeAt(index: number): T | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Update item by key value
|
|
123
|
+
*/
|
|
124
|
+
update(keyValue: unknown, updates: Partial<T>): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Replace item at index
|
|
127
|
+
*/
|
|
128
|
+
replace(index: number, item: T): void;
|
|
129
|
+
/**
|
|
130
|
+
* Replace all items
|
|
131
|
+
*/
|
|
132
|
+
reset(items: readonly T[]): void;
|
|
133
|
+
/**
|
|
134
|
+
* Clear all items
|
|
135
|
+
*/
|
|
136
|
+
clear(): void;
|
|
137
|
+
/**
|
|
138
|
+
* Move item from one index to another
|
|
139
|
+
*/
|
|
140
|
+
move(fromIndex: number, toIndex: number): void;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Reactive collection implementation with change tracking
|
|
144
|
+
*/
|
|
145
|
+
export declare class ReactiveCollection<T> implements MutableCollectionBinding<T> {
|
|
146
|
+
private _items;
|
|
147
|
+
private readonly _keyField;
|
|
148
|
+
private readonly listeners;
|
|
149
|
+
private disposed;
|
|
150
|
+
constructor(initialItems?: readonly T[], keyField?: string);
|
|
151
|
+
get items(): readonly T[];
|
|
152
|
+
get keyField(): string;
|
|
153
|
+
get length(): number;
|
|
154
|
+
subscribe(listener: CollectionChangeListener<T>): () => void;
|
|
155
|
+
filter(predicate: (item: T, index: number) => boolean): CollectionBinding<T>;
|
|
156
|
+
sort(comparator: (a: T, b: T) => number): CollectionBinding<T>;
|
|
157
|
+
map<U>(mapper: (item: T, index: number) => U): CollectionBinding<U>;
|
|
158
|
+
slice(start?: number, end?: number): CollectionBinding<T>;
|
|
159
|
+
getByKey(keyValue: unknown): T | undefined;
|
|
160
|
+
at(index: number): T | undefined;
|
|
161
|
+
find(predicate: (item: T, index: number) => boolean): T | undefined;
|
|
162
|
+
findIndex(predicate: (item: T, index: number) => boolean): number;
|
|
163
|
+
some(predicate: (item: T, index: number) => boolean): boolean;
|
|
164
|
+
every(predicate: (item: T, index: number) => boolean): boolean;
|
|
165
|
+
reduce<U>(reducer: (acc: U, item: T, index: number) => U, initial: U): U;
|
|
166
|
+
add(item: T): void;
|
|
167
|
+
addMany(items: readonly T[]): void;
|
|
168
|
+
remove(keyValue: unknown): boolean;
|
|
169
|
+
removeAt(index: number): T | undefined;
|
|
170
|
+
update(keyValue: unknown, updates: Partial<T>): boolean;
|
|
171
|
+
replace(index: number, item: T): void;
|
|
172
|
+
reset(items: readonly T[]): void;
|
|
173
|
+
clear(): void;
|
|
174
|
+
move(fromIndex: number, toIndex: number): void;
|
|
175
|
+
dispose(): void;
|
|
176
|
+
private getKeyValue;
|
|
177
|
+
private notify;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create a reactive collection
|
|
181
|
+
*/
|
|
182
|
+
export declare function createCollection<T>(initialItems?: readonly T[], keyField?: string): MutableCollectionBinding<T>;
|
|
183
|
+
/**
|
|
184
|
+
* Create a read-only collection from existing data
|
|
185
|
+
*/
|
|
186
|
+
export declare function createReadOnlyCollection<T>(items: readonly T[], keyField?: string): CollectionBinding<T>;
|
|
187
|
+
/**
|
|
188
|
+
* Create a collection from an async iterable
|
|
189
|
+
*/
|
|
190
|
+
export declare function createCollectionFromAsync<T>(asyncIterable: AsyncIterable<T>, keyField?: string): Promise<MutableCollectionBinding<T>>;
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collection Binding
|
|
3
|
+
*
|
|
4
|
+
* Reactive collection binding for arrays/lists in surfaces
|
|
5
|
+
*
|
|
6
|
+
* Provides:
|
|
7
|
+
* - Reactive array subscriptions
|
|
8
|
+
* - Filter, sort, map operations
|
|
9
|
+
* - Item change tracking (add, remove, update)
|
|
10
|
+
* - Derived/computed collections
|
|
11
|
+
*
|
|
12
|
+
* @module @pwfabric/runtime/binding/collection
|
|
13
|
+
*/
|
|
14
|
+
// ============================================================
|
|
15
|
+
// REACTIVE COLLECTION IMPLEMENTATION
|
|
16
|
+
// ============================================================
|
|
17
|
+
/**
|
|
18
|
+
* Reactive collection implementation with change tracking
|
|
19
|
+
*/
|
|
20
|
+
export class ReactiveCollection {
|
|
21
|
+
_items;
|
|
22
|
+
_keyField;
|
|
23
|
+
listeners = new Set();
|
|
24
|
+
disposed = false;
|
|
25
|
+
constructor(initialItems = [], keyField = 'id') {
|
|
26
|
+
this._items = [...initialItems];
|
|
27
|
+
this._keyField = keyField;
|
|
28
|
+
}
|
|
29
|
+
get items() {
|
|
30
|
+
return this._items;
|
|
31
|
+
}
|
|
32
|
+
get keyField() {
|
|
33
|
+
return this._keyField;
|
|
34
|
+
}
|
|
35
|
+
get length() {
|
|
36
|
+
return this._items.length;
|
|
37
|
+
}
|
|
38
|
+
subscribe(listener) {
|
|
39
|
+
if (this.disposed) {
|
|
40
|
+
throw new Error('Cannot subscribe to disposed collection');
|
|
41
|
+
}
|
|
42
|
+
this.listeners.add(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
this.listeners.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
filter(predicate) {
|
|
48
|
+
return new DerivedCollection(this, (items) => items.filter((item, index) => predicate(item, index)));
|
|
49
|
+
}
|
|
50
|
+
sort(comparator) {
|
|
51
|
+
return new DerivedCollection(this, (items) => [...items].sort(comparator));
|
|
52
|
+
}
|
|
53
|
+
map(mapper) {
|
|
54
|
+
return new DerivedCollection(this, (items) => items.map((item, index) => mapper(item, index)));
|
|
55
|
+
}
|
|
56
|
+
slice(start, end) {
|
|
57
|
+
return new DerivedCollection(this, (items) => items.slice(start, end));
|
|
58
|
+
}
|
|
59
|
+
getByKey(keyValue) {
|
|
60
|
+
return this._items.find((item) => this.getKeyValue(item) === keyValue);
|
|
61
|
+
}
|
|
62
|
+
at(index) {
|
|
63
|
+
if (index < 0) {
|
|
64
|
+
return this._items[this._items.length + index];
|
|
65
|
+
}
|
|
66
|
+
return this._items[index];
|
|
67
|
+
}
|
|
68
|
+
find(predicate) {
|
|
69
|
+
return this._items.find((item, index) => predicate(item, index));
|
|
70
|
+
}
|
|
71
|
+
findIndex(predicate) {
|
|
72
|
+
return this._items.findIndex((item, index) => predicate(item, index));
|
|
73
|
+
}
|
|
74
|
+
some(predicate) {
|
|
75
|
+
return this._items.some((item, index) => predicate(item, index));
|
|
76
|
+
}
|
|
77
|
+
every(predicate) {
|
|
78
|
+
return this._items.every((item, index) => predicate(item, index));
|
|
79
|
+
}
|
|
80
|
+
reduce(reducer, initial) {
|
|
81
|
+
return this._items.reduce((acc, item, index) => reducer(acc, item, index), initial);
|
|
82
|
+
}
|
|
83
|
+
add(item) {
|
|
84
|
+
if (this.disposed)
|
|
85
|
+
return;
|
|
86
|
+
const index = this._items.length;
|
|
87
|
+
this._items.push(item);
|
|
88
|
+
this.notify({ type: 'add', index, item, timestamp: Date.now() });
|
|
89
|
+
}
|
|
90
|
+
addMany(items) {
|
|
91
|
+
if (this.disposed || items.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
const startIndex = this._items.length;
|
|
94
|
+
this._items.push(...items);
|
|
95
|
+
// Notify for each added item
|
|
96
|
+
for (let i = 0; i < items.length; i++) {
|
|
97
|
+
this.notify({
|
|
98
|
+
type: 'add',
|
|
99
|
+
index: startIndex + i,
|
|
100
|
+
item: items[i],
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
remove(keyValue) {
|
|
106
|
+
if (this.disposed)
|
|
107
|
+
return false;
|
|
108
|
+
const index = this._items.findIndex((item) => this.getKeyValue(item) === keyValue);
|
|
109
|
+
if (index === -1)
|
|
110
|
+
return false;
|
|
111
|
+
const [item] = this._items.splice(index, 1);
|
|
112
|
+
this.notify({ type: 'remove', index, item, timestamp: Date.now() });
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
removeAt(index) {
|
|
116
|
+
if (this.disposed)
|
|
117
|
+
return undefined;
|
|
118
|
+
if (index < 0 || index >= this._items.length)
|
|
119
|
+
return undefined;
|
|
120
|
+
const [item] = this._items.splice(index, 1);
|
|
121
|
+
this.notify({ type: 'remove', index, item, timestamp: Date.now() });
|
|
122
|
+
return item;
|
|
123
|
+
}
|
|
124
|
+
update(keyValue, updates) {
|
|
125
|
+
if (this.disposed)
|
|
126
|
+
return false;
|
|
127
|
+
const index = this._items.findIndex((item) => this.getKeyValue(item) === keyValue);
|
|
128
|
+
if (index === -1)
|
|
129
|
+
return false;
|
|
130
|
+
const existing = this._items[index];
|
|
131
|
+
if (existing === undefined)
|
|
132
|
+
return false;
|
|
133
|
+
const updated = { ...existing, ...updates };
|
|
134
|
+
this._items[index] = updated;
|
|
135
|
+
this.notify({ type: 'update', index, item: updated, timestamp: Date.now() });
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
replace(index, item) {
|
|
139
|
+
if (this.disposed)
|
|
140
|
+
return;
|
|
141
|
+
if (index < 0 || index >= this._items.length)
|
|
142
|
+
return;
|
|
143
|
+
this._items[index] = item;
|
|
144
|
+
this.notify({ type: 'update', index, item, timestamp: Date.now() });
|
|
145
|
+
}
|
|
146
|
+
reset(items) {
|
|
147
|
+
if (this.disposed)
|
|
148
|
+
return;
|
|
149
|
+
const previousItems = this._items;
|
|
150
|
+
this._items = [...items];
|
|
151
|
+
this.notify({
|
|
152
|
+
type: 'reset',
|
|
153
|
+
index: -1,
|
|
154
|
+
previousItems,
|
|
155
|
+
timestamp: Date.now(),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
clear() {
|
|
159
|
+
this.reset([]);
|
|
160
|
+
}
|
|
161
|
+
move(fromIndex, toIndex) {
|
|
162
|
+
if (this.disposed)
|
|
163
|
+
return;
|
|
164
|
+
if (fromIndex < 0 || fromIndex >= this._items.length)
|
|
165
|
+
return;
|
|
166
|
+
if (toIndex < 0 || toIndex >= this._items.length)
|
|
167
|
+
return;
|
|
168
|
+
if (fromIndex === toIndex)
|
|
169
|
+
return;
|
|
170
|
+
const [item] = this._items.splice(fromIndex, 1);
|
|
171
|
+
if (item === undefined)
|
|
172
|
+
return;
|
|
173
|
+
this._items.splice(toIndex, 0, item);
|
|
174
|
+
this.notify({ type: 'reorder', index: toIndex, item, timestamp: Date.now() });
|
|
175
|
+
}
|
|
176
|
+
dispose() {
|
|
177
|
+
this.disposed = true;
|
|
178
|
+
this.listeners.clear();
|
|
179
|
+
}
|
|
180
|
+
getKeyValue(item) {
|
|
181
|
+
if (typeof item === 'object' && item !== null) {
|
|
182
|
+
return item[this._keyField];
|
|
183
|
+
}
|
|
184
|
+
return item;
|
|
185
|
+
}
|
|
186
|
+
notify(event) {
|
|
187
|
+
const items = this._items;
|
|
188
|
+
for (const listener of this.listeners) {
|
|
189
|
+
try {
|
|
190
|
+
listener(items, event);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// Swallow errors from listeners
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// ============================================================
|
|
199
|
+
// DERIVED COLLECTION IMPLEMENTATION
|
|
200
|
+
// ============================================================
|
|
201
|
+
/**
|
|
202
|
+
* Derived collection that transforms a source collection
|
|
203
|
+
*/
|
|
204
|
+
class DerivedCollection {
|
|
205
|
+
source;
|
|
206
|
+
transform;
|
|
207
|
+
listeners = new Set();
|
|
208
|
+
_items;
|
|
209
|
+
unsubscribe = null;
|
|
210
|
+
disposed = false;
|
|
211
|
+
constructor(source, transform) {
|
|
212
|
+
this.source = source;
|
|
213
|
+
this.transform = transform;
|
|
214
|
+
this._items = transform(source.items);
|
|
215
|
+
// Subscribe to source changes
|
|
216
|
+
this.unsubscribe = source.subscribe(() => {
|
|
217
|
+
this.update();
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
get items() {
|
|
221
|
+
return this._items;
|
|
222
|
+
}
|
|
223
|
+
get keyField() {
|
|
224
|
+
return this.source.keyField;
|
|
225
|
+
}
|
|
226
|
+
get length() {
|
|
227
|
+
return this._items.length;
|
|
228
|
+
}
|
|
229
|
+
subscribe(listener) {
|
|
230
|
+
if (this.disposed) {
|
|
231
|
+
throw new Error('Cannot subscribe to disposed collection');
|
|
232
|
+
}
|
|
233
|
+
this.listeners.add(listener);
|
|
234
|
+
return () => {
|
|
235
|
+
this.listeners.delete(listener);
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
filter(predicate) {
|
|
239
|
+
return new DerivedCollection(this, (items) => items.filter((item, index) => predicate(item, index)));
|
|
240
|
+
}
|
|
241
|
+
sort(comparator) {
|
|
242
|
+
return new DerivedCollection(this, (items) => [...items].sort(comparator));
|
|
243
|
+
}
|
|
244
|
+
map(mapper) {
|
|
245
|
+
return new DerivedCollection(this, (items) => items.map((item, index) => mapper(item, index)));
|
|
246
|
+
}
|
|
247
|
+
slice(start, end) {
|
|
248
|
+
return new DerivedCollection(this, (items) => items.slice(start, end));
|
|
249
|
+
}
|
|
250
|
+
getByKey(keyValue) {
|
|
251
|
+
// Note: For derived collections with map transforms, key lookup may not work as expected
|
|
252
|
+
return this._items.find((item) => {
|
|
253
|
+
if (typeof item === 'object' && item !== null) {
|
|
254
|
+
return item[this.keyField] === keyValue;
|
|
255
|
+
}
|
|
256
|
+
return item === keyValue;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
at(index) {
|
|
260
|
+
if (index < 0) {
|
|
261
|
+
return this._items[this._items.length + index];
|
|
262
|
+
}
|
|
263
|
+
return this._items[index];
|
|
264
|
+
}
|
|
265
|
+
find(predicate) {
|
|
266
|
+
return this._items.find((item, index) => predicate(item, index));
|
|
267
|
+
}
|
|
268
|
+
findIndex(predicate) {
|
|
269
|
+
return this._items.findIndex((item, index) => predicate(item, index));
|
|
270
|
+
}
|
|
271
|
+
some(predicate) {
|
|
272
|
+
return this._items.some((item, index) => predicate(item, index));
|
|
273
|
+
}
|
|
274
|
+
every(predicate) {
|
|
275
|
+
return this._items.every((item, index) => predicate(item, index));
|
|
276
|
+
}
|
|
277
|
+
reduce(reducer, initial) {
|
|
278
|
+
return this._items.reduce((acc, item, index) => reducer(acc, item, index), initial);
|
|
279
|
+
}
|
|
280
|
+
dispose() {
|
|
281
|
+
this.disposed = true;
|
|
282
|
+
this.listeners.clear();
|
|
283
|
+
if (this.unsubscribe) {
|
|
284
|
+
this.unsubscribe();
|
|
285
|
+
this.unsubscribe = null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
update() {
|
|
289
|
+
const previousItems = this._items;
|
|
290
|
+
this._items = this.transform(this.source.items);
|
|
291
|
+
// Notify listeners
|
|
292
|
+
const event = {
|
|
293
|
+
type: 'reset',
|
|
294
|
+
index: -1,
|
|
295
|
+
previousItems,
|
|
296
|
+
timestamp: Date.now(),
|
|
297
|
+
};
|
|
298
|
+
for (const listener of this.listeners) {
|
|
299
|
+
try {
|
|
300
|
+
listener(this._items, event);
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// Swallow errors from listeners
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// ============================================================
|
|
309
|
+
// FACTORY FUNCTIONS
|
|
310
|
+
// ============================================================
|
|
311
|
+
/**
|
|
312
|
+
* Create a reactive collection
|
|
313
|
+
*/
|
|
314
|
+
export function createCollection(initialItems, keyField) {
|
|
315
|
+
return new ReactiveCollection(initialItems, keyField);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Create a read-only collection from existing data
|
|
319
|
+
*/
|
|
320
|
+
export function createReadOnlyCollection(items, keyField = 'id') {
|
|
321
|
+
const collection = new ReactiveCollection(items, keyField);
|
|
322
|
+
// Return interface without mutation methods
|
|
323
|
+
return {
|
|
324
|
+
get items() {
|
|
325
|
+
return collection.items;
|
|
326
|
+
},
|
|
327
|
+
get keyField() {
|
|
328
|
+
return collection.keyField;
|
|
329
|
+
},
|
|
330
|
+
get length() {
|
|
331
|
+
return collection.length;
|
|
332
|
+
},
|
|
333
|
+
subscribe: (listener) => collection.subscribe(listener),
|
|
334
|
+
filter: (predicate) => collection.filter(predicate),
|
|
335
|
+
sort: (comparator) => collection.sort(comparator),
|
|
336
|
+
map: (mapper) => collection.map(mapper),
|
|
337
|
+
slice: (start, end) => collection.slice(start, end),
|
|
338
|
+
getByKey: (keyValue) => collection.getByKey(keyValue),
|
|
339
|
+
at: (index) => collection.at(index),
|
|
340
|
+
find: (predicate) => collection.find(predicate),
|
|
341
|
+
findIndex: (predicate) => collection.findIndex(predicate),
|
|
342
|
+
some: (predicate) => collection.some(predicate),
|
|
343
|
+
every: (predicate) => collection.every(predicate),
|
|
344
|
+
reduce: (reducer, initial) => collection.reduce(reducer, initial),
|
|
345
|
+
dispose: () => collection.dispose(),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Create a collection from an async iterable
|
|
350
|
+
*/
|
|
351
|
+
export async function createCollectionFromAsync(asyncIterable, keyField = 'id') {
|
|
352
|
+
const items = [];
|
|
353
|
+
for await (const item of asyncIterable) {
|
|
354
|
+
items.push(item);
|
|
355
|
+
}
|
|
356
|
+
return new ReactiveCollection(items, keyField);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=collection.js.map
|