@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,440 @@
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 { createCore } from "./create-core.js";
24
+ import { Schema } from "../../../schema/schema.js";
25
+ import type { Entity } from "../../entity.js";
26
+ import { F32Schema } from "../../../schema/f32.js";
27
+
28
+ // Shared test schemas
29
+ export const positionSchema = {
30
+ type: "object",
31
+ properties: {
32
+ x: F32Schema,
33
+ y: F32Schema,
34
+ z: F32Schema,
35
+ }
36
+ } as const satisfies Schema;
37
+
38
+ export const healthSchema = {
39
+ type: "object",
40
+ properties: {
41
+ current: F32Schema,
42
+ max: F32Schema,
43
+ }
44
+ } as const satisfies Schema;
45
+
46
+ export const nameSchema = {
47
+ type: "string",
48
+ maxLength: 50,
49
+ } as const satisfies Schema;
50
+
51
+ // Reusable test suite for any core-like interface
52
+ export function createCoreTestSuite(
53
+ name: string,
54
+ factory: typeof createCore = createCore
55
+ ) {
56
+ describe(name, () => {
57
+ it("should create with basic components", () => {
58
+ const core = factory({
59
+ position: positionSchema,
60
+ health: healthSchema,
61
+ });
62
+
63
+ expect(core).toBeDefined();
64
+ expect(core.componentSchemas).toHaveProperty("id");
65
+ expect(core.componentSchemas).toHaveProperty("position");
66
+ expect(core.componentSchemas).toHaveProperty("health");
67
+ expect(core.componentSchemas.id).toBeDefined();
68
+ expect(core.componentSchemas.position).toBeDefined();
69
+ expect(core.componentSchemas.health).toBeDefined();
70
+ });
71
+
72
+ it("should query archetypes correctly", () => {
73
+ const core = factory({
74
+ position: positionSchema,
75
+ health: healthSchema,
76
+ });
77
+
78
+ // Create entities with different component combinations
79
+ const archetype1 = core.ensureArchetype(["id", "position"]);
80
+ const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
81
+
82
+ const archetype2 = core.ensureArchetype(["id", "health"]);
83
+ const entity2 = archetype2.insert({ health: { current: 100, max: 100 } });
84
+
85
+ const archetype3 = core.ensureArchetype(["id", "position", "health"]);
86
+ const entity3 = archetype3.insert({
87
+ position: { x: 0, y: 0, z: 0 },
88
+ health: { current: 50, max: 100 }
89
+ });
90
+
91
+ // Query for position component
92
+ const positionArchetypes = core.queryArchetypes(["position"]);
93
+ expect(positionArchetypes).toHaveLength(2);
94
+ expect(positionArchetypes.some(a => a.components.has("position"))).toBe(true);
95
+ expect(positionArchetypes.some(a => a.components.has("health"))).toBe(true);
96
+
97
+ // Query for health component
98
+ const healthArchetypes = core.queryArchetypes(["health"]);
99
+ expect(healthArchetypes).toHaveLength(2);
100
+ expect(healthArchetypes.some(a => a.components.has("position"))).toBe(true);
101
+ expect(healthArchetypes.some(a => a.components.has("health"))).toBe(true);
102
+
103
+ // Query for both components
104
+ const bothArchetypes = core.queryArchetypes(["position", "health"]);
105
+ expect(bothArchetypes).toHaveLength(1);
106
+ expect(bothArchetypes[0].components.has("position")).toBe(true);
107
+ expect(bothArchetypes[0].components.has("health")).toBe(true);
108
+ });
109
+
110
+ it("should query archetypes with exclude option", () => {
111
+ const core = factory({
112
+ position: positionSchema,
113
+ health: healthSchema,
114
+ });
115
+
116
+ // Create entities with different component combinations
117
+ const archetype1 = core.ensureArchetype(["id", "position"]);
118
+ const entity1 = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
119
+
120
+ const archetype2 = core.ensureArchetype(["id", "health"]);
121
+ const entity2 = archetype2.insert({ health: { current: 100, max: 100 } });
122
+
123
+ const archetype3 = core.ensureArchetype(["id", "position", "health"]);
124
+ const entity3 = archetype3.insert({
125
+ position: { x: 0, y: 0, z: 0 },
126
+ health: { current: 50, max: 100 }
127
+ });
128
+
129
+ // Query for position but exclude health
130
+ const positionOnlyArchetypes = core.queryArchetypes(["position"], { exclude: ["health"] });
131
+ expect(positionOnlyArchetypes).toHaveLength(1);
132
+ expect(positionOnlyArchetypes[0].components.has("position")).toBe(true);
133
+ expect((positionOnlyArchetypes[0].components as Set<string>).has("health")).toBe(false);
134
+ });
135
+
136
+ it("should ensure archetype creates new archetype when needed", () => {
137
+ const core = factory({
138
+ position: positionSchema,
139
+ health: healthSchema,
140
+ });
141
+
142
+ // First call should create new archetype
143
+ const archetype1 = core.ensureArchetype(["id", "position"]);
144
+ expect(archetype1).toBeDefined();
145
+ expect(archetype1.components.has("id")).toBe(true);
146
+ expect(archetype1.components.has("position")).toBe(true);
147
+ expect((archetype1.components as Set<string>).has("health")).toBe(false);
148
+
149
+ // Second call with same components should return same archetype
150
+ const archetype2 = core.ensureArchetype(["id", "position"]);
151
+ expect(archetype2).toBe(archetype1);
152
+
153
+ // Different components should create new archetype
154
+ const archetype3 = core.ensureArchetype(["id", "health"]);
155
+ expect(archetype3).not.toBe(archetype1);
156
+ expect(archetype3.components.has("id")).toBe(true);
157
+ expect(archetype3.components.has("health")).toBe(true);
158
+ expect(archetype3.components.has("position")).toBe(false);
159
+ });
160
+
161
+ it("should throw error when ensuring archetype without id", () => {
162
+ const core = factory({
163
+ position: positionSchema,
164
+ });
165
+
166
+ expect(() => {
167
+ core.ensureArchetype(["position"]);
168
+ }).toThrow("id is required");
169
+ });
170
+
171
+ it("should locate entities correctly", () => {
172
+ const core = factory({
173
+ position: positionSchema,
174
+ });
175
+
176
+ const archetype = core.ensureArchetype(["id", "position"]);
177
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
178
+
179
+ const location = core.locate(entity);
180
+ expect(location).not.toBeNull();
181
+ expect(location?.archetype).toBe(archetype.id);
182
+ expect(location?.row).toBeGreaterThanOrEqual(0);
183
+ });
184
+
185
+ it("should return null when locating non-existent entity", () => {
186
+ const core = factory({
187
+ position: positionSchema,
188
+ });
189
+
190
+ const location = core.locate(999 as Entity);
191
+ expect(location).toBeNull();
192
+ });
193
+
194
+ it("should read entity data correctly", () => {
195
+ const core = factory({
196
+ position: positionSchema,
197
+ });
198
+
199
+ const archetype = core.ensureArchetype(["id", "position"]);
200
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
201
+
202
+ const data = core.read(entity);
203
+ expect(data).not.toBeNull();
204
+ expect(data?.id).toBe(entity);
205
+ expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
206
+ });
207
+
208
+ it("should return null when reading non-existent entity", () => {
209
+ const core = factory({
210
+ position: positionSchema,
211
+ });
212
+
213
+ const data = core.read(999 as Entity);
214
+ expect(data).toBeNull();
215
+ });
216
+
217
+ it("should delete entities correctly", () => {
218
+ const core = factory({
219
+ position: positionSchema,
220
+ });
221
+
222
+ const archetype = core.ensureArchetype(["id", "position"]);
223
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
224
+
225
+ // Verify entity exists
226
+ expect(core.locate(entity)).not.toBeNull();
227
+ expect(core.read(entity)).not.toBeNull();
228
+
229
+ // Delete entity
230
+ core.delete(entity);
231
+
232
+ // Verify entity is deleted
233
+ expect(core.locate(entity)).toBeNull();
234
+ expect(core.read(entity)).toBeNull();
235
+ });
236
+
237
+ it("should handle deleting non-existent entity gracefully", () => {
238
+ const core = factory({
239
+ position: positionSchema,
240
+ });
241
+
242
+ expect(() => {
243
+ core.delete(999 as Entity);
244
+ }).not.toThrow();
245
+ });
246
+
247
+ it("should update entity within same archetype", () => {
248
+ const core = factory({
249
+ position: positionSchema,
250
+ });
251
+
252
+ const archetype = core.ensureArchetype(["id", "position"]);
253
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
254
+
255
+ // Update position
256
+ core.update(entity, { position: { x: 10, y: 20, z: 30 } });
257
+
258
+ // Verify update
259
+ const data = core.read(entity);
260
+ expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
261
+ });
262
+
263
+ it("should move entity to new archetype when adding components", () => {
264
+ const core = factory({
265
+ position: positionSchema,
266
+ health: healthSchema,
267
+ });
268
+
269
+ const archetype1 = core.ensureArchetype(["id", "position"]);
270
+ const entity = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
271
+
272
+ // Add health component
273
+ core.update(entity, { health: { current: 100, max: 100 } });
274
+
275
+ // Verify entity moved to new archetype
276
+ const location = core.locate(entity);
277
+ expect(location).not.toBeNull();
278
+ expect(location?.archetype).not.toBe(archetype1.id);
279
+
280
+ const data = core.read(entity);
281
+ expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
282
+ expect(data?.health).toEqual({ current: 100, max: 100 });
283
+ });
284
+
285
+ it("should move entity to new archetype when removing components", () => {
286
+ const core = factory({
287
+ position: positionSchema,
288
+ health: healthSchema,
289
+ });
290
+
291
+ const archetype1 = core.ensureArchetype(["id", "position", "health"]);
292
+ const entity = archetype1.insert({
293
+ position: { x: 1, y: 2, z: 3 },
294
+ health: { current: 100, max: 100 }
295
+ });
296
+
297
+ // Remove health component
298
+ core.update(entity, { health: undefined });
299
+
300
+ // Verify entity moved to new archetype
301
+ const location = core.locate(entity);
302
+ expect(location).not.toBeNull();
303
+ expect(location?.archetype).not.toBe(archetype1.id);
304
+
305
+ const data = core.read(entity);
306
+ expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
307
+ expect(data?.health).toBeUndefined();
308
+ });
309
+
310
+ it("should throw error when updating non-existent entity", () => {
311
+ const core = factory({
312
+ position: positionSchema,
313
+ });
314
+
315
+ expect(() => {
316
+ core.update(999 as Entity, { position: { x: 1, y: 2, z: 3 } });
317
+ }).toThrow("Entity not found");
318
+ });
319
+
320
+ it("should handle complex component updates", () => {
321
+ const core = factory({
322
+ position: positionSchema,
323
+ health: healthSchema,
324
+ });
325
+
326
+ const archetype = core.ensureArchetype(["id", "position", "health"]);
327
+ const entity = archetype.insert({
328
+ position: { x: 1, y: 2, z: 3 },
329
+ health: { current: 100, max: 100 }
330
+ });
331
+
332
+ // Update both components
333
+ core.update(entity, {
334
+ position: { x: 10, y: 20, z: 30 },
335
+ health: { current: 50, max: 100 }
336
+ });
337
+
338
+ const data = core.read(entity);
339
+ expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
340
+ expect(data?.health).toEqual({ current: 50, max: 100 });
341
+ });
342
+
343
+ it("should handle mixed add/remove operations", () => {
344
+ const core = factory({
345
+ position: positionSchema,
346
+ health: healthSchema,
347
+ });
348
+
349
+ const archetype1 = core.ensureArchetype(["id", "position"]);
350
+ const entity = archetype1.insert({ position: { x: 1, y: 2, z: 3 } });
351
+
352
+ // Add health and update position
353
+ core.update(entity, {
354
+ position: { x: 10, y: 20, z: 30 },
355
+ health: { current: 100, max: 100 }
356
+ });
357
+
358
+ const data = core.read(entity);
359
+ expect(data?.position).toEqual({ x: 10, y: 20, z: 30 });
360
+ expect(data?.health).toEqual({ current: 100, max: 100 });
361
+ });
362
+
363
+ it("should maintain entity count correctly", () => {
364
+ const core = factory({
365
+ position: positionSchema,
366
+ });
367
+
368
+ const archetype = core.ensureArchetype(["id", "position"]);
369
+ const entity1 = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
370
+ const entity2 = archetype.insert({ position: { x: 4, y: 5, z: 6 } });
371
+
372
+ // Verify both entities exist
373
+ expect(core.locate(entity1)).not.toBeNull();
374
+ expect(core.locate(entity2)).not.toBeNull();
375
+
376
+ // Delete one entity
377
+ core.delete(entity1);
378
+
379
+ // Verify only one entity remains
380
+ expect(core.locate(entity1)).toBeNull();
381
+ expect(core.locate(entity2)).not.toBeNull();
382
+ });
383
+
384
+ it("should handle empty component updates", () => {
385
+ const core = factory({
386
+ position: positionSchema,
387
+ });
388
+
389
+ const archetype = core.ensureArchetype(["id", "position"]);
390
+ const entity = archetype.insert({ position: { x: 1, y: 2, z: 3 } });
391
+
392
+ // Update with empty object
393
+ core.update(entity, {});
394
+
395
+ // Verify entity still exists with original data
396
+ const data = core.read(entity);
397
+ expect(data?.position).toEqual({ x: 1, y: 2, z: 3 });
398
+ });
399
+
400
+ it("should handle large number of entities", () => {
401
+ const core = factory({
402
+ position: positionSchema,
403
+ });
404
+
405
+ const archetype = core.ensureArchetype(["id", "position"]);
406
+ const entities: Entity[] = [];
407
+
408
+ // Create many entities
409
+ for (let i = 0; i < 100; i++) {
410
+ const entity = archetype.insert({ position: { x: i, y: i, z: i } });
411
+ entities.push(entity);
412
+ }
413
+
414
+ // Verify all entities exist
415
+ for (const entity of entities) {
416
+ expect(core.locate(entity)).not.toBeNull();
417
+ }
418
+
419
+ // Delete some entities
420
+ for (let i = 0; i < 50; i++) {
421
+ core.delete(entities[i]);
422
+ }
423
+
424
+ // Verify remaining entities exist
425
+ for (let i = 50; i < 100; i++) {
426
+ expect(core.locate(entities[i])).not.toBeNull();
427
+ }
428
+
429
+ // Verify deleted entities don't exist
430
+ for (let i = 0; i < 50; i++) {
431
+ expect(core.locate(entities[i])).toBeNull();
432
+ }
433
+ });
434
+ });
435
+ }
436
+
437
+ // Original core-specific tests
438
+ describe("createCore", () => {
439
+ createCoreTestSuite("Core functionality");
440
+ });
@@ -0,0 +1,168 @@
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 { FromSchema, Schema } from "../../../schema/schema.js";
23
+ import { createEntityLocationTable } from "../../entity-location-table/index.js";
24
+ import * as ARCHETYPE from "../../archetype/index.js";
25
+ import * as TABLE from "../../../table/index.js";
26
+ import { Archetype } from "../../archetype/archetype.js";
27
+ import { CoreComponents } from "../../core-components.js";
28
+ import { Entity, EntitySchema } from "../../entity.js";
29
+ import { Core, EntityUpdateValues, EntityValues, QueryOptions } from "./core.js";
30
+ import { Assert, Equal, Simplify, StringKeyof } from "../../../types/index.js";
31
+ import { ComponentSchemas } from "../../component-schemas.js";
32
+
33
+ export function createCore<NC extends ComponentSchemas>(newComponentSchemas: NC): Core<Simplify<CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> }>> {
34
+ type C = CoreComponents & { [K in StringKeyof<NC>]: FromSchema<NC[K]> };
35
+
36
+ const componentSchemas: { readonly [K in StringKeyof<C>]: Schema } = { id: EntitySchema, ...newComponentSchemas };
37
+ const entityLocationTable = createEntityLocationTable();
38
+ const archetypes = [] as unknown as Archetype<C>[] & { readonly [x: string]: Archetype<C> };
39
+
40
+ const queryArchetypes = <
41
+ Include extends StringKeyof<C>,
42
+ Exclude extends StringKeyof<C> = never
43
+ >(
44
+ include: readonly Include[],
45
+ options?: QueryOptions<Include, Exclude>
46
+ ): readonly Archetype<CoreComponents & Pick<C, Include>>[] =>{
47
+ const results: Archetype<CoreComponents & Pick<C, Include>>[] = [];
48
+ for (const archetype of archetypes) {
49
+ const hasAllRequired = include.every(comp => archetype.columns[comp] !== undefined);
50
+ const hasNoExcluded = !options?.exclude || options.exclude.every(comp => archetype.columns[comp] === undefined);
51
+ if (hasAllRequired && hasNoExcluded) {
52
+ results.push(archetype as unknown as Archetype<CoreComponents & Pick<C, Include>>);
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+
58
+ const ensureArchetype = <CC extends StringKeyof<C>>(componentNames: readonly CC[]): Archetype<CoreComponents & { [K in CC]: C[K] }> => {
59
+ for (const archetype of queryArchetypes(componentNames)) {
60
+ if (archetype.components.size === componentNames.length) {
61
+ return archetype as unknown as Archetype<CoreComponents & { [K in CC]: C[K] }>;
62
+ }
63
+ }
64
+ const id = archetypes.length;
65
+ const archetypeComponentSchemas: { [K in CC]: Schema } = {} as { [K in CC]: Schema };
66
+ let hasId = false;
67
+ for (const comp of componentNames) {
68
+ if (comp === "id") {
69
+ hasId = true;
70
+ }
71
+ archetypeComponentSchemas[comp] = componentSchemas[comp];
72
+ }
73
+ if (!hasId) {
74
+ throw new Error("id is required");
75
+ }
76
+ const archetype = ARCHETYPE.createArchetype(archetypeComponentSchemas as any, id, entityLocationTable);
77
+ archetypes.push(archetype as unknown as Archetype<C>);
78
+ return archetype as unknown as Archetype<CoreComponents & { [K in CC]: C[K] }>;
79
+ }
80
+
81
+ const { locate } = entityLocationTable;
82
+
83
+ const selectEntity = (entity: Entity): EntityValues<C> | null => {
84
+ const location = locate(entity);
85
+ return location !== null ? TABLE.getRowData(archetypes[location.archetype], location.row) : null;
86
+ }
87
+
88
+ const deleteEntity = (entity: Entity) => {
89
+ const location = locate(entity);
90
+ if (location !== null) {
91
+ const archetype = archetypes[location.archetype];
92
+ ARCHETYPE.deleteRow(archetype, location.row, entityLocationTable);
93
+ entityLocationTable.delete(entity);
94
+ }
95
+ }
96
+
97
+ const updateEntity = (entity: Entity, components: EntityUpdateValues<C>) => {
98
+ const currentLocation = locate(entity);
99
+ if (currentLocation === null) {
100
+ throw "Entity not found";
101
+ }
102
+ const currentArchetype = archetypes[currentLocation.archetype];
103
+ let newArchetype = currentArchetype;
104
+ let addComponents: null | StringKeyof<C>[] = null;
105
+ let removeComponents: null | StringKeyof<C>[] = null;
106
+ for (const key in components) {
107
+ if ((components as any)[key as any] === undefined) {
108
+ (removeComponents ??= []).push(key as StringKeyof<C>);
109
+ // we remove the delete components so we can use this object for the new row data
110
+ delete (components as any)[key as any];
111
+ }
112
+ else if (!currentArchetype.components.has(key as StringKeyof<C>)) {
113
+ (addComponents ??= []).push(key as StringKeyof<C>);
114
+ }
115
+ }
116
+ if (addComponents || removeComponents) {
117
+ // currently changing archetype requires a set, but later we should have an edge map for better performance
118
+ // Alternatively we can have a faster path using addComponent and deleteComponent.
119
+ const newComponents = new Set(currentArchetype.components);
120
+ if (addComponents) {
121
+ for (const comp of addComponents) {
122
+ newComponents.add(comp);
123
+ }
124
+ }
125
+ if (removeComponents) {
126
+ for (const comp of removeComponents) {
127
+ newComponents.delete(comp);
128
+ }
129
+ }
130
+ newArchetype = ensureArchetype(Array.from(newComponents) as StringKeyof<C>[]) as unknown as Archetype<C>;
131
+ }
132
+ if (newArchetype !== currentArchetype) {
133
+ // create a new row in the new archetype
134
+ const currentData = TABLE.getRowData(currentArchetype, currentLocation.row);
135
+ // deletes the row from the current archetype (this will update the entity location table for any row which may have been moved into it's position)
136
+ ARCHETYPE.deleteRow(currentArchetype, currentLocation.row, entityLocationTable);
137
+ const newRow = TABLE.addRow(newArchetype, { ...currentData, ...components });
138
+ // update the entity location table for the entity so it points to the new archetype and row
139
+ entityLocationTable.update(entity, { archetype: newArchetype.id, row: newRow });
140
+ } else {
141
+ TABLE.updateRow(newArchetype, currentLocation.row, components as any);
142
+ }
143
+ }
144
+
145
+ const core: Core<C> = {
146
+ componentSchemas: componentSchemas,
147
+ queryArchetypes,
148
+ ensureArchetype,
149
+ locate,
150
+ read: selectEntity,
151
+ delete: deleteEntity,
152
+ update: updateEntity,
153
+ };
154
+ return core as any;
155
+ }
156
+
157
+ type TestType = ReturnType<typeof createCore<{ position: { type: "number"}, health: { type: "string"} }>>
158
+ type CheckTestType = Assert<Equal<TestType, Core<{
159
+ id: number;
160
+ position: number;
161
+ health: string;
162
+ }>>>
163
+ type TestTypeComponents = TestType["componentSchemas"]
164
+ type CheckComponents = Assert<Equal<TestTypeComponents, {
165
+ readonly id: Schema;
166
+ readonly position: Schema;
167
+ readonly health: Schema;
168
+ }>>;
@@ -19,5 +19,4 @@ 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
- export {};
23
- //# sourceMappingURL=async-cache.js.map
22
+ export * from "./core.js";