@adobe/data 0.1.3 → 0.2.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/.cursorrules +28 -0
- package/.eslintrc.cjs +48 -0
- package/.github/CONTRIBUTING.md +47 -0
- package/CODE_OF_CONDUCT.md +79 -0
- package/LICENSE +21 -0
- package/README.md +2 -2
- package/asconfig.json +22 -0
- package/assembly/index.ts +85 -0
- package/assembly/tsconfig.json +17 -0
- package/c/build_run.sh +2 -0
- package/c/vector_addition +0 -0
- package/c/vector_addition.c +125 -0
- package/{cache/functions/types.js → config/license.js} +0 -2
- package/docs/perftest.html +28 -0
- package/index.html +10 -0
- package/package.json +50 -28
- package/scripts/deploy-docs.sh +41 -0
- package/{assembly-test/assembly.test.js → src/assembly-test/assembly.test.ts} +4 -4
- package/src/cache/async-cache.ts +38 -0
- package/{cache/blob-store.test.js → src/cache/blob-store.test.ts} +41 -7
- package/src/cache/blob-store.ts +278 -0
- package/src/cache/data-cache.test.ts +61 -0
- package/src/cache/data-cache.ts +183 -0
- package/src/cache/expiring-data-cache.test.ts +81 -0
- package/src/cache/expiring-data-cache.ts +61 -0
- package/src/cache/fallback-async-cache.ts +49 -0
- package/src/cache/functions/async-data-function.ts +25 -0
- package/src/cache/functions/functions.test.ts +84 -0
- package/{cache/functions/get-cached.test.js → src/cache/functions/get-cached.test.ts} +24 -7
- package/{cache/functions/get-cached.js → src/cache/functions/get-cached.ts} +12 -6
- package/{cache/functions/hashing/blob-to-hash.js → src/cache/functions/hashing/blob-to-hash.ts} +20 -18
- package/{cache/functions/hashing/buffer-to-hash.js → src/cache/functions/hashing/buffer-to-hash.ts} +7 -7
- package/src/cache/functions/hashing/hashing.test.ts +95 -0
- package/{cache/functions/hashing/index.js → src/cache/functions/hashing/index.ts} +1 -1
- package/{cache/functions/hashing/json-to-hash.js → src/cache/functions/hashing/json-to-hash.ts} +3 -3
- package/{cache/functions/hashing/string-to-hash.js → src/cache/functions/hashing/string-to-hash.ts} +11 -10
- package/{cache/functions/index.js → src/cache/functions/index.ts} +2 -4
- package/{cache/functions/memoize.js → src/cache/functions/memoize.ts} +22 -15
- package/src/cache/functions/prevent-parallel-execution.ts +50 -0
- package/src/cache/get-persistent-cache.ts +62 -0
- package/{cache/index.js → src/cache/index.ts} +9 -3
- package/src/cache/managed-array.ts +243 -0
- package/{cache/managed-async-cache.browser.test.js → src/cache/managed-async-cache.browser.test.ts} +27 -24
- package/src/cache/managed-async-cache.ts +78 -0
- package/src/cache/memory-allocator.ts +176 -0
- package/src/cache/memory-async-cache.ts +51 -0
- package/src/data.ts +38 -0
- package/src/ecs/README.md +21 -0
- package/src/ecs/archetype/archetype.ts +39 -0
- package/src/ecs/archetype/create-archetype.test.ts +115 -0
- package/src/ecs/archetype/create-archetype.ts +52 -0
- package/src/ecs/archetype/delete-row.test.ts +110 -0
- package/src/ecs/archetype/delete-row.ts +37 -0
- package/src/ecs/archetype/index.ts +24 -0
- package/src/ecs/component-schemas.ts +24 -0
- package/src/ecs/core-components.ts +443 -0
- package/src/ecs/database/create-database.test.ts +745 -0
- package/src/ecs/database/create-database.ts +205 -0
- package/src/ecs/database/database.ts +81 -0
- package/src/ecs/database/index.ts +24 -0
- package/src/ecs/database/observe-dependent-value.test.ts +198 -0
- package/src/ecs/database/observe-dependent-value.ts +78 -0
- package/src/ecs/database/transactional-store/create-transactional-store.test.ts +250 -0
- package/src/ecs/database/transactional-store/create-transactional-store.ts +281 -0
- package/{ecs/ecs/ecs-types.js → src/ecs/database/transactional-store/index.ts} +1 -2
- package/src/ecs/database/transactional-store/transactional-store.ts +80 -0
- package/src/ecs/entity-location-table/create-entity-location-table.test.ts +170 -0
- package/src/ecs/entity-location-table/create-entity-location-table.ts +96 -0
- package/src/ecs/entity-location-table/entity-location-table.ts +30 -0
- package/{core/schema/schema.js → src/ecs/entity-location-table/entity-location.ts} +11 -11
- package/src/ecs/entity-location-table/index.ts +23 -0
- package/src/ecs/entity.ts +26 -0
- package/src/ecs/index.ts +26 -0
- package/src/ecs/store/core/core.ts +71 -0
- package/src/ecs/store/core/create-core.test.ts +440 -0
- package/src/ecs/store/core/create-core.ts +168 -0
- package/{cache/async-cache.js → src/ecs/store/core/index.ts} +1 -2
- package/src/ecs/store/create-store.test.ts +562 -0
- package/src/ecs/store/create-store.ts +97 -0
- package/src/ecs/store/index.ts +23 -0
- package/{types/types.js → src/ecs/store/resource-components.ts} +2 -6
- package/src/ecs/store/store.ts +55 -0
- package/src/equals-shallow.test.ts +133 -0
- package/src/equals-shallow.ts +37 -0
- package/src/equals.test.ts +175 -0
- package/src/equals.ts +70 -0
- package/src/index.ts +27 -0
- package/src/internal/array-buffer-like/copy.ts +469 -0
- package/src/internal/array-buffer-like/grow.ts +53 -0
- package/{core/index.js → src/internal/array-buffer-like/index.ts} +4 -4
- package/src/internal/array-buffer-like/is-array-buffer.ts +445 -0
- package/src/internal/array-buffer-like/is-shared-array-buffer.ts +445 -0
- package/{core/functions/is-async-generator.js → src/internal/async-generator/is-async-generator.ts} +2 -2
- package/{core/schema.js → src/internal/data-view-32/create-data-view-32.ts} +8 -11
- package/src/internal/data-view-32/data-view-32.ts +447 -0
- package/{ecs/action-ecs/index.js → src/internal/data-view-32/index.ts} +2 -2
- package/src/internal/function/memoize-factory.ts +12 -0
- package/src/internal/object/index.ts +23 -0
- package/{cache/functions/bind-functions.js → src/internal/object/map-entries.ts} +6 -11
- package/src/internal/promise/is-promise.ts +28 -0
- package/src/internal/typed-array/get-byte-size.ts +50 -0
- package/src/internal/typed-array/index.ts +24 -0
- package/src/internal/typed-array/typed-array-constructer.ts +32 -0
- package/src/internal/typed-array/typed-array.ts +25 -0
- package/src/is-data.ts +47 -0
- package/src/lit/decorators/apply-decorator.ts +24 -0
- package/src/lit/decorators/apply-service-decorators.ts +13 -0
- package/src/lit/decorators/index.ts +24 -0
- package/src/lit/decorators/require-service.ts +19 -0
- package/src/lit/elements/index.ts +3 -0
- package/src/lit/elements/service-application.ts +26 -0
- package/src/lit/elements/service-context.ts +3 -0
- package/src/lit/elements/service-element.ts +18 -0
- package/src/lit/hooks/component/component.ts +10 -0
- package/src/lit/hooks/component/stack.ts +17 -0
- package/src/lit/hooks/index.ts +13 -0
- package/src/lit/hooks/use-connected.ts +39 -0
- package/src/lit/hooks/use-effect.ts +17 -0
- package/src/lit/hooks/use-element.ts +8 -0
- package/src/lit/hooks/use-memo.ts +14 -0
- package/src/lit/hooks/use-observable-values.ts +9 -0
- package/src/lit/hooks/use-observable.ts +13 -0
- package/src/lit/hooks/use-ref.ts +6 -0
- package/src/lit/hooks/use-resize-observer.ts +27 -0
- package/src/lit/hooks/use-state.ts +17 -0
- package/src/lit/hooks/use-window-event.ts +14 -0
- package/src/lit/hooks/with-hooks.ts +20 -0
- package/src/lit/index.ts +3 -0
- package/src/mutable-clone.ts +29 -0
- package/{core/data.test.js → src/normalize.test.ts} +22 -22
- package/src/normalize.ts +37 -0
- package/src/observe/create-observable-event.ts +47 -0
- package/src/observe/create-observable-state.ts +51 -0
- package/src/observe/create-persisted-state.test.ts +143 -0
- package/src/observe/create-persisted-state.ts +60 -0
- package/src/observe/create-query-state.ts +70 -0
- package/{observe/from-array.js → src/observe/from-array.ts} +14 -3
- package/{service/service.js → src/observe/from-constant.ts} +13 -4
- package/{observe/from-element-id.js → src/observe/from-element-id.ts} +44 -39
- package/src/observe/from-element-properties-and-events.ts +47 -0
- package/{observe/from-element-property.js → src/observe/from-element-property.ts} +33 -25
- package/src/observe/from-promise-with-error.ts +51 -0
- package/src/observe/from-promise.ts +49 -0
- package/src/observe/from-properties.ts +67 -0
- package/{observe/index.js → src/observe/index.ts} +4 -1
- package/src/observe/observe.test.ts +467 -0
- package/src/observe/to-promise.ts +40 -0
- package/src/observe/to-properties.ts +41 -0
- package/src/observe/types.ts +40 -0
- package/src/observe/with-async-map.ts +37 -0
- package/src/observe/with-batch.test.ts +141 -0
- package/src/observe/with-batch.ts +67 -0
- package/{core/data.js → src/observe/with-cache.ts} +32 -26
- package/src/observe/with-copy.ts +32 -0
- package/src/observe/with-deduplicate-data.ts +43 -0
- package/src/observe/with-deduplicate.ts +41 -0
- package/src/observe/with-default.ts +48 -0
- package/src/observe/with-lazy.test.ts +68 -0
- package/{core/functions/is-promise.js → src/observe/with-lazy.ts} +17 -5
- package/{observe/with-map-data.js → src/observe/with-map-data.ts} +9 -3
- package/src/observe/with-map.ts +36 -0
- package/src/observe/with-optional.ts +47 -0
- package/src/observe/with-unwrap.ts +54 -0
- package/src/old-ecs/action-ecs/action-ecs.test.ts +420 -0
- package/src/old-ecs/action-ecs/action-ecs.ts +274 -0
- package/src/old-ecs/action-ecs/action-types.ts +178 -0
- package/src/old-ecs/action-ecs/index.ts +29 -0
- package/{service/sequential-action.js → src/old-ecs/action-ecs/sequential-action.ts} +19 -4
- package/src/old-ecs/core-ecs/core-ecs-serialization.test.ts +244 -0
- package/src/old-ecs/core-ecs/core-ecs-types.ts +183 -0
- package/src/old-ecs/core-ecs/core-ecs.test.ts +474 -0
- package/src/old-ecs/core-ecs/core-ecs.ts +640 -0
- package/{core/functions/index.js → src/old-ecs/core-ecs/index.ts} +9 -4
- package/src/old-ecs/ecs/ecs-types.ts +189 -0
- package/src/old-ecs/ecs/ecs-where-functions.ts +95 -0
- package/src/old-ecs/ecs/ecs.test.ts +461 -0
- package/src/old-ecs/ecs/ecs.ts +279 -0
- package/{ecs/core-ecs/core-ecs-types.js → src/old-ecs/ecs/index.ts} +2 -2
- package/src/old-ecs/entity.ts +26 -0
- package/{ecs/index.js → src/old-ecs/index.ts} +1 -1
- package/{ecs/transaction-ecs/index.js → src/old-ecs/transaction-ecs/index.ts} +0 -1
- package/src/old-ecs/transaction-ecs/transaction-ecs.test.ts +725 -0
- package/src/old-ecs/transaction-ecs/transaction-ecs.ts +283 -0
- package/src/old-ecs/transaction-ecs/transaction-types.ts +248 -0
- package/src/old-ecs/transaction-ecs/transactions.ts +243 -0
- package/src/perftest/ecs-perf.ts +255 -0
- package/src/perftest/helper-functions.ts +31 -0
- package/src/perftest/horizon-perf.ts +132 -0
- package/{perftest/index.js → src/perftest/index.ts} +9 -7
- package/src/perftest/perf-test.ts +193 -0
- package/src/perftest/perf.md +90 -0
- package/src/perftest/vanilla-perf.ts +136 -0
- package/src/schema/boolean.ts +5 -0
- package/src/schema/dynamic/deep-merge.test.ts +100 -0
- package/src/schema/dynamic/deep-merge.ts +67 -0
- package/{core/schema/dynamic/enumerate-patches.test.js → src/schema/dynamic/enumerate-patches.test.ts} +49 -23
- package/{core/schema/dynamic/enumerate-patches.js → src/schema/dynamic/enumerate-patches.ts} +44 -4
- package/{core/schema/dynamic/get-dynamic-schema.test.js → src/schema/dynamic/get-dynamic-schema.test.ts} +41 -6
- package/src/schema/dynamic/get-dynamic-schema.ts +48 -0
- package/src/schema/dynamic/index.ts +22 -0
- package/src/schema/f32.ts +30 -0
- package/src/schema/i32.ts +31 -0
- package/src/schema/index.ts +32 -0
- package/{cache/functions/omit.js → src/schema/nullable.ts} +10 -7
- package/src/schema/schema.ts +229 -0
- package/src/schema/time.ts +5 -0
- package/src/schema/true.ts +26 -0
- package/src/schema/tuple.ts +5 -0
- package/src/schema/u32.ts +31 -0
- package/{core/schema/validation/is-valid.test.js → src/schema/validation/is-valid.test.ts} +6 -3
- package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
- package/{core/schema/validation/validate.test.js → src/schema/validation/validate.test.ts} +18 -4
- package/{core/schema/validation/validate.js → src/schema/validation/validate.ts} +9 -6
- package/{core/functions/with-validation.test.js → src/schema/validation/with-validation.test.ts} +28 -12
- package/{core/functions/with-validation.js → src/schema/validation/with-validation.ts} +14 -10
- package/src/schema.test.ts +55 -0
- package/src/service/add-observable-actions.ts +207 -0
- package/{service/index.js → src/service/index.ts} +4 -4
- package/src/service/is-service.ts +7 -0
- package/src/service/progressive-result.ts +141 -0
- package/src/service/service.ts +27 -0
- package/src/table/add-row.ts +42 -0
- package/src/table/create-table.ts +36 -0
- package/src/table/delete-row.ts +42 -0
- package/src/table/ensure-capacity.ts +37 -0
- package/src/table/get-row-data.ts +31 -0
- package/src/table/index.ts +29 -0
- package/src/table/row-index.ts +26 -0
- package/src/table/table.ts +32 -0
- package/src/table/update-row.ts +35 -0
- package/src/tsconfig.json +6 -0
- package/src/typed-buffer/copy-to-gpu-buffer.ts +23 -0
- package/{cache/expiring-data-cache.js → src/typed-buffer/create-array-buffer.ts} +31 -25
- package/src/typed-buffer/create-number-buffer.ts +90 -0
- package/src/typed-buffer/create-struct-buffer.ts +93 -0
- package/src/typed-buffer/create-typed-buffer.ts +49 -0
- package/src/typed-buffer/index.ts +26 -0
- package/src/typed-buffer/structs/assert-struct.ts +37 -0
- package/src/typed-buffer/structs/create-read-struct.test.ts +202 -0
- package/src/typed-buffer/structs/create-read-struct.ts +77 -0
- package/src/typed-buffer/structs/create-write-struct.ts +73 -0
- package/src/typed-buffer/structs/get-field-offset.ts +36 -0
- package/src/typed-buffer/structs/get-struct-layout.test.ts +146 -0
- package/src/typed-buffer/structs/get-struct-layout.ts +222 -0
- package/src/typed-buffer/structs/index.ts +22 -0
- package/src/typed-buffer/structs/read-struct.ts +25 -0
- package/src/typed-buffer/structs/struct-layout.ts +465 -0
- package/src/typed-buffer/structs/write-struct.test.ts +195 -0
- package/src/typed-buffer/structs/write-struct.ts +25 -0
- package/src/typed-buffer/typed-buffer.test.ts +253 -0
- package/src/typed-buffer/typed-buffer.ts +41 -0
- package/src/types/assert.ts +22 -0
- package/src/types/equal.ts +24 -0
- package/{types/index.js → src/types/index.ts} +3 -1
- package/src/types/types.ts +166 -0
- package/tsconfig-base.json +25 -0
- package/tsconfig.json +8 -0
- package/typedoc.json +22 -0
- package/vite.config.js +16 -0
- package/assembly/index.d.ts +0 -30
- package/assembly/index.js +0 -18
- package/assembly/index.wasm +0 -0
- package/assembly/index.wasm.map +0 -1
- package/assembly-test/assembly.test.d.ts +0 -1
- package/assembly-test/assembly.test.js.map +0 -1
- package/cache/async-cache.d.ts +0 -15
- package/cache/async-cache.js.map +0 -1
- package/cache/blob-store.d.ts +0 -94
- package/cache/blob-store.js +0 -191
- package/cache/blob-store.js.map +0 -1
- package/cache/blob-store.test.d.ts +0 -1
- package/cache/blob-store.test.js.map +0 -1
- package/cache/data-cache.d.ts +0 -38
- package/cache/data-cache.js +0 -96
- package/cache/data-cache.js.map +0 -1
- package/cache/data-cache.test.d.ts +0 -1
- package/cache/data-cache.test.js +0 -50
- package/cache/data-cache.test.js.map +0 -1
- package/cache/expiring-data-cache.d.ts +0 -6
- package/cache/expiring-data-cache.js.map +0 -1
- package/cache/expiring-data-cache.test.d.ts +0 -1
- package/cache/expiring-data-cache.test.js +0 -62
- package/cache/expiring-data-cache.test.js.map +0 -1
- package/cache/fallback-async-cache.d.ts +0 -7
- package/cache/fallback-async-cache.js +0 -22
- package/cache/fallback-async-cache.js.map +0 -1
- package/cache/functions/bind-functions.d.ts +0 -6
- package/cache/functions/bind-functions.js.map +0 -1
- package/cache/functions/functions.test.d.ts +0 -1
- package/cache/functions/functions.test.js +0 -79
- package/cache/functions/functions.test.js.map +0 -1
- package/cache/functions/get-cached.d.ts +0 -11
- package/cache/functions/get-cached.js.map +0 -1
- package/cache/functions/get-cached.test.d.ts +0 -1
- package/cache/functions/get-cached.test.js.map +0 -1
- package/cache/functions/hashing/blob-to-hash.d.ts +0 -4
- package/cache/functions/hashing/blob-to-hash.js.map +0 -1
- package/cache/functions/hashing/buffer-to-hash.d.ts +0 -4
- package/cache/functions/hashing/buffer-to-hash.js.map +0 -1
- package/cache/functions/hashing/hashing.test.d.ts +0 -1
- package/cache/functions/hashing/hashing.test.js +0 -95
- package/cache/functions/hashing/hashing.test.js.map +0 -1
- package/cache/functions/hashing/index.d.ts +0 -4
- package/cache/functions/hashing/index.js.map +0 -1
- package/cache/functions/hashing/json-to-hash.d.ts +0 -4
- package/cache/functions/hashing/json-to-hash.js.map +0 -1
- package/cache/functions/hashing/string-to-hash.d.ts +0 -4
- package/cache/functions/hashing/string-to-hash.js.map +0 -1
- package/cache/functions/index.d.ts +0 -5
- package/cache/functions/index.js.map +0 -1
- package/cache/functions/memoize.d.ts +0 -12
- package/cache/functions/memoize.js.map +0 -1
- package/cache/functions/omit.d.ts +0 -1
- package/cache/functions/omit.js.map +0 -1
- package/cache/functions/prevent-parallel-execution.d.ts +0 -7
- package/cache/functions/prevent-parallel-execution.js +0 -25
- package/cache/functions/prevent-parallel-execution.js.map +0 -1
- package/cache/functions/types.d.ts +0 -1
- package/cache/functions/types.js.map +0 -1
- package/cache/get-persistent-cache.d.ts +0 -12
- package/cache/get-persistent-cache.js +0 -23
- package/cache/get-persistent-cache.js.map +0 -1
- package/cache/index.d.ts +0 -3
- package/cache/index.js.map +0 -1
- package/cache/managed-array.d.ts +0 -23
- package/cache/managed-array.js +0 -160
- package/cache/managed-array.js.map +0 -1
- package/cache/managed-async-cache.browser.test.d.ts +0 -1
- package/cache/managed-async-cache.browser.test.js.map +0 -1
- package/cache/managed-async-cache.d.ts +0 -4
- package/cache/managed-async-cache.js +0 -45
- package/cache/managed-async-cache.js.map +0 -1
- package/cache/memory-allocator.d.ts +0 -23
- package/cache/memory-allocator.js +0 -94
- package/cache/memory-allocator.js.map +0 -1
- package/cache/memory-async-cache.d.ts +0 -6
- package/cache/memory-async-cache.js +0 -23
- package/cache/memory-async-cache.js.map +0 -1
- package/core/data.d.ts +0 -22
- package/core/data.js.map +0 -1
- package/core/data.test.d.ts +0 -1
- package/core/data.test.js.map +0 -1
- package/core/functions/array-equals.d.ts +0 -1
- package/core/functions/array-equals.js.map +0 -1
- package/core/functions/deep-merge.d.ts +0 -32
- package/core/functions/deep-merge.js +0 -54
- package/core/functions/deep-merge.js.map +0 -1
- package/core/functions/deep-merge.test.d.ts +0 -1
- package/core/functions/deep-merge.test.js +0 -94
- package/core/functions/deep-merge.test.js.map +0 -1
- package/core/functions/index.d.ts +0 -3
- package/core/functions/index.js.map +0 -1
- package/core/functions/is-async-generator.d.ts +0 -1
- package/core/functions/is-async-generator.js.map +0 -1
- package/core/functions/is-promise.d.ts +0 -1
- package/core/functions/is-promise.js.map +0 -1
- package/core/functions/with-validation.d.ts +0 -5
- package/core/functions/with-validation.js.map +0 -1
- package/core/functions/with-validation.test.d.ts +0 -1
- package/core/functions/with-validation.test.js.map +0 -1
- package/core/index.d.ts +0 -3
- package/core/index.js.map +0 -1
- package/core/schema/dynamic/dynamic-schema.d.ts +0 -27
- package/core/schema/dynamic/dynamic-schema.js +0 -2
- package/core/schema/dynamic/dynamic-schema.js.map +0 -1
- package/core/schema/dynamic/enumerate-patches.d.ts +0 -9
- package/core/schema/dynamic/enumerate-patches.js.map +0 -1
- package/core/schema/dynamic/enumerate-patches.test.d.ts +0 -134
- package/core/schema/dynamic/enumerate-patches.test.js.map +0 -1
- package/core/schema/dynamic/get-dynamic-schema.d.ts +0 -5
- package/core/schema/dynamic/get-dynamic-schema.js +0 -26
- package/core/schema/dynamic/get-dynamic-schema.js.map +0 -1
- package/core/schema/dynamic/get-dynamic-schema.test.d.ts +0 -1
- package/core/schema/dynamic/get-dynamic-schema.test.js.map +0 -1
- package/core/schema/dynamic/index.d.ts +0 -1
- package/core/schema/dynamic/index.js +0 -2
- package/core/schema/dynamic/index.js.map +0 -1
- package/core/schema/dynamic/schema-path-value-path.d.ts +0 -5
- package/core/schema/dynamic/schema-path-value-path.js +0 -12
- package/core/schema/dynamic/schema-path-value-path.js.map +0 -1
- package/core/schema/dynamic-schema.d.ts +0 -27
- package/core/schema/dynamic-schema.js +0 -2
- package/core/schema/dynamic-schema.js.map +0 -1
- package/core/schema/index.d.ts +0 -4
- package/core/schema/index.js +0 -26
- package/core/schema/index.js.map +0 -1
- package/core/schema/schema.d.ts +0 -122
- package/core/schema/schema.js.map +0 -1
- package/core/schema/schemas.d.ts +0 -45
- package/core/schema/schemas.js +0 -39
- package/core/schema/schemas.js.map +0 -1
- package/core/schema/ui-schema.d.ts +0 -25
- package/core/schema/ui-schema.js +0 -2
- package/core/schema/ui-schema.js.map +0 -1
- package/core/schema/validation/is-valid.d.ts +0 -2
- package/core/schema/validation/is-valid.js +0 -14
- package/core/schema/validation/is-valid.js.map +0 -1
- package/core/schema/validation/is-valid.test.d.ts +0 -1
- package/core/schema/validation/is-valid.test.js.map +0 -1
- package/core/schema/validation/validate.d.ts +0 -2
- package/core/schema/validation/validate.js.map +0 -1
- package/core/schema/validation/validate.test.d.ts +0 -1
- package/core/schema/validation/validate.test.js.map +0 -1
- package/core/schema/validation/with-validation.d.ts +0 -5
- package/core/schema/validation/with-validation.js +0 -16
- package/core/schema/validation/with-validation.js.map +0 -1
- package/core/schema/validation/with-validation.test.d.ts +0 -1
- package/core/schema/validation/with-validation.test.js +0 -96
- package/core/schema/validation/with-validation.test.js.map +0 -1
- package/core/schema.d.ts +0 -86
- package/core/schema.js.map +0 -1
- package/core/schema.test.d.ts +0 -1
- package/core/schema.test.js +0 -16
- package/core/schema.test.js.map +0 -1
- package/core/schemas.d.ts +0 -45
- package/core/schemas.js +0 -39
- package/core/schemas.js.map +0 -1
- package/ecs/action-ecs/action-ecs.d.ts +0 -19
- package/ecs/action-ecs/action-ecs.js +0 -203
- package/ecs/action-ecs/action-ecs.js.map +0 -1
- package/ecs/action-ecs/action-ecs.test.d.ts +0 -1
- package/ecs/action-ecs/action-ecs.test.js +0 -362
- package/ecs/action-ecs/action-ecs.test.js.map +0 -1
- package/ecs/action-ecs/action-types.d.ts +0 -106
- package/ecs/action-ecs/action-types.js +0 -19
- package/ecs/action-ecs/action-types.js.map +0 -1
- package/ecs/action-ecs/index.d.ts +0 -2
- package/ecs/action-ecs/index.js.map +0 -1
- package/ecs/core-ecs/core-ecs-serialization.test.d.ts +0 -1
- package/ecs/core-ecs/core-ecs-serialization.test.js +0 -230
- package/ecs/core-ecs/core-ecs-serialization.test.js.map +0 -1
- package/ecs/core-ecs/core-ecs-types.d.ts +0 -141
- package/ecs/core-ecs/core-ecs-types.js.map +0 -1
- package/ecs/core-ecs/core-ecs.d.ts +0 -7
- package/ecs/core-ecs/core-ecs.js +0 -492
- package/ecs/core-ecs/core-ecs.js.map +0 -1
- package/ecs/core-ecs/core-ecs.test.d.ts +0 -1
- package/ecs/core-ecs/core-ecs.test.js +0 -425
- package/ecs/core-ecs/core-ecs.test.js.map +0 -1
- package/ecs/core-ecs/index.d.ts +0 -1
- package/ecs/core-ecs/index.js +0 -2
- package/ecs/core-ecs/index.js.map +0 -1
- package/ecs/ecs/ecs-types.d.ts +0 -132
- package/ecs/ecs/ecs-types.js.map +0 -1
- package/ecs/ecs/ecs-where-functions.d.ts +0 -6
- package/ecs/ecs/ecs-where-functions.js +0 -91
- package/ecs/ecs/ecs-where-functions.js.map +0 -1
- package/ecs/ecs/ecs.d.ts +0 -13
- package/ecs/ecs/ecs.js +0 -177
- package/ecs/ecs/ecs.js.map +0 -1
- package/ecs/ecs/ecs.test.d.ts +0 -1
- package/ecs/ecs/ecs.test.js +0 -399
- package/ecs/ecs/ecs.test.js.map +0 -1
- package/ecs/ecs/index.d.ts +0 -3
- package/ecs/ecs/index.js +0 -3
- package/ecs/ecs/index.js.map +0 -1
- package/ecs/index.d.ts +0 -4
- package/ecs/index.js.map +0 -1
- package/ecs/transaction-ecs/index.d.ts +0 -2
- package/ecs/transaction-ecs/index.js.map +0 -1
- package/ecs/transaction-ecs/transaction-ecs.d.ts +0 -11
- package/ecs/transaction-ecs/transaction-ecs.js +0 -184
- package/ecs/transaction-ecs/transaction-ecs.js.map +0 -1
- package/ecs/transaction-ecs/transaction-ecs.test.d.ts +0 -1
- package/ecs/transaction-ecs/transaction-ecs.test.js +0 -599
- package/ecs/transaction-ecs/transaction-ecs.test.js.map +0 -1
- package/ecs/transaction-ecs/transaction-types.d.ts +0 -135
- package/ecs/transaction-ecs/transaction-types.js +0 -2
- package/ecs/transaction-ecs/transaction-types.js.map +0 -1
- package/ecs/transaction-ecs/transactions.d.ts +0 -5
- package/ecs/transaction-ecs/transactions.js +0 -158
- package/ecs/transaction-ecs/transactions.js.map +0 -1
- package/index.d.ts +0 -1
- package/index.js +0 -23
- package/index.js.map +0 -1
- package/observe/create-observable-event.d.ts +0 -10
- package/observe/create-observable-event.js +0 -22
- package/observe/create-observable-event.js.map +0 -1
- package/observe/create-observable-state.d.ts +0 -7
- package/observe/create-observable-state.js +0 -27
- package/observe/create-observable-state.js.map +0 -1
- package/observe/create-persisted-state.d.ts +0 -11
- package/observe/create-persisted-state.js +0 -31
- package/observe/create-persisted-state.js.map +0 -1
- package/observe/create-persisted-state.test.d.ts +0 -1
- package/observe/create-persisted-state.test.js +0 -124
- package/observe/create-persisted-state.test.js.map +0 -1
- package/observe/from-array.d.ts +0 -5
- package/observe/from-array.js.map +0 -1
- package/observe/from-constant.d.ts +0 -5
- package/observe/from-constant.js +0 -12
- package/observe/from-constant.js.map +0 -1
- package/observe/from-element-id.d.ts +0 -7
- package/observe/from-element-id.js.map +0 -1
- package/observe/from-element-properties-and-events.d.ts +0 -2
- package/observe/from-element-properties-and-events.js +0 -18
- package/observe/from-element-properties-and-events.js.map +0 -1
- package/observe/from-element-property.d.ts +0 -11
- package/observe/from-element-property.js.map +0 -1
- package/observe/from-promise-with-error.d.ts +0 -7
- package/observe/from-promise-with-error.js +0 -27
- package/observe/from-promise-with-error.js.map +0 -1
- package/observe/from-promise.d.ts +0 -6
- package/observe/from-promise.js +0 -22
- package/observe/from-promise.js.map +0 -1
- package/observe/from-properties.d.ts +0 -10
- package/observe/from-properties.js +0 -33
- package/observe/from-properties.js.map +0 -1
- package/observe/index.d.ts +0 -27
- package/observe/index.js.map +0 -1
- package/observe/observe.test.d.ts +0 -7
- package/observe/observe.test.js +0 -417
- package/observe/observe.test.js.map +0 -1
- package/observe/to-promise.d.ts +0 -8
- package/observe/to-promise.js +0 -18
- package/observe/to-promise.js.map +0 -1
- package/observe/to-properties.d.ts +0 -11
- package/observe/to-properties.js +0 -9
- package/observe/to-properties.js.map +0 -1
- package/observe/types.d.ts +0 -17
- package/observe/types.js +0 -2
- package/observe/types.js.map +0 -1
- package/observe/with-async-map.d.ts +0 -6
- package/observe/with-async-map.js +0 -12
- package/observe/with-async-map.js.map +0 -1
- package/observe/with-cache.d.ts +0 -6
- package/observe/with-cache.js +0 -33
- package/observe/with-cache.js.map +0 -1
- package/observe/with-copy.d.ts +0 -5
- package/observe/with-copy.js +0 -10
- package/observe/with-copy.js.map +0 -1
- package/observe/with-deduplicate-data.d.ts +0 -7
- package/observe/with-deduplicate-data.js +0 -18
- package/observe/with-deduplicate-data.js.map +0 -1
- package/observe/with-deduplicate.d.ts +0 -6
- package/observe/with-deduplicate.js +0 -19
- package/observe/with-deduplicate.js.map +0 -1
- package/observe/with-default.d.ts +0 -6
- package/observe/with-default.js +0 -21
- package/observe/with-default.js.map +0 -1
- package/observe/with-map-data.d.ts +0 -7
- package/observe/with-map-data.js.map +0 -1
- package/observe/with-map.d.ts +0 -5
- package/observe/with-map.js +0 -11
- package/observe/with-map.js.map +0 -1
- package/observe/with-optional.d.ts +0 -5
- package/observe/with-optional.js +0 -20
- package/observe/with-optional.js.map +0 -1
- package/observe/with-unwrap.d.ts +0 -5
- package/observe/with-unwrap.js +0 -26
- package/observe/with-unwrap.js.map +0 -1
- package/perftest/ecs-perf.d.ts +0 -49
- package/perftest/ecs-perf.js +0 -230
- package/perftest/ecs-perf.js.map +0 -1
- package/perftest/helper-functions.d.ts +0 -1
- package/perftest/helper-functions.js +0 -31
- package/perftest/helper-functions.js.map +0 -1
- package/perftest/horizon-perf.d.ts +0 -22
- package/perftest/horizon-perf.js +0 -126
- package/perftest/horizon-perf.js.map +0 -1
- package/perftest/index.d.ts +0 -1
- package/perftest/index.js.map +0 -1
- package/perftest/perf-test.d.ts +0 -18
- package/perftest/perf-test.js +0 -124
- package/perftest/perf-test.js.map +0 -1
- package/perftest/vanilla-perf.d.ts +0 -38
- package/perftest/vanilla-perf.js +0 -128
- package/perftest/vanilla-perf.js.map +0 -1
- package/schemas/index.d.ts +0 -1
- package/schemas/index.js +0 -23
- package/schemas/index.js.map +0 -1
- package/schemas/schemas.d.ts +0 -45
- package/schemas/schemas.js +0 -39
- package/schemas/schemas.js.map +0 -1
- package/service/add-observable-actions.d.ts +0 -29
- package/service/add-observable-actions.js +0 -108
- package/service/add-observable-actions.js.map +0 -1
- package/service/index.d.ts +0 -4
- package/service/index.js.map +0 -1
- package/service/progressive-result.d.ts +0 -96
- package/service/progressive-result.js +0 -99
- package/service/progressive-result.js.map +0 -1
- package/service/sequential-action.d.ts +0 -18
- package/service/sequential-action.js.map +0 -1
- package/service/service.d.ts +0 -4
- package/service/service.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -1
- package/types/index.d.ts +0 -1
- package/types/index.js.map +0 -1
- package/types/types.d.ts +0 -61
- package/types/types.js.map +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { Notify, Observe } from "./types.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates a simple state observe function and a setValue function to update the value.
|
|
26
|
+
* When observed, the current state if any will be immediately and synchronously sent to the observer callback.
|
|
27
|
+
* @param initialValue The initial value of the state.
|
|
28
|
+
*/
|
|
29
|
+
export function createObservableState<T>(
|
|
30
|
+
initialValue?: T
|
|
31
|
+
): [Observe<T>, (value: T) => void] {
|
|
32
|
+
let value: T | undefined = initialValue;
|
|
33
|
+
const observers = new Set<Notify<T>>();
|
|
34
|
+
return [
|
|
35
|
+
(observer) => {
|
|
36
|
+
observers.add(observer);
|
|
37
|
+
if (value !== undefined) {
|
|
38
|
+
observer(value);
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
observers.delete(observer);
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
(newValue) => {
|
|
45
|
+
value = newValue;
|
|
46
|
+
for (const observer of observers) {
|
|
47
|
+
observer(newValue);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { assert } from 'riteway/vitest';
|
|
23
|
+
import { describe, test, beforeEach } from 'vitest';
|
|
24
|
+
import { createPersistedState } from './create-persisted-state.js';
|
|
25
|
+
|
|
26
|
+
describe('createPersistedState', () => {
|
|
27
|
+
// Mock storage implementation
|
|
28
|
+
class MockStorage implements Storage {
|
|
29
|
+
private store: Record<string, string> = {};
|
|
30
|
+
getItem(key: string): string | null {
|
|
31
|
+
return this.store[key] || null;
|
|
32
|
+
}
|
|
33
|
+
setItem(key: string, value: string): void {
|
|
34
|
+
this.store[key] = value;
|
|
35
|
+
}
|
|
36
|
+
clear(): void {
|
|
37
|
+
this.store = {};
|
|
38
|
+
}
|
|
39
|
+
removeItem(key: string): void {
|
|
40
|
+
delete this.store[key];
|
|
41
|
+
}
|
|
42
|
+
key(index: number): string | null {
|
|
43
|
+
return Object.keys(this.store)[index] || null;
|
|
44
|
+
}
|
|
45
|
+
get length(): number {
|
|
46
|
+
return Object.keys(this.store).length;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let mockStorage: Storage;
|
|
51
|
+
|
|
52
|
+
beforeEach(() => {
|
|
53
|
+
mockStorage = new MockStorage();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('should initialize with initial value when storage is empty', () => {
|
|
57
|
+
const [observe, setter] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
58
|
+
|
|
59
|
+
let observedValue: number | undefined;
|
|
60
|
+
observe((value) => {
|
|
61
|
+
observedValue = value;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
assert({
|
|
65
|
+
given: 'initial value with empty storage',
|
|
66
|
+
should: 'use provided initial value',
|
|
67
|
+
actual: observedValue,
|
|
68
|
+
expected: 42,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('should persist value updates to storage', () => {
|
|
73
|
+
const [_observe, setter] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
74
|
+
|
|
75
|
+
setter(100);
|
|
76
|
+
|
|
77
|
+
assert({
|
|
78
|
+
given: 'value update',
|
|
79
|
+
should: 'persist to storage',
|
|
80
|
+
actual: JSON.parse(mockStorage.getItem('test-key') || 'null'),
|
|
81
|
+
expected: 100,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('should load existing value from storage', () => {
|
|
86
|
+
// First create and set a value
|
|
87
|
+
const [_observe1, setter1] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
88
|
+
setter1(100);
|
|
89
|
+
|
|
90
|
+
// Create new observe function with same key but different initial value
|
|
91
|
+
const [observe2, _setter2] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
92
|
+
|
|
93
|
+
let observedValue: number | undefined;
|
|
94
|
+
observe2((value) => {
|
|
95
|
+
observedValue = value;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
assert({
|
|
99
|
+
given: 'existing value in storage',
|
|
100
|
+
should: 'use stored value instead of initial value',
|
|
101
|
+
actual: observedValue,
|
|
102
|
+
expected: 100,
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('should handle invalid JSON in storage', () => {
|
|
107
|
+
mockStorage.setItem('test-key', 'invalid-json');
|
|
108
|
+
|
|
109
|
+
const [observe, _setter] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
110
|
+
|
|
111
|
+
let observedValue: number | undefined;
|
|
112
|
+
observe((value) => {
|
|
113
|
+
observedValue = value;
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
assert({
|
|
117
|
+
given: 'invalid JSON in storage',
|
|
118
|
+
should: 'fall back to initial value',
|
|
119
|
+
actual: observedValue,
|
|
120
|
+
expected: 42,
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('should notify multiple observers of updates', () => {
|
|
125
|
+
const [observe, setter] = createPersistedState('test-key', 42 as number, mockStorage);
|
|
126
|
+
|
|
127
|
+
const observed: number[] = [];
|
|
128
|
+
const observed2: number[] = [];
|
|
129
|
+
|
|
130
|
+
observe((value) => observed.push(value));
|
|
131
|
+
observe((value) => observed2.push(value));
|
|
132
|
+
|
|
133
|
+
setter(100);
|
|
134
|
+
setter(200);
|
|
135
|
+
|
|
136
|
+
assert({
|
|
137
|
+
given: 'multiple observers',
|
|
138
|
+
should: 'notify all observers of updates',
|
|
139
|
+
actual: [observed, observed2],
|
|
140
|
+
expected: [[42, 100, 200], [42, 100, 200]],
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { Data } from "../index.js";
|
|
23
|
+
import { createObservableState } from "./create-observable-state.js";
|
|
24
|
+
import { Observe } from "./types.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Creates a simple state observable that also returns a function to update the value.
|
|
28
|
+
* The state is persisted to the provided storage.
|
|
29
|
+
* Since this is stored in localStorage or sessionStorage it should not be used for large data.
|
|
30
|
+
* @param key The key to use for storage.
|
|
31
|
+
* @param initialValue The initial value of the state.
|
|
32
|
+
* @param storage The storage to use for persistence.
|
|
33
|
+
*/
|
|
34
|
+
export function createPersistedState<T extends Data>(
|
|
35
|
+
key: string,
|
|
36
|
+
initialValue?: T,
|
|
37
|
+
storage = localStorage
|
|
38
|
+
): [Observe<T>, (value: T) => void] {
|
|
39
|
+
// Try to load initial state from storage
|
|
40
|
+
let storedValue: T | undefined;
|
|
41
|
+
const storedData = storage.getItem(key);
|
|
42
|
+
if (storedData) {
|
|
43
|
+
try {
|
|
44
|
+
storedValue = JSON.parse(storedData) as T;
|
|
45
|
+
} catch (e) {
|
|
46
|
+
console.warn(`Error parsing stored data for key ${key}:`, e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Create observable state with either stored or initial value
|
|
51
|
+
const [observable, setValue] = createObservableState(storedValue ?? initialValue);
|
|
52
|
+
|
|
53
|
+
// Wrap setValue to persist changes to storage
|
|
54
|
+
const setValueAndStore = (value: T) => {
|
|
55
|
+
setValue(value);
|
|
56
|
+
storage.setItem(key, JSON.stringify(value));
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
return [observable, setValueAndStore];
|
|
60
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Data } from "../data.js";
|
|
2
|
+
import { createObservableState } from "./create-observable-state.js";
|
|
3
|
+
import { Observe } from "./types.js";
|
|
4
|
+
|
|
5
|
+
type SetValue<T> = (value: T) => void;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates an observable state that syncs with URL query parameters.
|
|
9
|
+
* @param key - The query parameter key to use
|
|
10
|
+
* @param initialValue - The initial value if no query parameter exists
|
|
11
|
+
* @param options - Configuration options
|
|
12
|
+
* @returns A tuple containing the observe function and the setValue function
|
|
13
|
+
*/
|
|
14
|
+
export const createQueryState = <T extends Data>(
|
|
15
|
+
key: string,
|
|
16
|
+
initialValue: T,
|
|
17
|
+
options: {
|
|
18
|
+
serialize?: (value: T) => string;
|
|
19
|
+
deserialize?: (value: string) => T;
|
|
20
|
+
replaceState?: boolean;
|
|
21
|
+
} = {}
|
|
22
|
+
): [Observe<T>, SetValue<T>] => {
|
|
23
|
+
const {
|
|
24
|
+
serialize = (v) => JSON.stringify(v),
|
|
25
|
+
deserialize = (v) => JSON.parse(v),
|
|
26
|
+
replaceState = false
|
|
27
|
+
} = options;
|
|
28
|
+
|
|
29
|
+
// Get initial value from URL if it exists
|
|
30
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
31
|
+
const urlValue = urlParams.get(key);
|
|
32
|
+
const initial = urlValue ? deserialize(urlValue) : initialValue;
|
|
33
|
+
|
|
34
|
+
// Create the observable state
|
|
35
|
+
const [observe, setValue] = createObservableState<T>(initial);
|
|
36
|
+
|
|
37
|
+
// Create a wrapped setValue that updates both state and URL
|
|
38
|
+
const setQueryValue: SetValue<T> = (newValue: T) => {
|
|
39
|
+
setValue(newValue);
|
|
40
|
+
|
|
41
|
+
const url = new URL(window.location.href);
|
|
42
|
+
const serialized = serialize(newValue);
|
|
43
|
+
|
|
44
|
+
if (serialized === serialize(initialValue)) {
|
|
45
|
+
url.searchParams.delete(key);
|
|
46
|
+
} else {
|
|
47
|
+
url.searchParams.set(key, serialized);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Update URL without page reload
|
|
51
|
+
if (replaceState) {
|
|
52
|
+
window.history.replaceState({}, '', url.toString());
|
|
53
|
+
} else {
|
|
54
|
+
window.history.pushState({}, '', url.toString());
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Listen for browser back/forward navigation
|
|
59
|
+
window.addEventListener('popstate', () => {
|
|
60
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
61
|
+
const urlValue = urlParams.get(key);
|
|
62
|
+
if (urlValue) {
|
|
63
|
+
setValue(deserialize(urlValue));
|
|
64
|
+
} else {
|
|
65
|
+
setValue(initialValue);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return [observe, setQueryValue];
|
|
70
|
+
};
|
|
@@ -20,11 +20,22 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.*/
|
|
22
22
|
import { fromProperties } from "./from-properties.js";
|
|
23
|
+
import { Observe } from "./types.js";
|
|
23
24
|
import { withMap } from "./with-map.js";
|
|
25
|
+
|
|
24
26
|
/**
|
|
25
27
|
* Given an array of observe functions, returns a single observe function that will yield an array of each value.
|
|
26
28
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
|
|
30
|
+
export function fromArray<T>(
|
|
31
|
+
observeFunctions: Observe<T>[]
|
|
32
|
+
): Observe<T[]> {
|
|
33
|
+
return withMap(
|
|
34
|
+
fromProperties(
|
|
35
|
+
Object.fromEntries(
|
|
36
|
+
observeFunctions.map((observable, index) => [index.toString(), observable])
|
|
37
|
+
)
|
|
38
|
+
),
|
|
39
|
+
(values) => Object.values(values)
|
|
40
|
+
);
|
|
29
41
|
}
|
|
30
|
-
//# sourceMappingURL=from-array.js.map
|
|
@@ -19,8 +19,17 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
import { Observe } from "./types.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Converts a constant value into an Observe<T> function.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export function fromConstant<T>(value: T): Observe<T> {
|
|
29
|
+
return (observer) => {
|
|
30
|
+
observer(value);
|
|
31
|
+
return () => {
|
|
32
|
+
// deliberately empty.
|
|
33
|
+
};
|
|
34
|
+
};
|
|
25
35
|
}
|
|
26
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -20,51 +20,56 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.*/
|
|
22
22
|
import { fromConstant } from "./from-constant.js";
|
|
23
|
+
import { Observe } from "./types.js";
|
|
24
|
+
|
|
23
25
|
/**
|
|
24
26
|
* Uses DOM MutationObserver to watch for the addition or removal of an element with a specific id.
|
|
25
27
|
* @param id The id of the element to watch for.
|
|
26
28
|
* @returns a new Observe<Element | null> which yields null if element does not exist.
|
|
27
29
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (node.id === id) {
|
|
54
|
-
changed = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
30
|
+
|
|
31
|
+
export function fromElementId<T extends HTMLElement = HTMLElement>(
|
|
32
|
+
ancestor: HTMLElement | ShadowRoot,
|
|
33
|
+
id: string
|
|
34
|
+
): Observe<T | null> {
|
|
35
|
+
if (id === "") {
|
|
36
|
+
return fromConstant(null);
|
|
37
|
+
}
|
|
38
|
+
return (observer) => {
|
|
39
|
+
let lastElement: T | null = null;
|
|
40
|
+
const notify = () => {
|
|
41
|
+
const newElement = document.getElementById(id) as T | null;
|
|
42
|
+
if (!lastElement || newElement !== lastElement) {
|
|
43
|
+
lastElement = newElement;
|
|
44
|
+
observer(newElement);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
notify();
|
|
48
|
+
const mutationObserver = new MutationObserver((mutations) => {
|
|
49
|
+
let changed = false;
|
|
50
|
+
for (const mutation of mutations) {
|
|
51
|
+
if (mutation.type === "childList") {
|
|
52
|
+
for (const node of mutation.addedNodes) {
|
|
53
|
+
if ((node as T).id === id) {
|
|
54
|
+
changed = true;
|
|
59
55
|
}
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
}
|
|
57
|
+
if (!changed) {
|
|
58
|
+
for (const node of mutation.removedNodes) {
|
|
59
|
+
if ((node as T).id === id) {
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (changed) {
|
|
67
|
+
notify();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
mutationObserver.observe(ancestor, { childList: true, subtree: true });
|
|
71
|
+
return () => {
|
|
72
|
+
mutationObserver.disconnect();
|
|
68
73
|
};
|
|
74
|
+
};
|
|
69
75
|
}
|
|
70
|
-
//# sourceMappingURL=from-element-id.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { Observe } from "./types.js";
|
|
23
|
+
|
|
24
|
+
// private helper function to create an observable from an element property and events.
|
|
25
|
+
export function fromElementPropertyAndEvents<
|
|
26
|
+
T extends HTMLElement,
|
|
27
|
+
K extends keyof T,
|
|
28
|
+
E extends keyof HTMLElementEventMap,
|
|
29
|
+
>(element: T, property: K, events: E[]): Observe<T[K]> {
|
|
30
|
+
return (observer) => {
|
|
31
|
+
const listener = () => {
|
|
32
|
+
observer(element[property]);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
for (const event of events) {
|
|
36
|
+
element.addEventListener(event, listener);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
observer(element[property]);
|
|
40
|
+
|
|
41
|
+
return () => {
|
|
42
|
+
for (const event of events) {
|
|
43
|
+
element.removeEventListener(event, listener);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -20,26 +20,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.*/
|
|
22
22
|
import { fromElementPropertyAndEvents } from "./from-element-properties-and-events.js";
|
|
23
|
+
import { Observe } from "./types.js";
|
|
24
|
+
|
|
23
25
|
// private helper function to create an observable from an element property and a mutation observer.
|
|
24
|
-
function fromElementPropertyAndMutationObserver
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
function fromElementPropertyAndMutationObserver<
|
|
27
|
+
T extends HTMLElement,
|
|
28
|
+
K extends keyof T,
|
|
29
|
+
>(element: T, property: K): Observe<T[K]> {
|
|
30
|
+
return (observer) => {
|
|
31
|
+
observer(element[property]);
|
|
32
|
+
const mutationObserver = new MutationObserver((mutations) => {
|
|
33
|
+
// this should only be called when the property changes.
|
|
34
|
+
// check that this specific property was changed
|
|
35
|
+
for (const mutation of mutations) {
|
|
36
|
+
if (mutation.attributeName === property) {
|
|
37
|
+
observer(element[property]);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
mutationObserver.observe(element, { attributes: true });
|
|
43
|
+
return () => {
|
|
44
|
+
mutationObserver.disconnect();
|
|
41
45
|
};
|
|
46
|
+
};
|
|
42
47
|
}
|
|
48
|
+
|
|
43
49
|
/**
|
|
44
50
|
* Returns an observable that will notify observers when the element property changes.
|
|
45
51
|
* If there are any events provided, then the observer will be notified when the event is triggered.
|
|
@@ -49,12 +55,14 @@ function fromElementPropertyAndMutationObserver(element, property) {
|
|
|
49
55
|
* @param events The events that will trigger a new notification of changed values.
|
|
50
56
|
* @returns
|
|
51
57
|
*/
|
|
52
|
-
export function fromElementProperty
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
export function fromElementProperty<
|
|
59
|
+
T extends HTMLElement,
|
|
60
|
+
K extends keyof T,
|
|
61
|
+
E extends keyof HTMLElementEventMap,
|
|
62
|
+
>(element: T, property: K, events: E[] = []): Observe<T[K]> {
|
|
63
|
+
if (events.length > 0) {
|
|
64
|
+
return fromElementPropertyAndEvents(element, property, events);
|
|
65
|
+
} else {
|
|
66
|
+
return fromElementPropertyAndMutationObserver(element, property);
|
|
67
|
+
}
|
|
59
68
|
}
|
|
60
|
-
//# sourceMappingURL=from-element-property.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { Observe } from "./types.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new Observer that will notify observers exactly once when the promise is resolved.
|
|
26
|
+
* In the event of an error, the observer will be notified with the error.
|
|
27
|
+
* Note that the promise is only created when the first observer is added so it is lazy.
|
|
28
|
+
*/
|
|
29
|
+
export function fromPromiseWithError<T, E extends Error>(
|
|
30
|
+
promiseFactory: () => Promise<T>
|
|
31
|
+
): Observe<T | E> {
|
|
32
|
+
let promise: Promise<T> | undefined = undefined;
|
|
33
|
+
return (observer) => {
|
|
34
|
+
let cancelled = false;
|
|
35
|
+
promise = promise ?? promiseFactory();
|
|
36
|
+
promise
|
|
37
|
+
.then((value) => {
|
|
38
|
+
if (!cancelled) {
|
|
39
|
+
observer(value);
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
.catch((error: E) => {
|
|
43
|
+
if (!cancelled) {
|
|
44
|
+
observer(error);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return () => {
|
|
48
|
+
cancelled = true;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}
|