@adobe/data 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) 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 -27
  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/src/ecs/entity-location-table/entity-location.ts +34 -0
  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/{core/functions/index.js → src/old-ecs/action-ecs/index.ts} +8 -5
  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/src/old-ecs/core-ecs/index.ts +30 -0
  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/src/schema/dynamic/enumerate-patches.test.ts +235 -0
  197. package/src/schema/dynamic/enumerate-patches.ts +90 -0
  198. package/src/schema/dynamic/get-dynamic-schema.test.ts +129 -0
  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/src/schema/validation/is-valid.test.ts +43 -0
  211. package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
  212. package/src/schema/validation/validate.test.ts +120 -0
  213. package/src/schema/validation/validate.ts +41 -0
  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 -31
  346. package/core/functions/deep-merge.js +0 -51
  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 -4
  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.d.ts +0 -86
  364. package/core/schema.js.map +0 -1
  365. package/core/schema.test.d.ts +0 -1
  366. package/core/schema.test.js +0 -16
  367. package/core/schema.test.js.map +0 -1
  368. package/ecs/action-ecs/action-ecs.d.ts +0 -19
  369. package/ecs/action-ecs/action-ecs.js +0 -203
  370. package/ecs/action-ecs/action-ecs.js.map +0 -1
  371. package/ecs/action-ecs/action-ecs.test.d.ts +0 -1
  372. package/ecs/action-ecs/action-ecs.test.js +0 -362
  373. package/ecs/action-ecs/action-ecs.test.js.map +0 -1
  374. package/ecs/action-ecs/action-types.d.ts +0 -106
  375. package/ecs/action-ecs/action-types.js +0 -19
  376. package/ecs/action-ecs/action-types.js.map +0 -1
  377. package/ecs/action-ecs/index.d.ts +0 -2
  378. package/ecs/action-ecs/index.js.map +0 -1
  379. package/ecs/core-ecs/core-ecs-serialization.test.d.ts +0 -1
  380. package/ecs/core-ecs/core-ecs-serialization.test.js +0 -230
  381. package/ecs/core-ecs/core-ecs-serialization.test.js.map +0 -1
  382. package/ecs/core-ecs/core-ecs-types.d.ts +0 -141
  383. package/ecs/core-ecs/core-ecs-types.js.map +0 -1
  384. package/ecs/core-ecs/core-ecs.d.ts +0 -7
  385. package/ecs/core-ecs/core-ecs.js +0 -492
  386. package/ecs/core-ecs/core-ecs.js.map +0 -1
  387. package/ecs/core-ecs/core-ecs.test.d.ts +0 -1
  388. package/ecs/core-ecs/core-ecs.test.js +0 -404
  389. package/ecs/core-ecs/core-ecs.test.js.map +0 -1
  390. package/ecs/core-ecs/index.d.ts +0 -1
  391. package/ecs/core-ecs/index.js +0 -2
  392. package/ecs/core-ecs/index.js.map +0 -1
  393. package/ecs/ecs/ecs-types.d.ts +0 -132
  394. package/ecs/ecs/ecs-types.js.map +0 -1
  395. package/ecs/ecs/ecs-where-functions.d.ts +0 -6
  396. package/ecs/ecs/ecs-where-functions.js +0 -91
  397. package/ecs/ecs/ecs-where-functions.js.map +0 -1
  398. package/ecs/ecs/ecs.d.ts +0 -13
  399. package/ecs/ecs/ecs.js +0 -177
  400. package/ecs/ecs/ecs.js.map +0 -1
  401. package/ecs/ecs/ecs.test.d.ts +0 -1
  402. package/ecs/ecs/ecs.test.js +0 -399
  403. package/ecs/ecs/ecs.test.js.map +0 -1
  404. package/ecs/ecs/index.d.ts +0 -3
  405. package/ecs/ecs/index.js +0 -3
  406. package/ecs/ecs/index.js.map +0 -1
  407. package/ecs/index.d.ts +0 -4
  408. package/ecs/index.js.map +0 -1
  409. package/ecs/transaction-ecs/index.d.ts +0 -2
  410. package/ecs/transaction-ecs/index.js.map +0 -1
  411. package/ecs/transaction-ecs/transaction-ecs.d.ts +0 -11
  412. package/ecs/transaction-ecs/transaction-ecs.js +0 -184
  413. package/ecs/transaction-ecs/transaction-ecs.js.map +0 -1
  414. package/ecs/transaction-ecs/transaction-ecs.test.d.ts +0 -1
  415. package/ecs/transaction-ecs/transaction-ecs.test.js +0 -599
  416. package/ecs/transaction-ecs/transaction-ecs.test.js.map +0 -1
  417. package/ecs/transaction-ecs/transaction-types.d.ts +0 -135
  418. package/ecs/transaction-ecs/transaction-types.js +0 -2
  419. package/ecs/transaction-ecs/transaction-types.js.map +0 -1
  420. package/ecs/transaction-ecs/transactions.d.ts +0 -5
  421. package/ecs/transaction-ecs/transactions.js +0 -158
  422. package/ecs/transaction-ecs/transactions.js.map +0 -1
  423. package/index.d.ts +0 -1
  424. package/index.js +0 -23
  425. package/index.js.map +0 -1
  426. package/observe/create-observable-event.d.ts +0 -10
  427. package/observe/create-observable-event.js +0 -22
  428. package/observe/create-observable-event.js.map +0 -1
  429. package/observe/create-observable-state.d.ts +0 -7
  430. package/observe/create-observable-state.js +0 -27
  431. package/observe/create-observable-state.js.map +0 -1
  432. package/observe/create-persisted-state.d.ts +0 -11
  433. package/observe/create-persisted-state.js +0 -31
  434. package/observe/create-persisted-state.js.map +0 -1
  435. package/observe/create-persisted-state.test.d.ts +0 -1
  436. package/observe/create-persisted-state.test.js +0 -124
  437. package/observe/create-persisted-state.test.js.map +0 -1
  438. package/observe/from-array.d.ts +0 -5
  439. package/observe/from-array.js.map +0 -1
  440. package/observe/from-constant.d.ts +0 -5
  441. package/observe/from-constant.js +0 -12
  442. package/observe/from-constant.js.map +0 -1
  443. package/observe/from-element-id.d.ts +0 -7
  444. package/observe/from-element-id.js.map +0 -1
  445. package/observe/from-element-properties-and-events.d.ts +0 -2
  446. package/observe/from-element-properties-and-events.js +0 -18
  447. package/observe/from-element-properties-and-events.js.map +0 -1
  448. package/observe/from-element-property.d.ts +0 -11
  449. package/observe/from-element-property.js.map +0 -1
  450. package/observe/from-promise-with-error.d.ts +0 -7
  451. package/observe/from-promise-with-error.js +0 -27
  452. package/observe/from-promise-with-error.js.map +0 -1
  453. package/observe/from-promise.d.ts +0 -6
  454. package/observe/from-promise.js +0 -22
  455. package/observe/from-promise.js.map +0 -1
  456. package/observe/from-properties.d.ts +0 -10
  457. package/observe/from-properties.js +0 -33
  458. package/observe/from-properties.js.map +0 -1
  459. package/observe/index.d.ts +0 -27
  460. package/observe/index.js.map +0 -1
  461. package/observe/observe.test.d.ts +0 -7
  462. package/observe/observe.test.js +0 -417
  463. package/observe/observe.test.js.map +0 -1
  464. package/observe/to-promise.d.ts +0 -8
  465. package/observe/to-promise.js +0 -18
  466. package/observe/to-promise.js.map +0 -1
  467. package/observe/to-properties.d.ts +0 -11
  468. package/observe/to-properties.js +0 -9
  469. package/observe/to-properties.js.map +0 -1
  470. package/observe/types.d.ts +0 -17
  471. package/observe/types.js +0 -2
  472. package/observe/types.js.map +0 -1
  473. package/observe/with-async-map.d.ts +0 -6
  474. package/observe/with-async-map.js +0 -12
  475. package/observe/with-async-map.js.map +0 -1
  476. package/observe/with-cache.d.ts +0 -6
  477. package/observe/with-cache.js +0 -33
  478. package/observe/with-cache.js.map +0 -1
  479. package/observe/with-copy.d.ts +0 -5
  480. package/observe/with-copy.js +0 -10
  481. package/observe/with-copy.js.map +0 -1
  482. package/observe/with-deduplicate-data.d.ts +0 -7
  483. package/observe/with-deduplicate-data.js +0 -18
  484. package/observe/with-deduplicate-data.js.map +0 -1
  485. package/observe/with-deduplicate.d.ts +0 -6
  486. package/observe/with-deduplicate.js +0 -19
  487. package/observe/with-deduplicate.js.map +0 -1
  488. package/observe/with-default.d.ts +0 -6
  489. package/observe/with-default.js +0 -21
  490. package/observe/with-default.js.map +0 -1
  491. package/observe/with-map-data.d.ts +0 -7
  492. package/observe/with-map-data.js.map +0 -1
  493. package/observe/with-map.d.ts +0 -5
  494. package/observe/with-map.js +0 -11
  495. package/observe/with-map.js.map +0 -1
  496. package/observe/with-optional.d.ts +0 -5
  497. package/observe/with-optional.js +0 -20
  498. package/observe/with-optional.js.map +0 -1
  499. package/observe/with-unwrap.d.ts +0 -5
  500. package/observe/with-unwrap.js +0 -26
  501. package/observe/with-unwrap.js.map +0 -1
  502. package/perftest/ecs-perf.d.ts +0 -49
  503. package/perftest/ecs-perf.js +0 -230
  504. package/perftest/ecs-perf.js.map +0 -1
  505. package/perftest/helper-functions.d.ts +0 -1
  506. package/perftest/helper-functions.js +0 -31
  507. package/perftest/helper-functions.js.map +0 -1
  508. package/perftest/horizon-perf.d.ts +0 -22
  509. package/perftest/horizon-perf.js +0 -126
  510. package/perftest/horizon-perf.js.map +0 -1
  511. package/perftest/index.d.ts +0 -1
  512. package/perftest/index.js.map +0 -1
  513. package/perftest/perf-test.d.ts +0 -18
  514. package/perftest/perf-test.js +0 -124
  515. package/perftest/perf-test.js.map +0 -1
  516. package/perftest/vanilla-perf.d.ts +0 -38
  517. package/perftest/vanilla-perf.js +0 -128
  518. package/perftest/vanilla-perf.js.map +0 -1
  519. package/schemas/index.d.ts +0 -1
  520. package/schemas/index.js +0 -23
  521. package/schemas/index.js.map +0 -1
  522. package/schemas/schemas.d.ts +0 -45
  523. package/schemas/schemas.js +0 -39
  524. package/schemas/schemas.js.map +0 -1
  525. package/service/add-observable-actions.d.ts +0 -29
  526. package/service/add-observable-actions.js +0 -108
  527. package/service/add-observable-actions.js.map +0 -1
  528. package/service/index.d.ts +0 -4
  529. package/service/index.js.map +0 -1
  530. package/service/progressive-result.d.ts +0 -96
  531. package/service/progressive-result.js +0 -99
  532. package/service/progressive-result.js.map +0 -1
  533. package/service/sequential-action.d.ts +0 -18
  534. package/service/sequential-action.js.map +0 -1
  535. package/service/service.d.ts +0 -4
  536. package/service/service.js.map +0 -1
  537. package/tsconfig.tsbuildinfo +0 -1
  538. package/types/index.d.ts +0 -1
  539. package/types/index.js.map +0 -1
  540. package/types/types.d.ts +0 -61
  541. package/types/types.js.map +0 -1
