@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,61 @@
|
|
|
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 { getDataCache } from "./data-cache.js";
|
|
23
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
24
|
+
|
|
25
|
+
describe("DataCache", () => {
|
|
26
|
+
beforeAll(() => {});
|
|
27
|
+
it("should allow storing and retrieving values in namespaced/versioned caches", async () => {
|
|
28
|
+
// get a namespaced cache
|
|
29
|
+
const cache = await getDataCache("test:v1");
|
|
30
|
+
|
|
31
|
+
// create some keys and values to store
|
|
32
|
+
const key = { foo: 1, bar: [{ baz: 12 }] };
|
|
33
|
+
const valueIn = { alpha: "bet", bar: ["a", "b"] };
|
|
34
|
+
|
|
35
|
+
// store a key/value pair
|
|
36
|
+
await cache.put(key, valueIn);
|
|
37
|
+
|
|
38
|
+
// retrieve the value
|
|
39
|
+
const valueOut = await cache.match(key);
|
|
40
|
+
|
|
41
|
+
// output is NOT identical
|
|
42
|
+
expect(valueOut !== valueIn).toBe(true);
|
|
43
|
+
|
|
44
|
+
// output IS structurally equal
|
|
45
|
+
expect(valueOut).toEqual(valueIn);
|
|
46
|
+
|
|
47
|
+
// output from structurally equivalent key is the same
|
|
48
|
+
expect(await cache.match(JSON.parse(JSON.stringify(key)))).toEqual(valueIn);
|
|
49
|
+
|
|
50
|
+
// output from equivalent cache (constructed with same name/version) is the same.
|
|
51
|
+
expect(await (await getDataCache("test:v1")).match(key)).toEqual(valueIn);
|
|
52
|
+
|
|
53
|
+
// output from different named cache is undefined
|
|
54
|
+
expect(await (await getDataCache("test2:v1")).match(key)).toEqual(
|
|
55
|
+
undefined
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// output from different cache version is undefined
|
|
59
|
+
expect(await (await getDataCache("test:v2")).match(key)).toEqual(undefined);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,183 @@
|
|
|
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 { type AsyncCache } from "./async-cache.js";
|
|
23
|
+
import { type BlobRef, BlobStore, isBlobRef, blobStore } from "./blob-store.js";
|
|
24
|
+
import { getManagedPersistentCache } from "./get-persistent-cache.js";
|
|
25
|
+
|
|
26
|
+
import { type Data } from "../data.js";
|
|
27
|
+
import { createExpiringDataCache } from "./expiring-data-cache.js";
|
|
28
|
+
|
|
29
|
+
export type DataCacheInternal<K extends Data, V extends Data> = AsyncCache<
|
|
30
|
+
K,
|
|
31
|
+
V
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A persistent cache that stores data with an optional expiration time.
|
|
36
|
+
*/
|
|
37
|
+
export interface DataCache<K extends Data, V extends Data> {
|
|
38
|
+
/**
|
|
39
|
+
* Stores a new value within the cache.
|
|
40
|
+
* @param key key to use to store the value
|
|
41
|
+
* @param value the value to store
|
|
42
|
+
* @param maxDuration the time to live relative to the current time
|
|
43
|
+
*/
|
|
44
|
+
put(key: K, value: V, options?: { maximumDuration: number }): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Attempts to retrieve a value from the cache.
|
|
47
|
+
* @param key The key previously used to store the value.
|
|
48
|
+
*/
|
|
49
|
+
match(key: K): Promise<V | undefined>;
|
|
50
|
+
/**
|
|
51
|
+
* Deletes an item from the cache.
|
|
52
|
+
* @param key The key previously used to store the value.
|
|
53
|
+
*/
|
|
54
|
+
delete(key: K): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Recursively searches arbitrary JSON data and locates any BlobRefs within it.
|
|
59
|
+
*/
|
|
60
|
+
function getBlobRefsInternal(
|
|
61
|
+
d: Data,
|
|
62
|
+
refs: Array<BlobRef> = []
|
|
63
|
+
): Array<BlobRef> {
|
|
64
|
+
if (d && typeof d === "object") {
|
|
65
|
+
if (isBlobRef(d)) {
|
|
66
|
+
refs.push(d);
|
|
67
|
+
}
|
|
68
|
+
for (const value of Array.isArray(d) ? d : Object.values(d)) {
|
|
69
|
+
getBlobRefsInternal(value, refs);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return refs;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function getBlobRefs(d: Data): Array<BlobRef> {
|
|
76
|
+
return getBlobRefsInternal(d);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function toRequest(data: Data) {
|
|
80
|
+
return new Request("http://cache.key?" + encodeURI(JSON.stringify(data)));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function areAllBlobRefsPresentInBlobStore(
|
|
84
|
+
blobstore: BlobStore,
|
|
85
|
+
data: Data
|
|
86
|
+
): Promise<boolean> {
|
|
87
|
+
for (const ref of getBlobRefs(data)) {
|
|
88
|
+
// TODO: consider using a batched request to the blobstore or await Promise.all
|
|
89
|
+
if (!(await blobstore.hasBlob(ref))) {
|
|
90
|
+
// a contained blob ref is expired, so the entire data structure is expired
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function createDataCache<K extends Data, V extends Data>(
|
|
98
|
+
cache: AsyncCache<Request, Response>
|
|
99
|
+
): DataCacheInternal<K, V> {
|
|
100
|
+
return {
|
|
101
|
+
async match(k: K): Promise<V | undefined> {
|
|
102
|
+
const response = await cache.match(toRequest(k));
|
|
103
|
+
return response?.json();
|
|
104
|
+
},
|
|
105
|
+
async put(k: K, v: V): Promise<void> {
|
|
106
|
+
const blob = new Blob([JSON.stringify(v)], { type: "application/json" });
|
|
107
|
+
await cache.put(toRequest(k), new Response(blob));
|
|
108
|
+
},
|
|
109
|
+
async delete(k: K): Promise<void> {
|
|
110
|
+
await cache.delete(toRequest(k));
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function createBlobRefAwareDataCache<
|
|
116
|
+
K extends Data = Data,
|
|
117
|
+
V extends Data = Data,
|
|
118
|
+
>(
|
|
119
|
+
baseCache: DataCacheInternal<K, V> = dataCache as DataCacheInternal<K, V>,
|
|
120
|
+
blobstore = blobStore
|
|
121
|
+
): DataCacheInternal<Data, Data> {
|
|
122
|
+
return {
|
|
123
|
+
...baseCache,
|
|
124
|
+
async match(k: K): Promise<Data | undefined> {
|
|
125
|
+
const result = await baseCache.match(k);
|
|
126
|
+
if (
|
|
127
|
+
result !== undefined &&
|
|
128
|
+
!(await areAllBlobRefsPresentInBlobStore(blobstore, result))
|
|
129
|
+
) {
|
|
130
|
+
await baseCache.delete(k);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const managedPersistentCache = await getManagedPersistentCache("datacache", {
|
|
139
|
+
maximumMemoryEntries: 100,
|
|
140
|
+
maximumStorageEntries: 1000,
|
|
141
|
+
});
|
|
142
|
+
const blobRefAwareDataCache = await createBlobRefAwareDataCache(
|
|
143
|
+
createDataCache(managedPersistentCache)
|
|
144
|
+
);
|
|
145
|
+
export const dataCache: DataCache<Data, Data> = createExpiringDataCache(
|
|
146
|
+
blobRefAwareDataCache
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Retrieves a namespaced data cache. Calling it multiple times will return an equivalent cache.
|
|
151
|
+
* Values stored within a data cache generally persist across sessions.
|
|
152
|
+
* @param nameSpace A unique string used to isolate values within this cache from other caches.
|
|
153
|
+
*/
|
|
154
|
+
export function getDataCache<K extends Data, V extends Data>(
|
|
155
|
+
nameSpace: string
|
|
156
|
+
): DataCache<K, V> {
|
|
157
|
+
return getNamespacedDataCacheInternal(nameSpace, dataCache);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function getNamespacedDataCacheInternal<K extends Data, V extends Data>(
|
|
161
|
+
name: string,
|
|
162
|
+
mainCache = dataCache
|
|
163
|
+
): DataCache<K, V> {
|
|
164
|
+
if (!name || name.length === 0) {
|
|
165
|
+
throw new Error(`name is required`);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const getNSKey = (key: K) => {
|
|
169
|
+
return { name, key };
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
async match(key: K): Promise<V | undefined> {
|
|
174
|
+
return (await mainCache.match(getNSKey(key))) as V | undefined;
|
|
175
|
+
},
|
|
176
|
+
async put(key: K, value: V, options): Promise<void> {
|
|
177
|
+
await mainCache.put(getNSKey(key), value, options);
|
|
178
|
+
},
|
|
179
|
+
async delete(key: K): Promise<void> {
|
|
180
|
+
await mainCache.delete(getNSKey(key));
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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 { createExpiringDataCache } from "./expiring-data-cache.js"; // Adjust the import path as necessary
|
|
23
|
+
import { describe, expect, it } from "vitest";
|
|
24
|
+
import { createDataCache } from "./data-cache.js";
|
|
25
|
+
import { getManagedPersistentCache } from "./get-persistent-cache.js";
|
|
26
|
+
|
|
27
|
+
describe("ExpiringDataCache", () => {
|
|
28
|
+
it("should store and retrieve an item before it expires", async () => {
|
|
29
|
+
const time = Date.now();
|
|
30
|
+
let timePassed = 0;
|
|
31
|
+
const getTime = () => time + timePassed;
|
|
32
|
+
const cache = createExpiringDataCache<string, string>(
|
|
33
|
+
createDataCache(
|
|
34
|
+
await getManagedPersistentCache("expiring-data-cache-test", {
|
|
35
|
+
maximumMemoryEntries: 10,
|
|
36
|
+
maximumStorageEntries: 100,
|
|
37
|
+
})
|
|
38
|
+
),
|
|
39
|
+
getTime
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
cache.put("key1", "value1", { maximumDuration: 1000 }); // Expires in 1000ms
|
|
43
|
+
expect(await cache.match("key1")).toBe("value1");
|
|
44
|
+
|
|
45
|
+
timePassed = 500;
|
|
46
|
+
expect(await cache.match("key1")).toBe("value1");
|
|
47
|
+
|
|
48
|
+
timePassed = 999;
|
|
49
|
+
expect(await cache.match("key1")).toBe("value1");
|
|
50
|
+
|
|
51
|
+
timePassed = 1000;
|
|
52
|
+
expect(await cache.match("key1")).toBeUndefined();
|
|
53
|
+
|
|
54
|
+
timePassed = 1001;
|
|
55
|
+
expect(await cache.match("key1")).toBeUndefined();
|
|
56
|
+
|
|
57
|
+
timePassed = 2000;
|
|
58
|
+
expect(await cache.match("key1")).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should immediately expire items when maximumDuration is 0", async () => {
|
|
62
|
+
const time = Date.now();
|
|
63
|
+
let timePassed = 0;
|
|
64
|
+
const getTime = () => time + timePassed;
|
|
65
|
+
const cache = createExpiringDataCache<string, string>(
|
|
66
|
+
createDataCache(
|
|
67
|
+
await getManagedPersistentCache("expiring-data-cache-test", {
|
|
68
|
+
maximumMemoryEntries: 10,
|
|
69
|
+
maximumStorageEntries: 100,
|
|
70
|
+
})
|
|
71
|
+
),
|
|
72
|
+
getTime
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
cache.put("key1", "value1", { maximumDuration: 0 }); // Expires immediately
|
|
76
|
+
expect(await cache.match("key1")).toBeUndefined();
|
|
77
|
+
|
|
78
|
+
timePassed = 1000;
|
|
79
|
+
expect(await cache.match("key1")).toBeUndefined();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
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 { type Data } from "../data.js";
|
|
24
|
+
import { type DataCache, DataCacheInternal } from "./data-cache.js";
|
|
25
|
+
|
|
26
|
+
type ExpiringData<T extends Data> = {
|
|
27
|
+
expiration: number | null;
|
|
28
|
+
value: T;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new expiring data cache with the specified underlying cache.
|
|
33
|
+
*/
|
|
34
|
+
export function createExpiringDataCache<K extends Data, V extends Data>(
|
|
35
|
+
baseCache: DataCacheInternal<K, V>,
|
|
36
|
+
getTime = () => Date.now()
|
|
37
|
+
): DataCache<K, V> {
|
|
38
|
+
const cache = baseCache as unknown as DataCacheInternal<K, ExpiringData<V>>;
|
|
39
|
+
return {
|
|
40
|
+
async match(key: K): Promise<V | undefined> {
|
|
41
|
+
const entry = await cache.match(key);
|
|
42
|
+
if (!entry) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
if (entry.expiration != null && entry.expiration <= getTime()) {
|
|
46
|
+
await cache.delete(key);
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return entry.value;
|
|
50
|
+
},
|
|
51
|
+
async put(key: K, value: V, options): Promise<void> {
|
|
52
|
+
const { maximumDuration: maxDuration } = options || {};
|
|
53
|
+
const expiration =
|
|
54
|
+
(maxDuration !== undefined) && maxDuration >= 0 ? getTime() + maxDuration : null;
|
|
55
|
+
await cache.put(key, { value, expiration });
|
|
56
|
+
},
|
|
57
|
+
async delete(key: K): Promise<void> {
|
|
58
|
+
await cache.delete(key);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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 { type AsyncCache } from "./async-cache.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Provides a combined cache interface.
|
|
26
|
+
* Writes to both caches.
|
|
27
|
+
* Prefers to read from the faster cache first before falling back to slower.
|
|
28
|
+
*/
|
|
29
|
+
export function createFallbackAsyncCache(
|
|
30
|
+
fasterSmaller: AsyncCache<Request, Response>,
|
|
31
|
+
slowerLarger: AsyncCache<Request, Response>
|
|
32
|
+
): AsyncCache<Request, Response> {
|
|
33
|
+
return {
|
|
34
|
+
async put(key: Request, value: Response): Promise<void> {
|
|
35
|
+
await Promise.all([
|
|
36
|
+
fasterSmaller.put(key, value),
|
|
37
|
+
slowerLarger.put(key, value),
|
|
38
|
+
]);
|
|
39
|
+
},
|
|
40
|
+
async match(key: Request): Promise<Response | undefined> {
|
|
41
|
+
return (
|
|
42
|
+
(await fasterSmaller.match(key)) ?? (await slowerLarger.match(key))
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
async delete(key: Request): Promise<void> {
|
|
46
|
+
await Promise.all([fasterSmaller.delete(key), slowerLarger.delete(key)]);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 AsyncDataFunction<InputArgs extends Array<unknown>, Output> = (
|
|
24
|
+
...args: InputArgs
|
|
25
|
+
) => Promise<Output>;
|
|
@@ -0,0 +1,84 @@
|
|
|
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 { memoize } from "./memoize.js";
|
|
23
|
+
import { preventParallelExecution } from "./prevent-parallel-execution.js";
|
|
24
|
+
import { describe, expect, it } from "vitest";
|
|
25
|
+
|
|
26
|
+
describe("Function", () => {
|
|
27
|
+
describe("prevent parallel execution", () => {
|
|
28
|
+
it("should block parallel execution and return same promise", async () => {
|
|
29
|
+
let addCallCount = 0;
|
|
30
|
+
async function add(a: number, b: number): Promise<number> {
|
|
31
|
+
addCallCount++;
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
resolve(a + b);
|
|
35
|
+
}, 100);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function testAddBlocksParallelExecution(addFn: typeof add) {
|
|
40
|
+
addCallCount = 0;
|
|
41
|
+
const promises = [addFn(1, 2), addFn(1, 2), addFn(1, 2)];
|
|
42
|
+
const results = await Promise.all(promises);
|
|
43
|
+
expect(results).toEqual([3, 3, 3]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const addFn = preventParallelExecution(add);
|
|
47
|
+
await testAddBlocksParallelExecution(addFn);
|
|
48
|
+
// after all have completed... then another can execute
|
|
49
|
+
addCallCount = 0;
|
|
50
|
+
expect(await addFn(1, 2)).toEqual(3);
|
|
51
|
+
expect(addCallCount).toEqual(1);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("memoize", () => {
|
|
56
|
+
it("should block parallel execution and return same promise", async () => {
|
|
57
|
+
let addCallCount = 0;
|
|
58
|
+
async function add(a: number, b: number): Promise<number> {
|
|
59
|
+
addCallCount++;
|
|
60
|
+
return new Promise((resolve) => {
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
resolve(a + b);
|
|
63
|
+
}, 100);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function testAddBlocksParallelExecution(addFn: typeof add) {
|
|
68
|
+
addCallCount = 0;
|
|
69
|
+
const promises = [addFn(1, 2), addFn(1, 2), addFn(1, 2)];
|
|
70
|
+
const results = await Promise.all(promises);
|
|
71
|
+
expect(results).toEqual([3, 3, 3]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// now memoize the addFn and verify that it is cached.
|
|
75
|
+
const addFn = memoize("addFn-v1", add);
|
|
76
|
+
await testAddBlocksParallelExecution(addFn);
|
|
77
|
+
// after all have completed... then another can execute
|
|
78
|
+
addCallCount = 0;
|
|
79
|
+
expect(await addFn(1, 2)).toEqual(3);
|
|
80
|
+
// with memoize, the count should be 0 because we get a cached result.
|
|
81
|
+
expect(addCallCount).toEqual(0);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -19,78 +19,95 @@ 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
|
+
|
|
22
23
|
import { getCached } from "./get-cached.js";
|
|
23
24
|
import { describe, expect, it } from "vitest";
|
|
25
|
+
|
|
24
26
|
describe("getCached", () => {
|
|
25
27
|
it("should cache values on objects", () => {
|
|
26
28
|
const obj = { id: 1 };
|
|
27
29
|
let factoryCallCount = 0;
|
|
28
|
-
|
|
30
|
+
|
|
31
|
+
const factory = (o: typeof obj) => {
|
|
29
32
|
factoryCallCount++;
|
|
30
33
|
return { computed: o.id * 2 };
|
|
31
34
|
};
|
|
35
|
+
|
|
32
36
|
// First call should invoke factory
|
|
33
37
|
const result1 = getCached(obj, factory);
|
|
34
38
|
expect(result1).toEqual({ computed: 2 });
|
|
35
39
|
expect(factoryCallCount).toBe(1);
|
|
40
|
+
|
|
36
41
|
// Second call should use cached value
|
|
37
42
|
const result2 = getCached(obj, factory);
|
|
38
43
|
expect(result2).toEqual({ computed: 2 });
|
|
39
44
|
expect(factoryCallCount).toBe(1);
|
|
40
45
|
});
|
|
46
|
+
|
|
41
47
|
it("should cache different values for different objects", () => {
|
|
42
48
|
const obj1 = { id: 1 };
|
|
43
49
|
const obj2 = { id: 2 };
|
|
44
50
|
let factoryCallCount = 0;
|
|
45
|
-
|
|
51
|
+
|
|
52
|
+
const factory = (o: typeof obj1) => {
|
|
46
53
|
factoryCallCount++;
|
|
47
54
|
return { computed: o.id * 2 };
|
|
48
55
|
};
|
|
56
|
+
|
|
49
57
|
// Call for first object
|
|
50
58
|
const result1 = getCached(obj1, factory);
|
|
51
59
|
expect(result1).toEqual({ computed: 2 });
|
|
52
60
|
expect(factoryCallCount).toBe(1);
|
|
61
|
+
|
|
53
62
|
// Call for second object should invoke factory again
|
|
54
63
|
const result2 = getCached(obj2, factory);
|
|
55
64
|
expect(result2).toEqual({ computed: 4 });
|
|
56
65
|
expect(factoryCallCount).toBe(2);
|
|
57
66
|
});
|
|
67
|
+
|
|
58
68
|
it("should cache different values for different factories on same object", () => {
|
|
59
69
|
const obj = { id: 1 };
|
|
60
70
|
let factory1CallCount = 0;
|
|
61
71
|
let factory2CallCount = 0;
|
|
62
|
-
|
|
72
|
+
|
|
73
|
+
const factory1 = (o: typeof obj) => {
|
|
63
74
|
factory1CallCount++;
|
|
64
75
|
return { computed: o.id * 2 };
|
|
65
76
|
};
|
|
66
|
-
|
|
77
|
+
|
|
78
|
+
const factory2 = (o: typeof obj) => {
|
|
67
79
|
factory2CallCount++;
|
|
68
80
|
return { computed: o.id * 3 };
|
|
69
81
|
};
|
|
82
|
+
|
|
70
83
|
// Call first factory
|
|
71
84
|
const result1 = getCached(obj, factory1);
|
|
72
85
|
expect(result1).toEqual({ computed: 2 });
|
|
73
86
|
expect(factory1CallCount).toBe(1);
|
|
74
87
|
expect(factory2CallCount).toBe(0);
|
|
88
|
+
|
|
75
89
|
// Call second factory
|
|
76
90
|
const result2 = getCached(obj, factory2);
|
|
77
91
|
expect(result2).toEqual({ computed: 3 });
|
|
78
92
|
expect(factory1CallCount).toBe(1);
|
|
79
93
|
expect(factory2CallCount).toBe(1);
|
|
80
94
|
});
|
|
95
|
+
|
|
81
96
|
it("should handle primitive values", () => {
|
|
82
97
|
const obj = { id: 1 };
|
|
83
98
|
let factoryCallCount = 0;
|
|
84
|
-
|
|
99
|
+
|
|
100
|
+
const factory = (o: typeof obj) => {
|
|
85
101
|
factoryCallCount++;
|
|
86
102
|
return o.id * 2;
|
|
87
103
|
};
|
|
104
|
+
|
|
88
105
|
const result1 = getCached(obj, factory);
|
|
89
106
|
expect(result1).toBe(2);
|
|
90
107
|
expect(factoryCallCount).toBe(1);
|
|
108
|
+
|
|
91
109
|
const result2 = getCached(obj, factory);
|
|
92
110
|
expect(result2).toBe(2);
|
|
93
111
|
expect(factoryCallCount).toBe(1);
|
|
94
112
|
});
|
|
95
|
-
});
|
|
96
|
-
//# sourceMappingURL=get-cached.test.js.map
|
|
113
|
+
});
|