@adobe/data 0.1.3 → 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 +49 -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/{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,55 @@
|
|
|
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 { CoreComponents } from "../core-components.js";
|
|
23
|
+
import { ResourceComponents } from "./resource-components.js";
|
|
24
|
+
import { Core, QueryOptions, ReadonlyCore } from "./core/core.js";
|
|
25
|
+
import { Entity } from "../entity.js";
|
|
26
|
+
import { StringKeyof } from "../../types/types.js";
|
|
27
|
+
|
|
28
|
+
interface BaseStore<C extends CoreComponents> {
|
|
29
|
+
select<
|
|
30
|
+
Include extends StringKeyof<C>,
|
|
31
|
+
Exclude extends StringKeyof<C> = never
|
|
32
|
+
>(
|
|
33
|
+
include: Include[],
|
|
34
|
+
options?: QueryOptions<Include, Exclude>
|
|
35
|
+
): readonly Entity[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ReadonlyStore<
|
|
39
|
+
C extends CoreComponents = CoreComponents,
|
|
40
|
+
R extends ResourceComponents = never
|
|
41
|
+
> extends BaseStore<C>, ReadonlyCore<C> {
|
|
42
|
+
readonly resources: { readonly [K in StringKeyof<R>]: R[K] };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type ToReadonlyStore<T extends Store<any, any>> = T extends Store<infer C, infer R> ? ReadonlyStore<C, R> : never;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Store is the main interface for storing components, entities and resources.
|
|
49
|
+
*/
|
|
50
|
+
export interface Store<
|
|
51
|
+
C extends CoreComponents = CoreComponents,
|
|
52
|
+
R extends ResourceComponents = never
|
|
53
|
+
> extends BaseStore<C>, Core<C> {
|
|
54
|
+
readonly resources: { -readonly [K in StringKeyof<R>]: R[K] };
|
|
55
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { equalsShallow } from './equals-shallow.js';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
describe('equalsShallow', () => {
|
|
5
|
+
describe('primitives and identical refs', () => {
|
|
6
|
+
it('should return true for identical primitive values', () => {
|
|
7
|
+
expect(equalsShallow(1, 1)).toBe(true);
|
|
8
|
+
expect(equalsShallow('hello', 'hello')).toBe(true);
|
|
9
|
+
expect(equalsShallow(true, true)).toBe(true);
|
|
10
|
+
expect(equalsShallow(false, false)).toBe(true);
|
|
11
|
+
expect(equalsShallow(undefined, undefined)).toBe(true);
|
|
12
|
+
expect(equalsShallow(null, null)).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should return true for identical object references', () => {
|
|
16
|
+
const obj = { a: 1 };
|
|
17
|
+
expect(equalsShallow(obj, obj)).toBe(true);
|
|
18
|
+
|
|
19
|
+
const arr = [1, 2, 3];
|
|
20
|
+
expect(equalsShallow(arr, arr)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should return false for different primitive values', () => {
|
|
24
|
+
expect(equalsShallow(1, 2)).toBe(false);
|
|
25
|
+
expect(equalsShallow('hello', 'world')).toBe(false);
|
|
26
|
+
expect(equalsShallow(true, false)).toBe(false);
|
|
27
|
+
expect(equalsShallow(1, '1')).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('null and non-objects', () => {
|
|
32
|
+
it('should return false when one is null and other is not', () => {
|
|
33
|
+
expect(equalsShallow(null, {})).toBe(false);
|
|
34
|
+
expect(equalsShallow({}, null)).toBe(false);
|
|
35
|
+
expect(equalsShallow(null, [])).toBe(false);
|
|
36
|
+
expect(equalsShallow([], null)).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should return false when one is not an object', () => {
|
|
40
|
+
expect(equalsShallow(1, {})).toBe(false);
|
|
41
|
+
expect(equalsShallow({}, 1)).toBe(false);
|
|
42
|
+
expect(equalsShallow('string', [])).toBe(false);
|
|
43
|
+
expect(equalsShallow([], 'string')).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('arrays', () => {
|
|
48
|
+
it('should return true for identical arrays', () => {
|
|
49
|
+
expect(equalsShallow([1, 2, 3], [1, 2, 3])).toBe(true);
|
|
50
|
+
expect(equalsShallow(['a', 'b'], ['a', 'b'])).toBe(true);
|
|
51
|
+
expect(equalsShallow([], [])).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should return false when one is array and other is not', () => {
|
|
55
|
+
expect(equalsShallow([1, 2, 3], {})).toBe(false);
|
|
56
|
+
expect(equalsShallow({}, [1, 2, 3])).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should return false for arrays with different lengths', () => {
|
|
60
|
+
expect(equalsShallow([1, 2], [1, 2, 3])).toBe(false);
|
|
61
|
+
expect(equalsShallow([1, 2, 3], [1, 2])).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should return false for arrays with different elements', () => {
|
|
65
|
+
expect(equalsShallow([1, 2, 3], [1, 2, 4])).toBe(false);
|
|
66
|
+
expect(equalsShallow([1, 2, 3], [1, 3, 2])).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should handle nested objects in arrays (shallow comparison)', () => {
|
|
70
|
+
const obj1 = { a: 1 };
|
|
71
|
+
const obj2 = { a: 1 };
|
|
72
|
+
expect(equalsShallow([obj1], [obj1])).toBe(true);
|
|
73
|
+
expect(equalsShallow([obj1], [obj2])).toBe(false); // Different references
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('plain objects', () => {
|
|
78
|
+
it('should return true for identical objects', () => {
|
|
79
|
+
expect(equalsShallow({ a: 1, b: 2 }, { a: 1, b: 2 })).toBe(true);
|
|
80
|
+
expect(equalsShallow({}, {})).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should return false for objects with different values', () => {
|
|
84
|
+
expect(equalsShallow({ a: 1, b: 2 }, { a: 1, b: 3 })).toBe(false);
|
|
85
|
+
expect(equalsShallow({ a: 1 }, { a: 2 })).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should return false for objects with different keys', () => {
|
|
89
|
+
expect(equalsShallow({ a: 1, b: 2 }, { a: 1, c: 2 })).toBe(false);
|
|
90
|
+
expect(equalsShallow({ a: 1 }, { b: 1 })).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should return false when one object has extra keys', () => {
|
|
94
|
+
expect(equalsShallow({ a: 1 }, { a: 1, b: 2 })).toBe(false);
|
|
95
|
+
expect(equalsShallow({ a: 1, b: 2 }, { a: 1 })).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should handle nested objects (shallow comparison)', () => {
|
|
99
|
+
const nested1 = { x: 1 };
|
|
100
|
+
const nested2 = { x: 1 };
|
|
101
|
+
expect(equalsShallow({ a: nested1 }, { a: nested1 })).toBe(true);
|
|
102
|
+
expect(equalsShallow({ a: nested1 }, { a: nested2 })).toBe(false); // Different references
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should handle arrays as object values (shallow comparison)', () => {
|
|
106
|
+
const arr1 = [1, 2, 3];
|
|
107
|
+
const arr2 = [1, 2, 3];
|
|
108
|
+
expect(equalsShallow({ a: arr1 }, { a: arr1 })).toBe(true);
|
|
109
|
+
expect(equalsShallow({ a: arr1 }, { a: arr2 })).toBe(false); // Different references
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('edge cases', () => {
|
|
114
|
+
it('should handle objects with same keys but different order', () => {
|
|
115
|
+
expect(equalsShallow({ a: 1, b: 2 }, { b: 2, a: 1 })).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should handle objects with undefined values', () => {
|
|
119
|
+
expect(equalsShallow({ a: undefined }, { a: undefined })).toBe(true);
|
|
120
|
+
expect(equalsShallow({ a: undefined }, { a: 1 })).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should handle objects with null values', () => {
|
|
124
|
+
expect(equalsShallow({ a: null }, { a: null })).toBe(true);
|
|
125
|
+
expect(equalsShallow({ a: null }, { a: 1 })).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should handle mixed types in arrays', () => {
|
|
129
|
+
expect(equalsShallow([1, 'string', true], [1, 'string', true])).toBe(true);
|
|
130
|
+
expect(equalsShallow([1, 'string', true], [1, 'string', false])).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
|
|
2
|
+
export function equalsShallow(a: unknown, b: unknown): boolean {
|
|
3
|
+
// primitives / identical refs
|
|
4
|
+
if (a === b) return true;
|
|
5
|
+
if (
|
|
6
|
+
a === null || b === null ||
|
|
7
|
+
typeof a !== "object" || typeof b !== "object"
|
|
8
|
+
) return false;
|
|
9
|
+
|
|
10
|
+
// arrays
|
|
11
|
+
if (Array.isArray(a)) {
|
|
12
|
+
if (!Array.isArray(b)) return false;
|
|
13
|
+
const aa = a as unknown[];
|
|
14
|
+
const bb = b as unknown[];
|
|
15
|
+
if (aa.length !== bb.length) return false;
|
|
16
|
+
for (let i = 0; i < aa.length; i++) {
|
|
17
|
+
if (aa[i] !== bb[i]) return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(b)) return false;
|
|
22
|
+
|
|
23
|
+
// plain objects
|
|
24
|
+
let keysA = 0;
|
|
25
|
+
for (const k in a as Record<string, unknown>) {
|
|
26
|
+
if ((a as Record<string, unknown>)[k] !== (b as Record<string, unknown>)[k])
|
|
27
|
+
return false;
|
|
28
|
+
keysA++;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ensure no extra keys in b
|
|
32
|
+
let keysB = 0;
|
|
33
|
+
for (const _ in b as Record<string, unknown>) keysB++;
|
|
34
|
+
|
|
35
|
+
return keysA === keysB;
|
|
36
|
+
}
|
|
37
|
+
|
|
@@ -0,0 +1,175 @@
|
|
|
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
|
+
|
|
23
|
+
import { equals } from './equals.js';
|
|
24
|
+
import { describe, expect, it } from 'vitest';
|
|
25
|
+
|
|
26
|
+
describe('equals', () => {
|
|
27
|
+
describe('primitives and identical references', () => {
|
|
28
|
+
it('should return true for identical primitive values', () => {
|
|
29
|
+
expect(equals(42, 42)).toBe(true);
|
|
30
|
+
expect(equals('hello', 'hello')).toBe(true);
|
|
31
|
+
expect(equals(true, true)).toBe(true);
|
|
32
|
+
expect(equals(false, false)).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should return true for identical object references', () => {
|
|
36
|
+
const obj = { a: 1 };
|
|
37
|
+
expect(equals(obj, obj)).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should return false for different primitive values', () => {
|
|
41
|
+
expect(equals(42, 43)).toBe(false);
|
|
42
|
+
expect(equals('hello', 'world')).toBe(false);
|
|
43
|
+
expect(equals(true, false)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('null and undefined handling', () => {
|
|
48
|
+
it('should return false when one value is null and other is not', () => {
|
|
49
|
+
expect(equals(null, 42)).toBe(false);
|
|
50
|
+
expect(equals(42, null)).toBe(false);
|
|
51
|
+
expect(equals(null, 'hello')).toBe(false);
|
|
52
|
+
expect(equals('hello', null)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should return false when one value is undefined and other is not', () => {
|
|
56
|
+
expect(equals(undefined, 42)).toBe(false);
|
|
57
|
+
expect(equals(42, undefined)).toBe(false);
|
|
58
|
+
expect(equals(undefined, 'hello')).toBe(false);
|
|
59
|
+
expect(equals('hello', undefined)).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('should return false when one is null and other is undefined', () => {
|
|
63
|
+
expect(equals(null, undefined)).toBe(false);
|
|
64
|
+
expect(equals(undefined, null)).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('type mismatch handling', () => {
|
|
69
|
+
it('should return false when one is primitive and other is object', () => {
|
|
70
|
+
expect(equals(42, {})).toBe(false);
|
|
71
|
+
expect(equals({}, 42)).toBe(false);
|
|
72
|
+
expect(equals('hello', [])).toBe(false);
|
|
73
|
+
expect(equals([], 'hello')).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('arrays', () => {
|
|
78
|
+
it('should return true for identical arrays', () => {
|
|
79
|
+
expect(equals([1, 2, 3], [1, 2, 3])).toBe(true);
|
|
80
|
+
expect(equals(['a', 'b'], ['a', 'b'])).toBe(true);
|
|
81
|
+
expect(equals([], [])).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should return false when one is array and other is object', () => {
|
|
85
|
+
expect(equals([1, 2, 3], { 0: 1, 1: 2, 2: 3 })).toBe(false);
|
|
86
|
+
expect(equals({ 0: 1, 1: 2, 2: 3 }, [1, 2, 3])).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should return false for arrays with different lengths', () => {
|
|
90
|
+
expect(equals([1, 2], [1, 2, 3])).toBe(false);
|
|
91
|
+
expect(equals([1, 2, 3], [1, 2])).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should return false for arrays with different values', () => {
|
|
95
|
+
expect(equals([1, 2, 3], [1, 2, 4])).toBe(false);
|
|
96
|
+
expect(equals([1, 2, 3], [1, 3, 2])).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should handle nested arrays', () => {
|
|
100
|
+
expect(equals([[1, 2], [3, 4]], [[1, 2], [3, 4]])).toBe(true);
|
|
101
|
+
expect(equals([[1, 2], [3, 4]], [[1, 2], [3, 5]])).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should handle arrays with mixed content', () => {
|
|
105
|
+
expect(equals([1, 'hello', { a: 1 }], [1, 'hello', { a: 1 }])).toBe(true);
|
|
106
|
+
expect(equals([1, 'hello', { a: 1 }], [1, 'hello', { a: 2 }])).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('objects', () => {
|
|
111
|
+
it('should return true for identical objects', () => {
|
|
112
|
+
expect(equals({ a: 1, b: 2 }, { a: 1, b: 2 })).toBe(true);
|
|
113
|
+
expect(equals({}, {})).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should return false for objects with different keys', () => {
|
|
117
|
+
expect(equals({ a: 1 }, { b: 1 })).toBe(false);
|
|
118
|
+
expect(equals({ a: 1, b: 2 }, { a: 1 })).toBe(false);
|
|
119
|
+
expect(equals({ a: 1 }, { a: 1, b: 2 })).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should return false for objects with same keys but different values', () => {
|
|
123
|
+
expect(equals({ a: 1, b: 2 }, { a: 1, b: 3 })).toBe(false);
|
|
124
|
+
expect(equals({ a: 1 }, { a: 2 })).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should handle nested objects', () => {
|
|
128
|
+
expect(equals({ a: { b: 1 } }, { a: { b: 1 } })).toBe(true);
|
|
129
|
+
expect(equals({ a: { b: 1 } }, { a: { b: 2 } })).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should handle objects with arrays', () => {
|
|
133
|
+
expect(equals({ a: [1, 2] }, { a: [1, 2] })).toBe(true);
|
|
134
|
+
expect(equals({ a: [1, 2] }, { a: [1, 3] })).toBe(false);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should handle complex nested structures', () => {
|
|
138
|
+
const obj1 = { a: [1, { b: 2, c: [3, 4] }], d: { e: 5 } };
|
|
139
|
+
const obj2 = { a: [1, { b: 2, c: [3, 4] }], d: { e: 5 } };
|
|
140
|
+
const obj3 = { a: [1, { b: 2, c: [3, 5] }], d: { e: 5 } };
|
|
141
|
+
|
|
142
|
+
expect(equals(obj1, obj2)).toBe(true);
|
|
143
|
+
expect(equals(obj1, obj3)).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('edge cases', () => {
|
|
148
|
+
it('should handle objects with numeric keys', () => {
|
|
149
|
+
expect(equals({ '0': 1, '1': 2 }, { '0': 1, '1': 2 })).toBe(true);
|
|
150
|
+
expect(equals({ '0': 1, '1': 2 }, { '0': 1, '1': 3 })).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('should handle empty arrays and objects', () => {
|
|
154
|
+
expect(equals([], [])).toBe(true);
|
|
155
|
+
expect(equals({}, {})).toBe(true);
|
|
156
|
+
expect(equals([], {})).toBe(false);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should handle objects with undefined values', () => {
|
|
160
|
+
expect(equals({ a: undefined }, { a: undefined })).toBe(true);
|
|
161
|
+
expect(equals({ a: undefined }, { a: null })).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should handle objects with null values', () => {
|
|
165
|
+
expect(equals({ a: null }, { a: null })).toBe(true);
|
|
166
|
+
expect(equals({ a: null }, { a: undefined })).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should handle NaN values', () => {
|
|
170
|
+
expect(equals(NaN, NaN)).toBe(true);
|
|
171
|
+
expect(equals(NaN, 42)).toBe(false);
|
|
172
|
+
expect(equals(42, NaN)).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
package/src/equals.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Very-fast deep equality for JSON-style values.
|
|
25
|
+
*
|
|
26
|
+
* Assumptions
|
|
27
|
+
* ───────────
|
|
28
|
+
* • Only JSON primitives, plain objects, and arrays appear.
|
|
29
|
+
* • Objects have **no prototype chain** (so every enumerable key is "own,"
|
|
30
|
+
* letting us skip costly `hasOwnProperty` checks).
|
|
31
|
+
* • No cyclic references (add a WeakMap if you need that).
|
|
32
|
+
*/
|
|
33
|
+
export function equals(a: unknown, b: unknown): boolean {
|
|
34
|
+
// 1 Primitives / identical reference
|
|
35
|
+
if (Object.is(a, b)) return true; // Handles NaN === NaN
|
|
36
|
+
if (a == null || b == null) return false; // null / undefined mismatch
|
|
37
|
+
if (typeof a !== "object" || typeof b !== "object") return false;
|
|
38
|
+
|
|
39
|
+
// 2 Arrays
|
|
40
|
+
const aIsArr = Array.isArray(a);
|
|
41
|
+
const bIsArr = Array.isArray(b);
|
|
42
|
+
if (aIsArr || bIsArr) {
|
|
43
|
+
if (aIsArr !== bIsArr) return false; // one array, one object
|
|
44
|
+
const aa = a as unknown[];
|
|
45
|
+
const bb = b as unknown[];
|
|
46
|
+
if (aa.length !== bb.length) return false;
|
|
47
|
+
for (let i = 0; i < aa.length; i++) {
|
|
48
|
+
if (!equals(aa[i], bb[i])) return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 3 Plain objects
|
|
54
|
+
const ao = a as Record<string, unknown>;
|
|
55
|
+
const bo = b as Record<string, unknown>;
|
|
56
|
+
|
|
57
|
+
let keyBalance = 0; // = keys(a) – keys(b)
|
|
58
|
+
|
|
59
|
+
// Pass 1: walk keys of a, compare values, and tally count.
|
|
60
|
+
for (const k in ao) {
|
|
61
|
+
keyBalance++; // saw a key from a
|
|
62
|
+
if (!(k in bo)) return false; // missing in b
|
|
63
|
+
if (!equals(ao[k], bo[k])) return false; // value differs
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Pass 2: walk keys of b to detect extras.
|
|
67
|
+
for (const _ in bo) keyBalance--;
|
|
68
|
+
|
|
69
|
+
return keyBalance === 0; // zero ⇒ same key set
|
|
70
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
|
|
23
|
+
export { type Data } from "./data.js";
|
|
24
|
+
export { type IsData } from "./is-data.js";
|
|
25
|
+
export { equals } from "./equals.js";
|
|
26
|
+
export { normalize} from "./normalize.js";
|
|
27
|
+
export { mutableClone } from "./mutable-clone.js";
|