@@ -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 { Observe } from "./types.js";
23
+
24
+ /**
25
+ * Creates a new Observer that will notify observers exactly once when the promise is resolved.
26
+ * Note that the promise is only created when the first observer is added so it is lazy.
27
+ */
28
+ export function fromPromise<T>(
29
+ promiseFactory: () => Promise<T>
30
+ ): Observe<T> {
31
+ let promise: Promise<T> | undefined = undefined;
32
+ return (observer) => {
33
+ let cancelled = false;
34
+ promise = promise ?? promiseFactory();
35
+ promise.then(
36
+ (value) => {
37
+ if (!cancelled) {
38
+ observer(value);
39
+ }
40
+ },
41
+ (reject) => {
42
+ console.error(`Error in Observe fromPromise`, reject);
43
+ }
44
+ );
45
+ return () => {
46
+ cancelled = true;
47
+ };
48
+ };
49
+ }
@@ -0,0 +1,67 @@
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 { Notify, Observe } from "./types.js";
23
+
24
+ /**
25
+ * Creates a new Observe function that combines every named observe function into a single observe function with a value this is an object with the same keys.
26
+ * No result is provided until every required observe function has provided a value. If they all provide a value synchronously, then a result will be provided synchronously.
27
+ */
28
+ export function fromProperties<
29
+ T extends { [K: string]: Observe<unknown> },
30
+ >(
31
+ observeProperties: T
32
+ ): Observe<{
33
+ readonly [K in keyof T]: T[K] extends Observe<infer U> ? U : never;
34
+ }> {
35
+ type ObservableValues = {
36
+ readonly [K in keyof T]: T[K] extends Observe<infer U> ? U : never;
37
+ };
38
+ return (observer: Notify<ObservableValues>) => {
39
+ const values = new Map<keyof T, T[keyof T]>();
40
+ let initializing = true;
41
+ const maybeNotify = () => {
42
+ if (values.size === Object.keys(observeProperties).length) {
43
+ observer(Object.fromEntries(values) as ObservableValues);
44
+ }
45
+ };
46
+
47
+ const unobservers = Object.entries(observeProperties)
48
+ .map(([name, observable]) => {
49
+ return observable((value) => {
50
+ values.set(name as keyof T, value as T[keyof T]);
51
+ if (!initializing) {
52
+ maybeNotify();
53
+ }
54
+ });
55
+ })
56
+ .filter(Boolean);
57
+
58
+ initializing = false;
59
+ maybeNotify();
60
+
61
+ return () => {
62
+ for (const unobserve of unobservers) {
63
+ unobserve();
64
+ }
65
+ };
66
+ };
67
+ }
@@ -19,12 +19,14 @@ 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
  /**
23
24
  * TESTING SOME INDEX DOCUMENTATION HERE.
24
25
  */
