@adobe/data 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/.cursorrules +28 -0
  2. package/.eslintrc.cjs +48 -0
  3. package/.github/CONTRIBUTING.md +47 -0
  4. package/CODE_OF_CONDUCT.md +79 -0
  5. package/LICENSE +21 -0
  6. package/README.md +2 -2
  7. package/asconfig.json +22 -0
  8. package/assembly/index.ts +85 -0
  9. package/assembly/tsconfig.json +17 -0
  10. package/c/build_run.sh +2 -0
  11. package/c/vector_addition +0 -0
  12. package/c/vector_addition.c +125 -0
  13. package/{cache/functions/types.js → config/license.js} +0 -2
  14. package/docs/perftest.html +28 -0
  15. package/index.html +10 -0
  16. package/package.json +50 -28
  17. package/scripts/deploy-docs.sh +41 -0
  18. package/{assembly-test/assembly.test.js → src/assembly-test/assembly.test.ts} +4 -4
  19. package/src/cache/async-cache.ts +38 -0
  20. package/{cache/blob-store.test.js → src/cache/blob-store.test.ts} +41 -7
  21. package/src/cache/blob-store.ts +278 -0
  22. package/src/cache/data-cache.test.ts +61 -0
  23. package/src/cache/data-cache.ts +183 -0
  24. package/src/cache/expiring-data-cache.test.ts +81 -0
  25. package/src/cache/expiring-data-cache.ts +61 -0
  26. package/src/cache/fallback-async-cache.ts +49 -0
  27. package/src/cache/functions/async-data-function.ts +25 -0
  28. package/src/cache/functions/functions.test.ts +84 -0
  29. package/{cache/functions/get-cached.test.js → src/cache/functions/get-cached.test.ts} +24 -7
  30. package/{cache/functions/get-cached.js → src/cache/functions/get-cached.ts} +12 -6
  31. package/{cache/functions/hashing/blob-to-hash.js → src/cache/functions/hashing/blob-to-hash.ts} +20 -18
  32. package/{cache/functions/hashing/buffer-to-hash.js → src/cache/functions/hashing/buffer-to-hash.ts} +7 -7
  33. package/src/cache/functions/hashing/hashing.test.ts +95 -0
  34. package/{cache/functions/hashing/index.js → src/cache/functions/hashing/index.ts} +1 -1
  35. package/{cache/functions/hashing/json-to-hash.js → src/cache/functions/hashing/json-to-hash.ts} +3 -3
  36. package/{cache/functions/hashing/string-to-hash.js → src/cache/functions/hashing/string-to-hash.ts} +11 -10
  37. package/{cache/functions/index.js → src/cache/functions/index.ts} +2 -4
  38. package/{cache/functions/memoize.js → src/cache/functions/memoize.ts} +22 -15
  39. package/src/cache/functions/prevent-parallel-execution.ts +50 -0
  40. package/src/cache/get-persistent-cache.ts +62 -0
  41. package/{cache/index.js → src/cache/index.ts} +9 -3
  42. package/src/cache/managed-array.ts +243 -0
  43. package/{cache/managed-async-cache.browser.test.js → src/cache/managed-async-cache.browser.test.ts} +27 -24
  44. package/src/cache/managed-async-cache.ts +78 -0
  45. package/src/cache/memory-allocator.ts +176 -0
  46. package/src/cache/memory-async-cache.ts +51 -0
  47. package/src/data.ts +38 -0
  48. package/src/ecs/README.md +21 -0
  49. package/src/ecs/archetype/archetype.ts +39 -0
  50. package/src/ecs/archetype/create-archetype.test.ts +115 -0
  51. package/src/ecs/archetype/create-archetype.ts +52 -0
  52. package/src/ecs/archetype/delete-row.test.ts +110 -0
  53. package/src/ecs/archetype/delete-row.ts +37 -0
  54. package/src/ecs/archetype/index.ts +24 -0
  55. package/src/ecs/component-schemas.ts +24 -0
  56. package/src/ecs/core-components.ts +443 -0
  57. package/src/ecs/database/create-database.test.ts +745 -0
  58. package/src/ecs/database/create-database.ts +205 -0
  59. package/src/ecs/database/database.ts +81 -0
  60. package/src/ecs/database/index.ts +24 -0
  61. package/src/ecs/database/observe-dependent-value.test.ts +198 -0
  62. package/src/ecs/database/observe-dependent-value.ts +78 -0
  63. package/src/ecs/database/transactional-store/create-transactional-store.test.ts +250 -0
  64. package/src/ecs/database/transactional-store/create-transactional-store.ts +281 -0
  65. package/{ecs/ecs/ecs-types.js → src/ecs/database/transactional-store/index.ts} +1 -2
  66. package/src/ecs/database/transactional-store/transactional-store.ts +80 -0
  67. package/src/ecs/entity-location-table/create-entity-location-table.test.ts +170 -0
  68. package/src/ecs/entity-location-table/create-entity-location-table.ts +96 -0
  69. package/src/ecs/entity-location-table/entity-location-table.ts +30 -0
  70. package/{core/schema/schema.js → src/ecs/entity-location-table/entity-location.ts} +11 -11
  71. package/src/ecs/entity-location-table/index.ts +23 -0
  72. package/src/ecs/entity.ts +26 -0
  73. package/src/ecs/index.ts +26 -0
  74. package/src/ecs/store/core/core.ts +71 -0
  75. package/src/ecs/store/core/create-core.test.ts +440 -0
  76. package/src/ecs/store/core/create-core.ts +168 -0
  77. package/{cache/async-cache.js → src/ecs/store/core/index.ts} +1 -2
  78. package/src/ecs/store/create-store.test.ts +562 -0
  79. package/src/ecs/store/create-store.ts +97 -0
  80. package/src/ecs/store/index.ts +23 -0
  81. package/{types/types.js → src/ecs/store/resource-components.ts} +2 -6
  82. package/src/ecs/store/store.ts +55 -0
  83. package/src/equals-shallow.test.ts +133 -0
  84. package/src/equals-shallow.ts +37 -0
  85. package/src/equals.test.ts +175 -0
  86. package/src/equals.ts +70 -0
  87. package/src/index.ts +27 -0
  88. package/src/internal/array-buffer-like/copy.ts +469 -0
  89. package/src/internal/array-buffer-like/grow.ts +53 -0
  90. package/{core/index.js → src/internal/array-buffer-like/index.ts} +4 -4
  91. package/src/internal/array-buffer-like/is-array-buffer.ts +445 -0
  92. package/src/internal/array-buffer-like/is-shared-array-buffer.ts +445 -0
  93. package/{core/functions/is-async-generator.js → src/internal/async-generator/is-async-generator.ts} +2 -2
  94. package/{core/schema.js → src/internal/data-view-32/create-data-view-32.ts} +8 -11
  95. package/src/internal/data-view-32/data-view-32.ts +447 -0
  96. package/{ecs/action-ecs/index.js → src/internal/data-view-32/index.ts} +2 -2
  97. package/src/internal/function/memoize-factory.ts +12 -0
  98. package/src/internal/object/index.ts +23 -0
  99. package/{cache/functions/bind-functions.js → src/internal/object/map-entries.ts} +6 -11
  100. package/src/internal/promise/is-promise.ts +28 -0
  101. package/src/internal/typed-array/get-byte-size.ts +50 -0
  102. package/src/internal/typed-array/index.ts +24 -0
  103. package/src/internal/typed-array/typed-array-constructer.ts +32 -0
  104. package/src/internal/typed-array/typed-array.ts +25 -0
  105. package/src/is-data.ts +47 -0
  106. package/src/lit/decorators/apply-decorator.ts +24 -0
  107. package/src/lit/decorators/apply-service-decorators.ts +13 -0
  108. package/src/lit/decorators/index.ts +24 -0
  109. package/src/lit/decorators/require-service.ts +19 -0
  110. package/src/lit/elements/index.ts +3 -0
  111. package/src/lit/elements/service-application.ts +26 -0
  112. package/src/lit/elements/service-context.ts +3 -0
  113. package/src/lit/elements/service-element.ts +18 -0
  114. package/src/lit/hooks/component/component.ts +10 -0
  115. package/src/lit/hooks/component/stack.ts +17 -0
  116. package/src/lit/hooks/index.ts +13 -0
  117. package/src/lit/hooks/use-connected.ts +39 -0
  118. package/src/lit/hooks/use-effect.ts +17 -0
  119. package/src/lit/hooks/use-element.ts +8 -0
  120. package/src/lit/hooks/use-memo.ts +14 -0
  121. package/src/lit/hooks/use-observable-values.ts +9 -0
  122. package/src/lit/hooks/use-observable.ts +13 -0
  123. package/src/lit/hooks/use-ref.ts +6 -0
  124. package/src/lit/hooks/use-resize-observer.ts +27 -0
  125. package/src/lit/hooks/use-state.ts +17 -0
  126. package/src/lit/hooks/use-window-event.ts +14 -0
  127. package/src/lit/hooks/with-hooks.ts +20 -0
  128. package/src/lit/index.ts +3 -0
  129. package/src/mutable-clone.ts +29 -0
  130. package/{core/data.test.js → src/normalize.test.ts} +22 -22
  131. package/src/normalize.ts +37 -0
  132. package/src/observe/create-observable-event.ts +47 -0
  133. package/src/observe/create-observable-state.ts +51 -0
  134. package/src/observe/create-persisted-state.test.ts +143 -0
  135. package/src/observe/create-persisted-state.ts +60 -0
  136. package/src/observe/create-query-state.ts +70 -0
  137. package/{observe/from-array.js → src/observe/from-array.ts} +14 -3
  138. package/{service/service.js → src/observe/from-constant.ts} +13 -4
  139. package/{observe/from-element-id.js → src/observe/from-element-id.ts} +44 -39
  140. package/src/observe/from-element-properties-and-events.ts +47 -0
  141. package/{observe/from-element-property.js → src/observe/from-element-property.ts} +33 -25
  142. package/src/observe/from-promise-with-error.ts +51 -0
  143. package/src/observe/from-promise.ts +49 -0
  144. package/src/observe/from-properties.ts +67 -0
  145. package/{observe/index.js → src/observe/index.ts} +4 -1
  146. package/src/observe/observe.test.ts +467 -0
  147. package/src/observe/to-promise.ts +40 -0
  148. package/src/observe/to-properties.ts +41 -0
  149. package/src/observe/types.ts +40 -0
  150. package/src/observe/with-async-map.ts +37 -0
  151. package/src/observe/with-batch.test.ts +141 -0
  152. package/src/observe/with-batch.ts +67 -0
  153. package/{core/data.js → src/observe/with-cache.ts} +32 -26
  154. package/src/observe/with-copy.ts +32 -0
  155. package/src/observe/with-deduplicate-data.ts +43 -0
  156. package/src/observe/with-deduplicate.ts +41 -0
  157. package/src/observe/with-default.ts +48 -0
  158. package/src/observe/with-lazy.test.ts +68 -0
  159. package/{core/functions/is-promise.js → src/observe/with-lazy.ts} +17 -5
  160. package/{observe/with-map-data.js → src/observe/with-map-data.ts} +9 -3
  161. package/src/observe/with-map.ts +36 -0
  162. package/src/observe/with-optional.ts +47 -0
  163. package/src/observe/with-unwrap.ts +54 -0
  164. package/src/old-ecs/action-ecs/action-ecs.test.ts +420 -0
  165. package/src/old-ecs/action-ecs/action-ecs.ts +274 -0
  166. package/src/old-ecs/action-ecs/action-types.ts +178 -0
  167. package/src/old-ecs/action-ecs/index.ts +29 -0
  168. package/{service/sequential-action.js → src/old-ecs/action-ecs/sequential-action.ts} +19 -4
  169. package/src/old-ecs/core-ecs/core-ecs-serialization.test.ts +244 -0
  170. package/src/old-ecs/core-ecs/core-ecs-types.ts +183 -0
  171. package/src/old-ecs/core-ecs/core-ecs.test.ts +474 -0
  172. package/src/old-ecs/core-ecs/core-ecs.ts +640 -0
  173. package/{core/functions/index.js → src/old-ecs/core-ecs/index.ts} +9 -4
  174. package/src/old-ecs/ecs/ecs-types.ts +189 -0
  175. package/src/old-ecs/ecs/ecs-where-functions.ts +95 -0
  176. package/src/old-ecs/ecs/ecs.test.ts +461 -0
  177. package/src/old-ecs/ecs/ecs.ts +279 -0
  178. package/{ecs/core-ecs/core-ecs-types.js → src/old-ecs/ecs/index.ts} +2 -2
  179. package/src/old-ecs/entity.ts +26 -0
  180. package/{ecs/index.js → src/old-ecs/index.ts} +1 -1
  181. package/{ecs/transaction-ecs/index.js → src/old-ecs/transaction-ecs/index.ts} +0 -1
  182. package/src/old-ecs/transaction-ecs/transaction-ecs.test.ts +725 -0
  183. package/src/old-ecs/transaction-ecs/transaction-ecs.ts +283 -0
  184. package/src/old-ecs/transaction-ecs/transaction-types.ts +248 -0
  185. package/src/old-ecs/transaction-ecs/transactions.ts +243 -0
  186. package/src/perftest/ecs-perf.ts +255 -0
  187. package/src/perftest/helper-functions.ts +31 -0
  188. package/src/perftest/horizon-perf.ts +132 -0
  189. package/{perftest/index.js → src/perftest/index.ts} +9 -7
  190. package/src/perftest/perf-test.ts +193 -0
  191. package/src/perftest/perf.md +90 -0
  192. package/src/perftest/vanilla-perf.ts +136 -0
  193. package/src/schema/boolean.ts +5 -0
  194. package/src/schema/dynamic/deep-merge.test.ts +100 -0
  195. package/src/schema/dynamic/deep-merge.ts +67 -0
  196. package/{core/schema/dynamic/enumerate-patches.test.js → src/schema/dynamic/enumerate-patches.test.ts} +49 -23
  197. package/{core/schema/dynamic/enumerate-patches.js → src/schema/dynamic/enumerate-patches.ts} +44 -4
  198. package/{core/schema/dynamic/get-dynamic-schema.test.js → src/schema/dynamic/get-dynamic-schema.test.ts} +41 -6
  199. package/src/schema/dynamic/get-dynamic-schema.ts +48 -0
  200. package/src/schema/dynamic/index.ts +22 -0
  201. package/src/schema/f32.ts +30 -0
  202. package/src/schema/i32.ts +31 -0
  203. package/src/schema/index.ts +32 -0
  204. package/{cache/functions/omit.js → src/schema/nullable.ts} +10 -7
  205. package/src/schema/schema.ts +229 -0
  206. package/src/schema/time.ts +5 -0
  207. package/src/schema/true.ts +26 -0
  208. package/src/schema/tuple.ts +5 -0
  209. package/src/schema/u32.ts +31 -0
  210. package/{core/schema/validation/is-valid.test.js → src/schema/validation/is-valid.test.ts} +6 -3
  211. package/{core/functions/array-equals.js → src/schema/validation/is-valid.ts} +8 -10
  212. package/{core/schema/validation/validate.test.js → src/schema/validation/validate.test.ts} +18 -4
  213. package/{core/schema/validation/validate.js → src/schema/validation/validate.ts} +9 -6
  214. package/{core/functions/with-validation.test.js → src/schema/validation/with-validation.test.ts} +28 -12
  215. package/{core/functions/with-validation.js → src/schema/validation/with-validation.ts} +14 -10
  216. package/src/schema.test.ts +55 -0
  217. package/src/service/add-observable-actions.ts +207 -0
  218. package/{service/index.js → src/service/index.ts} +4 -4
  219. package/src/service/is-service.ts +7 -0
  220. package/src/service/progressive-result.ts +141 -0
  221. package/src/service/service.ts +27 -0
  222. package/src/table/add-row.ts +42 -0
  223. package/src/table/create-table.ts +36 -0
  224. package/src/table/delete-row.ts +42 -0
  225. package/src/table/ensure-capacity.ts +37 -0
  226. package/src/table/get-row-data.ts +31 -0
  227. package/src/table/index.ts +29 -0
  228. package/src/table/row-index.ts +26 -0
  229. package/src/table/table.ts +32 -0
  230. package/src/table/update-row.ts +35 -0
  231. package/src/tsconfig.json +6 -0
  232. package/src/typed-buffer/copy-to-gpu-buffer.ts +23 -0
  233. package/{cache/expiring-data-cache.js → src/typed-buffer/create-array-buffer.ts} +31 -25
  234. package/src/typed-buffer/create-number-buffer.ts +90 -0
  235. package/src/typed-buffer/create-struct-buffer.ts +93 -0
  236. package/src/typed-buffer/create-typed-buffer.ts +49 -0
  237. package/src/typed-buffer/index.ts +26 -0
  238. package/src/typed-buffer/structs/assert-struct.ts +37 -0
  239. package/src/typed-buffer/structs/create-read-struct.test.ts +202 -0
  240. package/src/typed-buffer/structs/create-read-struct.ts +77 -0
  241. package/src/typed-buffer/structs/create-write-struct.ts +73 -0
  242. package/src/typed-buffer/structs/get-field-offset.ts +36 -0
  243. package/src/typed-buffer/structs/get-struct-layout.test.ts +146 -0
  244. package/src/typed-buffer/structs/get-struct-layout.ts +222 -0
  245. package/src/typed-buffer/structs/index.ts +22 -0
  246. package/src/typed-buffer/structs/read-struct.ts +25 -0
  247. package/src/typed-buffer/structs/struct-layout.ts +465 -0
  248. package/src/typed-buffer/structs/write-struct.test.ts +195 -0
  249. package/src/typed-buffer/structs/write-struct.ts +25 -0
  250. package/src/typed-buffer/typed-buffer.test.ts +253 -0
  251. package/src/typed-buffer/typed-buffer.ts +41 -0
  252. package/src/types/assert.ts +22 -0
  253. package/src/types/equal.ts +24 -0
  254. package/{types/index.js → src/types/index.ts} +3 -1
  255. package/src/types/types.ts +166 -0
  256. package/tsconfig-base.json +25 -0
  257. package/tsconfig.json +8 -0
  258. package/typedoc.json +22 -0
  259. package/vite.config.js +16 -0
  260. package/assembly/index.d.ts +0 -30
  261. package/assembly/index.js +0 -18
  262. package/assembly/index.wasm +0 -0
  263. package/assembly/index.wasm.map +0 -1
  264. package/assembly-test/assembly.test.d.ts +0 -1
  265. package/assembly-test/assembly.test.js.map +0 -1
  266. package/cache/async-cache.d.ts +0 -15
  267. package/cache/async-cache.js.map +0 -1
  268. package/cache/blob-store.d.ts +0 -94
  269. package/cache/blob-store.js +0 -191
  270. package/cache/blob-store.js.map +0 -1
  271. package/cache/blob-store.test.d.ts +0 -1
  272. package/cache/blob-store.test.js.map +0 -1
  273. package/cache/data-cache.d.ts +0 -38
  274. package/cache/data-cache.js +0 -96
  275. package/cache/data-cache.js.map +0 -1
  276. package/cache/data-cache.test.d.ts +0 -1
  277. package/cache/data-cache.test.js +0 -50
  278. package/cache/data-cache.test.js.map +0 -1
  279. package/cache/expiring-data-cache.d.ts +0 -6
  280. package/cache/expiring-data-cache.js.map +0 -1
  281. package/cache/expiring-data-cache.test.d.ts +0 -1
  282. package/cache/expiring-data-cache.test.js +0 -62
  283. package/cache/expiring-data-cache.test.js.map +0 -1
  284. package/cache/fallback-async-cache.d.ts +0 -7
  285. package/cache/fallback-async-cache.js +0 -22
  286. package/cache/fallback-async-cache.js.map +0 -1
  287. package/cache/functions/bind-functions.d.ts +0 -6
  288. package/cache/functions/bind-functions.js.map +0 -1
  289. package/cache/functions/functions.test.d.ts +0 -1
  290. package/cache/functions/functions.test.js +0 -79
  291. package/cache/functions/functions.test.js.map +0 -1
  292. package/cache/functions/get-cached.d.ts +0 -11
  293. package/cache/functions/get-cached.js.map +0 -1
  294. package/cache/functions/get-cached.test.d.ts +0 -1
  295. package/cache/functions/get-cached.test.js.map +0 -1
  296. package/cache/functions/hashing/blob-to-hash.d.ts +0 -4
  297. package/cache/functions/hashing/blob-to-hash.js.map +0 -1
  298. package/cache/functions/hashing/buffer-to-hash.d.ts +0 -4
  299. package/cache/functions/hashing/buffer-to-hash.js.map +0 -1
  300. package/cache/functions/hashing/hashing.test.d.ts +0 -1
  301. package/cache/functions/hashing/hashing.test.js +0 -95
  302. package/cache/functions/hashing/hashing.test.js.map +0 -1
  303. package/cache/functions/hashing/index.d.ts +0 -4
  304. package/cache/functions/hashing/index.js.map +0 -1
  305. package/cache/functions/hashing/json-to-hash.d.ts +0 -4
  306. package/cache/functions/hashing/json-to-hash.js.map +0 -1
  307. package/cache/functions/hashing/string-to-hash.d.ts +0 -4
  308. package/cache/functions/hashing/string-to-hash.js.map +0 -1
  309. package/cache/functions/index.d.ts +0 -5
  310. package/cache/functions/index.js.map +0 -1
  311. package/cache/functions/memoize.d.ts +0 -12
  312. package/cache/functions/memoize.js.map +0 -1
  313. package/cache/functions/omit.d.ts +0 -1
  314. package/cache/functions/omit.js.map +0 -1
  315. package/cache/functions/prevent-parallel-execution.d.ts +0 -7
  316. package/cache/functions/prevent-parallel-execution.js +0 -25
  317. package/cache/functions/prevent-parallel-execution.js.map +0 -1
  318. package/cache/functions/types.d.ts +0 -1
  319. package/cache/functions/types.js.map +0 -1
  320. package/cache/get-persistent-cache.d.ts +0 -12
  321. package/cache/get-persistent-cache.js +0 -23
  322. package/cache/get-persistent-cache.js.map +0 -1
  323. package/cache/index.d.ts +0 -3
  324. package/cache/index.js.map +0 -1
  325. package/cache/managed-array.d.ts +0 -23
  326. package/cache/managed-array.js +0 -160
  327. package/cache/managed-array.js.map +0 -1
  328. package/cache/managed-async-cache.browser.test.d.ts +0 -1
  329. package/cache/managed-async-cache.browser.test.js.map +0 -1
  330. package/cache/managed-async-cache.d.ts +0 -4
  331. package/cache/managed-async-cache.js +0 -45
  332. package/cache/managed-async-cache.js.map +0 -1
  333. package/cache/memory-allocator.d.ts +0 -23
  334. package/cache/memory-allocator.js +0 -94
  335. package/cache/memory-allocator.js.map +0 -1
  336. package/cache/memory-async-cache.d.ts +0 -6
  337. package/cache/memory-async-cache.js +0 -23
  338. package/cache/memory-async-cache.js.map +0 -1
  339. package/core/data.d.ts +0 -22
  340. package/core/data.js.map +0 -1
  341. package/core/data.test.d.ts +0 -1
  342. package/core/data.test.js.map +0 -1
  343. package/core/functions/array-equals.d.ts +0 -1
  344. package/core/functions/array-equals.js.map +0 -1
  345. package/core/functions/deep-merge.d.ts +0 -32
  346. package/core/functions/deep-merge.js +0 -54
  347. package/core/functions/deep-merge.js.map +0 -1
  348. package/core/functions/deep-merge.test.d.ts +0 -1
  349. package/core/functions/deep-merge.test.js +0 -94
  350. package/core/functions/deep-merge.test.js.map +0 -1
  351. package/core/functions/index.d.ts +0 -3
  352. package/core/functions/index.js.map +0 -1
  353. package/core/functions/is-async-generator.d.ts +0 -1
  354. package/core/functions/is-async-generator.js.map +0 -1
  355. package/core/functions/is-promise.d.ts +0 -1
  356. package/core/functions/is-promise.js.map +0 -1
  357. package/core/functions/with-validation.d.ts +0 -5
  358. package/core/functions/with-validation.js.map +0 -1
  359. package/core/functions/with-validation.test.d.ts +0 -1
  360. package/core/functions/with-validation.test.js.map +0 -1
  361. package/core/index.d.ts +0 -3
  362. package/core/index.js.map +0 -1
  363. package/core/schema/dynamic/dynamic-schema.d.ts +0 -27
  364. package/core/schema/dynamic/dynamic-schema.js +0 -2
  365. package/core/schema/dynamic/dynamic-schema.js.map +0 -1
  366. package/core/schema/dynamic/enumerate-patches.d.ts +0 -9
  367. package/core/schema/dynamic/enumerate-patches.js.map +0 -1
  368. package/core/schema/dynamic/enumerate-patches.test.d.ts +0 -134
  369. package/core/schema/dynamic/enumerate-patches.test.js.map +0 -1
  370. package/core/schema/dynamic/get-dynamic-schema.d.ts +0 -5
  371. package/core/schema/dynamic/get-dynamic-schema.js +0 -26
  372. package/core/schema/dynamic/get-dynamic-schema.js.map +0 -1
  373. package/core/schema/dynamic/get-dynamic-schema.test.d.ts +0 -1
  374. package/core/schema/dynamic/get-dynamic-schema.test.js.map +0 -1
  375. package/core/schema/dynamic/index.d.ts +0 -1
  376. package/core/schema/dynamic/index.js +0 -2
  377. package/core/schema/dynamic/index.js.map +0 -1
  378. package/core/schema/dynamic/schema-path-value-path.d.ts +0 -5
  379. package/core/schema/dynamic/schema-path-value-path.js +0 -12
  380. package/core/schema/dynamic/schema-path-value-path.js.map +0 -1
  381. package/core/schema/dynamic-schema.d.ts +0 -27
  382. package/core/schema/dynamic-schema.js +0 -2
  383. package/core/schema/dynamic-schema.js.map +0 -1
  384. package/core/schema/index.d.ts +0 -4
  385. package/core/schema/index.js +0 -26
  386. package/core/schema/index.js.map +0 -1
  387. package/core/schema/schema.d.ts +0 -122
  388. package/core/schema/schema.js.map +0 -1
  389. package/core/schema/schemas.d.ts +0 -45
  390. package/core/schema/schemas.js +0 -39
  391. package/core/schema/schemas.js.map +0 -1
  392. package/core/schema/ui-schema.d.ts +0 -25
  393. package/core/schema/ui-schema.js +0 -2
  394. package/core/schema/ui-schema.js.map +0 -1
  395. package/core/schema/validation/is-valid.d.ts +0 -2
  396. package/core/schema/validation/is-valid.js +0 -14
  397. package/core/schema/validation/is-valid.js.map +0 -1
  398. package/core/schema/validation/is-valid.test.d.ts +0 -1
  399. package/core/schema/validation/is-valid.test.js.map +0 -1
  400. package/core/schema/validation/validate.d.ts +0 -2
  401. package/core/schema/validation/validate.js.map +0 -1
  402. package/core/schema/validation/validate.test.d.ts +0 -1
  403. package/core/schema/validation/validate.test.js.map +0 -1
  404. package/core/schema/validation/with-validation.d.ts +0 -5
  405. package/core/schema/validation/with-validation.js +0 -16
  406. package/core/schema/validation/with-validation.js.map +0 -1
  407. package/core/schema/validation/with-validation.test.d.ts +0 -1
  408. package/core/schema/validation/with-validation.test.js +0 -96
  409. package/core/schema/validation/with-validation.test.js.map +0 -1
  410. package/core/schema.d.ts +0 -86
  411. package/core/schema.js.map +0 -1
  412. package/core/schema.test.d.ts +0 -1
  413. package/core/schema.test.js +0 -16
  414. package/core/schema.test.js.map +0 -1
  415. package/core/schemas.d.ts +0 -45
  416. package/core/schemas.js +0 -39
  417. package/core/schemas.js.map +0 -1
  418. package/ecs/action-ecs/action-ecs.d.ts +0 -19
  419. package/ecs/action-ecs/action-ecs.js +0 -203
  420. package/ecs/action-ecs/action-ecs.js.map +0 -1
  421. package/ecs/action-ecs/action-ecs.test.d.ts +0 -1
  422. package/ecs/action-ecs/action-ecs.test.js +0 -362
  423. package/ecs/action-ecs/action-ecs.test.js.map +0 -1
  424. package/ecs/action-ecs/action-types.d.ts +0 -106
  425. package/ecs/action-ecs/action-types.js +0 -19
  426. package/ecs/action-ecs/action-types.js.map +0 -1
  427. package/ecs/action-ecs/index.d.ts +0 -2
  428. package/ecs/action-ecs/index.js.map +0 -1
  429. package/ecs/core-ecs/core-ecs-serialization.test.d.ts +0 -1
  430. package/ecs/core-ecs/core-ecs-serialization.test.js +0 -230
  431. package/ecs/core-ecs/core-ecs-serialization.test.js.map +0 -1
  432. package/ecs/core-ecs/core-ecs-types.d.ts +0 -141
  433. package/ecs/core-ecs/core-ecs-types.js.map +0 -1
  434. package/ecs/core-ecs/core-ecs.d.ts +0 -7
  435. package/ecs/core-ecs/core-ecs.js +0 -492
  436. package/ecs/core-ecs/core-ecs.js.map +0 -1
  437. package/ecs/core-ecs/core-ecs.test.d.ts +0 -1
  438. package/ecs/core-ecs/core-ecs.test.js +0 -425
  439. package/ecs/core-ecs/core-ecs.test.js.map +0 -1
  440. package/ecs/core-ecs/index.d.ts +0 -1
  441. package/ecs/core-ecs/index.js +0 -2
  442. package/ecs/core-ecs/index.js.map +0 -1
  443. package/ecs/ecs/ecs-types.d.ts +0 -132
  444. package/ecs/ecs/ecs-types.js.map +0 -1
  445. package/ecs/ecs/ecs-where-functions.d.ts +0 -6
  446. package/ecs/ecs/ecs-where-functions.js +0 -91
  447. package/ecs/ecs/ecs-where-functions.js.map +0 -1
  448. package/ecs/ecs/ecs.d.ts +0 -13
  449. package/ecs/ecs/ecs.js +0 -177
  450. package/ecs/ecs/ecs.js.map +0 -1
  451. package/ecs/ecs/ecs.test.d.ts +0 -1
  452. package/ecs/ecs/ecs.test.js +0 -399
  453. package/ecs/ecs/ecs.test.js.map +0 -1
  454. package/ecs/ecs/index.d.ts +0 -3
  455. package/ecs/ecs/index.js +0 -3
  456. package/ecs/ecs/index.js.map +0 -1
  457. package/ecs/index.d.ts +0 -4
  458. package/ecs/index.js.map +0 -1
  459. package/ecs/transaction-ecs/index.d.ts +0 -2
  460. package/ecs/transaction-ecs/index.js.map +0 -1
  461. package/ecs/transaction-ecs/transaction-ecs.d.ts +0 -11
  462. package/ecs/transaction-ecs/transaction-ecs.js +0 -184
  463. package/ecs/transaction-ecs/transaction-ecs.js.map +0 -1
  464. package/ecs/transaction-ecs/transaction-ecs.test.d.ts +0 -1
  465. package/ecs/transaction-ecs/transaction-ecs.test.js +0 -599
  466. package/ecs/transaction-ecs/transaction-ecs.test.js.map +0 -1
  467. package/ecs/transaction-ecs/transaction-types.d.ts +0 -135
  468. package/ecs/transaction-ecs/transaction-types.js +0 -2
  469. package/ecs/transaction-ecs/transaction-types.js.map +0 -1
  470. package/ecs/transaction-ecs/transactions.d.ts +0 -5
  471. package/ecs/transaction-ecs/transactions.js +0 -158
  472. package/ecs/transaction-ecs/transactions.js.map +0 -1
  473. package/index.d.ts +0 -1
  474. package/index.js +0 -23
  475. package/index.js.map +0 -1
  476. package/observe/create-observable-event.d.ts +0 -10
  477. package/observe/create-observable-event.js +0 -22
  478. package/observe/create-observable-event.js.map +0 -1
  479. package/observe/create-observable-state.d.ts +0 -7
  480. package/observe/create-observable-state.js +0 -27
  481. package/observe/create-observable-state.js.map +0 -1
  482. package/observe/create-persisted-state.d.ts +0 -11
  483. package/observe/create-persisted-state.js +0 -31
  484. package/observe/create-persisted-state.js.map +0 -1
  485. package/observe/create-persisted-state.test.d.ts +0 -1
  486. package/observe/create-persisted-state.test.js +0 -124
  487. package/observe/create-persisted-state.test.js.map +0 -1
  488. package/observe/from-array.d.ts +0 -5
  489. package/observe/from-array.js.map +0 -1
  490. package/observe/from-constant.d.ts +0 -5
  491. package/observe/from-constant.js +0 -12
  492. package/observe/from-constant.js.map +0 -1
  493. package/observe/from-element-id.d.ts +0 -7
  494. package/observe/from-element-id.js.map +0 -1
  495. package/observe/from-element-properties-and-events.d.ts +0 -2
  496. package/observe/from-element-properties-and-events.js +0 -18
  497. package/observe/from-element-properties-and-events.js.map +0 -1
  498. package/observe/from-element-property.d.ts +0 -11
  499. package/observe/from-element-property.js.map +0 -1
  500. package/observe/from-promise-with-error.d.ts +0 -7
  501. package/observe/from-promise-with-error.js +0 -27
  502. package/observe/from-promise-with-error.js.map +0 -1
  503. package/observe/from-promise.d.ts +0 -6
  504. package/observe/from-promise.js +0 -22
  505. package/observe/from-promise.js.map +0 -1
  506. package/observe/from-properties.d.ts +0 -10
  507. package/observe/from-properties.js +0 -33
  508. package/observe/from-properties.js.map +0 -1
  509. package/observe/index.d.ts +0 -27
  510. package/observe/index.js.map +0 -1
  511. package/observe/observe.test.d.ts +0 -7
  512. package/observe/observe.test.js +0 -417
  513. package/observe/observe.test.js.map +0 -1
  514. package/observe/to-promise.d.ts +0 -8
  515. package/observe/to-promise.js +0 -18
  516. package/observe/to-promise.js.map +0 -1
  517. package/observe/to-properties.d.ts +0 -11
  518. package/observe/to-properties.js +0 -9
  519. package/observe/to-properties.js.map +0 -1
  520. package/observe/types.d.ts +0 -17
  521. package/observe/types.js +0 -2
  522. package/observe/types.js.map +0 -1
  523. package/observe/with-async-map.d.ts +0 -6
  524. package/observe/with-async-map.js +0 -12
  525. package/observe/with-async-map.js.map +0 -1
  526. package/observe/with-cache.d.ts +0 -6
  527. package/observe/with-cache.js +0 -33
  528. package/observe/with-cache.js.map +0 -1
  529. package/observe/with-copy.d.ts +0 -5
  530. package/observe/with-copy.js +0 -10
  531. package/observe/with-copy.js.map +0 -1
  532. package/observe/with-deduplicate-data.d.ts +0 -7
  533. package/observe/with-deduplicate-data.js +0 -18
  534. package/observe/with-deduplicate-data.js.map +0 -1
  535. package/observe/with-deduplicate.d.ts +0 -6
  536. package/observe/with-deduplicate.js +0 -19
  537. package/observe/with-deduplicate.js.map +0 -1
  538. package/observe/with-default.d.ts +0 -6
  539. package/observe/with-default.js +0 -21
  540. package/observe/with-default.js.map +0 -1
  541. package/observe/with-map-data.d.ts +0 -7
  542. package/observe/with-map-data.js.map +0 -1
  543. package/observe/with-map.d.ts +0 -5
  544. package/observe/with-map.js +0 -11
  545. package/observe/with-map.js.map +0 -1
  546. package/observe/with-optional.d.ts +0 -5
  547. package/observe/with-optional.js +0 -20
  548. package/observe/with-optional.js.map +0 -1
  549. package/observe/with-unwrap.d.ts +0 -5
  550. package/observe/with-unwrap.js +0 -26
  551. package/observe/with-unwrap.js.map +0 -1
  552. package/perftest/ecs-perf.d.ts +0 -49
  553. package/perftest/ecs-perf.js +0 -230
  554. package/perftest/ecs-perf.js.map +0 -1
  555. package/perftest/helper-functions.d.ts +0 -1
  556. package/perftest/helper-functions.js +0 -31
  557. package/perftest/helper-functions.js.map +0 -1
  558. package/perftest/horizon-perf.d.ts +0 -22
  559. package/perftest/horizon-perf.js +0 -126
  560. package/perftest/horizon-perf.js.map +0 -1
  561. package/perftest/index.d.ts +0 -1
  562. package/perftest/index.js.map +0 -1
  563. package/perftest/perf-test.d.ts +0 -18
  564. package/perftest/perf-test.js +0 -124
  565. package/perftest/perf-test.js.map +0 -1
  566. package/perftest/vanilla-perf.d.ts +0 -38
  567. package/perftest/vanilla-perf.js +0 -128
  568. package/perftest/vanilla-perf.js.map +0 -1
  569. package/schemas/index.d.ts +0 -1
  570. package/schemas/index.js +0 -23
  571. package/schemas/index.js.map +0 -1
  572. package/schemas/schemas.d.ts +0 -45
  573. package/schemas/schemas.js +0 -39
  574. package/schemas/schemas.js.map +0 -1
  575. package/service/add-observable-actions.d.ts +0 -29
  576. package/service/add-observable-actions.js +0 -108
  577. package/service/add-observable-actions.js.map +0 -1
  578. package/service/index.d.ts +0 -4
  579. package/service/index.js.map +0 -1
  580. package/service/progressive-result.d.ts +0 -96
  581. package/service/progressive-result.js +0 -99
  582. package/service/progressive-result.js.map +0 -1
  583. package/service/sequential-action.d.ts +0 -18
  584. package/service/sequential-action.js.map +0 -1
  585. package/service/service.d.ts +0 -4
  586. package/service/service.js.map +0 -1
  587. package/tsconfig.tsbuildinfo +0 -1
  588. package/types/index.d.ts +0 -1
  589. package/types/index.js.map +0 -1
  590. package/types/types.d.ts +0 -61
  591. package/types/types.js.map +0 -1
