@adobe/data 0.1.2 → 0.2.0
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 -27
- 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/src/ecs/entity-location-table/entity-location.ts +34 -0
- 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/{core/functions/index.js → src/old-ecs/action-ecs/index.ts} +8 -5
- 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/src/old-ecs/core-ecs/index.ts +30 -0
- 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/src/schema/dynamic/enumerate-patches.test.ts +235 -0
- package/src/schema/dynamic/enumerate-patches.ts +90 -0
- package/src/schema/dynamic/get-dynamic-schema.test.ts +129 -0
- 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/src/schema/validation/is-valid.test.ts +43 -0
- package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
- package/src/schema/validation/validate.test.ts +120 -0
- package/src/schema/validation/validate.ts +41 -0
- 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 -31
- package/core/functions/deep-merge.js +0 -51
- 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 -4
- 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.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/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 -404
- 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,562 @@
|
|
|
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 { describe, it, expect } from "vitest";
|
|
23
|
+
import { createStore } from "./create-store.js";
|
|
24
|
+
import { createCoreTestSuite, positionSchema, healthSchema, nameSchema } from "./core/create-core.test.js";
|
|
25
|
+
import { Schema } from "../../schema/schema.js";
|
|
26
|
+
import { F32Schema } from "../../schema/f32.js";
|
|
27
|
+
|
|
28
|
+
describe("createStore", () => {
|
|
29
|
+
// Test that store passes all core functionality tests
|
|
30
|
+
createCoreTestSuite("Store core functionality", (componentSchemas) =>
|
|
31
|
+
createStore(componentSchemas, {})
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Select function tests
|
|
35
|
+
describe("Select functionality", () => {
|
|
36
|
+
const velocitySchema = {
|
|
37
|
+
type: "object",
|
|
38
|
+
properties: {
|
|
39
|
+
x: F32Schema,
|
|
40
|
+
y: F32Schema,
|
|
41
|
+
z: F32Schema,
|
|
42
|
+
}
|
|
43
|
+
} as const satisfies Schema;
|
|
44
|
+
|
|
45
|
+
it("should select entities from single archetype", () => {
|
|
46
|
+
const store = createStore({
|
|
47
|
+
position: positionSchema,
|
|
48
|
+
health: healthSchema,
|
|
49
|
+
name: nameSchema,
|
|
50
|
+
}, {});
|
|
51
|
+
|
|
52
|
+
// Create entities in a single archetype
|
|
53
|
+
const archetype = store.ensureArchetype(["id", "position", "health"]);
|
|
54
|
+
const entity1 = archetype.insert({
|
|
55
|
+
position: { x: 1, y: 2, z: 3 },
|
|
56
|
+
health: { current: 100, max: 100 }
|
|
57
|
+
});
|
|
58
|
+
const entity2 = archetype.insert({
|
|
59
|
+
position: { x: 4, y: 5, z: 6 },
|
|
60
|
+
health: { current: 50, max: 100 }
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Select entities with position and health
|
|
64
|
+
const entities = store.select(["position", "health"]);
|
|
65
|
+
expect(entities).toHaveLength(2);
|
|
66
|
+
expect(entities).toContain(entity1);
|
|
67
|
+
expect(entities).toContain(entity2);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should select entities spanning multiple archetypes", () => {
|
|
71
|
+
const store = createStore({
|
|
72
|
+
position: positionSchema,
|
|
73
|
+
health: healthSchema,
|
|
74
|
+
name: nameSchema,
|
|
75
|
+
velocity: velocitySchema,
|
|
76
|
+
}, {});
|
|
77
|
+
|
|
78
|
+
// Create entities in different archetypes
|
|
79
|
+
const positionOnlyArchetype = store.ensureArchetype(["id", "position"]);
|
|
80
|
+
const entity1 = positionOnlyArchetype.insert({
|
|
81
|
+
position: { x: 1, y: 2, z: 3 }
|
|
82
|
+
});
|
|
83
|
+
const entity2 = positionOnlyArchetype.insert({
|
|
84
|
+
position: { x: 4, y: 5, z: 6 }
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const healthOnlyArchetype = store.ensureArchetype(["id", "health"]);
|
|
88
|
+
const entity3 = healthOnlyArchetype.insert({
|
|
89
|
+
health: { current: 100, max: 100 }
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const positionHealthArchetype = store.ensureArchetype(["id", "position", "health"]);
|
|
93
|
+
const entity4 = positionHealthArchetype.insert({
|
|
94
|
+
position: { x: 0, y: 0, z: 0 },
|
|
95
|
+
health: { current: 50, max: 100 }
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const velocityArchetype = store.ensureArchetype(["id", "velocity"]);
|
|
99
|
+
const entity5 = velocityArchetype.insert({
|
|
100
|
+
velocity: { x: 1, y: 0, z: 0 }
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Select all entities with position component (should span 2 archetypes)
|
|
104
|
+
const positionEntities = store.select(["position"]);
|
|
105
|
+
expect(positionEntities).toHaveLength(3);
|
|
106
|
+
expect(positionEntities).toContain(entity1);
|
|
107
|
+
expect(positionEntities).toContain(entity2);
|
|
108
|
+
expect(positionEntities).toContain(entity4);
|
|
109
|
+
expect(positionEntities).not.toContain(entity3);
|
|
110
|
+
expect(positionEntities).not.toContain(entity5);
|
|
111
|
+
|
|
112
|
+
// Select all entities with health component (should span 2 archetypes)
|
|
113
|
+
const healthEntities = store.select(["health"]);
|
|
114
|
+
expect(healthEntities).toHaveLength(2);
|
|
115
|
+
expect(healthEntities).toContain(entity3);
|
|
116
|
+
expect(healthEntities).toContain(entity4);
|
|
117
|
+
expect(healthEntities).not.toContain(entity1);
|
|
118
|
+
expect(healthEntities).not.toContain(entity2);
|
|
119
|
+
expect(healthEntities).not.toContain(entity5);
|
|
120
|
+
|
|
121
|
+
// Select entities with both position and health (should be only 1 archetype)
|
|
122
|
+
const bothEntities = store.select(["position", "health"]);
|
|
123
|
+
expect(bothEntities).toHaveLength(1);
|
|
124
|
+
expect(bothEntities).toContain(entity4);
|
|
125
|
+
expect(bothEntities).not.toContain(entity1);
|
|
126
|
+
expect(bothEntities).not.toContain(entity2);
|
|
127
|
+
expect(bothEntities).not.toContain(entity3);
|
|
128
|
+
expect(bothEntities).not.toContain(entity5);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("should select entities with exclude option", () => {
|
|
132
|
+
const store = createStore({
|
|
133
|
+
position: positionSchema,
|
|
134
|
+
health: healthSchema,
|
|
135
|
+
name: nameSchema,
|
|
136
|
+
}, {});
|
|
137
|
+
|
|
138
|
+
// Create entities in different archetypes
|
|
139
|
+
const positionOnlyArchetype = store.ensureArchetype(["id", "position"]);
|
|
140
|
+
const entity1 = positionOnlyArchetype.insert({
|
|
141
|
+
position: { x: 1, y: 2, z: 3 }
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const positionHealthArchetype = store.ensureArchetype(["id", "position", "health"]);
|
|
145
|
+
const entity2 = positionHealthArchetype.insert({
|
|
146
|
+
position: { x: 0, y: 0, z: 0 },
|
|
147
|
+
health: { current: 50, max: 100 }
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Select entities with position but exclude health
|
|
151
|
+
const positionOnlyEntities = store.select(["position"], { exclude: ["health"] });
|
|
152
|
+
expect(positionOnlyEntities).toHaveLength(1);
|
|
153
|
+
expect(positionOnlyEntities).toContain(entity1);
|
|
154
|
+
expect(positionOnlyEntities).not.toContain(entity2);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("should return empty array when no entities match", () => {
|
|
158
|
+
const store = createStore({
|
|
159
|
+
position: positionSchema,
|
|
160
|
+
health: healthSchema,
|
|
161
|
+
}, {});
|
|
162
|
+
|
|
163
|
+
// Create entity with only position
|
|
164
|
+
const archetype = store.ensureArchetype(["id", "position"]);
|
|
165
|
+
archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
166
|
+
|
|
167
|
+
// Select entities with health (should be empty)
|
|
168
|
+
const entities = store.select(["health"]);
|
|
169
|
+
expect(entities).toHaveLength(0);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("should handle complex multi-archetype scenarios", () => {
|
|
173
|
+
const store = createStore({
|
|
174
|
+
position: positionSchema,
|
|
175
|
+
health: healthSchema,
|
|
176
|
+
name: nameSchema,
|
|
177
|
+
velocity: velocitySchema,
|
|
178
|
+
}, {});
|
|
179
|
+
|
|
180
|
+
// Create entities across many different archetypes
|
|
181
|
+
const archetype1 = store.ensureArchetype(["id", "position"]);
|
|
182
|
+
const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
183
|
+
const entity2 = archetype1.insert({ position: { x: 4, y: 5, z: 6 } });
|
|
184
|
+
|
|
185
|
+
const archetype2 = store.ensureArchetype(["id", "health"]);
|
|
186
|
+
const entity3 = archetype2.insert({ health: { current: 100, max: 100 } });
|
|
187
|
+
|
|
188
|
+
const archetype3 = store.ensureArchetype(["id", "position", "health"]);
|
|
189
|
+
const entity4 = archetype3.insert({
|
|
190
|
+
position: { x: 0, y: 0, z: 0 },
|
|
191
|
+
health: { current: 50, max: 100 }
|
|
192
|
+
});
|
|
193
|
+
const entity5 = archetype3.insert({
|
|
194
|
+
position: { x: 10, y: 20, z: 30 },
|
|
195
|
+
health: { current: 75, max: 100 }
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const archetype4 = store.ensureArchetype(["id", "name"]);
|
|
199
|
+
const entity6 = archetype4.insert({ name: "Player1" });
|
|
200
|
+
|
|
201
|
+
const archetype5 = store.ensureArchetype(["id", "position", "name"]);
|
|
202
|
+
const entity7 = archetype5.insert({
|
|
203
|
+
position: { x: 100, y: 200, z: 300 },
|
|
204
|
+
name: "Player2"
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
const archetype6 = store.ensureArchetype(["id", "position", "health", "name"]);
|
|
208
|
+
const entity8 = archetype6.insert({
|
|
209
|
+
position: { x: 500, y: 600, z: 700 },
|
|
210
|
+
health: { current: 25, max: 100 },
|
|
211
|
+
name: "Player3"
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Test various selection scenarios
|
|
215
|
+
const positionEntities = store.select(["position"]);
|
|
216
|
+
expect(positionEntities).toHaveLength(6);
|
|
217
|
+
expect(positionEntities).toContain(entity1);
|
|
218
|
+
expect(positionEntities).toContain(entity2);
|
|
219
|
+
expect(positionEntities).toContain(entity4);
|
|
220
|
+
expect(positionEntities).toContain(entity5);
|
|
221
|
+
expect(positionEntities).toContain(entity7);
|
|
222
|
+
expect(positionEntities).toContain(entity8);
|
|
223
|
+
|
|
224
|
+
const nameEntities = store.select(["name"]);
|
|
225
|
+
expect(nameEntities).toHaveLength(3);
|
|
226
|
+
expect(nameEntities).toContain(entity6);
|
|
227
|
+
expect(nameEntities).toContain(entity7);
|
|
228
|
+
expect(nameEntities).toContain(entity8);
|
|
229
|
+
|
|
230
|
+
const positionNameEntities = store.select(["position", "name"]);
|
|
231
|
+
expect(positionNameEntities).toHaveLength(2);
|
|
232
|
+
expect(positionNameEntities).toContain(entity7);
|
|
233
|
+
expect(positionNameEntities).toContain(entity8);
|
|
234
|
+
|
|
235
|
+
const allThreeEntities = store.select(["position", "health", "name"]);
|
|
236
|
+
expect(allThreeEntities).toHaveLength(1);
|
|
237
|
+
expect(allThreeEntities).toContain(entity8);
|
|
238
|
+
|
|
239
|
+
// Test exclusion
|
|
240
|
+
const positionWithoutHealth = store.select(["position"], { exclude: ["health"] });
|
|
241
|
+
expect(positionWithoutHealth).toHaveLength(3);
|
|
242
|
+
expect(positionWithoutHealth).toContain(entity1);
|
|
243
|
+
expect(positionWithoutHealth).toContain(entity2);
|
|
244
|
+
expect(positionWithoutHealth).toContain(entity7);
|
|
245
|
+
expect(positionWithoutHealth).not.toContain(entity4);
|
|
246
|
+
expect(positionWithoutHealth).not.toContain(entity5);
|
|
247
|
+
expect(positionWithoutHealth).not.toContain(entity8);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it("should maintain entity order across archetypes", () => {
|
|
251
|
+
const store = createStore({
|
|
252
|
+
position: positionSchema,
|
|
253
|
+
health: healthSchema,
|
|
254
|
+
}, {});
|
|
255
|
+
|
|
256
|
+
// Create entities in different archetypes
|
|
257
|
+
const archetype1 = store.ensureArchetype(["id", "position"]);
|
|
258
|
+
const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
259
|
+
const entity2 = archetype1.insert({ position: { x: 4, y: 5, z: 6 } });
|
|
260
|
+
|
|
261
|
+
const archetype2 = store.ensureArchetype(["id", "health"]);
|
|
262
|
+
const entity3 = archetype2.insert({ health: { current: 100, max: 100 } });
|
|
263
|
+
|
|
264
|
+
const archetype3 = store.ensureArchetype(["id", "position", "health"]);
|
|
265
|
+
const entity4 = archetype3.insert({
|
|
266
|
+
position: { x: 0, y: 0, z: 0 },
|
|
267
|
+
health: { current: 50, max: 100 }
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// Select all entities with position
|
|
271
|
+
const entities = store.select(["position"]);
|
|
272
|
+
expect(entities).toHaveLength(3);
|
|
273
|
+
|
|
274
|
+
// Verify all expected entities are present (order may vary)
|
|
275
|
+
expect(entities).toContain(entity1);
|
|
276
|
+
expect(entities).toContain(entity2);
|
|
277
|
+
expect(entities).toContain(entity4);
|
|
278
|
+
expect(entities).not.toContain(entity3);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it("should handle empty store", () => {
|
|
282
|
+
const store = createStore({
|
|
283
|
+
position: positionSchema,
|
|
284
|
+
health: healthSchema,
|
|
285
|
+
}, {});
|
|
286
|
+
|
|
287
|
+
const entities = store.select(["position"]);
|
|
288
|
+
expect(entities).toHaveLength(0);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it("should work with resources as components", () => {
|
|
292
|
+
const store = createStore({
|
|
293
|
+
position: positionSchema,
|
|
294
|
+
health: healthSchema,
|
|
295
|
+
}, {
|
|
296
|
+
time: { delta: 0.016, elapsed: 0 }
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Create some entities
|
|
300
|
+
const archetype = store.ensureArchetype(["id", "position"]);
|
|
301
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
302
|
+
|
|
303
|
+
// Select entities with time component (should include the resource entity)
|
|
304
|
+
const timeEntities = store.select(["time" as any]);
|
|
305
|
+
expect(timeEntities).toHaveLength(1);
|
|
306
|
+
|
|
307
|
+
// The resource entity should be included in time queries
|
|
308
|
+
const timeArchetypes = store.queryArchetypes(["time" as any]);
|
|
309
|
+
expect(timeArchetypes).toHaveLength(1);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Store-specific resource tests
|
|
314
|
+
describe("Resource functionality", () => {
|
|
315
|
+
const timeSchema = {
|
|
316
|
+
type: "object",
|
|
317
|
+
properties: {
|
|
318
|
+
delta: F32Schema,
|
|
319
|
+
elapsed: F32Schema,
|
|
320
|
+
}
|
|
321
|
+
} as const satisfies Schema;
|
|
322
|
+
|
|
323
|
+
const configSchema = {
|
|
324
|
+
type: "object",
|
|
325
|
+
properties: {
|
|
326
|
+
debug: { type: "boolean" },
|
|
327
|
+
volume: F32Schema,
|
|
328
|
+
}
|
|
329
|
+
} as const satisfies Schema;
|
|
330
|
+
|
|
331
|
+
it("should create store with resources", () => {
|
|
332
|
+
const store = createStore(
|
|
333
|
+
{ position: positionSchema },
|
|
334
|
+
{
|
|
335
|
+
time: { delta: 0.016, elapsed: 0 },
|
|
336
|
+
config: { debug: false, volume: 1.0 }
|
|
337
|
+
}
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
expect(store).toBeDefined();
|
|
341
|
+
expect(store.resources).toBeDefined();
|
|
342
|
+
expect(store.resources.time).toBeDefined();
|
|
343
|
+
expect(store.resources.config).toBeDefined();
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it("should initialize resources with default values", () => {
|
|
347
|
+
const defaultTime = { delta: 0.016, elapsed: 0 };
|
|
348
|
+
const defaultConfig = { debug: false, volume: 1.0 };
|
|
349
|
+
|
|
350
|
+
const store = createStore(
|
|
351
|
+
{ position: positionSchema },
|
|
352
|
+
{
|
|
353
|
+
time: defaultTime,
|
|
354
|
+
config: defaultConfig
|
|
355
|
+
}
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
expect(store.resources.time).toEqual(defaultTime);
|
|
359
|
+
expect(store.resources.config).toEqual(defaultConfig);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it("should allow reading resource values", () => {
|
|
363
|
+
const store = createStore(
|
|
364
|
+
{ position: positionSchema },
|
|
365
|
+
{
|
|
366
|
+
time: { delta: 0.016, elapsed: 0 },
|
|
367
|
+
config: { debug: false, volume: 1.0 }
|
|
368
|
+
}
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
expect(store.resources.time.delta).toBe(0.016);
|
|
372
|
+
expect(store.resources.time.elapsed).toBe(0);
|
|
373
|
+
expect(store.resources.config.debug).toBe(false);
|
|
374
|
+
expect(store.resources.config.volume).toBe(1.0);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it("should allow updating resource values", () => {
|
|
378
|
+
const store = createStore(
|
|
379
|
+
{ position: positionSchema },
|
|
380
|
+
{
|
|
381
|
+
time: { delta: 0.016, elapsed: 0 },
|
|
382
|
+
config: { debug: false, volume: 1.0 }
|
|
383
|
+
}
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
// Update time
|
|
387
|
+
store.resources.time = { delta: 0.033, elapsed: 1.5 };
|
|
388
|
+
expect(store.resources.time.delta).toBe(0.033);
|
|
389
|
+
expect(store.resources.time.elapsed).toBe(1.5);
|
|
390
|
+
|
|
391
|
+
// Update config
|
|
392
|
+
store.resources.config = { debug: true, volume: 0.5 };
|
|
393
|
+
expect(store.resources.config.debug).toBe(true);
|
|
394
|
+
expect(store.resources.config.volume).toBe(0.5);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it("should maintain resource values across updates", () => {
|
|
398
|
+
const store = createStore(
|
|
399
|
+
{ position: positionSchema },
|
|
400
|
+
{
|
|
401
|
+
time: { delta: 0.016, elapsed: 0 },
|
|
402
|
+
config: { debug: false, volume: 1.0 }
|
|
403
|
+
}
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
// Update multiple times
|
|
407
|
+
store.resources.time = { delta: 0.033, elapsed: 1.5 };
|
|
408
|
+
store.resources.time = { delta: 0.025, elapsed: 2.0 };
|
|
409
|
+
store.resources.config = { debug: true, volume: 0.5 };
|
|
410
|
+
|
|
411
|
+
// Verify final values
|
|
412
|
+
expect(store.resources.time).toEqual({ delta: 0.025, elapsed: 2.0 });
|
|
413
|
+
expect(store.resources.config).toEqual({ debug: true, volume: 0.5 });
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it("should handle nested resource updates", () => {
|
|
417
|
+
const store = createStore(
|
|
418
|
+
{ position: positionSchema },
|
|
419
|
+
{
|
|
420
|
+
time: { delta: 0.016, elapsed: 0 }
|
|
421
|
+
}
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
// Update individual properties
|
|
425
|
+
const newTime = { delta: 0.033, elapsed: 1.5 };
|
|
426
|
+
store.resources.time = newTime;
|
|
427
|
+
|
|
428
|
+
expect(store.resources.time.delta).toBe(newTime.delta);
|
|
429
|
+
expect(store.resources.time.elapsed).toBe(newTime.elapsed);
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it("should work with empty resource object", () => {
|
|
433
|
+
const store = createStore(
|
|
434
|
+
{ position: positionSchema },
|
|
435
|
+
{}
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
expect(store.resources).toBeDefined();
|
|
439
|
+
expect(Object.keys(store.resources)).toHaveLength(0);
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
it("should handle multiple resources independently", () => {
|
|
443
|
+
const store = createStore(
|
|
444
|
+
{ position: positionSchema },
|
|
445
|
+
{
|
|
446
|
+
time: { delta: 0.016, elapsed: 0 },
|
|
447
|
+
config: { debug: false, volume: 1.0 },
|
|
448
|
+
score: 0
|
|
449
|
+
}
|
|
450
|
+
);
|
|
451
|
+
|
|
452
|
+
// Update each resource independently
|
|
453
|
+
store.resources.time = { delta: 0.033, elapsed: 1.5 };
|
|
454
|
+
store.resources.config = { debug: true, volume: 0.5 };
|
|
455
|
+
store.resources.score = 100;
|
|
456
|
+
|
|
457
|
+
// Verify all resources maintain their values
|
|
458
|
+
expect(store.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
459
|
+
expect(store.resources.config).toEqual({ debug: true, volume: 0.5 });
|
|
460
|
+
expect(store.resources.score).toBe(100);
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
it("should allow querying resources as components", () => {
|
|
464
|
+
const store = createStore(
|
|
465
|
+
{
|
|
466
|
+
position: positionSchema,
|
|
467
|
+
time: timeSchema
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
time: { delta: 0.016, elapsed: 0 }
|
|
471
|
+
}
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
// Resources should be queryable as components
|
|
475
|
+
const timeArchetypes = store.queryArchetypes(["time"]);
|
|
476
|
+
expect(timeArchetypes).toHaveLength(1);
|
|
477
|
+
expect(timeArchetypes[0].components.has("time")).toBe(true);
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
it("should maintain resource singleton behavior", () => {
|
|
481
|
+
const store = createStore(
|
|
482
|
+
{
|
|
483
|
+
position: positionSchema,
|
|
484
|
+
time: timeSchema
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
time: { delta: 0.016, elapsed: 0 }
|
|
488
|
+
}
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
// Resources should be queryable as components
|
|
492
|
+
const timeArchetypes = store.queryArchetypes(["time"]);
|
|
493
|
+
expect(timeArchetypes).toHaveLength(1);
|
|
494
|
+
|
|
495
|
+
// Resources should maintain their values
|
|
496
|
+
expect(store.resources.time).toEqual({ delta: 0.016, elapsed: 0 });
|
|
497
|
+
|
|
498
|
+
// Update and verify
|
|
499
|
+
store.resources.time = { delta: 0.033, elapsed: 1.5 };
|
|
500
|
+
expect(store.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it("should handle primitive resource values", () => {
|
|
504
|
+
const store = createStore(
|
|
505
|
+
{ position: positionSchema },
|
|
506
|
+
{
|
|
507
|
+
score: 0,
|
|
508
|
+
name: "Player1",
|
|
509
|
+
active: true
|
|
510
|
+
}
|
|
511
|
+
);
|
|
512
|
+
|
|
513
|
+
expect(store.resources.score).toBe(0);
|
|
514
|
+
expect(store.resources.name).toBe("Player1");
|
|
515
|
+
expect(store.resources.active).toBe(true);
|
|
516
|
+
|
|
517
|
+
// Update primitive values
|
|
518
|
+
store.resources.score = 100;
|
|
519
|
+
store.resources.name = "Player2";
|
|
520
|
+
store.resources.active = false;
|
|
521
|
+
|
|
522
|
+
expect(store.resources.score).toBe(100);
|
|
523
|
+
expect(store.resources.name).toBe("Player2");
|
|
524
|
+
expect(store.resources.active).toBe(false);
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
it("should handle complex resource objects", () => {
|
|
528
|
+
const complexResource = {
|
|
529
|
+
nested: {
|
|
530
|
+
deep: {
|
|
531
|
+
value: 42,
|
|
532
|
+
array: [1, 2, 3],
|
|
533
|
+
flag: true
|
|
534
|
+
}
|
|
535
|
+
},
|
|
536
|
+
count: 0
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
const store = createStore(
|
|
540
|
+
{ position: positionSchema },
|
|
541
|
+
{ complex: complexResource }
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
expect(store.resources.complex).toEqual(complexResource);
|
|
545
|
+
|
|
546
|
+
// Update complex resource
|
|
547
|
+
const updatedComplex = {
|
|
548
|
+
nested: {
|
|
549
|
+
deep: {
|
|
550
|
+
value: 100,
|
|
551
|
+
array: [4, 5, 6],
|
|
552
|
+
flag: false
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
count: 10
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
store.resources.complex = updatedComplex;
|
|
559
|
+
expect(store.resources.complex).toEqual(updatedComplex);
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
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 { ResourceComponents } from "./resource-components.js";
|
|
23
|
+
import { ComponentSchemas } from "../component-schemas.js";
|
|
24
|
+
import { StringKeyof } from "../../types/types.js";
|
|
25
|
+
import { CoreComponents } from "../core-components.js";
|
|
26
|
+
import { Simplify } from "../../types/index.js";
|
|
27
|
+
import { Store } from "./store.js";
|
|
28
|
+
import { FromSchema, Schema } from "../../schema/schema.js";
|
|
29
|
+
import { createCore } from "./core/create-core.js";
|
|
30
|
+
import { Entity } from "../entity.js";
|
|
31
|
+
import { Core, QueryOptions } from "./core/core.js";
|
|
32
|
+
|
|
33
|
+
export function createStore<NC extends ComponentSchemas, R extends ResourceComponents>(
|
|
34
|
+
newComponentSchemas: NC,
|
|
35
|
+
resourceDefaults: R,
|
|
36
|
+
): Store<Simplify<CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> }>, { -readonly [K in StringKeyof<R>]: R[K] }> {
|
|
37
|
+
type C = CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> };
|
|
38
|
+
const resources = {} as R;
|
|
39
|
+
type S = StringKeyof<C>;
|
|
40
|
+
|
|
41
|
+
const resourceSchema = {} as const satisfies Schema;
|
|
42
|
+
const componentAndResourceSchemas: { [K in StringKeyof<C | R>]: Schema } = { ...newComponentSchemas };
|
|
43
|
+
// Resources are stored in the core as components, so we need to add them to the componentSchemas
|
|
44
|
+
for (const name of Object.keys(resourceDefaults)) {
|
|
45
|
+
const resourceId = name as StringKeyof<C | R>;
|
|
46
|
+
componentAndResourceSchemas[resourceId] = resourceSchema;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const core = createCore(componentAndResourceSchemas) as unknown as Core<C>;
|
|
50
|
+
|
|
51
|
+
// Each resource will be stored as the only entity in an archetype of [id, <resourceName>]
|
|
52
|
+
// The resource component we added above will contain the resource value
|
|
53
|
+
for (const [name, resource] of Object.entries(resourceDefaults)) {
|
|
54
|
+
const resourceId = name as StringKeyof<C>;
|
|
55
|
+
const archetype = core.ensureArchetype(["id", resourceId]);
|
|
56
|
+
archetype.insert({ [resourceId]: resource } as any);
|
|
57
|
+
const row = 0;
|
|
58
|
+
Object.defineProperty(resources, name, {
|
|
59
|
+
get: () => archetype.columns[resourceId]!.get(row),
|
|
60
|
+
set: (value) => {
|
|
61
|
+
archetype.columns[resourceId]!.set(row, value);
|
|
62
|
+
},
|
|
63
|
+
enumerable: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const select = <
|
|
68
|
+
Include extends StringKeyof<C>,
|
|
69
|
+
Exclude extends StringKeyof<C> = never
|
|
70
|
+
>(
|
|
71
|
+
include: Include[],
|
|
72
|
+
options?: QueryOptions<Include, Exclude>
|
|
73
|
+
): readonly Entity[] => {
|
|
74
|
+
const archetypes = core.queryArchetypes(include, options);
|
|
75
|
+
let length = 0;
|
|
76
|
+
for (const archetype of archetypes) {
|
|
77
|
+
length += archetype.rows;
|
|
78
|
+
}
|
|
79
|
+
const entities = new Array<Entity>(length);
|
|
80
|
+
let index = 0;
|
|
81
|
+
for (const archetype of archetypes) {
|
|
82
|
+
const typedArray = archetype.columns.id.getTypedArray();
|
|
83
|
+
for (let i = 0; i < archetype.rows; i++) {
|
|
84
|
+
entities[index++] = typedArray[i];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return entities;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const store: Store<C, R> = {
|
|
91
|
+
...core,
|
|
92
|
+
resources,
|
|
93
|
+
select,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
return store as any;
|
|
97
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
export * from "./store.js";
|
|
23
|
+
export * from "./create-store.js";
|
|
@@ -19,9 +19,5 @@ 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
|
-
{
|
|
25
|
-
}
|
|
26
|
-
export {};
|
|
27
|
-
//# sourceMappingURL=types.js.map
|
|
22
|
+
|
|
23
|
+
export type ResourceComponents = object;
|