25
26
  export * from "./create-observable-event.js";
26
27
  export * from "./create-observable-state.js";
27
28
  export * from "./create-persisted-state.js";
29
+ export * from "./create-query-state.js";
28
30
  export * from "./from-constant.js";
29
31
  export * from "./from-element-id.js";
30
32
  export * from "./from-element-properties-and-events.js";
@@ -46,4 +48,5 @@ export * from "./with-map.js";
46
48
  export * from "./with-map-data.js";
47
49
  export * from "./with-optional.js";
48
50
  export * from "./with-unwrap.js";
49
- //# sourceMappingURL=index.js.map
51
+ export * from "./with-lazy.js";
52
+ export * from "./with-batch.js";
@@ -0,0 +1,467 @@
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 { assert } from "riteway/vitest";
23
+ import { describe, test } from "vitest";
24
+
25
+ import {
26
+ Notify,
27
+ Observe,
28
+ createObservableState,
29
+ fromConstant,
30
+ fromArray,
31
+ fromProperties,
32
+ fromPromise,
33
+ fromPromiseWithError,
34
+ withCache,
35
+ withDeduplicate,
36
+ withDefault,
37
+ withMap,
38
+ withOptional,
39
+ } from "./index.js";
40
+ import { toProperties } from "./to-properties.js";
41
+ import { withAsyncMap } from "./with-async-map.js";
42
+
43
+ function createTestObservable<T>(
44
+ sync: T | undefined,
45
+ async: Array<T>
46
+ ): [Observe<T>, () => Promise<void>] {
47
+ const observers = new Set<Notify<T>>();
48
+ const observe: Observe<T> = (observer) => {
49
+ observers.add(observer);
50
+ if (sync !== undefined) {
51
+ observer(sync);
52
+ }
53
+ return () => {
54
+ observers.delete(observer);
55
+ };
56
+ };
57
+ return [
58
+ observe,
59
+ async () => {
60
+ for (const value of async) {
61
+ await Promise.resolve();
62
+ for (const observer of observers) {
63
+ observer(value);
64
+ }
65
+ }
66
+ },
67
+ ];
68
+ }
69
+
70
+ async function testObserver<T>(props: {
71
+ given: string;
72
+ expected: {
73
+ sync: T | undefined;
74
+ async: Array<T>;
75
+ };
76
+ observable: Observe<T>;
77
+ doAsync: () => Promise<void>;
78
+ }) {
79
+ const { given, expected, observable: observer, doAsync } = props;
80
+ const actual = { sync: undefined as T | undefined, async: [] as Array<T> };
81
+ let isSync = true;
82
+ const unobserve = observer((value) => {
83
+ if (isSync) {
84
+ actual.sync = value;
85
+ } else {
86
+ actual.async.push(value);
87
+ }
88
+ });
89
+ isSync = false;
90
+ await doAsync();
91
+ unobserve();
92
+ assert({
93
+ given,
94
+ should: `observe ${JSON.stringify(expected)}`,
95
+ actual,
96
+ expected,
97
+ });
98
+ }
99
+
100
+ export async function testObservableFilter<T, U>(props: {
101
+ given: string;
102
+ filter: (observable: Observe<T>) => Observe<U>;
103
+ input: [T | undefined, Array<T>];
104
+ output: [U | undefined, Array<U>];
105
+ }) {
106
+ const { given, input, filter, output } = props;
107
+ const [observer, done] = createTestObservable(input[0], input[1]);
108
+ const filtered = filter(observer);
109
+ await testObserver({
110
+ given,
111
+ expected: {
112
+ sync: output[0],
113
+ async: output[1],
114
+ },
115
+ observable: filtered,
116
+ doAsync: done,
117
+ });
118
+ }
119
+
120
+ describe("observable", () => {
121
+ test("createTestObservable", async () => {
122
+ const [observer, done] = createTestObservable(1, [2, 3]);
123
+ await testObserver({
124
+ given: "createTestObservable",
125
+ expected: {
126
+ sync: 1,
127
+ async: [2, 3],
128
+ },
129
+ observable: observer,
130
+ doAsync: done,
131
+ });
132
+ });
133
+ test("fromConstant", async () => {
134
+ await testObserver({
135
+ given: "fromConstant",
136
+ expected: {
137
+ sync: 1,
138
+ async: [],
139
+ },
140
+ observable: fromConstant(1),
141
+ doAsync: () => Promise.resolve(),
142
+ });
143
+ });
144
+ test("withOptional", async () => {
145
+ const observable = withOptional(fromPromise(() => Promise.resolve(1)));
146
+ // manually test that we DO get a sync value callback.
147
+ {
148
+ let syncCallback = false;
149
+ let syncValue: number | undefined;
150
+ observable((value) => {
151
+ syncValue = value;
152
+ syncCallback = true;
153
+ })();
154
+ assert({
155
+ given: "withOptional",
156
+ should: "get a sync value callback",
157
+ actual: [syncCallback, syncValue],
158
+ expected: [true, undefined],
159
+ });
160
+ }
161
+
162
+ await testObserver({
163
+ given: "fromOptional",
164
+ expected: {
165
+ sync: undefined,
166
+ async: [1],
167
+ },
168
+ observable,
169
+ doAsync: () => Promise.resolve(),
170
+ });
171
+ });
172
+
173
+ test("fromObservableProperties sync", async () => {
174
+ const observable = fromProperties({
175
+ a: fromConstant(1),
176
+ b: fromConstant(2),
177
+ c: fromConstant(3),
178
+ });
179
+ await testObserver({
180
+ given:
181
+ "fromObservableProperties called with all sync values should yield sync result",
182
+ expected: {
183
+ sync: { a: 1, b: 2, c: 3 },
184
+ async: [],
185
+ },
186
+ observable,
187
+ doAsync: () => Promise.resolve(),
188
+ });
189
+ });
190
+
191
+ test("fromObservableProperties optional called first", async () => {
192
+ const [observer1, doAsync1] = createTestObservable(undefined, [1, 2, 3]);
193
+ const [observer2, doAsync2] = createTestObservable("0", ["1", "2", "3"]);
194
+ const observable = fromProperties({
195
+ a: observer1,
196
+ b: withOptional(observer2),
197
+ });
198
+ await testObserver({
199
+ given: "pick",
200
+ expected: {
201
+ sync: undefined,
202
+ async: [
203
+ { a: 1, b: "3" },
204
+ { a: 2, b: "3" },
205
+ { a: 3, b: "3" },
206
+ ],
207
+ },
208
+ observable,
209
+ doAsync: async () => {
210
+ await doAsync2();
211
+ await doAsync1();
212
+ },
213
+ });
214
+ });
215
+ test("fromObservableProperties optional called second", async () => {
216
+ const [observer1, doAsync1] = createTestObservable(undefined, [1, 2, 3]);
217
+ const [observer2, doAsync2] = createTestObservable(undefined, [
218
+ "1",
219
+ "2",
220
+ "3",
221
+ ]);
222
+ const observable = fromProperties({
223
+ a: observer1,
224
+ b: withOptional(observer2),
225
+ });
226
+ await testObserver({
227
+ given: "pick",
228
+ expected: {
229
+ sync: undefined,
230
+ async: [
231
+ { a: 1, b: undefined },
232
+ { a: 2, b: undefined },
233
+ { a: 3, b: undefined },
234
+ { a: 3, b: "1" },
235
+ { a: 3, b: "2" },
236
+ { a: 3, b: "3" },
237
+ ],
238
+ },
239
+ observable,
240
+ doAsync: async () => {
241
+ await doAsync1();
242
+ await doAsync2();
243
+ },
244
+ });
245
+ });
246
+
247
+ test("fromObservableArray sync", async () => {
248
+ const observable = fromArray([
249
+ fromConstant(1),
250
+ fromConstant(2),
251
+ fromConstant(3),
252
+ ]);
253
+ await testObserver({
254
+ given:
255
+ "fromObservableArray called with all sync values should yield sync result",
256
+ expected: {
257
+ sync: [1, 2, 3],
258
+ async: [],
259
+ },
260
+ observable,
261
+ doAsync: () => Promise.resolve(),
262
+ });
263
+ });
264
+
265
+ test("fromPromise", async () => {
266
+ const promise = Promise.resolve(1);
267
+
268
+ await testObserver({
269
+ given: "fromPromise",
270
+ expected: {
271
+ sync: undefined,
272
+ async: [1],
273
+ },
274
+ observable: fromPromise(() => promise),
275
+ doAsync: async () => {
276
+ await promise;
277
+ },
278
+ });
279
+ });
280
+ test("fromPromiseWithError", async () => {
281
+ const error = new Error("error");
282
+ const promise = Promise.reject(error);
283
+
284
+ await testObserver({
285
+ given: "fromPromiseWithError",
286
+ expected: {
287
+ sync: undefined,
288
+ async: [error],
289
+ },
290
+ observable: fromPromiseWithError(() => promise),
291
+ doAsync: async () => {
292
+ try {
293
+ await promise;
294
+ } catch (_error) {
295
+ // ignore
296
+ }
297
+ },
298
+ });
299
+ });
300
+ test("cache", async () => {
301
+ // create a promise
302
+ const promise = Promise.resolve(1);
303
+ // create the observable with a cache
304
+ const observable = withCache(fromPromise(() => promise));
305
+ // wait for the first observable value to return.
306
+ const first = await new Promise<number>((resolve) => {
307
+ const unobserve = observable((value) => {
308
+ resolve(value);
309
+ unobserve();
310
+ });
311
+ });
312
+ assert({
313
+ given: "first return value from cache",
314
+ should: "be 1",
315
+ actual: first,
316
+ expected: 1,
317
+ });
318
+ // now that it's primed let's verify we get a synchronous result.
319
+ let syncValue: number | undefined;
320
+ observable((value) => {
321
+ syncValue = value;
322
+ })();
323
+ assert({
324
+ given: "synchronous return value from primed cache",
325
+ should: "be 1",
326
+ actual: syncValue,
327
+ expected: 1,
328
+ });
329
+ });
330
+ test("deduplicate shallow compare", async () => {
331
+ await testObservableFilter({
332
+ given: "an Observable with cache shallow",
333
+ filter: withDeduplicate,
334
+ input: [1, [1, 2, 2, 2, 3, 3, 4]],
335
+ output: [1, [2, 3, 4]],
336
+ });
337
+ });
338
+ // test("deduplicate deep compare", async () => {
339
+ // await testObservableFilter({
340
+ // given: "an Observable with deduplicate data",
341
+ // filter: withDeduplicateData,
342
+ // input: [
343
+ // { a: 1 },
344
+ // [{ a: 1 }, { a: 2 }, { a: 2 }, { a: 3 }, { a: 3 }, { a: 4 }],
345
+ // ],
346
+ // output: [{ a: 1 }, [{ a: 2 }, { a: 3 }, { a: 4 }]],
347
+ // });
348
+ // });
349
+ test("withDefault", async () => {
350
+ await testObservableFilter({
351
+ given: "an Observable withDefault",
352
+ filter: withDefault(0),
353
+ input: [undefined, [1, undefined, 3]],
354
+ output: [0, [1, 0, 3]],
355
+ });
356
+ });
357
+ test("withMap", async () => {
358
+ await testObservableFilter({
359
+ given: "an Observable withMap",
360
+ filter: (observable) => withMap(observable, (value) => value * 2),
361
+ input: [1, [1, 2, 3]],
362
+ output: [2, [2, 4, 6]],
363
+ });
364
+ });
365
+ test("withAsyncMap", async () => {
366
+ await testObservableFilter({
367
+ given: "an Observable withAsyncMap",
368
+ filter: (observable) => withAsyncMap(observable, async (value) => value * 2),
369
+ input: [1, [1, 2, 3]],
370
+ output: [undefined, [2, 2, 4, 6]],
371
+ });
372
+ });
373
+ test("withCache shares base observable", async () => {
374
+ let observeCount = 0;
375
+ const observer = withCache((callback: Notify<number>) => {
376
+ observeCount++;
377
+ callback(42);
378
+ return () => { };
379
+ });
380
+
381
+ let observe1 = -1;
382
+ observer((value) => {
383
+ observe1 = value;
384
+ });
385
+ let observe2 = -1;
386
+ observer((value) => {
387
+ observe2 = value;
388
+ });
389
+
390
+ assert({
391
+ given: "withShared called multiple times",
392
+ should: "base observable to be called only once",
393
+ actual: [observe1, observe2, observeCount],
394
+ expected: [42, 42, 1],
395
+ });
396
+ });
397
+ test("toObservableProperties", async () => {
398
+ const [observable, setState] = createObservableState({ a: 1, b: "foo" });
399
+ const properties = toProperties(observable, ["a", "b"]);
400
+ const observedValues: Array<any> = [];
401
+ const observer = (value: any) => {
402
+ observedValues.push(value);
403
+ };
404
+ properties.a(observer);
405
+ properties.b(observer);
406
+ assert({
407
+ given: "toObservableProperties",
408
+ should: "observe values",
409
+ actual: observedValues,
410
+ expected: [1, "foo"],
411
+ });
412
+ setState({ a: 2, b: "bar" });
413
+ assert({
414
+ given: "toObservableProperties",
415
+ should: "observe new values",
416
+ actual: observedValues,
417
+ expected: [1, "foo", 2, "bar"],
418
+ });
419
+ setState({ a: 2, b: "bar" });
420
+ assert({
421
+ given: "toObservableProperties",
422
+ should: "not observe unchanged values",
423
+ actual: observedValues,
424
+ expected: [1, "foo", 2, "bar"],
425
+ });
426
+ setState({ a: 3, b: "bar" });
427
+ assert({
428
+ given: "toObservableProperties",
429
+ should: "observe only changed values",
430
+ actual: observedValues,
431
+ expected: [1, "foo", 2, "bar", 3],
432
+ });
433
+ })
434
+ });
435
+
436
+ describe("observable", () => {
437
+ test("createObservableWithSetter", async () => {
438
+ const [observable, setter] = createObservableState<number>();
439
+
440
+ const observedValues = [] as number[];
441
+ const unobserve = observable((value) => {
442
+ observedValues.push(value);
443
+ });
444
+
445
+ const values = [2, 3, 4];
446
+
447
+ // Set subsequent values
448
+ values.forEach((value) => setter(value));
449
+
450
+ assert({
451
+ given: "createObservableWithSetter",
452
+ should: "observe values",
453
+ actual: observedValues,
454
+ expected: values,
455
+ });
456
+
457
+ unobserve();
458
+ values.forEach((value) => setter(value));
459
+
460
+ assert({
461
+ given: "createObservableWithSetter",
462
+ should: "not observe values after unobserve",
463
+ actual: observedValues,
464
+ expected: values,
465
+ });
466
+ });
467
+ });
@@ -0,0 +1,40 @@
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 { Observe, Unobserve } from "./types.js";
23
+
24
+ /**
25
+ * Converts an Observe function to a Promise that will resolve with the first value.
26
+ * Note that you will never receive subsequent updates since promises can only resolve once.
27
+ * @param observe
28
+ * @returns the first value yielded by the observe function.
29
+ */
30
+ export function toPromise<T>(observable: Observe<T>): Promise<T> {
31
+ return new Promise<T>((resolve, _reject) => {
32
+ let unobserve: Unobserve | null = null;
33
+ unobserve = observable((value) => {
34
+ resolve(value);
35
+ if (unobserve) {
36
+ unobserve();
37
+ }
38
+ });
39
+ });
40
+ }
@@ -0,0 +1,41 @@
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 { Data } from "../index.js";
23
+ import { Observe } from "./types.js";
24
+ import { withMapData } from "./with-map-data.js";
25
+
26
+ /**
27
+ * Returns an object which contains an observe function for each key in the input object.
28
+ * Each individual observe function will only notify observers when it's own value has changed.
29
+ */
30
+ export function toProperties<
31
+ T extends { [K: string]: Data },
32
+ Keys extends keyof T
33
+ >(
34
+ observable: Observe<T>,
35
+ keys: Keys[]
36
+ )
37
+ : { readonly [K in Keys]: Observe<T[K]>; } {
38
+ return Object.fromEntries(
39
+ keys.map((key) => [key, withMapData(observable, (value) => value[key])])
40
+ ) as unknown as { readonly [K in keyof T]: Observe<T[K]>; }
41
+ }