@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.
Files changed (591) hide show
  1. package/.cursorrules +28 -0
  2. package/.eslintrc.cjs +48 -0
  3. package/.github/CONTRIBUTING.md +47 -0
  4. package/CODE_OF_CONDUCT.md +79 -0
  5. package/LICENSE +21 -0
  6. package/README.md +2 -2
  7. package/asconfig.json +22 -0
  8. package/assembly/index.ts +85 -0
  9. package/assembly/tsconfig.json +17 -0
  10. package/c/build_run.sh +2 -0
  11. package/c/vector_addition +0 -0
  12. package/c/vector_addition.c +125 -0
  13. package/{cache/functions/types.js → config/license.js} +0 -2
  14. package/docs/perftest.html +28 -0
  15. package/index.html +10 -0
  16. package/package.json +50 -28
  17. package/scripts/deploy-docs.sh +41 -0
  18. package/{assembly-test/assembly.test.js → src/assembly-test/assembly.test.ts} +4 -4
  19. package/src/cache/async-cache.ts +38 -0
  20. package/{cache/blob-store.test.js → src/cache/blob-store.test.ts} +41 -7
  21. package/src/cache/blob-store.ts +278 -0
  22. package/src/cache/data-cache.test.ts +61 -0
  23. package/src/cache/data-cache.ts +183 -0
  24. package/src/cache/expiring-data-cache.test.ts +81 -0
  25. package/src/cache/expiring-data-cache.ts +61 -0
  26. package/src/cache/fallback-async-cache.ts +49 -0
  27. package/src/cache/functions/async-data-function.ts +25 -0
  28. package/src/cache/functions/functions.test.ts +84 -0
  29. package/{cache/functions/get-cached.test.js → src/cache/functions/get-cached.test.ts} +24 -7
  30. package/{cache/functions/get-cached.js → src/cache/functions/get-cached.ts} +12 -6
  31. package/{cache/functions/hashing/blob-to-hash.js → src/cache/functions/hashing/blob-to-hash.ts} +20 -18
  32. package/{cache/functions/hashing/buffer-to-hash.js → src/cache/functions/hashing/buffer-to-hash.ts} +7 -7
  33. package/src/cache/functions/hashing/hashing.test.ts +95 -0
  34. package/{cache/functions/hashing/index.js → src/cache/functions/hashing/index.ts} +1 -1
  35. package/{cache/functions/hashing/json-to-hash.js → src/cache/functions/hashing/json-to-hash.ts} +3 -3
  36. package/{cache/functions/hashing/string-to-hash.js → src/cache/functions/hashing/string-to-hash.ts} +11 -10
  37. package/{cache/functions/index.js → src/cache/functions/index.ts} +2 -4
  38. package/{cache/functions/memoize.js → src/cache/functions/memoize.ts} +22 -15
  39. package/src/cache/functions/prevent-parallel-execution.ts +50 -0
  40. package/src/cache/get-persistent-cache.ts +62 -0
  41. package/{cache/index.js → src/cache/index.ts} +9 -3
  42. package/src/cache/managed-array.ts +243 -0
  43. package/{cache/managed-async-cache.browser.test.js → src/cache/managed-async-cache.browser.test.ts} +27 -24
  44. package/src/cache/managed-async-cache.ts +78 -0
  45. package/src/cache/memory-allocator.ts +176 -0
  46. package/src/cache/memory-async-cache.ts +51 -0
  47. package/src/data.ts +38 -0
  48. package/src/ecs/README.md +21 -0
  49. package/src/ecs/archetype/archetype.ts +39 -0
  50. package/src/ecs/archetype/create-archetype.test.ts +115 -0
  51. package/src/ecs/archetype/create-archetype.ts +52 -0
  52. package/src/ecs/archetype/delete-row.test.ts +110 -0
  53. package/src/ecs/archetype/delete-row.ts +37 -0
  54. package/src/ecs/archetype/index.ts +24 -0
  55. package/src/ecs/component-schemas.ts +24 -0
  56. package/src/ecs/core-components.ts +443 -0
  57. package/src/ecs/database/create-database.test.ts +745 -0
  58. package/src/ecs/database/create-database.ts +205 -0
  59. package/src/ecs/database/database.ts +81 -0
  60. package/src/ecs/database/index.ts +24 -0
  61. package/src/ecs/database/observe-dependent-value.test.ts +198 -0
  62. package/src/ecs/database/observe-dependent-value.ts +78 -0
  63. package/src/ecs/database/transactional-store/create-transactional-store.test.ts +250 -0
  64. package/src/ecs/database/transactional-store/create-transactional-store.ts +281 -0
  65. package/{ecs/ecs/ecs-types.js → src/ecs/database/transactional-store/index.ts} +1 -2
  66. package/src/ecs/database/transactional-store/transactional-store.ts +80 -0
  67. package/src/ecs/entity-location-table/create-entity-location-table.test.ts +170 -0
  68. package/src/ecs/entity-location-table/create-entity-location-table.ts +96 -0
  69. package/src/ecs/entity-location-table/entity-location-table.ts +30 -0
  70. package/{core/schema/schema.js → src/ecs/entity-location-table/entity-location.ts} +11 -11
  71. package/src/ecs/entity-location-table/index.ts +23 -0
  72. package/src/ecs/entity.ts +26 -0
  73. package/src/ecs/index.ts +26 -0
  74. package/src/ecs/store/core/core.ts +71 -0
  75. package/src/ecs/store/core/create-core.test.ts +440 -0
  76. package/src/ecs/store/core/create-core.ts +168 -0
  77. package/{cache/async-cache.js → src/ecs/store/core/index.ts} +1 -2
  78. package/src/ecs/store/create-store.test.ts +562 -0
  79. package/src/ecs/store/create-store.ts +97 -0
  80. package/src/ecs/store/index.ts +23 -0
  81. package/{types/types.js → src/ecs/store/resource-components.ts} +2 -6
  82. package/src/ecs/store/store.ts +55 -0
  83. package/src/equals-shallow.test.ts +133 -0
  84. package/src/equals-shallow.ts +37 -0
  85. package/src/equals.test.ts +175 -0
  86. package/src/equals.ts +70 -0
  87. package/src/index.ts +27 -0
  88. package/src/internal/array-buffer-like/copy.ts +469 -0
  89. package/src/internal/array-buffer-like/grow.ts +53 -0
  90. package/{core/index.js → src/internal/array-buffer-like/index.ts} +4 -4
  91. package/src/internal/array-buffer-like/is-array-buffer.ts +445 -0
  92. package/src/internal/array-buffer-like/is-shared-array-buffer.ts +445 -0
  93. package/{core/functions/is-async-generator.js → src/internal/async-generator/is-async-generator.ts} +2 -2
  94. package/{core/schema.js → src/internal/data-view-32/create-data-view-32.ts} +8 -11
  95. package/src/internal/data-view-32/data-view-32.ts +447 -0
  96. package/{ecs/action-ecs/index.js → src/internal/data-view-32/index.ts} +2 -2
  97. package/src/internal/function/memoize-factory.ts +12 -0
  98. package/src/internal/object/index.ts +23 -0
  99. package/{cache/functions/bind-functions.js → src/internal/object/map-entries.ts} +6 -11
  100. package/src/internal/promise/is-promise.ts +28 -0
  101. package/src/internal/typed-array/get-byte-size.ts +50 -0
  102. package/src/internal/typed-array/index.ts +24 -0
  103. package/src/internal/typed-array/typed-array-constructer.ts +32 -0
  104. package/src/internal/typed-array/typed-array.ts +25 -0
  105. package/src/is-data.ts +47 -0
  106. package/src/lit/decorators/apply-decorator.ts +24 -0
  107. package/src/lit/decorators/apply-service-decorators.ts +13 -0
  108. package/src/lit/decorators/index.ts +24 -0
  109. package/src/lit/decorators/require-service.ts +19 -0
  110. package/src/lit/elements/index.ts +3 -0
  111. package/src/lit/elements/service-application.ts +26 -0
  112. package/src/lit/elements/service-context.ts +3 -0
  113. package/src/lit/elements/service-element.ts +18 -0
  114. package/src/lit/hooks/component/component.ts +10 -0
  115. package/src/lit/hooks/component/stack.ts +17 -0
  116. package/src/lit/hooks/index.ts +13 -0
  117. package/src/lit/hooks/use-connected.ts +39 -0
  118. package/src/lit/hooks/use-effect.ts +17 -0
  119. package/src/lit/hooks/use-element.ts +8 -0
  120. package/src/lit/hooks/use-memo.ts +14 -0
  121. package/src/lit/hooks/use-observable-values.ts +9 -0
  122. package/src/lit/hooks/use-observable.ts +13 -0
  123. package/src/lit/hooks/use-ref.ts +6 -0
  124. package/src/lit/hooks/use-resize-observer.ts +27 -0
  125. package/src/lit/hooks/use-state.ts +17 -0
  126. package/src/lit/hooks/use-window-event.ts +14 -0
  127. package/src/lit/hooks/with-hooks.ts +20 -0
  128. package/src/lit/index.ts +3 -0
  129. package/src/mutable-clone.ts +29 -0
  130. package/{core/data.test.js → src/normalize.test.ts} +22 -22
  131. package/src/normalize.ts +37 -0
  132. package/src/observe/create-observable-event.ts +47 -0
  133. package/src/observe/create-observable-state.ts +51 -0
  134. package/src/observe/create-persisted-state.test.ts +143 -0
  135. package/src/observe/create-persisted-state.ts +60 -0
  136. package/src/observe/create-query-state.ts +70 -0
  137. package/{observe/from-array.js → src/observe/from-array.ts} +14 -3
  138. package/{service/service.js → src/observe/from-constant.ts} +13 -4
  139. package/{observe/from-element-id.js → src/observe/from-element-id.ts} +44 -39
  140. package/src/observe/from-element-properties-and-events.ts +47 -0
  141. package/{observe/from-element-property.js → src/observe/from-element-property.ts} +33 -25
  142. package/src/observe/from-promise-with-error.ts +51 -0
  143. package/src/observe/from-promise.ts +49 -0
  144. package/src/observe/from-properties.ts +67 -0
  145. package/{observe/index.js → src/observe/index.ts} +4 -1
  146. package/src/observe/observe.test.ts +467 -0
  147. package/src/observe/to-promise.ts +40 -0
  148. package/src/observe/to-properties.ts +41 -0
  149. package/src/observe/types.ts +40 -0
  150. package/src/observe/with-async-map.ts +37 -0
  151. package/src/observe/with-batch.test.ts +141 -0
  152. package/src/observe/with-batch.ts +67 -0
  153. package/{core/data.js → src/observe/with-cache.ts} +32 -26
  154. package/src/observe/with-copy.ts +32 -0
  155. package/src/observe/with-deduplicate-data.ts +43 -0
  156. package/src/observe/with-deduplicate.ts +41 -0
  157. package/src/observe/with-default.ts +48 -0
  158. package/src/observe/with-lazy.test.ts +68 -0
  159. package/{core/functions/is-promise.js → src/observe/with-lazy.ts} +17 -5
  160. package/{observe/with-map-data.js → src/observe/with-map-data.ts} +9 -3
  161. package/src/observe/with-map.ts +36 -0
  162. package/src/observe/with-optional.ts +47 -0
  163. package/src/observe/with-unwrap.ts +54 -0
  164. package/src/old-ecs/action-ecs/action-ecs.test.ts +420 -0
  165. package/src/old-ecs/action-ecs/action-ecs.ts +274 -0
  166. package/src/old-ecs/action-ecs/action-types.ts +178 -0
  167. package/src/old-ecs/action-ecs/index.ts +29 -0
  168. package/{service/sequential-action.js → src/old-ecs/action-ecs/sequential-action.ts} +19 -4
  169. package/src/old-ecs/core-ecs/core-ecs-serialization.test.ts +244 -0
  170. package/src/old-ecs/core-ecs/core-ecs-types.ts +183 -0
  171. package/src/old-ecs/core-ecs/core-ecs.test.ts +474 -0
  172. package/src/old-ecs/core-ecs/core-ecs.ts +640 -0
  173. package/{core/functions/index.js → src/old-ecs/core-ecs/index.ts} +9 -4
  174. package/src/old-ecs/ecs/ecs-types.ts +189 -0
  175. package/src/old-ecs/ecs/ecs-where-functions.ts +95 -0
  176. package/src/old-ecs/ecs/ecs.test.ts +461 -0
  177. package/src/old-ecs/ecs/ecs.ts +279 -0
  178. package/{ecs/core-ecs/core-ecs-types.js → src/old-ecs/ecs/index.ts} +2 -2
  179. package/src/old-ecs/entity.ts +26 -0
  180. package/{ecs/index.js → src/old-ecs/index.ts} +1 -1
  181. package/{ecs/transaction-ecs/index.js → src/old-ecs/transaction-ecs/index.ts} +0 -1
  182. package/src/old-ecs/transaction-ecs/transaction-ecs.test.ts +725 -0
  183. package/src/old-ecs/transaction-ecs/transaction-ecs.ts +283 -0
  184. package/src/old-ecs/transaction-ecs/transaction-types.ts +248 -0
  185. package/src/old-ecs/transaction-ecs/transactions.ts +243 -0
  186. package/src/perftest/ecs-perf.ts +255 -0
  187. package/src/perftest/helper-functions.ts +31 -0
  188. package/src/perftest/horizon-perf.ts +132 -0
  189. package/{perftest/index.js → src/perftest/index.ts} +9 -7
  190. package/src/perftest/perf-test.ts +193 -0
  191. package/src/perftest/perf.md +90 -0
  192. package/src/perftest/vanilla-perf.ts +136 -0
  193. package/src/schema/boolean.ts +5 -0
  194. package/src/schema/dynamic/deep-merge.test.ts +100 -0
  195. package/src/schema/dynamic/deep-merge.ts +67 -0
  196. package/{core/schema/dynamic/enumerate-patches.test.js → src/schema/dynamic/enumerate-patches.test.ts} +49 -23
  197. package/{core/schema/dynamic/enumerate-patches.js → src/schema/dynamic/enumerate-patches.ts} +44 -4
  198. package/{core/schema/dynamic/get-dynamic-schema.test.js → src/schema/dynamic/get-dynamic-schema.test.ts} +41 -6
  199. package/src/schema/dynamic/get-dynamic-schema.ts +48 -0
  200. package/src/schema/dynamic/index.ts +22 -0
  201. package/src/schema/f32.ts +30 -0
  202. package/src/schema/i32.ts +31 -0
  203. package/src/schema/index.ts +32 -0
  204. package/{cache/functions/omit.js → src/schema/nullable.ts} +10 -7
  205. package/src/schema/schema.ts +229 -0
  206. package/src/schema/time.ts +5 -0
  207. package/src/schema/true.ts +26 -0
  208. package/src/schema/tuple.ts +5 -0
  209. package/src/schema/u32.ts +31 -0
  210. package/{core/schema/validation/is-valid.test.js → src/schema/validation/is-valid.test.ts} +6 -3
  211. package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
  212. package/{core/schema/validation/validate.test.js → src/schema/validation/validate.test.ts} +18 -4
  213. package/{core/schema/validation/validate.js → src/schema/validation/validate.ts} +9 -6
  214. package/{core/functions/with-validation.test.js → src/schema/validation/with-validation.test.ts} +28 -12
  215. package/{core/functions/with-validation.js → src/schema/validation/with-validation.ts} +14 -10
  216. package/src/schema.test.ts +55 -0
  217. package/src/service/add-observable-actions.ts +207 -0
  218. package/{service/index.js → src/service/index.ts} +4 -4
  219. package/src/service/is-service.ts +7 -0
  220. package/src/service/progressive-result.ts +141 -0
  221. package/src/service/service.ts +27 -0
  222. package/src/table/add-row.ts +42 -0
  223. package/src/table/create-table.ts +36 -0
  224. package/src/table/delete-row.ts +42 -0
  225. package/src/table/ensure-capacity.ts +37 -0
  226. package/src/table/get-row-data.ts +31 -0
  227. package/src/table/index.ts +29 -0
  228. package/src/table/row-index.ts +26 -0
  229. package/src/table/table.ts +32 -0
  230. package/src/table/update-row.ts +35 -0
  231. package/src/tsconfig.json +6 -0
  232. package/src/typed-buffer/copy-to-gpu-buffer.ts +23 -0
  233. package/{cache/expiring-data-cache.js → src/typed-buffer/create-array-buffer.ts} +31 -25
  234. package/src/typed-buffer/create-number-buffer.ts +90 -0
  235. package/src/typed-buffer/create-struct-buffer.ts +93 -0
  236. package/src/typed-buffer/create-typed-buffer.ts +49 -0
  237. package/src/typed-buffer/index.ts +26 -0
  238. package/src/typed-buffer/structs/assert-struct.ts +37 -0
  239. package/src/typed-buffer/structs/create-read-struct.test.ts +202 -0
  240. package/src/typed-buffer/structs/create-read-struct.ts +77 -0
  241. package/src/typed-buffer/structs/create-write-struct.ts +73 -0
  242. package/src/typed-buffer/structs/get-field-offset.ts +36 -0
  243. package/src/typed-buffer/structs/get-struct-layout.test.ts +146 -0
  244. package/src/typed-buffer/structs/get-struct-layout.ts +222 -0
  245. package/src/typed-buffer/structs/index.ts +22 -0
  246. package/src/typed-buffer/structs/read-struct.ts +25 -0
  247. package/src/typed-buffer/structs/struct-layout.ts +465 -0
  248. package/src/typed-buffer/structs/write-struct.test.ts +195 -0
  249. package/src/typed-buffer/structs/write-struct.ts +25 -0
  250. package/src/typed-buffer/typed-buffer.test.ts +253 -0
  251. package/src/typed-buffer/typed-buffer.ts +41 -0
  252. package/src/types/assert.ts +22 -0
  253. package/src/types/equal.ts +24 -0
  254. package/{types/index.js → src/types/index.ts} +3 -1
  255. package/src/types/types.ts +166 -0
  256. package/tsconfig-base.json +25 -0
  257. package/tsconfig.json +8 -0
  258. package/typedoc.json +22 -0
  259. package/vite.config.js +16 -0
  260. package/assembly/index.d.ts +0 -30
  261. package/assembly/index.js +0 -18
  262. package/assembly/index.wasm +0 -0
  263. package/assembly/index.wasm.map +0 -1
  264. package/assembly-test/assembly.test.d.ts +0 -1
  265. package/assembly-test/assembly.test.js.map +0 -1
  266. package/cache/async-cache.d.ts +0 -15
  267. package/cache/async-cache.js.map +0 -1
  268. package/cache/blob-store.d.ts +0 -94
  269. package/cache/blob-store.js +0 -191
  270. package/cache/blob-store.js.map +0 -1
  271. package/cache/blob-store.test.d.ts +0 -1
  272. package/cache/blob-store.test.js.map +0 -1
  273. package/cache/data-cache.d.ts +0 -38
  274. package/cache/data-cache.js +0 -96
  275. package/cache/data-cache.js.map +0 -1
  276. package/cache/data-cache.test.d.ts +0 -1
  277. package/cache/data-cache.test.js +0 -50
  278. package/cache/data-cache.test.js.map +0 -1
  279. package/cache/expiring-data-cache.d.ts +0 -6
  280. package/cache/expiring-data-cache.js.map +0 -1
  281. package/cache/expiring-data-cache.test.d.ts +0 -1
  282. package/cache/expiring-data-cache.test.js +0 -62
  283. package/cache/expiring-data-cache.test.js.map +0 -1
  284. package/cache/fallback-async-cache.d.ts +0 -7
  285. package/cache/fallback-async-cache.js +0 -22
  286. package/cache/fallback-async-cache.js.map +0 -1
  287. package/cache/functions/bind-functions.d.ts +0 -6
  288. package/cache/functions/bind-functions.js.map +0 -1
  289. package/cache/functions/functions.test.d.ts +0 -1
  290. package/cache/functions/functions.test.js +0 -79
  291. package/cache/functions/functions.test.js.map +0 -1
  292. package/cache/functions/get-cached.d.ts +0 -11
  293. package/cache/functions/get-cached.js.map +0 -1
  294. package/cache/functions/get-cached.test.d.ts +0 -1
  295. package/cache/functions/get-cached.test.js.map +0 -1
  296. package/cache/functions/hashing/blob-to-hash.d.ts +0 -4
  297. package/cache/functions/hashing/blob-to-hash.js.map +0 -1
  298. package/cache/functions/hashing/buffer-to-hash.d.ts +0 -4
  299. package/cache/functions/hashing/buffer-to-hash.js.map +0 -1
  300. package/cache/functions/hashing/hashing.test.d.ts +0 -1
  301. package/cache/functions/hashing/hashing.test.js +0 -95
  302. package/cache/functions/hashing/hashing.test.js.map +0 -1
  303. package/cache/functions/hashing/index.d.ts +0 -4
  304. package/cache/functions/hashing/index.js.map +0 -1
  305. package/cache/functions/hashing/json-to-hash.d.ts +0 -4
  306. package/cache/functions/hashing/json-to-hash.js.map +0 -1
  307. package/cache/functions/hashing/string-to-hash.d.ts +0 -4
  308. package/cache/functions/hashing/string-to-hash.js.map +0 -1
  309. package/cache/functions/index.d.ts +0 -5
  310. package/cache/functions/index.js.map +0 -1
  311. package/cache/functions/memoize.d.ts +0 -12
  312. package/cache/functions/memoize.js.map +0 -1
  313. package/cache/functions/omit.d.ts +0 -1
  314. package/cache/functions/omit.js.map +0 -1
  315. package/cache/functions/prevent-parallel-execution.d.ts +0 -7
  316. package/cache/functions/prevent-parallel-execution.js +0 -25
  317. package/cache/functions/prevent-parallel-execution.js.map +0 -1
  318. package/cache/functions/types.d.ts +0 -1
  319. package/cache/functions/types.js.map +0 -1
  320. package/cache/get-persistent-cache.d.ts +0 -12
  321. package/cache/get-persistent-cache.js +0 -23
  322. package/cache/get-persistent-cache.js.map +0 -1
  323. package/cache/index.d.ts +0 -3
  324. package/cache/index.js.map +0 -1
  325. package/cache/managed-array.d.ts +0 -23
  326. package/cache/managed-array.js +0 -160
  327. package/cache/managed-array.js.map +0 -1
  328. package/cache/managed-async-cache.browser.test.d.ts +0 -1
  329. package/cache/managed-async-cache.browser.test.js.map +0 -1
  330. package/cache/managed-async-cache.d.ts +0 -4
  331. package/cache/managed-async-cache.js +0 -45
  332. package/cache/managed-async-cache.js.map +0 -1
  333. package/cache/memory-allocator.d.ts +0 -23
  334. package/cache/memory-allocator.js +0 -94
  335. package/cache/memory-allocator.js.map +0 -1
  336. package/cache/memory-async-cache.d.ts +0 -6
  337. package/cache/memory-async-cache.js +0 -23
  338. package/cache/memory-async-cache.js.map +0 -1
  339. package/core/data.d.ts +0 -22
  340. package/core/data.js.map +0 -1
  341. package/core/data.test.d.ts +0 -1
  342. package/core/data.test.js.map +0 -1
  343. package/core/functions/array-equals.d.ts +0 -1
  344. package/core/functions/array-equals.js.map +0 -1
  345. package/core/functions/deep-merge.d.ts +0 -32
  346. package/core/functions/deep-merge.js +0 -54
  347. package/core/functions/deep-merge.js.map +0 -1
  348. package/core/functions/deep-merge.test.d.ts +0 -1
  349. package/core/functions/deep-merge.test.js +0 -94
  350. package/core/functions/deep-merge.test.js.map +0 -1
  351. package/core/functions/index.d.ts +0 -3
  352. package/core/functions/index.js.map +0 -1
  353. package/core/functions/is-async-generator.d.ts +0 -1
  354. package/core/functions/is-async-generator.js.map +0 -1
  355. package/core/functions/is-promise.d.ts +0 -1
  356. package/core/functions/is-promise.js.map +0 -1
  357. package/core/functions/with-validation.d.ts +0 -5
  358. package/core/functions/with-validation.js.map +0 -1
  359. package/core/functions/with-validation.test.d.ts +0 -1
  360. package/core/functions/with-validation.test.js.map +0 -1
  361. package/core/index.d.ts +0 -3
  362. package/core/index.js.map +0 -1
  363. package/core/schema/dynamic/dynamic-schema.d.ts +0 -27
  364. package/core/schema/dynamic/dynamic-schema.js +0 -2
  365. package/core/schema/dynamic/dynamic-schema.js.map +0 -1
  366. package/core/schema/dynamic/enumerate-patches.d.ts +0 -9
  367. package/core/schema/dynamic/enumerate-patches.js.map +0 -1
  368. package/core/schema/dynamic/enumerate-patches.test.d.ts +0 -134
  369. package/core/schema/dynamic/enumerate-patches.test.js.map +0 -1
  370. package/core/schema/dynamic/get-dynamic-schema.d.ts +0 -5
  371. package/core/schema/dynamic/get-dynamic-schema.js +0 -26
  372. package/core/schema/dynamic/get-dynamic-schema.js.map +0 -1
  373. package/core/schema/dynamic/get-dynamic-schema.test.d.ts +0 -1
  374. package/core/schema/dynamic/get-dynamic-schema.test.js.map +0 -1
  375. package/core/schema/dynamic/index.d.ts +0 -1
  376. package/core/schema/dynamic/index.js +0 -2
  377. package/core/schema/dynamic/index.js.map +0 -1
  378. package/core/schema/dynamic/schema-path-value-path.d.ts +0 -5
  379. package/core/schema/dynamic/schema-path-value-path.js +0 -12
  380. package/core/schema/dynamic/schema-path-value-path.js.map +0 -1
  381. package/core/schema/dynamic-schema.d.ts +0 -27
  382. package/core/schema/dynamic-schema.js +0 -2
  383. package/core/schema/dynamic-schema.js.map +0 -1
  384. package/core/schema/index.d.ts +0 -4
  385. package/core/schema/index.js +0 -26
  386. package/core/schema/index.js.map +0 -1
  387. package/core/schema/schema.d.ts +0 -122
  388. package/core/schema/schema.js.map +0 -1
  389. package/core/schema/schemas.d.ts +0 -45
  390. package/core/schema/schemas.js +0 -39
  391. package/core/schema/schemas.js.map +0 -1
  392. package/core/schema/ui-schema.d.ts +0 -25
  393. package/core/schema/ui-schema.js +0 -2
  394. package/core/schema/ui-schema.js.map +0 -1
  395. package/core/schema/validation/is-valid.d.ts +0 -2
  396. package/core/schema/validation/is-valid.js +0 -14
  397. package/core/schema/validation/is-valid.js.map +0 -1
  398. package/core/schema/validation/is-valid.test.d.ts +0 -1
  399. package/core/schema/validation/is-valid.test.js.map +0 -1
  400. package/core/schema/validation/validate.d.ts +0 -2
  401. package/core/schema/validation/validate.js.map +0 -1
  402. package/core/schema/validation/validate.test.d.ts +0 -1
  403. package/core/schema/validation/validate.test.js.map +0 -1
  404. package/core/schema/validation/with-validation.d.ts +0 -5
  405. package/core/schema/validation/with-validation.js +0 -16
  406. package/core/schema/validation/with-validation.js.map +0 -1
  407. package/core/schema/validation/with-validation.test.d.ts +0 -1
  408. package/core/schema/validation/with-validation.test.js +0 -96
  409. package/core/schema/validation/with-validation.test.js.map +0 -1
  410. package/core/schema.d.ts +0 -86
  411. package/core/schema.js.map +0 -1
  412. package/core/schema.test.d.ts +0 -1
  413. package/core/schema.test.js +0 -16
  414. package/core/schema.test.js.map +0 -1
  415. package/core/schemas.d.ts +0 -45
  416. package/core/schemas.js +0 -39
  417. package/core/schemas.js.map +0 -1
  418. package/ecs/action-ecs/action-ecs.d.ts +0 -19
  419. package/ecs/action-ecs/action-ecs.js +0 -203
  420. package/ecs/action-ecs/action-ecs.js.map +0 -1
  421. package/ecs/action-ecs/action-ecs.test.d.ts +0 -1
  422. package/ecs/action-ecs/action-ecs.test.js +0 -362
  423. package/ecs/action-ecs/action-ecs.test.js.map +0 -1
  424. package/ecs/action-ecs/action-types.d.ts +0 -106
  425. package/ecs/action-ecs/action-types.js +0 -19
  426. package/ecs/action-ecs/action-types.js.map +0 -1
  427. package/ecs/action-ecs/index.d.ts +0 -2
  428. package/ecs/action-ecs/index.js.map +0 -1
  429. package/ecs/core-ecs/core-ecs-serialization.test.d.ts +0 -1
  430. package/ecs/core-ecs/core-ecs-serialization.test.js +0 -230
  431. package/ecs/core-ecs/core-ecs-serialization.test.js.map +0 -1
  432. package/ecs/core-ecs/core-ecs-types.d.ts +0 -141
  433. package/ecs/core-ecs/core-ecs-types.js.map +0 -1
  434. package/ecs/core-ecs/core-ecs.d.ts +0 -7
  435. package/ecs/core-ecs/core-ecs.js +0 -492
  436. package/ecs/core-ecs/core-ecs.js.map +0 -1
  437. package/ecs/core-ecs/core-ecs.test.d.ts +0 -1
  438. package/ecs/core-ecs/core-ecs.test.js +0 -425
  439. package/ecs/core-ecs/core-ecs.test.js.map +0 -1
  440. package/ecs/core-ecs/index.d.ts +0 -1
  441. package/ecs/core-ecs/index.js +0 -2
  442. package/ecs/core-ecs/index.js.map +0 -1
  443. package/ecs/ecs/ecs-types.d.ts +0 -132
  444. package/ecs/ecs/ecs-types.js.map +0 -1
  445. package/ecs/ecs/ecs-where-functions.d.ts +0 -6
  446. package/ecs/ecs/ecs-where-functions.js +0 -91
  447. package/ecs/ecs/ecs-where-functions.js.map +0 -1
  448. package/ecs/ecs/ecs.d.ts +0 -13
  449. package/ecs/ecs/ecs.js +0 -177
  450. package/ecs/ecs/ecs.js.map +0 -1
  451. package/ecs/ecs/ecs.test.d.ts +0 -1
  452. package/ecs/ecs/ecs.test.js +0 -399
  453. package/ecs/ecs/ecs.test.js.map +0 -1
  454. package/ecs/ecs/index.d.ts +0 -3
  455. package/ecs/ecs/index.js +0 -3
  456. package/ecs/ecs/index.js.map +0 -1
  457. package/ecs/index.d.ts +0 -4
  458. package/ecs/index.js.map +0 -1
  459. package/ecs/transaction-ecs/index.d.ts +0 -2
  460. package/ecs/transaction-ecs/index.js.map +0 -1
  461. package/ecs/transaction-ecs/transaction-ecs.d.ts +0 -11
  462. package/ecs/transaction-ecs/transaction-ecs.js +0 -184
  463. package/ecs/transaction-ecs/transaction-ecs.js.map +0 -1
  464. package/ecs/transaction-ecs/transaction-ecs.test.d.ts +0 -1
  465. package/ecs/transaction-ecs/transaction-ecs.test.js +0 -599
  466. package/ecs/transaction-ecs/transaction-ecs.test.js.map +0 -1
  467. package/ecs/transaction-ecs/transaction-types.d.ts +0 -135
  468. package/ecs/transaction-ecs/transaction-types.js +0 -2
  469. package/ecs/transaction-ecs/transaction-types.js.map +0 -1
  470. package/ecs/transaction-ecs/transactions.d.ts +0 -5
  471. package/ecs/transaction-ecs/transactions.js +0 -158
  472. package/ecs/transaction-ecs/transactions.js.map +0 -1
  473. package/index.d.ts +0 -1
  474. package/index.js +0 -23
  475. package/index.js.map +0 -1
  476. package/observe/create-observable-event.d.ts +0 -10
  477. package/observe/create-observable-event.js +0 -22
  478. package/observe/create-observable-event.js.map +0 -1
  479. package/observe/create-observable-state.d.ts +0 -7
  480. package/observe/create-observable-state.js +0 -27
  481. package/observe/create-observable-state.js.map +0 -1
  482. package/observe/create-persisted-state.d.ts +0 -11
  483. package/observe/create-persisted-state.js +0 -31
  484. package/observe/create-persisted-state.js.map +0 -1
  485. package/observe/create-persisted-state.test.d.ts +0 -1
  486. package/observe/create-persisted-state.test.js +0 -124
  487. package/observe/create-persisted-state.test.js.map +0 -1
  488. package/observe/from-array.d.ts +0 -5
  489. package/observe/from-array.js.map +0 -1
  490. package/observe/from-constant.d.ts +0 -5
  491. package/observe/from-constant.js +0 -12
  492. package/observe/from-constant.js.map +0 -1
  493. package/observe/from-element-id.d.ts +0 -7
  494. package/observe/from-element-id.js.map +0 -1
  495. package/observe/from-element-properties-and-events.d.ts +0 -2
  496. package/observe/from-element-properties-and-events.js +0 -18
  497. package/observe/from-element-properties-and-events.js.map +0 -1
  498. package/observe/from-element-property.d.ts +0 -11
  499. package/observe/from-element-property.js.map +0 -1
  500. package/observe/from-promise-with-error.d.ts +0 -7
  501. package/observe/from-promise-with-error.js +0 -27
  502. package/observe/from-promise-with-error.js.map +0 -1
  503. package/observe/from-promise.d.ts +0 -6
  504. package/observe/from-promise.js +0 -22
  505. package/observe/from-promise.js.map +0 -1
  506. package/observe/from-properties.d.ts +0 -10
  507. package/observe/from-properties.js +0 -33
  508. package/observe/from-properties.js.map +0 -1
  509. package/observe/index.d.ts +0 -27
  510. package/observe/index.js.map +0 -1
  511. package/observe/observe.test.d.ts +0 -7
  512. package/observe/observe.test.js +0 -417
  513. package/observe/observe.test.js.map +0 -1
  514. package/observe/to-promise.d.ts +0 -8
  515. package/observe/to-promise.js +0 -18
  516. package/observe/to-promise.js.map +0 -1
  517. package/observe/to-properties.d.ts +0 -11
  518. package/observe/to-properties.js +0 -9
  519. package/observe/to-properties.js.map +0 -1
  520. package/observe/types.d.ts +0 -17
  521. package/observe/types.js +0 -2
  522. package/observe/types.js.map +0 -1
  523. package/observe/with-async-map.d.ts +0 -6
  524. package/observe/with-async-map.js +0 -12
  525. package/observe/with-async-map.js.map +0 -1
  526. package/observe/with-cache.d.ts +0 -6
  527. package/observe/with-cache.js +0 -33
  528. package/observe/with-cache.js.map +0 -1
  529. package/observe/with-copy.d.ts +0 -5
  530. package/observe/with-copy.js +0 -10
  531. package/observe/with-copy.js.map +0 -1
  532. package/observe/with-deduplicate-data.d.ts +0 -7
  533. package/observe/with-deduplicate-data.js +0 -18
  534. package/observe/with-deduplicate-data.js.map +0 -1
  535. package/observe/with-deduplicate.d.ts +0 -6
  536. package/observe/with-deduplicate.js +0 -19
  537. package/observe/with-deduplicate.js.map +0 -1
  538. package/observe/with-default.d.ts +0 -6
  539. package/observe/with-default.js +0 -21
  540. package/observe/with-default.js.map +0 -1
  541. package/observe/with-map-data.d.ts +0 -7
  542. package/observe/with-map-data.js.map +0 -1
  543. package/observe/with-map.d.ts +0 -5
  544. package/observe/with-map.js +0 -11
  545. package/observe/with-map.js.map +0 -1
  546. package/observe/with-optional.d.ts +0 -5
  547. package/observe/with-optional.js +0 -20
  548. package/observe/with-optional.js.map +0 -1
  549. package/observe/with-unwrap.d.ts +0 -5
  550. package/observe/with-unwrap.js +0 -26
  551. package/observe/with-unwrap.js.map +0 -1
  552. package/perftest/ecs-perf.d.ts +0 -49
  553. package/perftest/ecs-perf.js +0 -230
  554. package/perftest/ecs-perf.js.map +0 -1
  555. package/perftest/helper-functions.d.ts +0 -1
  556. package/perftest/helper-functions.js +0 -31
  557. package/perftest/helper-functions.js.map +0 -1
  558. package/perftest/horizon-perf.d.ts +0 -22
  559. package/perftest/horizon-perf.js +0 -126
  560. package/perftest/horizon-perf.js.map +0 -1
  561. package/perftest/index.d.ts +0 -1
  562. package/perftest/index.js.map +0 -1
  563. package/perftest/perf-test.d.ts +0 -18
  564. package/perftest/perf-test.js +0 -124
  565. package/perftest/perf-test.js.map +0 -1
  566. package/perftest/vanilla-perf.d.ts +0 -38
  567. package/perftest/vanilla-perf.js +0 -128
  568. package/perftest/vanilla-perf.js.map +0 -1
  569. package/schemas/index.d.ts +0 -1
  570. package/schemas/index.js +0 -23
  571. package/schemas/index.js.map +0 -1
  572. package/schemas/schemas.d.ts +0 -45
  573. package/schemas/schemas.js +0 -39
  574. package/schemas/schemas.js.map +0 -1
  575. package/service/add-observable-actions.d.ts +0 -29
  576. package/service/add-observable-actions.js +0 -108
  577. package/service/add-observable-actions.js.map +0 -1
  578. package/service/index.d.ts +0 -4
  579. package/service/index.js.map +0 -1
  580. package/service/progressive-result.d.ts +0 -96
  581. package/service/progressive-result.js +0 -99
  582. package/service/progressive-result.js.map +0 -1
  583. package/service/sequential-action.d.ts +0 -18
  584. package/service/sequential-action.js.map +0 -1
  585. package/service/service.d.ts +0 -4
  586. package/service/service.js.map +0 -1
  587. package/tsconfig.tsbuildinfo +0 -1
  588. package/types/index.d.ts +0 -1
  589. package/types/index.js.map +0 -1
  590. package/types/types.d.ts +0 -61
  591. 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
- const factory = (o) => {
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
- const factory = (o) => {
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
- const factory1 = (o) => {
72
+
73
+ const factory1 = (o: typeof obj) => {
63
74
  factory1CallCount++;
64
75
  return { computed: o.id * 2 };
65
76
  };
66
- const factory2 = (o) => {
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
- const factory = (o) => {
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
+ });