@@ -0,0 +1,562 @@
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 { describe, it, expect } from "vitest";
23
+ import { createStore } from "./create-store.js";
24
+ import { createCoreTestSuite, positionSchema, healthSchema, nameSchema } from "./core/create-core.test.js";
25
+ import { Schema } from "../../schema/schema.js";
26
+ import { F32Schema } from "../../schema/f32.js";
27
+
28
+ describe("createStore", () => {
29
+ // Test that store passes all core functionality tests
30
+ createCoreTestSuite("Store core functionality", (componentSchemas) =>
31
+ createStore(componentSchemas, {})
32
+ );
33
+
34
+ // Select function tests
35
+ describe("Select functionality", () => {
36
+ const velocitySchema = {
37
+ type: "object",
38
+ properties: {
39
+ x: F32Schema,
40
+ y: F32Schema,
41
+ z: F32Schema,
42
+ }
43
+ } as const satisfies Schema;
44
+
45
+ it("should select entities from single archetype", () => {
46
+ const store = createStore({
47
+ position: positionSchema,
48
+ health: healthSchema,
49
+ name: nameSchema,
50
+ }, {});
51
+
52
+ // Create entities in a single archetype
53
+ const archetype = store.ensureArchetype(["id", "position", "health"]);
54
+ const entity1 = archetype.insert({
55
+ position: { x: 1, y: 2, z: 3 },
56
+ health: { current: 100, max: 100 }
57
+ });
58
+ const entity2 = archetype.insert({
59
+ position: { x: 4, y: 5, z: 6 },
60
+ health: { current: 50, max: 100 }
61
+ });
62
+
63
+ // Select entities with position and health
64
+ const entities = store.select(["position", "health"]);
65
+ expect(entities).toHaveLength(2);
66
+ expect(entities).toContain(entity1);
67
+ expect(entities).toContain(entity2);
68
+ });
69
+
70
+ it("should select entities spanning multiple archetypes", () => {
71
+ const store = createStore({
72
+ position: positionSchema,
73
+ health: healthSchema,
74
+ name: nameSchema,
75
+ velocity: velocitySchema,
76
+ }, {});
77
+
78
+ // Create entities in different archetypes
79
+ const positionOnlyArchetype = store.ensureArchetype(["id", "position"]);
80
+ const entity1 = positionOnlyArchetype.insert({
81
+ position: { x: 1, y: 2, z: 3 }
82
+ });
83
+ const entity2 = positionOnlyArchetype.insert({
84
+ position: { x: 4, y: 5, z: 6 }
85
+ });
86
+
87
+ const healthOnlyArchetype = store.ensureArchetype(["id", "health"]);
88
+ const entity3 = healthOnlyArchetype.insert({
89
+ health: { current: 100, max: 100 }
90
+ });
91
+
92
+ const positionHealthArchetype = store.ensureArchetype(["id", "position", "health"]);
93
+ const entity4 = positionHealthArchetype.insert({
94
+ position: { x: 0, y: 0, z: 0 },
95
+ health: { current: 50, max: 100 }
96
+ });
97
+
98
+ const velocityArchetype = store.ensureArchetype(["id", "velocity"]);
99
+ const entity5 = velocityArchetype.insert({
100
+ velocity: { x: 1, y: 0, z: 0 }
101
+ });
102
+
103
+ // Select all entities with position component (should span 2 archetypes)
104
+ const positionEntities = store.select(["position"]);
105
+ expect(positionEntities).toHaveLength(3);
106
+ expect(positionEntities).toContain(entity1);
107
+ expect(positionEntities).toContain(entity2);
108
+ expect(positionEntities).toContain(entity4);
109
+ expect(positionEntities).not.toContain(entity3);
110
+ expect(positionEntities).not.toContain(entity5);
111
+
112
+ // Select all entities with health component (should span 2 archetypes)
113
+ const healthEntities = store.select(["health"]);
114
+ expect(healthEntities).toHaveLength(2);
115
+ expect(healthEntities).toContain(entity3);
116
+ expect(healthEntities).toContain(entity4);
117
+ expect(healthEntities).not.toContain(entity1);
118
+ expect(healthEntities).not.toContain(entity2);
119
+ expect(healthEntities).not.toContain(entity5);
120
+
121
+ // Select entities with both position and health (should be only 1 archetype)
122
+ const bothEntities = store.select(["position", "health"]);
123
+ expect(bothEntities).toHaveLength(1);
124
+ expect(bothEntities).toContain(entity4);
125
+ expect(bothEntities).not.toContain(entity1);
126
+ expect(bothEntities).not.toContain(entity2);
127
+ expect(bothEntities).not.toContain(entity3);
128
+ expect(bothEntities).not.toContain(entity5);
129
+ });
130
+
131
+ it("should select entities with exclude option", () => {
132
+ const store = createStore({
133
+ position: positionSchema,
134
+ health: healthSchema,
135
+ name: nameSchema,
136
+ }, {});
137
+
138
+ // Create entities in different archetypes
139
+ const positionOnlyArchetype = store.ensureArchetype(["id", "position"]);
140
+ const entity1 = positionOnlyArchetype.insert({
141
+ position: { x: 1, y: 2, z: 3 }
142
+ });
143
+
144
+ const positionHealthArchetype = store.ensureArchetype(["id", "position", "health"]);
145
+ const entity2 = positionHealthArchetype.insert({
146
+ position: { x: 0, y: 0, z: 0 },
147
+ health: { current: 50, max: 100 }
148
+ });
149
+
150
+ // Select entities with position but exclude health
151
+ const positionOnlyEntities = store.select(["position"], { exclude: ["health"] });
152
+ expect(positionOnlyEntities).toHaveLength(1);
153
+ expect(positionOnlyEntities).toContain(entity1);
154
+ expect(positionOnlyEntities).not.toContain(entity2);
155
+ });
156
+
157
+ it("should return empty array when no entities match", () => {
158
+ const store = createStore({
159
+ position: positionSchema,
160
+ health: healthSchema,
161
+ }, {});
162
+
163
+ // Create entity with only position
164
+ const archetype = store.ensureArchetype(["id", "position"]);
165
+ archetype.insert({ position: { x: 1, y: 2, z: 3 } });
166
+
167
+ // Select entities with health (should be empty)
168
+ const entities = store.select(["health"]);
169
+ expect(entities).toHaveLength(0);
170
+ });
171
+
172
+ it("should handle complex multi-archetype scenarios", () => {
173
+ const store = createStore({
174
+ position: positionSchema,
175
+ health: healthSchema,
176
+ name: nameSchema,
177
+ velocity: velocitySchema,
178
+ }, {});
179
+
180
+ // Create entities across many different archetypes
181
+ const archetype1 = store.ensureArchetype(["id", "position"]);
182
+ const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
183
+ const entity2 = archetype1.insert({ position: { x: 4, y: 5, z: 6 } });
184
+
185
+ const archetype2 = store.ensureArchetype(["id", "health"]);
186
+ const entity3 = archetype2.insert({ health: { current: 100, max: 100 } });
187
+
188
+ const archetype3 = store.ensureArchetype(["id", "position", "health"]);
189
+ const entity4 = archetype3.insert({
190
+ position: { x: 0, y: 0, z: 0 },
191
+ health: { current: 50, max: 100 }
192
+ });
193
+ const entity5 = archetype3.insert({
194
+ position: { x: 10, y: 20, z: 30 },
195
+ health: { current: 75, max: 100 }
196
+ });
197
+
198
+ const archetype4 = store.ensureArchetype(["id", "name"]);
199
+ const entity6 = archetype4.insert({ name: "Player1" });
200
+
201
+ const archetype5 = store.ensureArchetype(["id", "position", "name"]);
202
+ const entity7 = archetype5.insert({
203
+ position: { x: 100, y: 200, z: 300 },
204
+ name: "Player2"
205
+ });
206
+
207
+ const archetype6 = store.ensureArchetype(["id", "position", "health", "name"]);
208
+ const entity8 = archetype6.insert({
209
+ position: { x: 500, y: 600, z: 700 },
210
+ health: { current: 25, max: 100 },
211
+ name: "Player3"
212
+ });
213
+
214
+ // Test various selection scenarios
215
+ const positionEntities = store.select(["position"]);
216
+ expect(positionEntities).toHaveLength(6);
217
+ expect(positionEntities).toContain(entity1);
218
+ expect(positionEntities).toContain(entity2);
219
+ expect(positionEntities).toContain(entity4);
220
+ expect(positionEntities).toContain(entity5);
221
+ expect(positionEntities).toContain(entity7);
222
+ expect(positionEntities).toContain(entity8);
223
+
224
+ const nameEntities = store.select(["name"]);
225
+ expect(nameEntities).toHaveLength(3);
226
+ expect(nameEntities).toContain(entity6);
227
+ expect(nameEntities).toContain(entity7);
228
+ expect(nameEntities).toContain(entity8);
229
+
230
+ const positionNameEntities = store.select(["position", "name"]);
231
+ expect(positionNameEntities).toHaveLength(2);
232
+ expect(positionNameEntities).toContain(entity7);
233
+ expect(positionNameEntities).toContain(entity8);
234
+
235
+ const allThreeEntities = store.select(["position", "health", "name"]);
236
+ expect(allThreeEntities).toHaveLength(1);
237
+ expect(allThreeEntities).toContain(entity8);
238
+
239
+ // Test exclusion
240
+ const positionWithoutHealth = store.select(["position"], { exclude: ["health"] });
241
+ expect(positionWithoutHealth).toHaveLength(3);
242
+ expect(positionWithoutHealth).toContain(entity1);
243
+ expect(positionWithoutHealth).toContain(entity2);
244
+ expect(positionWithoutHealth).toContain(entity7);
245
+ expect(positionWithoutHealth).not.toContain(entity4);
246
+ expect(positionWithoutHealth).not.toContain(entity5);
247
+ expect(positionWithoutHealth).not.toContain(entity8);
248
+ });
249
+
250
+ it("should maintain entity order across archetypes", () => {
251
+ const store = createStore({
252
+ position: positionSchema,
253
+ health: healthSchema,
254
+ }, {});
255
+
256
+ // Create entities in different archetypes
257
+ const archetype1 = store.ensureArchetype(["id", "position"]);
258
+ const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
259
+ const entity2 = archetype1.insert({ position: { x: 4, y: 5, z: 6 } });
260
+
261
+ const archetype2 = store.ensureArchetype(["id", "health"]);
262
+ const entity3 = archetype2.insert({ health: { current: 100, max: 100 } });
263
+
264
+ const archetype3 = store.ensureArchetype(["id", "position", "health"]);
265
+ const entity4 = archetype3.insert({
266
+ position: { x: 0, y: 0, z: 0 },
267
+ health: { current: 50, max: 100 }
268
+ });
269
+
270
+ // Select all entities with position
271
+ const entities = store.select(["position"]);
272
+ expect(entities).toHaveLength(3);
273
+
274
+ // Verify all expected entities are present (order may vary)
275
+ expect(entities).toContain(entity1);
276
+ expect(entities).toContain(entity2);
277
+ expect(entities).toContain(entity4);
278
+ expect(entities).not.toContain(entity3);
279
+ });
280
+
281
+ it("should handle empty store", () => {
282
+ const store = createStore({
283
+ position: positionSchema,
284
+ health: healthSchema,
285
+ }, {});
286
+
287
+ const entities = store.select(["position"]);
288
+ expect(entities).toHaveLength(0);
289
+ });
290
+
291
+ it("should work with resources as components", () => {
292
+ const store = createStore({
293
+ position: positionSchema,
294
+ health: healthSchema,
295
+ }, {
296
+ time: { delta: 0.016, elapsed: 0 }
297
+ });
298
+
299
+ // Create some entities
300
+ const archetype = store.ensureArchetype(["id", "position"]);
301
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
302
+
303
+ // Select entities with time component (should include the resource entity)
304
+ const timeEntities = store.select(["time" as any]);
305
+ expect(timeEntities).toHaveLength(1);
306
+
307
+ // The resource entity should be included in time queries
308
+ const timeArchetypes = store.queryArchetypes(["time" as any]);
309
+ expect(timeArchetypes).toHaveLength(1);
310
+ });
311
+ });
312
+
313
+ // Store-specific resource tests
314
+ describe("Resource functionality", () => {
315
+ const timeSchema = {
316
+ type: "object",
317
+ properties: {
318
+ delta: F32Schema,
319
+ elapsed: F32Schema,
320
+ }
321
+ } as const satisfies Schema;
322
+
323
+ const configSchema = {
324
+ type: "object",
325
+ properties: {
326
+ debug: { type: "boolean" },
327
+ volume: F32Schema,
328
+ }
329
+ } as const satisfies Schema;
330
+
331
+ it("should create store with resources", () => {
332
+ const store = createStore(
333
+ { position: positionSchema },
334
+ {
335
+ time: { delta: 0.016, elapsed: 0 },
336
+ config: { debug: false, volume: 1.0 }
337
+ }
338
+ );
339
+
340
+ expect(store).toBeDefined();
341
+ expect(store.resources).toBeDefined();
342
+ expect(store.resources.time).toBeDefined();
343
+ expect(store.resources.config).toBeDefined();
344
+ });
345
+
346
+ it("should initialize resources with default values", () => {
347
+ const defaultTime = { delta: 0.016, elapsed: 0 };
348
+ const defaultConfig = { debug: false, volume: 1.0 };
349
+
350
+ const store = createStore(
351
+ { position: positionSchema },
352
+ {
353
+ time: defaultTime,
354
+ config: defaultConfig
355
+ }
356
+ );
357
+
358
+ expect(store.resources.time).toEqual(defaultTime);
359
+ expect(store.resources.config).toEqual(defaultConfig);
360
+ });
361
+
362
+ it("should allow reading resource values", () => {
363
+ const store = createStore(
364
+ { position: positionSchema },
365
+ {
366
+ time: { delta: 0.016, elapsed: 0 },
367
+ config: { debug: false, volume: 1.0 }
368
+ }
369
+ );
370
+
371
+ expect(store.resources.time.delta).toBe(0.016);
372
+ expect(store.resources.time.elapsed).toBe(0);
373
+ expect(store.resources.config.debug).toBe(false);
374
+ expect(store.resources.config.volume).toBe(1.0);
375
+ });
376
+
377
+ it("should allow updating resource values", () => {
378
+ const store = createStore(
379
+ { position: positionSchema },
380
+ {
381
+ time: { delta: 0.016, elapsed: 0 },
382
+ config: { debug: false, volume: 1.0 }
383
+ }
384
+ );
385
+
386
+ // Update time
387
+ store.resources.time = { delta: 0.033, elapsed: 1.5 };
388
+ expect(store.resources.time.delta).toBe(0.033);
389
+ expect(store.resources.time.elapsed).toBe(1.5);
390
+
391
+ // Update config
392
+ store.resources.config = { debug: true, volume: 0.5 };
393
+ expect(store.resources.config.debug).toBe(true);
394
+ expect(store.resources.config.volume).toBe(0.5);
395
+ });
396
+
397
+ it("should maintain resource values across updates", () => {
398
+ const store = createStore(
399
+ { position: positionSchema },
400
+ {
401
+ time: { delta: 0.016, elapsed: 0 },
402
+ config: { debug: false, volume: 1.0 }
403
+ }
404
+ );
405
+
406
+ // Update multiple times
407
+ store.resources.time = { delta: 0.033, elapsed: 1.5 };
408
+ store.resources.time = { delta: 0.025, elapsed: 2.0 };
409
+ store.resources.config = { debug: true, volume: 0.5 };
410
+
411
+ // Verify final values
412
+ expect(store.resources.time).toEqual({ delta: 0.025, elapsed: 2.0 });
413
+ expect(store.resources.config).toEqual({ debug: true, volume: 0.5 });
414
+ });
415
+
416
+ it("should handle nested resource updates", () => {
417
+ const store = createStore(
418
+ { position: positionSchema },
419
+ {
420
+ time: { delta: 0.016, elapsed: 0 }
421
+ }
422
+ );
423
+
424
+ // Update individual properties
425
+ const newTime = { delta: 0.033, elapsed: 1.5 };
426
+ store.resources.time = newTime;
427
+
428
+ expect(store.resources.time.delta).toBe(newTime.delta);
429
+ expect(store.resources.time.elapsed).toBe(newTime.elapsed);
430
+ });
431
+
432
+ it("should work with empty resource object", () => {
433
+ const store = createStore(
434
+ { position: positionSchema },
435
+ {}
436
+ );
437
+
438
+ expect(store.resources).toBeDefined();
439
+ expect(Object.keys(store.resources)).toHaveLength(0);
440
+ });
441
+
442
+ it("should handle multiple resources independently", () => {
443
+ const store = createStore(
444
+ { position: positionSchema },
445
+ {
446
+ time: { delta: 0.016, elapsed: 0 },
447
+ config: { debug: false, volume: 1.0 },
448
+ score: 0
449
+ }
450
+ );
451
+
452
+ // Update each resource independently
453
+ store.resources.time = { delta: 0.033, elapsed: 1.5 };
454
+ store.resources.config = { debug: true, volume: 0.5 };
455
+ store.resources.score = 100;
456
+
457
+ // Verify all resources maintain their values
458
+ expect(store.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
459
+ expect(store.resources.config).toEqual({ debug: true, volume: 0.5 });
460
+ expect(store.resources.score).toBe(100);
461
+ });
462
+
463
+ it("should allow querying resources as components", () => {
464
+ const store = createStore(
465
+ {
466
+ position: positionSchema,
467
+ time: timeSchema
468
+ },
469
+ {
470
+ time: { delta: 0.016, elapsed: 0 }
471
+ }
472
+ );
473
+
474
+ // Resources should be queryable as components
475
+ const timeArchetypes = store.queryArchetypes(["time"]);
476
+ expect(timeArchetypes).toHaveLength(1);
477
+ expect(timeArchetypes[0].components.has("time")).toBe(true);
478
+ });
479
+
480
+ it("should maintain resource singleton behavior", () => {
481
+ const store = createStore(
482
+ {
483
+ position: positionSchema,
484
+ time: timeSchema
485
+ },
486
+ {
487
+ time: { delta: 0.016, elapsed: 0 }
488
+ }
489
+ );
490
+
491
+ // Resources should be queryable as components
492
+ const timeArchetypes = store.queryArchetypes(["time"]);
493
+ expect(timeArchetypes).toHaveLength(1);
494
+
495
+ // Resources should maintain their values
496
+ expect(store.resources.time).toEqual({ delta: 0.016, elapsed: 0 });
497
+
498
+ // Update and verify
499
+ store.resources.time = { delta: 0.033, elapsed: 1.5 };
500
+ expect(store.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
501
+ });
502
+
503
+ it("should handle primitive resource values", () => {
504
+ const store = createStore(
505
+ { position: positionSchema },
506
+ {
507
+ score: 0,
508
+ name: "Player1",
509
+ active: true
510
+ }
511
+ );
512
+
513
+ expect(store.resources.score).toBe(0);
514
+ expect(store.resources.name).toBe("Player1");
515
+ expect(store.resources.active).toBe(true);
516
+
517
+ // Update primitive values
518
+ store.resources.score = 100;
519
+ store.resources.name = "Player2";
520
+ store.resources.active = false;
521
+
522
+ expect(store.resources.score).toBe(100);
523
+ expect(store.resources.name).toBe("Player2");
524
+ expect(store.resources.active).toBe(false);
525
+ });
526
+
527
+ it("should handle complex resource objects", () => {
528
+ const complexResource = {
529
+ nested: {
530
+ deep: {
531
+ value: 42,
532
+ array: [1, 2, 3],
533
+ flag: true
534
+ }
535
+ },
536
+ count: 0
537
+ };
538
+
539
+ const store = createStore(
540
+ { position: positionSchema },
541
+ { complex: complexResource }
542
+ );
543
+
544
+ expect(store.resources.complex).toEqual(complexResource);
545
+
546
+ // Update complex resource
547
+ const updatedComplex = {
548
+ nested: {
549
+ deep: {
550
+ value: 100,
551
+ array: [4, 5, 6],
552
+ flag: false
553
+ }
554
+ },
555
+ count: 10
556
+ };
557
+
558
+ store.resources.complex = updatedComplex;
559
+ expect(store.resources.complex).toEqual(updatedComplex);
560
+ });
561
+ });
562
+ });
@@ -0,0 +1,97 @@
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 { ResourceComponents } from "./resource-components.js";
23
+ import { ComponentSchemas } from "../component-schemas.js";
24
+ import { StringKeyof } from "../../types/types.js";
25
+ import { CoreComponents } from "../core-components.js";
26
+ import { Simplify } from "../../types/index.js";
27
+ import { Store } from "./store.js";
28
+ import { FromSchema, Schema } from "../../schema/schema.js";
29
+ import { createCore } from "./core/create-core.js";
30
+ import { Entity } from "../entity.js";
31
+ import { Core, QueryOptions } from "./core/core.js";
32
+
33
+ export function createStore<NC extends ComponentSchemas, R extends ResourceComponents>(
34
+ newComponentSchemas: NC,
35
+ resourceDefaults: R,
36
+ ): Store<Simplify<CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> }>, { -readonly [K in StringKeyof<R>]: R[K] }> {
37
+ type C = CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> };
38
+ const resources = {} as R;
39
+ type S = StringKeyof<C>;
40
+
41
+ const resourceSchema = {} as const satisfies Schema;
42
+ const componentAndResourceSchemas: { [K in StringKeyof<C | R>]: Schema } = { ...newComponentSchemas };
43
+ // Resources are stored in the core as components, so we need to add them to the componentSchemas
44
+ for (const name of Object.keys(resourceDefaults)) {
45
+ const resourceId = name as StringKeyof<C | R>;
46
+ componentAndResourceSchemas[resourceId] = resourceSchema;
47
+ }
48
+
49
+ const core = createCore(componentAndResourceSchemas) as unknown as Core<C>;
50
+
51
+ // Each resource will be stored as the only entity in an archetype of [id, <resourceName>]
52
+ // The resource component we added above will contain the resource value
53
+ for (const [name, resource] of Object.entries(resourceDefaults)) {
54
+ const resourceId = name as StringKeyof<C>;
55
+ const archetype = core.ensureArchetype(["id", resourceId]);
56
+ archetype.insert({ [resourceId]: resource } as any);
57
+ const row = 0;
58
+ Object.defineProperty(resources, name, {
59
+ get: () => archetype.columns[resourceId]!.get(row),
60
+ set: (value) => {
61
+ archetype.columns[resourceId]!.set(row, value);
62
+ },
63
+ enumerable: true,
64
+ });
65
+ }
66
+
67
+ const select = <
68
+ Include extends StringKeyof<C>,
69
+ Exclude extends StringKeyof<C> = never
70
+ >(
71
+ include: Include[],
72
+ options?: QueryOptions<Include, Exclude>
73
+ ): readonly Entity[] => {
74
+ const archetypes = core.queryArchetypes(include, options);
75
+ let length = 0;
76
+ for (const archetype of archetypes) {
77
+ length += archetype.rows;
78
+ }
79
+ const entities = new Array<Entity>(length);
80
+ let index = 0;
81
+ for (const archetype of archetypes) {
82
+ const typedArray = archetype.columns.id.getTypedArray();
83
+ for (let i = 0; i < archetype.rows; i++) {
84
+ entities[index++] = typedArray[i];
85
+ }
86
+ }
87
+ return entities;
88
+ }
89
+
90
+ const store: Store<C, R> = {
91
+ ...core,
92
+ resources,
93
+ select,
94
+ };
95
+
96
+ return store as any;
97
+ }
@@ -0,0 +1,23 @@
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
+ export * from "./store.js";
23
+ export * from "./create-store.js";
@@ -19,9 +19,5 @@ 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
- {
23
- }
24
- {
25
- }
26
- export {};
27
- //# sourceMappingURL=types.js.map
22
+
23
+ export type ResourceComponents = object;