@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,440 @@
|
|
|
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 { createCore } from "./create-core.js";
|
|
24
|
+
import { Schema } from "../../../schema/schema.js";
|
|
25
|
+
import type { Entity } from "../../entity.js";
|
|
26
|
+
import { F32Schema } from "../../../schema/f32.js";
|
|
27
|
+
|
|
28
|
+
// Shared test schemas
|
|
29
|
+
export const positionSchema = {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
x: F32Schema,
|
|
33
|
+
y: F32Schema,
|
|
34
|
+
z: F32Schema,
|
|
35
|
+
}
|
|
36
|
+
} as const satisfies Schema;
|
|
37
|
+
|
|
38
|
+
export const healthSchema = {
|
|
39
|
+
type: "object",
|
|
40
|
+
properties: {
|
|
41
|
+
current: F32Schema,
|
|
42
|
+
max: F32Schema,
|
|
43
|
+
}
|
|
44
|
+
} as const satisfies Schema;
|
|
45
|
+
|
|
46
|
+
export const nameSchema = {
|
|
47
|
+
type: "string",
|
|
48
|
+
maxLength: 50,
|
|
49
|
+
} as const satisfies Schema;
|
|
50
|
+
|
|
51
|
+
// Reusable test suite for any core-like interface
|
|
52
|
+
export function createCoreTestSuite(
|
|
53
|
+
name: string,
|
|
54
|
+
factory: typeof createCore = createCore
|
|
55
|
+
) {
|
|
56
|
+
describe(name, () => {
|
|
57
|
+
it("should create with basic components", () => {
|
|
58
|
+
const core = factory({
|
|
59
|
+
position: positionSchema,
|
|
60
|
+
health: healthSchema,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(core).toBeDefined();
|
|
64
|
+
expect(core.componentSchemas).toHaveProperty("id");
|
|
65
|
+
expect(core.componentSchemas).toHaveProperty("position");
|
|
66
|
+
expect(core.componentSchemas).toHaveProperty("health");
|
|
67
|
+
expect(core.componentSchemas.id).toBeDefined();
|
|
68
|
+
expect(core.componentSchemas.position).toBeDefined();
|
|
69
|
+
expect(core.componentSchemas.health).toBeDefined();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should query archetypes correctly", () => {
|
|
73
|
+
const core = factory({
|
|
74
|
+
position: positionSchema,
|
|
75
|
+
health: healthSchema,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Create entities with different component combinations
|
|
79
|
+
const archetype1 = core.ensureArchetype(["id", "position"]);
|
|
80
|
+
const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
81
|
+
|
|
82
|
+
const archetype2 = core.ensureArchetype(["id", "health"]);
|
|
83
|
+
const entity2 = archetype2.insert({ health: { current: 100, max: 100 } });
|
|
84
|
+
|
|
85
|
+
const archetype3 = core.ensureArchetype(["id", "position", "health"]);
|
|
86
|
+
const entity3 = archetype3.insert({
|
|
87
|
+
position: { x: 0, y: 0, z: 0 },
|
|
88
|
+
health: { current: 50, max: 100 }
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Query for position component
|
|
92
|
+
const positionArchetypes = core.queryArchetypes(["position"]);
|
|
93
|
+
expect(positionArchetypes).toHaveLength(2);
|
|
94
|
+
expect(positionArchetypes.some(a => a.components.has("position"))).toBe(true);
|
|
95
|
+
expect(positionArchetypes.some(a => a.components.has("health"))).toBe(true);
|
|
96
|
+
|
|
97
|
+
// Query for health component
|
|
98
|
+
const healthArchetypes = core.queryArchetypes(["health"]);
|
|
99
|
+
expect(healthArchetypes).toHaveLength(2);
|
|
100
|
+
expect(healthArchetypes.some(a => a.components.has("position"))).toBe(true);
|
|
101
|
+
expect(healthArchetypes.some(a => a.components.has("health"))).toBe(true);
|
|
102
|
+
|
|
103
|
+
// Query for both components
|
|
104
|
+
const bothArchetypes = core.queryArchetypes(["position", "health"]);
|
|
105
|
+
expect(bothArchetypes).toHaveLength(1);
|
|
106
|
+
expect(bothArchetypes[0].components.has("position")).toBe(true);
|
|
107
|
+
expect(bothArchetypes[0].components.has("health")).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("should query archetypes with exclude option", () => {
|
|
111
|
+
const core = factory({
|
|
112
|
+
position: positionSchema,
|
|
113
|
+
health: healthSchema,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Create entities with different component combinations
|
|
117
|
+
const archetype1 = core.ensureArchetype(["id", "position"]);
|
|
118
|
+
const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
119
|
+
|
|
120
|
+
const archetype2 = core.ensureArchetype(["id", "health"]);
|
|
121
|
+
const entity2 = archetype2.insert({ health: { current: 100, max: 100 } });
|
|
122
|
+
|
|
123
|
+
const archetype3 = core.ensureArchetype(["id", "position", "health"]);
|
|
124
|
+
const entity3 = archetype3.insert({
|
|
125
|
+
position: { x: 0, y: 0, z: 0 },
|
|
126
|
+
health: { current: 50, max: 100 }
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// Query for position but exclude health
|
|
130
|
+
const positionOnlyArchetypes = core.queryArchetypes(["position"], { exclude: ["health"] });
|
|
131
|
+
expect(positionOnlyArchetypes).toHaveLength(1);
|
|
132
|
+
expect(positionOnlyArchetypes[0].components.has("position")).toBe(true);
|
|
133
|
+
expect((positionOnlyArchetypes[0].components as Set<string>).has("health")).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("should ensure archetype creates new archetype when needed", () => {
|
|
137
|
+
const core = factory({
|
|
138
|
+
position: positionSchema,
|
|
139
|
+
health: healthSchema,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// First call should create new archetype
|
|
143
|
+
const archetype1 = core.ensureArchetype(["id", "position"]);
|
|
144
|
+
expect(archetype1).toBeDefined();
|
|
145
|
+
expect(archetype1.components.has("id")).toBe(true);
|
|
146
|
+
expect(archetype1.components.has("position")).toBe(true);
|
|
147
|
+
expect((archetype1.components as Set<string>).has("health")).toBe(false);
|
|
148
|
+
|
|
149
|
+
// Second call with same components should return same archetype
|
|
150
|
+
const archetype2 = core.ensureArchetype(["id", "position"]);
|
|
151
|
+
expect(archetype2).toBe(archetype1);
|
|
152
|
+
|
|
153
|
+
// Different components should create new archetype
|
|
154
|
+
const archetype3 = core.ensureArchetype(["id", "health"]);
|
|
155
|
+
expect(archetype3).not.toBe(archetype1);
|
|
156
|
+
expect(archetype3.components.has("id")).toBe(true);
|
|
157
|
+
expect(archetype3.components.has("health")).toBe(true);
|
|
158
|
+
expect(archetype3.components.has("position")).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should throw error when ensuring archetype without id", () => {
|
|
162
|
+
const core = factory({
|
|
163
|
+
position: positionSchema,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
expect(() => {
|
|
167
|
+
core.ensureArchetype(["position"]);
|
|
168
|
+
}).toThrow("id is required");
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("should locate entities correctly", () => {
|
|
172
|
+
const core = factory({
|
|
173
|
+
position: positionSchema,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
177
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
178
|
+
|
|
179
|
+
const location = core.locate(entity);
|
|
180
|
+
expect(location).not.toBeNull();
|
|
181
|
+
expect(location?.archetype).toBe(archetype.id);
|
|
182
|
+
expect(location?.row).toBeGreaterThanOrEqual(0);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("should return null when locating non-existent entity", () => {
|
|
186
|
+
const core = factory({
|
|
187
|
+
position: positionSchema,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const location = core.locate(999 as Entity);
|
|
191
|
+
expect(location).toBeNull();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it("should read entity data correctly", () => {
|
|
195
|
+
const core = factory({
|
|
196
|
+
position: positionSchema,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
200
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
201
|
+
|
|
202
|
+
const data = core.read(entity);
|
|
203
|
+
expect(data).not.toBeNull();
|
|
204
|
+
expect(data?.id).toBe(entity);
|
|
205
|
+
expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("should return null when reading non-existent entity", () => {
|
|
209
|
+
const core = factory({
|
|
210
|
+
position: positionSchema,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
const data = core.read(999 as Entity);
|
|
214
|
+
expect(data).toBeNull();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it("should delete entities correctly", () => {
|
|
218
|
+
const core = factory({
|
|
219
|
+
position: positionSchema,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
223
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
224
|
+
|
|
225
|
+
// Verify entity exists
|
|
226
|
+
expect(core.locate(entity)).not.toBeNull();
|
|
227
|
+
expect(core.read(entity)).not.toBeNull();
|
|
228
|
+
|
|
229
|
+
// Delete entity
|
|
230
|
+
core.delete(entity);
|
|
231
|
+
|
|
232
|
+
// Verify entity is deleted
|
|
233
|
+
expect(core.locate(entity)).toBeNull();
|
|
234
|
+
expect(core.read(entity)).toBeNull();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it("should handle deleting non-existent entity gracefully", () => {
|
|
238
|
+
const core = factory({
|
|
239
|
+
position: positionSchema,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
expect(() => {
|
|
243
|
+
core.delete(999 as Entity);
|
|
244
|
+
}).not.toThrow();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it("should update entity within same archetype", () => {
|
|
248
|
+
const core = factory({
|
|
249
|
+
position: positionSchema,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
253
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
254
|
+
|
|
255
|
+
// Update position
|
|
256
|
+
core.update(entity, { position: { x: 10, y: 20, z: 30 } });
|
|
257
|
+
|
|
258
|
+
// Verify update
|
|
259
|
+
const data = core.read(entity);
|
|
260
|
+
expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it("should move entity to new archetype when adding components", () => {
|
|
264
|
+
const core = factory({
|
|
265
|
+
position: positionSchema,
|
|
266
|
+
health: healthSchema,
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
const archetype1 = core.ensureArchetype(["id", "position"]);
|
|
270
|
+
const entity = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
271
|
+
|
|
272
|
+
// Add health component
|
|
273
|
+
core.update(entity, { health: { current: 100, max: 100 } });
|
|
274
|
+
|
|
275
|
+
// Verify entity moved to new archetype
|
|
276
|
+
const location = core.locate(entity);
|
|
277
|
+
expect(location).not.toBeNull();
|
|
278
|
+
expect(location?.archetype).not.toBe(archetype1.id);
|
|
279
|
+
|
|
280
|
+
const data = core.read(entity);
|
|
281
|
+
expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
|
|
282
|
+
expect(data?.health).toEqual({ current: 100, max: 100 });
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it("should move entity to new archetype when removing components", () => {
|
|
286
|
+
const core = factory({
|
|
287
|
+
position: positionSchema,
|
|
288
|
+
health: healthSchema,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
const archetype1 = core.ensureArchetype(["id", "position", "health"]);
|
|
292
|
+
const entity = archetype1.insert({
|
|
293
|
+
position: { x: 1, y: 2, z: 3 },
|
|
294
|
+
health: { current: 100, max: 100 }
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// Remove health component
|
|
298
|
+
core.update(entity, { health: undefined });
|
|
299
|
+
|
|
300
|
+
// Verify entity moved to new archetype
|
|
301
|
+
const location = core.locate(entity);
|
|
302
|
+
expect(location).not.toBeNull();
|
|
303
|
+
expect(location?.archetype).not.toBe(archetype1.id);
|
|
304
|
+
|
|
305
|
+
const data = core.read(entity);
|
|
306
|
+
expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
|
|
307
|
+
expect(data?.health).toBeUndefined();
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it("should throw error when updating non-existent entity", () => {
|
|
311
|
+
const core = factory({
|
|
312
|
+
position: positionSchema,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
expect(() => {
|
|
316
|
+
core.update(999 as Entity, { position: { x: 1, y: 2, z: 3 } });
|
|
317
|
+
}).toThrow("Entity not found");
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it("should handle complex component updates", () => {
|
|
321
|
+
const core = factory({
|
|
322
|
+
position: positionSchema,
|
|
323
|
+
health: healthSchema,
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
const archetype = core.ensureArchetype(["id", "position", "health"]);
|
|
327
|
+
const entity = archetype.insert({
|
|
328
|
+
position: { x: 1, y: 2, z: 3 },
|
|
329
|
+
health: { current: 100, max: 100 }
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// Update both components
|
|
333
|
+
core.update(entity, {
|
|
334
|
+
position: { x: 10, y: 20, z: 30 },
|
|
335
|
+
health: { current: 50, max: 100 }
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
const data = core.read(entity);
|
|
339
|
+
expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
|
|
340
|
+
expect(data?.health).toEqual({ current: 50, max: 100 });
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it("should handle mixed add/remove operations", () => {
|
|
344
|
+
const core = factory({
|
|
345
|
+
position: positionSchema,
|
|
346
|
+
health: healthSchema,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
const archetype1 = core.ensureArchetype(["id", "position"]);
|
|
350
|
+
const entity = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
351
|
+
|
|
352
|
+
// Add health and update position
|
|
353
|
+
core.update(entity, {
|
|
354
|
+
position: { x: 10, y: 20, z: 30 },
|
|
355
|
+
health: { current: 100, max: 100 }
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
const data = core.read(entity);
|
|
359
|
+
expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
|
|
360
|
+
expect(data?.health).toEqual({ current: 100, max: 100 });
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it("should maintain entity count correctly", () => {
|
|
364
|
+
const core = factory({
|
|
365
|
+
position: positionSchema,
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
369
|
+
const entity1 = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
370
|
+
const entity2 = archetype.insert({ position: { x: 4, y: 5, z: 6 } });
|
|
371
|
+
|
|
372
|
+
// Verify both entities exist
|
|
373
|
+
expect(core.locate(entity1)).not.toBeNull();
|
|
374
|
+
expect(core.locate(entity2)).not.toBeNull();
|
|
375
|
+
|
|
376
|
+
// Delete one entity
|
|
377
|
+
core.delete(entity1);
|
|
378
|
+
|
|
379
|
+
// Verify only one entity remains
|
|
380
|
+
expect(core.locate(entity1)).toBeNull();
|
|
381
|
+
expect(core.locate(entity2)).not.toBeNull();
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it("should handle empty component updates", () => {
|
|
385
|
+
const core = factory({
|
|
386
|
+
position: positionSchema,
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
390
|
+
const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
|
|
391
|
+
|
|
392
|
+
// Update with empty object
|
|
393
|
+
core.update(entity, {});
|
|
394
|
+
|
|
395
|
+
// Verify entity still exists with original data
|
|
396
|
+
const data = core.read(entity);
|
|
397
|
+
expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
it("should handle large number of entities", () => {
|
|
401
|
+
const core = factory({
|
|
402
|
+
position: positionSchema,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
const archetype = core.ensureArchetype(["id", "position"]);
|
|
406
|
+
const entities: Entity[] = [];
|
|
407
|
+
|
|
408
|
+
// Create many entities
|
|
409
|
+
for (let i = 0; i < 100; i++) {
|
|
410
|
+
const entity = archetype.insert({ position: { x: i, y: i, z: i } });
|
|
411
|
+
entities.push(entity);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Verify all entities exist
|
|
415
|
+
for (const entity of entities) {
|
|
416
|
+
expect(core.locate(entity)).not.toBeNull();
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Delete some entities
|
|
420
|
+
for (let i = 0; i < 50; i++) {
|
|
421
|
+
core.delete(entities[i]);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Verify remaining entities exist
|
|
425
|
+
for (let i = 50; i < 100; i++) {
|
|
426
|
+
expect(core.locate(entities[i])).not.toBeNull();
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Verify deleted entities don't exist
|
|
430
|
+
for (let i = 0; i < 50; i++) {
|
|
431
|
+
expect(core.locate(entities[i])).toBeNull();
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Original core-specific tests
|
|
438
|
+
describe("createCore", () => {
|
|
439
|
+
createCoreTestSuite("Core functionality");
|
|
440
|
+
});
|
|
@@ -0,0 +1,168 @@
|
|
|
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 { FromSchema, Schema } from "../../../schema/schema.js";
|
|
23
|
+
import { createEntityLocationTable } from "../../entity-location-table/index.js";
|
|
24
|
+
import * as ARCHETYPE from "../../archetype/index.js";
|
|
25
|
+
import * as TABLE from "../../../table/index.js";
|
|
26
|
+
import { Archetype } from "../../archetype/archetype.js";
|
|
27
|
+
import { CoreComponents } from "../../core-components.js";
|
|
28
|
+
import { Entity, EntitySchema } from "../../entity.js";
|
|
29
|
+
import { Core, EntityUpdateValues, EntityValues, QueryOptions } from "./core.js";
|
|
30
|
+
import { Assert, Equal, Simplify, StringKeyof } from "../../../types/index.js";
|
|
31
|
+
import { ComponentSchemas } from "../../component-schemas.js";
|
|
32
|
+
|
|
33
|
+
export function createCore<NC extends ComponentSchemas>(newComponentSchemas: NC): Core<Simplify<CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> }>> {
|
|
34
|
+
type C = CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> };
|
|
35
|
+
|
|
36
|
+
const componentSchemas: { readonly [K in StringKeyof<C>]: Schema } = { id: EntitySchema, ...newComponentSchemas };
|
|
37
|
+
const entityLocationTable = createEntityLocationTable();
|
|
38
|
+
const archetypes = [] as unknown as Archetype<C>[] & { readonly [x: string]: Archetype<C> };
|
|
39
|
+
|
|
40
|
+
const queryArchetypes = <
|
|
41
|
+
Include extends StringKeyof<C>,
|
|
42
|
+
Exclude extends StringKeyof<C> = never
|
|
43
|
+
>(
|
|
44
|
+
include: readonly Include[],
|
|
45
|
+
options?: QueryOptions<Include, Exclude>
|
|
46
|
+
): readonly Archetype<CoreComponents & Pick<C, Include>>[] =>{
|
|
47
|
+
const results: Archetype<CoreComponents & Pick<C, Include>>[] = [];
|
|
48
|
+
for (const archetype of archetypes) {
|
|
49
|
+
const hasAllRequired = include.every(comp => archetype.columns[comp] !== undefined);
|
|
50
|
+
const hasNoExcluded = !options?.exclude || options.exclude.every(comp => archetype.columns[comp] === undefined);
|
|
51
|
+
if (hasAllRequired && hasNoExcluded) {
|
|
52
|
+
results.push(archetype as unknown as Archetype<CoreComponents & Pick<C, Include>>);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const ensureArchetype = <CC extends StringKeyof<C>>(componentNames: readonly CC[]): Archetype<CoreComponents & { [K in CC]: C[K] }> => {
|
|
59
|
+
for (const archetype of queryArchetypes(componentNames)) {
|
|
60
|
+
if (archetype.components.size === componentNames.length) {
|
|
61
|
+
return archetype as unknown as Archetype<CoreComponents & { [K in CC]: C[K] }>;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const id = archetypes.length;
|
|
65
|
+
const archetypeComponentSchemas: { [K in CC]: Schema } = {} as { [K in CC]: Schema };
|
|
66
|
+
let hasId = false;
|
|
67
|
+
for (const comp of componentNames) {
|
|
68
|
+
if (comp === "id") {
|
|
69
|
+
hasId = true;
|
|
70
|
+
}
|
|
71
|
+
archetypeComponentSchemas[comp] = componentSchemas[comp];
|
|
72
|
+
}
|
|
73
|
+
if (!hasId) {
|
|
74
|
+
throw new Error("id is required");
|
|
75
|
+
}
|
|
76
|
+
const archetype = ARCHETYPE.createArchetype(archetypeComponentSchemas as any, id, entityLocationTable);
|
|
77
|
+
archetypes.push(archetype as unknown as Archetype<C>);
|
|
78
|
+
return archetype as unknown as Archetype<CoreComponents & { [K in CC]: C[K] }>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const { locate } = entityLocationTable;
|
|
82
|
+
|
|
83
|
+
const selectEntity = (entity: Entity): EntityValues<C> | null => {
|
|
84
|
+
const location = locate(entity);
|
|
85
|
+
return location !== null ? TABLE.getRowData(archetypes[location.archetype], location.row) : null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const deleteEntity = (entity: Entity) => {
|
|
89
|
+
const location = locate(entity);
|
|
90
|
+
if (location !== null) {
|
|
91
|
+
const archetype = archetypes[location.archetype];
|
|
92
|
+
ARCHETYPE.deleteRow(archetype, location.row, entityLocationTable);
|
|
93
|
+
entityLocationTable.delete(entity);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const updateEntity = (entity: Entity, components: EntityUpdateValues<C>) => {
|
|
98
|
+
const currentLocation = locate(entity);
|
|
99
|
+
if (currentLocation === null) {
|
|
100
|
+
throw "Entity not found";
|
|
101
|
+
}
|
|
102
|
+
const currentArchetype = archetypes[currentLocation.archetype];
|
|
103
|
+
let newArchetype = currentArchetype;
|
|
104
|
+
let addComponents: null | StringKeyof<C>[] = null;
|
|
105
|
+
let removeComponents: null | StringKeyof<C>[] = null;
|
|
106
|
+
for (const key in components) {
|
|
107
|
+
if ((components as any)[key as any] === undefined) {
|
|
108
|
+
(removeComponents ??= []).push(key as StringKeyof<C>);
|
|
109
|
+
// we remove the delete components so we can use this object for the new row data
|
|
110
|
+
delete (components as any)[key as any];
|
|
111
|
+
}
|
|
112
|
+
else if (!currentArchetype.components.has(key as StringKeyof<C>)) {
|
|
113
|
+
(addComponents ??= []).push(key as StringKeyof<C>);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (addComponents || removeComponents) {
|
|
117
|
+
// currently changing archetype requires a set, but later we should have an edge map for better performance
|
|
118
|
+
// Alternatively we can have a faster path using addComponent and deleteComponent.
|
|
119
|
+
const newComponents = new Set(currentArchetype.components);
|
|
120
|
+
if (addComponents) {
|
|
121
|
+
for (const comp of addComponents) {
|
|
122
|
+
newComponents.add(comp);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (removeComponents) {
|
|
126
|
+
for (const comp of removeComponents) {
|
|
127
|
+
newComponents.delete(comp);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
newArchetype = ensureArchetype(Array.from(newComponents) as StringKeyof<C>[]) as unknown as Archetype<C>;
|
|
131
|
+
}
|
|
132
|
+
if (newArchetype !== currentArchetype) {
|
|
133
|
+
// create a new row in the new archetype
|
|
134
|
+
const currentData = TABLE.getRowData(currentArchetype, currentLocation.row);
|
|
135
|
+
// deletes the row from the current archetype (this will update the entity location table for any row which may have been moved into it's position)
|
|
136
|
+
ARCHETYPE.deleteRow(currentArchetype, currentLocation.row, entityLocationTable);
|
|
137
|
+
const newRow = TABLE.addRow(newArchetype, { ...currentData, ...components });
|
|
138
|
+
// update the entity location table for the entity so it points to the new archetype and row
|
|
139
|
+
entityLocationTable.update(entity, { archetype: newArchetype.id, row: newRow });
|
|
140
|
+
} else {
|
|
141
|
+
TABLE.updateRow(newArchetype, currentLocation.row, components as any);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const core: Core<C> = {
|
|
146
|
+
componentSchemas: componentSchemas,
|
|
147
|
+
queryArchetypes,
|
|
148
|
+
ensureArchetype,
|
|
149
|
+
locate,
|
|
150
|
+
read: selectEntity,
|
|
151
|
+
delete: deleteEntity,
|
|
152
|
+
update: updateEntity,
|
|
153
|
+
};
|
|
154
|
+
return core as any;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
type TestType = ReturnType<typeof createCore<{ position: { type: "number"}, health: { type: "string"} }>>
|
|
158
|
+
type CheckTestType = Assert<Equal<TestType, Core<{
|
|
159
|
+
id: number;
|
|
160
|
+
position: number;
|
|
161
|
+
health: string;
|
|
162
|
+
}>>>
|
|
163
|
+
type TestTypeComponents = TestType["componentSchemas"]
|
|
164
|
+
type CheckComponents = Assert<Equal<TestTypeComponents, {
|
|
165
|
+
readonly id: Schema;
|
|
166
|
+
readonly position: Schema;
|
|
167
|
+
readonly health: Schema;
|
|
168
|
+
}>>;
|
|
@@ -19,5 +19,4 @@ 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
|
-
export
|
|
23
|
-
//# sourceMappingURL=async-cache.js.map
|
|
22
|
+
export * from "./core.js";
|