@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
package/package.json CHANGED
@@ -1,56 +1,77 @@
1
1
  {
2
2
  "name": "@adobe/data",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "Adobe data oriented programming library",
5
5
  "type": "module",
6
6
  "sideEffects": true,
7
7
  "private": false,
8
- "packageManager": "pnpm@8.6.2+sha256.c6da9e00697e334b6193c034a5d1508e4c8605b12f249736b13f31139f4f0d73",
9
8
  "exports": {
10
9
  ".": {
11
- "import": "./core/index.js",
12
- "types": "./core/index.d.ts"
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
13
12
  },
14
13
  "./cache": {
15
- "import": "./cache/index.js",
16
- "types": "./cache/index.d.ts"
14
+ "import": "./dist/cache/index.js",
15
+ "types": "./dist/cache/index.d.ts"
17
16
  },
18
- "./schemas": {
19
- "import": "./schemas/index.js",
20
- "types": "./schemas/index.d.ts"
17
+ "./schema": {
18
+ "import": "./dist/schema/index.js",
19
+ "types": "./dist/schema/index.d.ts"
21
20
  },
22
21
  "./types": {
23
- "import": "./types/index.js",
24
- "types": "./types/index.d.ts"
22
+ "import": "./dist/types/index.js",
23
+ "types": "./dist/types/index.d.ts"
25
24
  },
26
25
  "./observe": {
27
- "import": "./observe/index.js",
28
- "types": "./observe/index.d.ts"
26
+ "import": "./dist/observe/index.js",
27
+ "types": "./dist/observe/index.d.ts"
29
28
  },
30
29
  "./ecs": {
31
- "import": "./ecs/index.js",
32
- "types": "./ecs/index.d.ts"
30
+ "import": "./dist/ecs/index.js",
31
+ "types": "./dist/ecs/index.d.ts"
32
+ },
33
+ "./old-ecs": {
34
+ "import": "./dist/old-ecs/index.js",
35
+ "types": "./dist/old-ecs/index.d.ts"
36
+ },
37
+ "./lit": {
38
+ "import": "./dist/lit/index.js",
39
+ "types": "./dist/lit/index.d.ts"
40
+ },
41
+ "./service": {
42
+ "import": "./dist/service/index.js",
43
+ "types": "./dist/service/index.d.ts"
44
+ },
45
+ "./table": {
46
+ "import": "./dist/table/index.js",
47
+ "types": "./dist/table/index.d.ts"
48
+ },
49
+ "./typed-buffer": {
50
+ "import": "./dist/typed-buffer/index.js",
51
+ "types": "./dist/typed-buffer/index.d.ts"
33
52
  }
34
53
  },
35
54
  "devDependencies": {
36
55
  "@assemblyscript/loader": "^0.27.30",
37
56
  "@trivago/prettier-plugin-sort-imports": "^4.3.0",
57
+ "@types/jsonpath": "^0.2.4",
38
58
  "@types/uuid": "^10.0.0",
39
- "@typescript-eslint/eslint-plugin": "^5.59.2",
40
- "@typescript-eslint/parser": "^5.59.2",
59
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
60
+ "@typescript-eslint/parser": "^6.21.0",
41
61
  "@vitest/browser": "^1.6.0",
62
+ "@webgpu/types": "^0.1.61",
42
63
  "assemblyscript": "^0.27.30",
43
64
  "eslint": "^8.56.0",
44
65
  "eslint-config-airbnb-typescript": "^17.1.0",
45
- "eslint-config-prettier": "^8.6.0",
66
+ "eslint-config-prettier": "^9.1.0",
46
67
  "eslint-formatter-pretty": "^5.0.0",
47
68
  "eslint-plugin-header": "^3.1.1",
48
- "eslint-plugin-import": "^2.27.5",
69
+ "eslint-plugin-import": "^2.29.1",
49
70
  "eslint-plugin-lit": "^1.11.0",
50
71
  "eslint-plugin-lit-a11y": "^4.1.2",
51
- "eslint-plugin-notice": "0.9.10",
72
+ "eslint-plugin-notice": "^0.9.10",
52
73
  "eslint-plugin-prettier": "^5.1.3",
53
- "glob": "^11.0.0",
74
+ "glob": "^10.3.10",
54
75
  "jsdom": "^24.1.0",
55
76
  "lint-staged": "^13.2.2",
56
77
  "nodemon": "^3.1.7",
@@ -63,7 +84,7 @@
63
84
  "stylelint": "^16.2.1",
64
85
  "stylelint-config-standard": "^36.0.0",
65
86
  "typedoc": "^0.26.7",
66
- "typescript": "^5.3.3",
87
+ "typescript": "^5.8.3",
67
88
  "uuid": "^10.0.0",
68
89
  "vite": "^5.1.1",
69
90
  "vitest": "^1.6.0",
@@ -76,27 +97,28 @@
76
97
  },
77
98
  "dependencies": {
78
99
  "@cfworker/json-schema": "^4.1.1",
79
- "jsonpath": "^1.1.1"
100
+ "@lit/context": "^1.1.5",
101
+ "jsonpath": "^1.1.1",
102
+ "lit": "^3.3.0"
80
103
  },
81
104
  "scripts": {
82
105
  "build": "pnpm build-assembly && run-p build:*",
83
- "build:code": "pnpm copy && tsc -b",
106
+ "build:code": "tsc -b",
84
107
  "build:apidocs": "typedoc",
85
108
  "build-assembly": "run-p asbuild:release",
86
109
  "clean": "rm -rf dist build node_modules",
87
- "copy": "mkdir -p dist && cp README.md dist && sed '/publish\":/d' package.json > dist/package.json",
88
110
  "deploy-docs": "pnpm build && ./scripts/deploy-docs.sh",
89
111
  "dev": "run-p dev:*",
90
- "dev:build": "pnpm copy && tsc -b -w --preserveWatchOutput",
112
+ "dev:build": "tsc -b -w --preserveWatchOutput",
91
113
  "dev:test": "pnpm test",
92
114
  "dev:apidocs": "nodemon -w README.md -w dist -x typedoc --delay 100",
93
115
  "dev:assembly": "nodemon -w assembly -e ts -x pnpm run asbuild:release --delay 100",
94
116
  "lint": "pnpm eslint .",
95
117
  "lint-fix": "pnpm eslint . --fix",
96
118
  "debug": "vitest --inspect-brk --no-file-parallelism --test-timeout 1000000",
97
- "link": "pnpm build && cd dist && ln -sf ../node_modules node_modules && pnpm link --global",
98
- "bump": "pnpm version patch --no-git-tag-version && git commit -am 'bumped patch version' && pnpm run publish",
119
+ "link": "pnpm build && pnpm link --global",
99
120
  "pre-commit": "lint-staged",
121
+ "publish-public": "pnpm build && pnpm publish --no-git-checks --access public",
100
122
  "perftest": "node dist/perftest/index.js",
101
123
  "test": "vitest",
102
124
  "asbuild:debug": "asc assembly/index.ts -o dist/assembly/index.wasm --target debug --enable simd && echo built dist/assembly/index.wasm",
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+
3
+ # Exit if any command fails
4
+ set -e
5
+
6
+ # Step 1: Ensure we are on the main branch
7
+ current_branch=$(git branch --show-current)
8
+ if [ "$current_branch" != "main" ]; then
9
+ echo "Error: You are on branch '$current_branch'. Please switch to 'main' before deploying."
10
+ exit 1
11
+ fi
12
+
13
+ # Step 2: Check for uncommitted changes
14
+ if [[ -n $(git status --porcelain) ]]; then
15
+ echo "Error: You have uncommitted changes. Please commit or stash your changes before deploying."
16
+ exit 1
17
+ fi
18
+
19
+ # Step 3: Build the project
20
+ echo "Building the project..."
21
+ pnpm install
22
+ pnpm run build
23
+
24
+ # Step 4: Checkout gh-pages branch
25
+ echo "Checking out the gh-pages branch..."
26
+ git fetch origin
27
+ git checkout gh-pages
28
+ git pull origin gh-pages
29
+
30
+ # Step 5: Commit and push the changes to gh-pages
31
+ echo "Committing and pushing changes to gh-pages..."
32
+ git checkout -f main -- README.md docs
33
+ git add dist/ docs/ README.md
34
+ git commit -m "Deploy updated docs and dist to GitHub Pages"
35
+ git push origin gh-pages
36
+
37
+ # Step 6: Switch back to the main branch
38
+ echo "Switching back to the main branch..."
39
+ git checkout main
40
+
41
+ echo "Deployment to gh-pages complete!"
@@ -21,9 +21,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.*/
22
22
  import { describe, expect, test } from "vitest";
23
23
  import { add } from "../../dist/assembly/index.js";
24
+
24
25
  describe("Assembly", () => {
25
- test("should be able to call assembly script functions", () => {
26
- expect(add(40, 2)).toBe(42);
27
- });
26
+ test("should be able to call assembly script functions", () => {
27
+ expect(add(40, 2)).toBe(42);
28
+ });
28
29
  });
29
- //# sourceMappingURL=assembly.test.js.map
@@ -0,0 +1,38 @@
1
+ /*MIT License
2
+
3
+ © Copyright 2025 Adobe. All rights reserved.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.*/
22
+
23
+ /**
24
+ * This is a generalization of the browser built in Cache API.
25
+ */
26
+ export interface AsyncCache<K, V> {
27
+ put(key: K, value: V): Promise<void>;
28
+ match(key: K): Promise<V | undefined>;
29
+ delete(key: K): Promise<void>;
30
+ }
31
+
32
+ /**
33
+ * Shouldn't be needed normally. Only used by ManagedAsyncCache.
34
+ * We don't want to expose it externally so leaving out of main AsyncCache type.
35
+ */
36
+ export interface AsyncCacheWithKeys<K, V> extends AsyncCache<K, V> {
37
+ keys(): Promise<ReadonlyArray<K>>;
38
+ }
@@ -20,123 +20,157 @@ 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
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
23
- import { createBlobStore } from "./blob-store.js";
23
+ import { type BlobStore, createBlobStore } from "./blob-store.js";
24
+
24
25
  describe("blobStore", () => {
25
26
  // Mock URL.createObjectURL and URL.revokeObjectURL
26
- const mockCreateObjectURL = vi.fn((blob) => `blob:${Math.random()}`);
27
+ const mockCreateObjectURL = vi.fn((blob: Blob) => `blob:${Math.random()}`);
27
28
  const mockRevokeObjectURL = vi.fn();
28
- let testBlobStore;
29
- let createdUrl;
29
+ let testBlobStore: BlobStore;
30
+ let createdUrl: string;
31
+
30
32
  beforeEach(async () => {
31
33
  // Setup URL mock functions
32
34
  const originalCreateObjectURL = URL.createObjectURL;
33
35
  const originalRevokeObjectURL = URL.revokeObjectURL;
36
+
34
37
  // Ensure we create a non-http URL
35
- mockCreateObjectURL.mockImplementation((blob) => {
38
+ mockCreateObjectURL.mockImplementation((blob: Blob) => {
36
39
  createdUrl = `blob:${Math.random()}`;
37
40
  return createdUrl;
38
41
  });
42
+
39
43
  URL.createObjectURL = mockCreateObjectURL;
40
44
  URL.revokeObjectURL = mockRevokeObjectURL;
45
+
41
46
  // Clear mock call history
42
47
  mockCreateObjectURL.mockClear();
43
48
  mockRevokeObjectURL.mockClear();
49
+
44
50
  testBlobStore = await createBlobStore();
51
+
45
52
  return () => {
46
53
  URL.createObjectURL = originalCreateObjectURL;
47
54
  URL.revokeObjectURL = originalRevokeObjectURL;
48
55
  };
49
56
  });
57
+
50
58
  afterEach(() => {
51
59
  // Clean up any remaining borrowed URLs
52
60
  mockCreateObjectURL.mockReset();
53
61
  mockRevokeObjectURL.mockReset();
54
62
  });
63
+
55
64
  describe("URL reference counting", () => {
56
65
  it("should reuse the same URL for multiple borrows of the same blob", async () => {
57
66
  // Create a test blob
58
67
  const testBlob = new Blob(["test"], { type: "text/plain" });
59
68
  const blobRef = await testBlobStore.getRef(testBlob);
69
+
60
70
  // Borrow the URL multiple times
61
71
  const url1 = await testBlobStore.borrowUrl(blobRef);
62
72
  const url2 = await testBlobStore.borrowUrl(blobRef);
63
73
  const url3 = await testBlobStore.borrowUrl(blobRef);
74
+
64
75
  expect(url1).toBeTruthy();
65
76
  expect(url1).toBe(url2);
66
77
  expect(url2).toBe(url3);
67
78
  expect(url1).toMatch(/^blob:/); // Verify it's a blob URL
79
+
68
80
  // createObjectURL should only be called once
69
81
  expect(mockCreateObjectURL).toHaveBeenCalledTimes(1);
82
+
70
83
  // Clean up
71
84
  testBlobStore.returnUrl(url1);
72
85
  testBlobStore.returnUrl(url2);
73
86
  testBlobStore.returnUrl(url3);
74
87
  });
88
+
75
89
  it("should only revoke URL when all references are returned", async () => {
76
90
  const testBlob = new Blob(["test"], { type: "text/plain" });
77
91
  const blobRef = await testBlobStore.getRef(testBlob);
92
+
78
93
  // Borrow the URL three times
79
94
  const url1 = await testBlobStore.borrowUrl(blobRef);
80
95
  const url2 = await testBlobStore.borrowUrl(blobRef);
81
96
  const url3 = await testBlobStore.borrowUrl(blobRef);
97
+
82
98
  expect(url1).toMatch(/^blob:/); // Verify it's a blob URL
99
+
83
100
  // Return URLs one by one
84
101
  testBlobStore.returnUrl(url1);
85
102
  expect(mockRevokeObjectURL).not.toHaveBeenCalled();
103
+
86
104
  testBlobStore.returnUrl(url2);
87
105
  expect(mockRevokeObjectURL).not.toHaveBeenCalled();
106
+
88
107
  testBlobStore.returnUrl(url3);
89
108
  expect(mockRevokeObjectURL).toHaveBeenCalledTimes(1);
90
109
  expect(mockRevokeObjectURL).toHaveBeenCalledWith(createdUrl);
91
110
  });
111
+
92
112
  it("should handle remote URLs correctly", async () => {
93
113
  const remoteRef = testBlobStore.createRemoteBlobRef("http://example.com/image.jpg");
114
+
94
115
  // Borrow remote URL multiple times
95
116
  const url1 = await testBlobStore.borrowUrl(remoteRef);
96
117
  const url2 = await testBlobStore.borrowUrl(remoteRef);
118
+
97
119
  expect(url1).toBe("http://example.com/image.jpg");
98
120
  expect(url2).toBe("http://example.com/image.jpg");
99
121
  expect(mockCreateObjectURL).not.toHaveBeenCalled();
122
+
100
123
  // Return URLs
101
124
  testBlobStore.returnUrl(url1);
102
125
  testBlobStore.returnUrl(url2);
126
+
103
127
  // Should not revoke remote URLs
104
128
  expect(mockRevokeObjectURL).not.toHaveBeenCalled();
105
129
  });
130
+
106
131
  it("should handle null inputs gracefully", async () => {
107
132
  const nullUrl = await testBlobStore.borrowUrl(null);
108
133
  expect(nullUrl).toBeNull();
134
+
109
135
  // Should not throw when returning null
110
136
  expect(() => testBlobStore.returnUrl(null)).not.toThrow();
111
137
  });
138
+
112
139
  it('demonstrates race condition in borrowUrl', async () => {
113
140
  const store = testBlobStore;
114
141
  const testBlob = new Blob(['test data'], { type: 'text/plain' });
115
142
  const blobRef = await store.getRef(testBlob);
143
+
116
144
  // Create an artificially delayed getBlob to simulate network latency
117
145
  const originalGetBlob = store.getBlob;
118
146
  store.getBlob = async (ref) => {
119
147
  await new Promise(resolve => setTimeout(resolve, 50)); // Add delay
120
148
  return originalGetBlob(ref);
121
149
  };
150
+
122
151
  // Make two parallel borrowUrl calls
123
152
  const [url1, url2] = await Promise.all([
124
153
  store.borrowUrl(blobRef),
125
154
  store.borrowUrl(blobRef)
126
155
  ]);
156
+
127
157
  expect(url1).toBe(url2); // Same URL should be returned
158
+
128
159
  // Return one of the URLs
129
160
  store.returnUrl(url1);
161
+
130
162
  // Verify that the borrow count is still 1 since we borrowed twice and returned once
131
163
  expect(store._testGetBorrowCount(blobRef)).toBe(1);
164
+
132
165
  // Return the second URL
133
166
  store.returnUrl(url2);
167
+
134
168
  // Verify the borrow count is now 0
135
169
  expect(store._testGetBorrowCount(blobRef)).toBe(0);
170
+
136
171
  // Verify the URL was revoked
137
172
  expect(mockRevokeObjectURL).toHaveBeenCalledTimes(1);
138
173
  expect(mockRevokeObjectURL).toHaveBeenCalledWith(url1);
139
174
  });
140
175
  });
141
- });
142
- //# sourceMappingURL=blob-store.test.js.map
176
+ });
@@ -0,0 +1,278 @@
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 { getManagedPersistentCache } from "./get-persistent-cache.js";
23
+ import { type FromSchema, type Schema } from "../schema/index.js";
24
+ import { blobToHash } from "./functions/hashing/blob-to-hash.js";
25
+ import { preventParallelExecution } from "./functions/prevent-parallel-execution.js";
26
+
27
+ const remoteUrlPrefix = "http";
28
+ const RemoteUrlSchema = {
29
+ type: "string",
30
+ pattern: `${remoteUrlPrefix}.*`,
31
+ } as const satisfies Schema;
32
+ type RemoteUrl = `${typeof remoteUrlPrefix}${string}`;
33
+
34
+ const RemoteBlobRefSchema = {
35
+ required: ["remoteBlobRef"],
36
+ properties: {
37
+ remoteBlobRef: RemoteUrlSchema,
38
+ },
39
+ additionalProperties: false,
40
+ } as const satisfies Schema;
41
+ type RemoteBlobRef = FromSchema<typeof RemoteBlobRefSchema>;
42
+
43
+ const LocalBlobRefSchema = {
44
+ required: ["localBlobRef"],
45
+ properties: {
46
+ localBlobRef: { type: "string" },
47
+ },
48
+ additionalProperties: false,
49
+ } as const satisfies Schema;
50
+ type LocalBlobRef = FromSchema<typeof LocalBlobRefSchema>;
51
+
52
+ export const BlobRefSchema = {
53
+ oneOf: [RemoteBlobRefSchema, LocalBlobRefSchema],
54
+ } as const satisfies Schema;
55
+
56
+ /**
57
+ * Represents a reference to a blob as a plain JSON object.
58
+ * Do NOT create this type directly.
59
+ * Use the BlobStore to create and manage blob references.
60
+ */
61
+ export type BlobRef = FromSchema<typeof BlobRefSchema>;
62
+
63
+ function isRemoteBlobRef(ref: unknown): ref is RemoteBlobRef {
64
+ const maybe = ref as Partial<RemoteBlobRef> | undefined;
65
+ return typeof maybe?.remoteBlobRef === "string";
66
+ }
67
+
68
+ function isLocalBlobRef(ref: unknown): ref is LocalBlobRef {
69
+ const maybe = ref as Partial<LocalBlobRef> | undefined;
70
+ return typeof maybe?.localBlobRef === "string";
71
+ }
72
+
73
+ export function isBlobRef(value: unknown): value is BlobRef {
74
+ return isRemoteBlobRef(value) || isLocalBlobRef(value);
75
+ }
76
+
77
+ function isRemoteUrl(url: string): url is RemoteUrl {
78
+ return url.startsWith(remoteUrlPrefix);
79
+ }
80
+
81
+ function toRequest(ref: LocalBlobRef) {
82
+ return new Request(`${window.location.origin}/${ref.localBlobRef}`);
83
+ }
84
+
85
+ /**
86
+ * Defined as a symbol because we only want it used by internal code like DataCache.
87
+ */
88
+ export const hasBlobInternalDoNotUse = Symbol("hasBlob");
89
+
90
+ /**
91
+ * A blob store is a service that can efficiently store blobs across sessions and retrieve them using the browsers Cache api.
92
+ */
93
+ export interface BlobStore {
94
+ /**
95
+ * Stores a blob and returns a reference to it.
96
+ * Blob references are based upon the content and type of the Blob.
97
+ * If an equivalent blob is stored, an equivalent reference will be returned every time.
98
+ */
99
+ getRef(b: Blob | string): Promise<BlobRef>;
100
+ /**
101
+ * Gets a blob from the blob store or null if it is not available.
102
+ */
103
+ getBlob(r: BlobRef | null): Promise<Blob | null>;
104
+ /**
105
+ * Checks if the blob is still available.
106
+ */
107
+ hasBlob(r: BlobRef | null): Promise<boolean>;
108
+ /**
109
+ * Do NOT use this directly, use useBorrowUrl hook instead as it will automatically return the url when the component unmounts.
110
+ */
111
+ borrowUrl(r: BlobRef | null): Promise<string | null>;
112
+ /**
113
+ * Return a url that was previously borrowed from borrowUrl.
114
+ * Failure to do so may result in memory leaking.
115
+ * @param url The url provided by borrowUrl.
116
+ */
117
+ returnUrl(url: string | null): void;
118
+ /**
119
+ * Removes a blob from the store.
120
+ */
121
+ releaseBlob(r: BlobRef): Promise<void>;
122
+ /**
123
+ * Creates a new remote blob ref. The url must start with http.
124
+ * This should only be called if the remote content is persistent and immutable.
125
+ */
126
+ createRemoteBlobRef(url: string): BlobRef;
127
+ /**
128
+ * TEST ONLY: Gets the current borrow count for a blob reference.
129
+ * This should only be used in tests to verify reference counting behavior.
130
+ * @param r The blob reference to check
131
+ * @returns The number of times the blob reference has been borrowed, or 0 if not borrowed
132
+ */
133
+ _testGetBorrowCount(r: BlobRef): number;
134
+ }
135
+
136
+ /**
137
+ * Creates a new blob store instance.
138
+ */
139
+ export function createBlobStore() {
140
+ const cachePromise = getManagedPersistentCache("blobstore", {
141
+ maximumMemoryEntries: 10,
142
+ maximumStorageEntries: 1000,
143
+ });
144
+
145
+ // Track borrowed URLs and their reference counts
146
+ const borrowedUrls = new Map<string, { url: string; count: number }>();
147
+ // Reverse mapping for O(1) lookup
148
+ const urlToKey = new Map<string, string>();
149
+
150
+ async function getRef(blob: Blob | string): Promise<BlobRef> {
151
+ const cache = await cachePromise;
152
+ if (typeof blob === "string") {
153
+ // if this is not a remote url, then we can assume it is a data url and fetch the blob from it.
154
+ blob = await (await fetch(blob)).blob();
155
+ }
156
+ const ref = {
157
+ localBlobRef: await blobToHash(blob),
158
+ } as const satisfies LocalBlobRef;
159
+
160
+ const request = toRequest(ref);
161
+ const response = new Response(blob);
162
+
163
+ await cache.put(request, response);
164
+ return ref;
165
+ }
166
+
167
+ async function hasBlob(r: BlobRef): Promise<boolean> {
168
+ if (isRemoteBlobRef(r)) {
169
+ return true;
170
+ }
171
+ const cache = await cachePromise;
172
+ const response = await cache.match(toRequest(r));
173
+ return response !== undefined;
174
+ }
175
+
176
+ async function getBlob(r?: BlobRef | null): Promise<Blob | null> {
177
+ if (!r) {
178
+ return null;
179
+ }
180
+ const response = await (isRemoteBlobRef(r)
181
+ ? fetch(r.remoteBlobRef)
182
+ : (await cachePromise).match(toRequest(r)));
183
+ if (!response) {
184
+ return null;
185
+ }
186
+ if (!response.ok) {
187
+ // this should only happen with remote urls. local blob responses are always ok.
188
+ throw new Error(response.statusText);
189
+ }
190
+ return response.blob();
191
+ }
192
+
193
+ async function releaseBlob(r: BlobRef): Promise<void> {
194
+ if (isLocalBlobRef(r)) {
195
+ const cache = await cachePromise;
196
+ cache.delete(toRequest(r));
197
+ }
198
+ }
199
+
200
+ /**
201
+ * prevent parallel execution to avoid race condition in borrowUrl while awaiting getBlob
202
+ */
203
+ const borrowUrlInternalNoIncrement = preventParallelExecution(async (key: string, r: BlobRef): Promise<{ url: string; count: number } | null> => {
204
+ if (isRemoteBlobRef(r)) {
205
+ return { url: r.remoteBlobRef, count: 0 };
206
+ }
207
+ const blob = await getBlob(r);
208
+ if (!blob) {
209
+ return null;
210
+ }
211
+ const url = URL.createObjectURL(blob);
212
+ const existing = { url, count: 0 };
213
+ borrowedUrls.set(key, existing);
214
+ urlToKey.set(url, key);
215
+ return existing;
216
+ });
217
+
218
+ async function borrowUrl(r: BlobRef): Promise<string | null> {
219
+ const key = JSON.stringify(r);
220
+ const existing = borrowedUrls.get(key) ?? await borrowUrlInternalNoIncrement(key, r);
221
+ if (!existing) {
222
+ return null;
223
+ }
224
+ existing.count++;
225
+ return existing.url;
226
+ }
227
+
228
+ function returnUrl(url: string | null) {
229
+ if (!url) {
230
+ return;
231
+ }
232
+
233
+ const key = urlToKey.get(url);
234
+ if (key) {
235
+ const entry = borrowedUrls.get(key)!;
236
+ if (entry) {
237
+ entry.count--;
238
+ if (entry.count <= 0) {
239
+ borrowedUrls.delete(key);
240
+ urlToKey.delete(url);
241
+ if (!isRemoteUrl(url)) {
242
+ URL.revokeObjectURL(url);
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+
249
+ function createRemoteBlobRef(url: string): BlobRef {
250
+ if (!isRemoteUrl(url)) {
251
+ throw new Error(
252
+ `Invalid url, expected to start with (${remoteUrlPrefix}): ${url}`
253
+ );
254
+ }
255
+ return { remoteBlobRef: url } satisfies RemoteBlobRef;
256
+ }
257
+
258
+ function _testGetBorrowCount(r: BlobRef): number {
259
+ const key = JSON.stringify(r);
260
+ return borrowedUrls.get(key)?.count ?? 0;
261
+ }
262
+
263
+ return {
264
+ getRef,
265
+ getBlob,
266
+ hasBlob,
267
+ borrowUrl,
268
+ returnUrl,
269
+ releaseBlob,
270
+ createRemoteBlobRef,
271
+ _testGetBorrowCount,
272
+ } as const satisfies BlobStore;
273
+ }
274
+
275
+ /**
276
+ * The global blob store that can be used to store and retrieve blobs.
277
+ */
278
+ export const blobStore: BlobStore = createBlobStore();