@oasys/oecs 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/CHANGELOG.md +1399 -276
  2. package/README.md +327 -169
  3. package/dist/core/ecs/access_check.d.cts +31 -31
  4. package/dist/core/ecs/access_check.d.ts +31 -31
  5. package/dist/core/ecs/access_check.d.ts.map +1 -1
  6. package/dist/core/ecs/archetype.d.cts +273 -205
  7. package/dist/core/ecs/archetype.d.ts +273 -205
  8. package/dist/core/ecs/archetype.d.ts.map +1 -1
  9. package/dist/core/ecs/archetype_closure.d.cts +23 -0
  10. package/dist/core/ecs/archetype_closure.d.ts +23 -0
  11. package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
  12. package/dist/core/ecs/archetype_graph.d.cts +34 -34
  13. package/dist/core/ecs/archetype_graph.d.ts +34 -34
  14. package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
  15. package/dist/core/ecs/archetype_types.d.cts +55 -0
  16. package/dist/core/ecs/archetype_types.d.ts +55 -0
  17. package/dist/core/ecs/archetype_types.d.ts.map +1 -0
  18. package/dist/core/ecs/change_feed.d.cts +53 -0
  19. package/dist/core/ecs/change_feed.d.ts +53 -0
  20. package/dist/core/ecs/change_feed.d.ts.map +1 -0
  21. package/dist/core/ecs/changed_query.d.cts +36 -0
  22. package/dist/core/ecs/changed_query.d.ts +36 -0
  23. package/dist/core/ecs/changed_query.d.ts.map +1 -0
  24. package/dist/core/ecs/chunk_columns.d.cts +49 -0
  25. package/dist/core/ecs/chunk_columns.d.ts +49 -0
  26. package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
  27. package/dist/core/ecs/command_log.d.cts +30 -30
  28. package/dist/core/ecs/command_log.d.ts +30 -30
  29. package/dist/core/ecs/command_log.d.ts.map +1 -1
  30. package/dist/core/ecs/component.d.cts +45 -44
  31. package/dist/core/ecs/component.d.ts +45 -44
  32. package/dist/core/ecs/component.d.ts.map +1 -1
  33. package/dist/core/ecs/component_registry.d.cts +53 -0
  34. package/dist/core/ecs/component_registry.d.ts +53 -0
  35. package/dist/core/ecs/component_registry.d.ts.map +1 -0
  36. package/dist/core/ecs/compute_backend.d.cts +18 -7
  37. package/dist/core/ecs/compute_backend.d.ts +18 -7
  38. package/dist/core/ecs/compute_backend.d.ts.map +1 -1
  39. package/dist/core/ecs/deferred_commands.d.cts +15 -14
  40. package/dist/core/ecs/deferred_commands.d.ts +15 -14
  41. package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
  42. package/dist/core/ecs/dispatch_trace.d.cts +32 -31
  43. package/dist/core/ecs/dispatch_trace.d.ts +32 -31
  44. package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
  45. package/dist/core/ecs/ecs.d.cts +337 -276
  46. package/dist/core/ecs/ecs.d.ts +337 -276
  47. package/dist/core/ecs/ecs.d.ts.map +1 -1
  48. package/dist/core/ecs/ecs_memory.d.cts +134 -136
  49. package/dist/core/ecs/ecs_memory.d.ts +134 -136
  50. package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
  51. package/dist/core/ecs/ecs_options.d.cts +89 -0
  52. package/dist/core/ecs/ecs_options.d.ts +89 -0
  53. package/dist/core/ecs/ecs_options.d.ts.map +1 -0
  54. package/dist/core/ecs/entity.d.cts +4 -4
  55. package/dist/core/ecs/entity.d.ts +4 -4
  56. package/dist/core/ecs/entity_allocator.d.cts +24 -22
  57. package/dist/core/ecs/entity_allocator.d.ts +24 -22
  58. package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
  59. package/dist/core/ecs/event.d.cts +37 -23
  60. package/dist/core/ecs/event.d.ts +37 -23
  61. package/dist/core/ecs/event.d.ts.map +1 -1
  62. package/dist/core/ecs/facades.d.cts +12 -126
  63. package/dist/core/ecs/facades.d.ts +12 -126
  64. package/dist/core/ecs/facades.d.ts.map +1 -1
  65. package/dist/core/ecs/frame_stepper.d.cts +12 -12
  66. package/dist/core/ecs/frame_stepper.d.ts +12 -12
  67. package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
  68. package/dist/core/ecs/frame_trace.d.cts +34 -34
  69. package/dist/core/ecs/frame_trace.d.ts +34 -34
  70. package/dist/core/ecs/frame_trace.d.ts.map +1 -1
  71. package/dist/core/ecs/host_commands.d.cts +107 -89
  72. package/dist/core/ecs/host_commands.d.ts +107 -89
  73. package/dist/core/ecs/host_commands.d.ts.map +1 -1
  74. package/dist/core/ecs/index.d.cts +22 -12
  75. package/dist/core/ecs/index.d.ts +22 -12
  76. package/dist/core/ecs/index.d.ts.map +1 -1
  77. package/dist/core/ecs/observer.d.cts +41 -122
  78. package/dist/core/ecs/observer.d.ts +41 -122
  79. package/dist/core/ecs/observer.d.ts.map +1 -1
  80. package/dist/core/ecs/phase.d.cts +79 -0
  81. package/dist/core/ecs/phase.d.ts +79 -0
  82. package/dist/core/ecs/phase.d.ts.map +1 -0
  83. package/dist/core/ecs/plugin.d.cts +125 -0
  84. package/dist/core/ecs/plugin.d.ts +125 -0
  85. package/dist/core/ecs/plugin.d.ts.map +1 -0
  86. package/dist/core/ecs/plugin_slots.d.cts +26 -0
  87. package/dist/core/ecs/plugin_slots.d.ts +26 -0
  88. package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
  89. package/dist/core/ecs/query.d.cts +219 -568
  90. package/dist/core/ecs/query.d.ts +219 -568
  91. package/dist/core/ecs/query.d.ts.map +1 -1
  92. package/dist/core/ecs/query_cache.d.cts +130 -0
  93. package/dist/core/ecs/query_cache.d.ts +130 -0
  94. package/dist/core/ecs/query_cache.d.ts.map +1 -0
  95. package/dist/core/ecs/query_registry.d.cts +47 -0
  96. package/dist/core/ecs/query_registry.d.ts +47 -0
  97. package/dist/core/ecs/query_registry.d.ts.map +1 -0
  98. package/dist/core/ecs/query_terms.d.cts +126 -0
  99. package/dist/core/ecs/query_terms.d.ts +126 -0
  100. package/dist/core/ecs/query_terms.d.ts.map +1 -0
  101. package/dist/core/ecs/ref.d.cts +129 -16
  102. package/dist/core/ecs/ref.d.ts +129 -16
  103. package/dist/core/ecs/ref.d.ts.map +1 -1
  104. package/dist/core/ecs/relation.d.cts +105 -186
  105. package/dist/core/ecs/relation.d.ts +105 -186
  106. package/dist/core/ecs/relation.d.ts.map +1 -1
  107. package/dist/core/ecs/resource.d.cts +14 -14
  108. package/dist/core/ecs/resource.d.ts +14 -14
  109. package/dist/core/ecs/resource_registry.d.cts +6 -6
  110. package/dist/core/ecs/resource_registry.d.ts +6 -6
  111. package/dist/core/ecs/resource_registry.d.ts.map +1 -1
  112. package/dist/core/ecs/row_kinds.d.cts +24 -0
  113. package/dist/core/ecs/row_kinds.d.ts +24 -0
  114. package/dist/core/ecs/row_kinds.d.ts.map +1 -0
  115. package/dist/core/ecs/run_condition.d.cts +23 -23
  116. package/dist/core/ecs/run_condition.d.ts +23 -23
  117. package/dist/core/ecs/run_condition.d.ts.map +1 -1
  118. package/dist/core/ecs/schedule.d.cts +98 -114
  119. package/dist/core/ecs/schedule.d.ts +98 -114
  120. package/dist/core/ecs/schedule.d.ts.map +1 -1
  121. package/dist/core/ecs/schedule_plan.d.cts +33 -0
  122. package/dist/core/ecs/schedule_plan.d.ts +33 -0
  123. package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
  124. package/dist/core/ecs/snapshot.d.cts +77 -0
  125. package/dist/core/ecs/snapshot.d.ts +77 -0
  126. package/dist/core/ecs/snapshot.d.ts.map +1 -0
  127. package/dist/core/ecs/snapshot_mount.d.cts +42 -0
  128. package/dist/core/ecs/snapshot_mount.d.ts +42 -0
  129. package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
  130. package/dist/core/ecs/sparse_store.d.cts +110 -53
  131. package/dist/core/ecs/sparse_store.d.ts +110 -53
  132. package/dist/core/ecs/sparse_store.d.ts.map +1 -1
  133. package/dist/core/ecs/store.d.cts +644 -511
  134. package/dist/core/ecs/store.d.ts +644 -511
  135. package/dist/core/ecs/store.d.ts.map +1 -1
  136. package/dist/core/ecs/store_layout_listener.d.cts +8 -8
  137. package/dist/core/ecs/store_layout_listener.d.ts +8 -8
  138. package/dist/core/ecs/store_types.d.cts +122 -0
  139. package/dist/core/ecs/store_types.d.ts +122 -0
  140. package/dist/core/ecs/store_types.d.ts.map +1 -0
  141. package/dist/core/ecs/system.d.cts +151 -66
  142. package/dist/core/ecs/system.d.ts +151 -66
  143. package/dist/core/ecs/system.d.ts.map +1 -1
  144. package/dist/core/ecs/system_context.d.cts +296 -0
  145. package/dist/core/ecs/system_context.d.ts +296 -0
  146. package/dist/core/ecs/system_context.d.ts.map +1 -0
  147. package/dist/core/ecs/system_set.d.cts +48 -0
  148. package/dist/core/ecs/system_set.d.ts +48 -0
  149. package/dist/core/ecs/system_set.d.ts.map +1 -0
  150. package/dist/core/ecs/utils/arrays.d.cts +15 -1
  151. package/dist/core/ecs/utils/arrays.d.ts +15 -1
  152. package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
  153. package/dist/core/ecs/utils/error.d.cts +87 -4
  154. package/dist/core/ecs/utils/error.d.ts +87 -4
  155. package/dist/core/ecs/utils/error.d.ts.map +1 -1
  156. package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
  157. package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
  158. package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
  159. package/dist/core/restore_errors.d.cts +30 -0
  160. package/dist/core/restore_errors.d.ts +30 -0
  161. package/dist/core/restore_errors.d.ts.map +1 -0
  162. package/dist/core/store/action_ring.d.cts +48 -49
  163. package/dist/core/store/action_ring.d.ts +48 -49
  164. package/dist/core/store/action_ring.d.ts.map +1 -1
  165. package/dist/core/store/allocator.d.cts +166 -114
  166. package/dist/core/store/allocator.d.ts +166 -114
  167. package/dist/core/store/allocator.d.ts.map +1 -1
  168. package/dist/core/store/buffer_backed_column.d.cts +21 -22
  169. package/dist/core/store/buffer_backed_column.d.ts +21 -22
  170. package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
  171. package/dist/core/store/column_store.d.cts +138 -100
  172. package/dist/core/store/column_store.d.ts +138 -100
  173. package/dist/core/store/column_store.d.ts.map +1 -1
  174. package/dist/core/store/command_dispatch.d.cts +14 -15
  175. package/dist/core/store/command_dispatch.d.ts +14 -15
  176. package/dist/core/store/command_dispatch.d.ts.map +1 -1
  177. package/dist/core/store/command_ring.d.cts +41 -45
  178. package/dist/core/store/command_ring.d.ts +41 -45
  179. package/dist/core/store/command_ring.d.ts.map +1 -1
  180. package/dist/core/store/descriptor.d.cts +35 -18
  181. package/dist/core/store/descriptor.d.ts +35 -18
  182. package/dist/core/store/descriptor.d.ts.map +1 -1
  183. package/dist/core/store/entity_index.d.cts +34 -35
  184. package/dist/core/store/entity_index.d.ts +34 -35
  185. package/dist/core/store/entity_index.d.ts.map +1 -1
  186. package/dist/core/store/event_ring.d.cts +40 -42
  187. package/dist/core/store/event_ring.d.ts +40 -42
  188. package/dist/core/store/event_ring.d.ts.map +1 -1
  189. package/dist/core/store/extend.d.cts +15 -9
  190. package/dist/core/store/extend.d.ts +15 -9
  191. package/dist/core/store/extend.d.ts.map +1 -1
  192. package/dist/core/store/grow.d.cts +3 -3
  193. package/dist/core/store/grow.d.ts +3 -3
  194. package/dist/core/store/grow.d.ts.map +1 -1
  195. package/dist/core/store/header.d.cts +37 -33
  196. package/dist/core/store/header.d.ts +37 -33
  197. package/dist/core/store/header.d.ts.map +1 -1
  198. package/dist/core/store/index.d.cts +10 -10
  199. package/dist/core/store/index.d.ts +10 -10
  200. package/dist/core/store/index.d.ts.map +1 -1
  201. package/dist/core/store/layout_ops.d.cts +72 -63
  202. package/dist/core/store/layout_ops.d.ts +72 -63
  203. package/dist/core/store/layout_ops.d.ts.map +1 -1
  204. package/dist/core/store/region_table.d.cts +28 -21
  205. package/dist/core/store/region_table.d.ts +28 -21
  206. package/dist/core/store/region_table.d.ts.map +1 -1
  207. package/dist/core/store/snapshot.d.cts +31 -16
  208. package/dist/core/store/snapshot.d.ts +31 -16
  209. package/dist/core/store/snapshot.d.ts.map +1 -1
  210. package/dist/core/store/state_hash.d.cts +14 -14
  211. package/dist/core/store/state_hash.d.ts +14 -14
  212. package/dist/core/store/state_hash.d.ts.map +1 -1
  213. package/dist/core/store/store_regions.d.cts +10 -10
  214. package/dist/core/store/store_regions.d.ts +10 -10
  215. package/dist/core/store/store_regions.d.ts.map +1 -1
  216. package/dist/core/store/vendored_abi/abi.d.cts +27 -2
  217. package/dist/core/store/vendored_abi/abi.d.ts +27 -2
  218. package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
  219. package/dist/host_commands-B2KMx8O2.cjs +1 -0
  220. package/dist/host_commands-ClVPvhSa.cjs +2 -0
  221. package/dist/host_commands-CwxVQS1z.js +1524 -0
  222. package/dist/host_commands-nJvTy88E.js +1667 -0
  223. package/dist/index.cjs +1 -1
  224. package/dist/index.d.cts +16 -11
  225. package/dist/index.d.ts +16 -11
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.development.cjs +1 -1
  228. package/dist/index.development.js +6709 -5729
  229. package/dist/index.js +5664 -4743
  230. package/dist/internal.cjs +2 -2
  231. package/dist/internal.d.cts +5 -2
  232. package/dist/internal.d.ts +5 -2
  233. package/dist/internal.d.ts.map +1 -1
  234. package/dist/internal.development.cjs +1 -1
  235. package/dist/internal.development.js +70 -20
  236. package/dist/internal.js +138 -83
  237. package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
  238. package/dist/plugins/abi-NP8pNxpd.js +42 -0
  239. package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
  240. package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
  241. package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
  242. package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
  243. package/dist/{extensions → plugins}/editor/editor.d.cts +56 -56
  244. package/dist/{extensions → plugins}/editor/editor.d.ts +56 -56
  245. package/dist/plugins/editor/editor.d.ts.map +1 -0
  246. package/dist/{extensions → plugins}/editor/field_handle.d.cts +13 -13
  247. package/dist/{extensions → plugins}/editor/field_handle.d.ts +13 -13
  248. package/dist/plugins/editor/field_handle.d.ts.map +1 -0
  249. package/dist/plugins/editor/index.d.cts +22 -0
  250. package/dist/plugins/editor/index.d.ts +22 -0
  251. package/dist/plugins/editor/index.d.ts.map +1 -0
  252. package/dist/plugins/editor.cjs +1 -0
  253. package/dist/plugins/editor.d.cts +1 -0
  254. package/dist/plugins/editor.d.ts +1 -0
  255. package/dist/plugins/editor.development.cjs +1 -0
  256. package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +83 -66
  257. package/dist/{extensions/editor/index.js → plugins/editor.js} +83 -66
  258. package/dist/plugins/events/event_channel.d.cts +13 -0
  259. package/dist/plugins/events/event_channel.d.ts +13 -0
  260. package/dist/plugins/events/event_channel.d.ts.map +1 -0
  261. package/dist/plugins/events/event_registry.d.cts +22 -0
  262. package/dist/plugins/events/event_registry.d.ts +22 -0
  263. package/dist/plugins/events/event_registry.d.ts.map +1 -0
  264. package/dist/plugins/events/facade.d.cts +26 -0
  265. package/dist/plugins/events/facade.d.ts +26 -0
  266. package/dist/plugins/events/facade.d.ts.map +1 -0
  267. package/dist/plugins/events/index.d.cts +10 -0
  268. package/dist/plugins/events/index.d.ts +10 -0
  269. package/dist/plugins/events/index.d.ts.map +1 -0
  270. package/dist/plugins/events.cjs +1 -0
  271. package/dist/plugins/events.d.cts +1 -0
  272. package/dist/plugins/events.d.ts +1 -0
  273. package/dist/plugins/events.development.cjs +1 -0
  274. package/dist/plugins/events.development.js +174 -0
  275. package/dist/plugins/events.js +159 -0
  276. package/dist/plugins/observers/index.d.cts +23 -0
  277. package/dist/plugins/observers/index.d.ts +23 -0
  278. package/dist/plugins/observers/index.d.ts.map +1 -0
  279. package/dist/plugins/observers/observer_registry.d.cts +101 -0
  280. package/dist/plugins/observers/observer_registry.d.ts +101 -0
  281. package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
  282. package/dist/plugins/observers.cjs +1 -0
  283. package/dist/plugins/observers.d.cts +1 -0
  284. package/dist/plugins/observers.d.ts +1 -0
  285. package/dist/plugins/observers.development.cjs +1 -0
  286. package/dist/plugins/observers.development.js +431 -0
  287. package/dist/plugins/observers.js +403 -0
  288. package/dist/plugins/relation_store-BsoegrZh.js +313 -0
  289. package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
  290. package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
  291. package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
  292. package/dist/plugins/relations/builtin_relations.d.cts +48 -0
  293. package/dist/plugins/relations/builtin_relations.d.ts +48 -0
  294. package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
  295. package/dist/plugins/relations/facade.d.cts +73 -0
  296. package/dist/plugins/relations/facade.d.ts +73 -0
  297. package/dist/plugins/relations/facade.d.ts.map +1 -0
  298. package/dist/plugins/relations/index.d.cts +11 -0
  299. package/dist/plugins/relations/index.d.ts +11 -0
  300. package/dist/plugins/relations/index.d.ts.map +1 -0
  301. package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +93 -105
  302. package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +93 -105
  303. package/dist/plugins/relations/relation_service.d.ts.map +1 -0
  304. package/dist/plugins/relations/relation_store.d.cts +177 -0
  305. package/dist/plugins/relations/relation_store.d.ts +177 -0
  306. package/dist/plugins/relations/relation_store.d.ts.map +1 -0
  307. package/dist/plugins/relations.cjs +1 -0
  308. package/dist/plugins/relations.d.cts +1 -0
  309. package/dist/plugins/relations.d.ts +1 -0
  310. package/dist/plugins/relations.development.cjs +1 -0
  311. package/dist/plugins/relations.development.js +603 -0
  312. package/dist/plugins/relations.js +553 -0
  313. package/dist/plugins/snapshots/index.d.cts +33 -0
  314. package/dist/plugins/snapshots/index.d.ts +33 -0
  315. package/dist/plugins/snapshots/index.d.ts.map +1 -0
  316. package/dist/plugins/snapshots/resume.d.cts +57 -0
  317. package/dist/plugins/snapshots/resume.d.ts +57 -0
  318. package/dist/plugins/snapshots/resume.d.ts.map +1 -0
  319. package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
  320. package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
  321. package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
  322. package/dist/plugins/snapshots.cjs +1 -0
  323. package/dist/plugins/snapshots.d.cts +1 -0
  324. package/dist/plugins/snapshots.d.ts +1 -0
  325. package/dist/plugins/snapshots.development.cjs +1 -0
  326. package/dist/plugins/snapshots.development.js +737 -0
  327. package/dist/plugins/snapshots.js +737 -0
  328. package/dist/plugins/solid/index.d.cts +8 -0
  329. package/dist/plugins/solid/index.d.ts +8 -0
  330. package/dist/plugins/solid/index.d.ts.map +1 -0
  331. package/dist/plugins/solid/solid.d.cts +97 -0
  332. package/dist/plugins/solid/solid.d.ts +97 -0
  333. package/dist/plugins/solid/solid.d.ts.map +1 -0
  334. package/dist/plugins/solid.cjs +1 -0
  335. package/dist/plugins/solid.d.cts +1 -0
  336. package/dist/plugins/solid.d.ts +1 -0
  337. package/dist/plugins/solid.development.cjs +1 -0
  338. package/dist/plugins/solid.development.js +319 -0
  339. package/dist/plugins/solid.js +319 -0
  340. package/dist/plugins/workers/index.d.cts +75 -0
  341. package/dist/plugins/workers/index.d.ts +75 -0
  342. package/dist/plugins/workers/index.d.ts.map +1 -0
  343. package/dist/plugins/workers/node_threads.d.cts +25 -0
  344. package/dist/plugins/workers/node_threads.d.ts +25 -0
  345. package/dist/plugins/workers/node_threads.d.ts.map +1 -0
  346. package/dist/plugins/workers/plan.d.cts +61 -0
  347. package/dist/plugins/workers/plan.d.ts +61 -0
  348. package/dist/plugins/workers/plan.d.ts.map +1 -0
  349. package/dist/plugins/workers/pool.d.cts +144 -0
  350. package/dist/plugins/workers/pool.d.ts +144 -0
  351. package/dist/plugins/workers/pool.d.ts.map +1 -0
  352. package/dist/plugins/workers/protocol.d.cts +112 -0
  353. package/dist/plugins/workers/protocol.d.ts +112 -0
  354. package/dist/plugins/workers/protocol.d.ts.map +1 -0
  355. package/dist/plugins/workers/worker_bind.d.cts +64 -0
  356. package/dist/plugins/workers/worker_bind.d.ts +64 -0
  357. package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
  358. package/dist/plugins/workers/worker_loop.d.cts +14 -0
  359. package/dist/plugins/workers/worker_loop.d.ts +14 -0
  360. package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
  361. package/dist/plugins/workers.cjs +1 -0
  362. package/dist/plugins/workers.d.cts +1 -0
  363. package/dist/plugins/workers.d.ts +1 -0
  364. package/dist/plugins/workers.development.cjs +1 -0
  365. package/dist/plugins/workers.development.js +596 -0
  366. package/dist/plugins/workers.js +474 -0
  367. package/dist/primitives.cjs +1 -1
  368. package/dist/primitives.d.cts +4 -4
  369. package/dist/primitives.d.ts +4 -4
  370. package/dist/primitives.development.cjs +1 -1
  371. package/dist/primitives.development.js +66 -22
  372. package/dist/primitives.js +66 -22
  373. package/dist/shared-BKl12xF1.js +132 -0
  374. package/dist/shared-Dk-pACZT.cjs +1 -0
  375. package/dist/shared.cjs +1 -1
  376. package/dist/shared.d.cts +7 -7
  377. package/dist/shared.d.ts +7 -7
  378. package/dist/shared.d.ts.map +1 -1
  379. package/dist/shared.development.cjs +1 -1
  380. package/dist/shared.development.js +4 -3
  381. package/dist/shared.js +4 -3
  382. package/dist/topological_sort-Cc_yXqPT.js +346 -0
  383. package/dist/topological_sort-vp1imU6D.cjs +1 -0
  384. package/dist/type_primitives/assertions.d.cts +12 -16
  385. package/dist/type_primitives/assertions.d.ts +12 -16
  386. package/dist/type_primitives/assertions.d.ts.map +1 -1
  387. package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
  388. package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
  389. package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
  390. package/dist/type_primitives/bitset/bitset.d.cts +7 -11
  391. package/dist/type_primitives/bitset/bitset.d.ts +7 -11
  392. package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
  393. package/dist/type_primitives/brand.d.cts +2 -7
  394. package/dist/type_primitives/brand.d.ts +2 -7
  395. package/dist/type_primitives/brand.d.ts.map +1 -1
  396. package/dist/type_primitives/error.d.cts +1 -2
  397. package/dist/type_primitives/error.d.ts +1 -2
  398. package/dist/type_primitives/error.d.ts.map +1 -1
  399. package/dist/type_primitives/index.d.cts +1 -1
  400. package/dist/type_primitives/index.d.ts +1 -1
  401. package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
  402. package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
  403. package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
  404. package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
  405. package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
  406. package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
  407. package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
  408. package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
  409. package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
  410. package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +18 -17
  411. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +18 -17
  412. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
  413. package/dist/utils/error.d.ts.map +1 -1
  414. package/dist/version.d.cts +4 -4
  415. package/dist/version.d.ts +4 -4
  416. package/dist/worker.cjs +1 -0
  417. package/dist/worker.d.cts +17 -0
  418. package/dist/worker.d.ts +17 -0
  419. package/dist/worker.d.ts.map +1 -0
  420. package/dist/worker.development.cjs +1 -0
  421. package/dist/worker.development.js +253 -0
  422. package/dist/worker.js +253 -0
  423. package/package.json +363 -191
  424. package/dist/core/ecs/builtin_relations.d.cts +0 -43
  425. package/dist/core/ecs/builtin_relations.d.ts +0 -43
  426. package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
  427. package/dist/core/ecs/event_registry.d.cts +0 -22
  428. package/dist/core/ecs/event_registry.d.ts +0 -22
  429. package/dist/core/ecs/event_registry.d.ts.map +0 -1
  430. package/dist/core/ecs/relation_service.d.ts.map +0 -1
  431. package/dist/core/ecs/resume.d.cts +0 -85
  432. package/dist/core/ecs/resume.d.ts +0 -85
  433. package/dist/core/ecs/resume.d.ts.map +0 -1
  434. package/dist/core/ecs/snapshot_service.d.cts +0 -94
  435. package/dist/core/ecs/snapshot_service.d.ts +0 -94
  436. package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
  437. package/dist/extensions/editor/editor.d.ts.map +0 -1
  438. package/dist/extensions/editor/field_handle.d.ts.map +0 -1
  439. package/dist/extensions/editor/index.cjs +0 -1
  440. package/dist/extensions/editor/index.d.cts +0 -21
  441. package/dist/extensions/editor/index.d.ts +0 -21
  442. package/dist/extensions/editor/index.d.ts.map +0 -1
  443. package/dist/extensions/editor/index.development.cjs +0 -1
  444. package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
  445. package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
  446. package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
  447. package/dist/extensions/reactive/index.cjs +0 -1
  448. package/dist/extensions/reactive/index.d.cts +0 -23
  449. package/dist/extensions/reactive/index.d.ts +0 -23
  450. package/dist/extensions/reactive/index.d.ts.map +0 -1
  451. package/dist/extensions/reactive/index.development.cjs +0 -1
  452. package/dist/extensions/reactive/index.development.js +0 -215
  453. package/dist/extensions/reactive/index.js +0 -215
  454. package/dist/extensions/solid/index.cjs +0 -1
  455. package/dist/extensions/solid/index.d.cts +0 -6
  456. package/dist/extensions/solid/index.d.ts +0 -6
  457. package/dist/extensions/solid/index.d.ts.map +0 -1
  458. package/dist/extensions/solid/index.development.cjs +0 -1
  459. package/dist/extensions/solid/index.development.js +0 -40
  460. package/dist/extensions/solid/index.js +0 -36
  461. package/dist/extensions/solid/kernel_solid.d.cts +0 -45
  462. package/dist/extensions/solid/kernel_solid.d.ts +0 -45
  463. package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
  464. package/dist/host_commands-3jyFfWNg.js +0 -2326
  465. package/dist/host_commands-DNf0f6ko.cjs +0 -1
  466. package/dist/internal-C9jjL90H.js +0 -2485
  467. package/dist/internal-RZN14uMw.cjs +0 -2
  468. package/dist/interop-CT-REx0W.cjs +0 -1
  469. package/dist/interop-CcY6ASQc.js +0 -18
  470. package/dist/interop-DqxleBo7.js +0 -18
  471. package/dist/interop-T1HZ-Dpa.cjs +0 -1
  472. package/dist/kernel-Cz2Kxlwl.js +0 -240
  473. package/dist/kernel-DgyrLFjW.js +0 -227
  474. package/dist/kernel-sw7ScKWu.cjs +0 -1
  475. package/dist/kernel-yWV3XnAb.cjs +0 -1
  476. package/dist/reactive/array.d.cts +0 -24
  477. package/dist/reactive/array.d.ts +0 -24
  478. package/dist/reactive/array.d.ts.map +0 -1
  479. package/dist/reactive/index.cjs +0 -1
  480. package/dist/reactive/index.d.cts +0 -11
  481. package/dist/reactive/index.d.ts +0 -11
  482. package/dist/reactive/index.d.ts.map +0 -1
  483. package/dist/reactive/index.development.cjs +0 -1
  484. package/dist/reactive/index.development.js +0 -18
  485. package/dist/reactive/index.js +0 -18
  486. package/dist/reactive/interop.d.cts +0 -19
  487. package/dist/reactive/interop.d.ts +0 -19
  488. package/dist/reactive/interop.d.ts.map +0 -1
  489. package/dist/reactive/kernel.d.cts +0 -73
  490. package/dist/reactive/kernel.d.ts +0 -73
  491. package/dist/reactive/kernel.d.ts.map +0 -1
  492. package/dist/reactive/map.d.cts +0 -16
  493. package/dist/reactive/map.d.ts +0 -16
  494. package/dist/reactive/map.d.ts.map +0 -1
  495. package/dist/reactive/shallow.d.cts +0 -11
  496. package/dist/reactive/shallow.d.ts +0 -11
  497. package/dist/reactive/shallow.d.ts.map +0 -1
  498. package/dist/reactive/struct.d.cts +0 -10
  499. package/dist/reactive/struct.d.ts +0 -10
  500. package/dist/reactive/struct.d.ts.map +0 -1
  501. package/dist/shallow-9S1pY_Iw.js +0 -159
  502. package/dist/shallow-C5YmTbtb.cjs +0 -1
  503. package/dist/shallow-DQ8aG51_.cjs +0 -1
  504. package/dist/shallow-DfnAm9vG.js +0 -150
  505. package/dist/shared-BMXh9hxm.cjs +0 -1
  506. package/dist/shared-DQKK0i-E.js +0 -109
  507. package/dist/topological_sort-BDvEyb9W.cjs +0 -1
  508. package/dist/topological_sort-DK6EjpWa.js +0 -135
  509. package/dist/typed_arrays-BcXcnzB4.js +0 -258
  510. package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
@@ -0,0 +1,313 @@
1
+ import { SparseRestoreError as u } from "../index.js";
2
+ import { u as c } from "./assertions-gtDVfbnQ.js";
3
+ const z = -1;
4
+ Object.freeze(/* @__PURE__ */ Object.create(null));
5
+ const F = 31, E = 20, p = (1 << E) - 1, R = p, $ = F - E, y = (1 << $) - 1, S = y << E | R, B = (a, r) => c(r << E | a), f = (a) => a & p, G = "orphan", C = "target", O = Object.freeze({});
6
+ class U {
7
+ /** `true` → one target per source, held in the sparse field. `false` →
8
+ * a set of targets per source. The cardinality discriminant survives as a
9
+ * field because the snapshot header and the traversal and `targetOf`
10
+ * mode guards carry it. The forward mechanics stay virtual, never branched
11
+ * on it. */
12
+ exclusive;
13
+ /** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
14
+ * multi. Carries membership (and the target, when exclusive). */
15
+ sparse;
16
+ /** Cleanup policy applied to this relation's sources when a target is
17
+ * destroyed. `orphan` (the default) is a no-op, the link dangles
18
+ * safely. `Store` reads this at destroy-flush off `sourcesOf`. */
19
+ onDeleteTarget;
20
+ /** The backing sparse store instance. Owned for registration and liveness by
21
+ * `Store`, but the relation drives the forward and membership rows on it directly.
22
+ * That is the cardinality interaction this class now encapsulates. */
23
+ _store;
24
+ /** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
25
+ * the index, so a recycled target slot can't alias a dead target's sources.
26
+ * An entry is dropped the moment its set empties (`_unlinkReverse`). */
27
+ _reverse = /* @__PURE__ */ new Map();
28
+ constructor(r, t, e, s) {
29
+ this.exclusive = r, this.sparse = t, this._store = e, this.onDeleteTarget = s;
30
+ }
31
+ // --- shared reverse index (cardinality-agnostic) ---
32
+ /** Record that `src` points at `tgt` in the reverse index. */
33
+ _linkReverse(r, t) {
34
+ let e = this._reverse.get(r);
35
+ e === void 0 && (e = /* @__PURE__ */ new Set(), this._reverse.set(r, e)), e.add(t);
36
+ }
37
+ /** Drop the `src → tgt` edge from the reverse index, removing the target's
38
+ * entry entirely once its last source is gone (so a dead-target key doesn't
39
+ * linger with an empty set). */
40
+ _unlinkReverse(r, t) {
41
+ const e = this._reverse.get(r);
42
+ e !== void 0 && (e.delete(t), e.size === 0 && this._reverse.delete(r));
43
+ }
44
+ /** Drop every reverse-index entry whose **target** is no longer alive,
45
+ * returning the count dropped. The `orphan` policy intentionally
46
+ * leaves a destroyed target's reverse entry intact (the link dangles
47
+ * safely), so a long-lived source that orphan-points at a stream of
48
+ * short-lived targets and never re-targets or dies accumulates dead-target keys
49
+ * without bound. This is the reclaim primitive behind `ecs.relations.compact`,
50
+ * a cold path the host calls at scene and snapshot boundaries. It is
51
+ * cardinality-free (reverse-index only), so it lives on the base unchanged.
52
+ *
53
+ * Pure index reclaim: the **forward** links (the exclusive sparse target
54
+ * field, the multi forward set) are left untouched, so `targetOf` and
55
+ * `targetsOf` still return the dangling dead handle exactly as `orphan`
56
+ * promises. The reverse index is derived, so dropping a dead-target entry
57
+ * changes nothing observable except `sourcesOf` on that dead handle (which
58
+ * goes from the dangling sources to `[]`, meaningless either way, the target
59
+ * is gone) and is faithfully rebuilt by snapshot and restore from the surviving
60
+ * forward links. Only the **target** role can leak here: a destroyed *source*
61
+ * is already unlinked from every reverse set by `purgeSource`, so a live
62
+ * target's set never holds a dead source. `isAlive` is supplied by `Store`,
63
+ * which owns entity liveness. Deleting during `Map` key iteration is
64
+ * well-defined, already-visited and not-yet-reached keys are unaffected. */
65
+ pruneDeadReverse(r) {
66
+ let t = 0;
67
+ for (const e of this._reverse.keys())
68
+ r(c(e)) || (this._reverse.delete(e), t++);
69
+ return t;
70
+ }
71
+ /** Sources that point at `tgt`, ascending by id (deterministic, cold-path
72
+ * sort), empty when none. */
73
+ sourcesOf(r) {
74
+ const t = this._reverse.get(r);
75
+ if (t === void 0 || t.size === 0) return [];
76
+ const e = new Array(t.size);
77
+ let s = 0;
78
+ return t.forEach((n) => {
79
+ e[s++] = c(n);
80
+ }), e.sort((n, o) => n - o), e;
81
+ }
82
+ /** Drop every derived side index, the reverse index and (for multi) the
83
+ * forward target sets. Restore path only (`restoreRelations`): the side
84
+ * indices are rebuilt from scratch, so they're cleared first to stay
85
+ * idempotent when restoring into a dirty world. The backing sparse store is
86
+ * cleared separately by `restoreSparseStores`. */
87
+ resetIndices() {
88
+ this._reverse.clear(), this._resetForward();
89
+ }
90
+ }
91
+ class M extends U {
92
+ constructor(r, t, e) {
93
+ super(!0, r, t, e);
94
+ }
95
+ _resetForward() {
96
+ }
97
+ link(r, t) {
98
+ const e = f(r), s = this._store.getField(e, 0);
99
+ if (s !== void 0) {
100
+ if (s === t) return;
101
+ this._unlinkReverse(c(s), r);
102
+ }
103
+ this._store.setRow(e, { [C]: t }), this._linkReverse(t, r);
104
+ }
105
+ unlink(r, t) {
106
+ const e = f(r), s = this._store.getField(e, 0);
107
+ s !== void 0 && (t !== void 0 && s !== t || (this._unlinkReverse(c(s), r), this._store.remove(e)));
108
+ }
109
+ purgeSource(r) {
110
+ const t = f(r), e = this._store.getField(t, 0);
111
+ e !== void 0 && this._unlinkReverse(c(e), r);
112
+ }
113
+ singleTargetAt(r) {
114
+ const t = this._store.getField(r, 0);
115
+ return t === void 0 ? void 0 : c(t);
116
+ }
117
+ targetsAt(r) {
118
+ const t = this._store.getField(r, 0);
119
+ return t === void 0 ? [] : [c(t)];
120
+ }
121
+ hasIndex(r) {
122
+ return this._store.has(r);
123
+ }
124
+ forEachCanonicalTargetSet(r) {
125
+ }
126
+ forEachCanonicalPair(r, t) {
127
+ const e = this._store.canonicalIndices();
128
+ for (let s = 0; s < e.length; s++) {
129
+ const n = e[s];
130
+ t(r(n), c(this._store.getField(n, 0)));
131
+ }
132
+ }
133
+ rebuildReverse(r) {
134
+ const t = this._store.indices;
135
+ for (let e = 0; e < t.length; e++) {
136
+ const s = t[e];
137
+ this._linkReverse(c(this._store.getField(s, 0)), r(s));
138
+ }
139
+ }
140
+ restoreAddTarget() {
141
+ throw new u(
142
+ "exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
143
+ );
144
+ }
145
+ }
146
+ class b extends U {
147
+ /** source entity **index** → set of target `EntityID`s. Keyed by source index
148
+ * so destroy-purge, which has the freed index, can drop it in O(1). An
149
+ * entry is removed the moment its set empties. */
150
+ _forward = /* @__PURE__ */ new Map();
151
+ constructor(r, t, e) {
152
+ super(!1, r, t, e);
153
+ }
154
+ _resetForward() {
155
+ this._forward.clear();
156
+ }
157
+ link(r, t) {
158
+ const e = f(r);
159
+ let s = this._forward.get(e);
160
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s), this._store.setRow(e, O)), s.add(t), this._linkReverse(t, r);
161
+ }
162
+ unlink(r, t) {
163
+ const e = f(r), s = this._forward.get(e);
164
+ if (s !== void 0) {
165
+ if (t === void 0) {
166
+ this._forward.delete(e), s.forEach((n) => this._unlinkReverse(c(n), r)), this._store.remove(e);
167
+ return;
168
+ }
169
+ s.has(t) && (s.delete(t), this._unlinkReverse(t, r), s.size === 0 && (this._forward.delete(e), this._store.remove(e)));
170
+ }
171
+ }
172
+ purgeSource(r) {
173
+ const t = f(r), e = this._forward.get(t);
174
+ e !== void 0 && (this._forward.delete(t), e.forEach((s) => this._unlinkReverse(c(s), r)));
175
+ }
176
+ singleTargetAt() {
177
+ }
178
+ targetsAt(r) {
179
+ const t = this._forward.get(r);
180
+ if (t === void 0 || t.size === 0) return [];
181
+ const e = new Array(t.size);
182
+ let s = 0;
183
+ return t.forEach((n) => {
184
+ e[s++] = c(n);
185
+ }), e.sort((n, o) => n - o), e;
186
+ }
187
+ hasIndex(r) {
188
+ return this._store.has(r);
189
+ }
190
+ forEachCanonicalTargetSet(r) {
191
+ const t = Array.from(this._forward.keys()).sort((e, s) => e - s);
192
+ for (let e = 0; e < t.length; e++) {
193
+ const s = this.targetsAt(t[e]);
194
+ s.length !== 0 && r(t[e], s);
195
+ }
196
+ }
197
+ forEachCanonicalPair(r, t) {
198
+ this.forEachCanonicalTargetSet((e, s) => {
199
+ const n = r(e);
200
+ for (let o = 0; o < s.length; o++) t(n, s[o]);
201
+ });
202
+ }
203
+ rebuildReverse() {
204
+ }
205
+ restoreAddTarget(r, t, e) {
206
+ let s = this._forward.get(r);
207
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(r, s)), s.add(t), this._linkReverse(t, e);
208
+ }
209
+ }
210
+ function Y(a, r, t, e) {
211
+ return a ? new M(r, t, e) : new b(r, t, e);
212
+ }
213
+ const k = 4, m = 4, D = 8, w = 8;
214
+ function P(a) {
215
+ const r = new Array(a.length);
216
+ let t = 4;
217
+ for (let o = 0; o < a.length; o++) {
218
+ t += k;
219
+ const h = a[o];
220
+ if (h.exclusive) {
221
+ r[o] = null;
222
+ continue;
223
+ }
224
+ const i = [];
225
+ h.forEachCanonicalTargetSet((l, d) => i.push([l, d])), r[o] = i, t += m;
226
+ for (let l = 0; l < i.length; l++)
227
+ t += D + i[l][1].length * w;
228
+ }
229
+ const e = new Uint8Array(t), s = new DataView(e.buffer);
230
+ let n = 0;
231
+ s.setUint32(n, a.length, !0), n += 4;
232
+ for (let o = 0; o < a.length; o++) {
233
+ s.setUint32(n, a[o].exclusive ? 0 : 1, !0), n += 4;
234
+ const h = r[o];
235
+ if (h !== null) {
236
+ s.setUint32(n, h.length, !0), n += 4;
237
+ for (let i = 0; i < h.length; i++) {
238
+ const l = h[i][0], d = h[i][1];
239
+ s.setUint32(n, l, !0), n += 4, s.setUint32(n, d.length, !0), n += 4;
240
+ for (let _ = 0; _ < d.length; _++)
241
+ s.setFloat64(n, d[_], !0), n += w;
242
+ }
243
+ }
244
+ }
245
+ return e;
246
+ }
247
+ function j(a, r, t) {
248
+ const e = new DataView(r.buffer, r.byteOffset, r.byteLength), s = r.byteLength;
249
+ let n = 0;
250
+ const o = (i) => {
251
+ if (n + i > s)
252
+ throw new u(
253
+ `relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s - n}`
254
+ );
255
+ };
256
+ for (let i = 0; i < a.length; i++) a[i].resetIndices();
257
+ o(4);
258
+ const h = e.getUint32(n, !0);
259
+ if (n += 4, h !== a.length)
260
+ throw new u(
261
+ `relation count mismatch: snapshot=${h}, registered=${a.length}`
262
+ );
263
+ for (let i = 0; i < a.length; i++) {
264
+ const l = a[i];
265
+ o(k);
266
+ const d = e.getUint32(n, !0);
267
+ if (n += 4, d === 1 === l.exclusive)
268
+ throw new u(
269
+ `relation ${i} cardinality mismatch: snapshot ${d ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
270
+ );
271
+ if (l.exclusive) continue;
272
+ o(m);
273
+ const _ = e.getUint32(n, !0);
274
+ n += 4;
275
+ for (let T = 0; T < _; T++) {
276
+ o(D);
277
+ const g = e.getUint32(n, !0);
278
+ n += 4;
279
+ const x = e.getUint32(n, !0);
280
+ if (n += 4, g > R)
281
+ throw new u(
282
+ `relation ${i} source index ${g} exceeds MAX_INDEX (${R})`
283
+ );
284
+ o(x * w);
285
+ const N = t(g);
286
+ for (let A = 0; A < x; A++) {
287
+ const I = c(e.getFloat64(n, !0));
288
+ n += w;
289
+ const v = I;
290
+ if (!Number.isInteger(v) || v < 0 || v > S)
291
+ throw new u(
292
+ `relation ${i} target ${v} is not a well-formed packed EntityID (expected an integer in [0, ${S}])`
293
+ );
294
+ l.restoreAddTarget(g, I, N);
295
+ }
296
+ }
297
+ }
298
+ if (n !== s)
299
+ throw new u(
300
+ `relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
301
+ );
302
+ }
303
+ export {
304
+ G as D,
305
+ R as M,
306
+ C as R,
307
+ z as U,
308
+ Y as a,
309
+ B as c,
310
+ f as g,
311
+ j as r,
312
+ P as s
313
+ };
@@ -0,0 +1 @@
1
+ "use strict";const d=require("../index.cjs"),c=require("./assertions-z5GQd_bB.cjs"),y=-1;Object.freeze(Object.create(null));const O=31,R=20,p=(1<<R)-1,v=p,L=O-R,$=(1<<L)-1,x=$<<R|v,m=(a,r)=>c.unsafeCast(r<<R|a),f=a=>a&p,M="orphan",C="target",b=Object.freeze({});class N{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(r,t,e,s){this.exclusive=r,this.sparse=t,this._store=e,this.onDeleteTarget=s}_linkReverse(r,t){let e=this._reverse.get(r);e===void 0&&(e=new Set,this._reverse.set(r,e)),e.add(t)}_unlinkReverse(r,t){const e=this._reverse.get(r);e!==void 0&&(e.delete(t),e.size===0&&this._reverse.delete(r))}pruneDeadReverse(r){let t=0;for(const e of this._reverse.keys())r(c.unsafeCast(e))||(this._reverse.delete(e),t++);return t}sourcesOf(r){const t=this._reverse.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}resetIndices(){this._reverse.clear(),this._resetForward()}}class X extends N{constructor(r,t,e){super(!0,r,t,e)}_resetForward(){}link(r,t){const e=f(r),s=this._store.getField(e,0);if(s!==void 0){if(s===t)return;this._unlinkReverse(c.unsafeCast(s),r)}this._store.setRow(e,{[C]:t}),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._store.getField(e,0);s!==void 0&&(t!==void 0&&s!==t||(this._unlinkReverse(c.unsafeCast(s),r),this._store.remove(e)))}purgeSource(r){const t=f(r),e=this._store.getField(t,0);e!==void 0&&this._unlinkReverse(c.unsafeCast(e),r)}singleTargetAt(r){const t=this._store.getField(r,0);return t===void 0?void 0:c.unsafeCast(t)}targetsAt(r){const t=this._store.getField(r,0);return t===void 0?[]:[c.unsafeCast(t)]}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){}forEachCanonicalPair(r,t){const e=this._store.canonicalIndices();for(let s=0;s<e.length;s++){const n=e[s];t(r(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(r){const t=this._store.indices;for(let e=0;e<t.length;e++){const s=t[e];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),r(s))}}restoreAddTarget(){throw new d.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class G extends N{_forward=new Map;constructor(r,t,e){super(!1,r,t,e)}_resetForward(){this._forward.clear()}link(r,t){const e=f(r);let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s),this._store.setRow(e,b)),s.add(t),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._forward.get(e);if(s!==void 0){if(t===void 0){this._forward.delete(e),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),r)),this._store.remove(e);return}s.has(t)&&(s.delete(t),this._unlinkReverse(t,r),s.size===0&&(this._forward.delete(e),this._store.remove(e)))}}purgeSource(r){const t=f(r),e=this._forward.get(t);e!==void 0&&(this._forward.delete(t),e.forEach(s=>this._unlinkReverse(c.unsafeCast(s),r)))}singleTargetAt(){}targetsAt(r){const t=this._forward.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){const t=Array.from(this._forward.keys()).sort((e,s)=>e-s);for(let e=0;e<t.length;e++){const s=this.targetsAt(t[e]);s.length!==0&&r(t[e],s)}}forEachCanonicalPair(r,t){this.forEachCanonicalTargetSet((e,s)=>{const n=r(e);for(let o=0;o<s.length;o++)t(n,s[o])})}rebuildReverse(){}restoreAddTarget(r,t,e){let s=this._forward.get(r);s===void 0&&(s=new Set,this._forward.set(r,s)),s.add(t),this._linkReverse(t,e)}}function z(a,r,t,e){return a?new X(r,t,e):new G(r,t,e)}const D=4,U=4,k=8,w=8;function B(a){const r=new Array(a.length);let t=4;for(let o=0;o<a.length;o++){t+=D;const u=a[o];if(u.exclusive){r[o]=null;continue}const i=[];u.forEachCanonicalTargetSet((l,h)=>i.push([l,h])),r[o]=i,t+=U;for(let l=0;l<i.length;l++)t+=k+i[l][1].length*w}const e=new Uint8Array(t),s=new DataView(e.buffer);let n=0;s.setUint32(n,a.length,!0),n+=4;for(let o=0;o<a.length;o++){s.setUint32(n,a[o].exclusive?0:1,!0),n+=4;const u=r[o];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let i=0;i<u.length;i++){const l=u[i][0],h=u[i][1];s.setUint32(n,l,!0),n+=4,s.setUint32(n,h.length,!0),n+=4;for(let _=0;_<h.length;_++)s.setFloat64(n,h[_],!0),n+=w}}}return e}function Y(a,r,t){const e=new DataView(r.buffer,r.byteOffset,r.byteLength),s=r.byteLength;let n=0;const o=i=>{if(n+i>s)throw new d.SparseRestoreError(`relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s-n}`)};for(let i=0;i<a.length;i++)a[i].resetIndices();o(4);const u=e.getUint32(n,!0);if(n+=4,u!==a.length)throw new d.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${a.length}`);for(let i=0;i<a.length;i++){const l=a[i];o(D);const h=e.getUint32(n,!0);if(n+=4,h===1===l.exclusive)throw new d.SparseRestoreError(`relation ${i} cardinality mismatch: snapshot ${h?"multi":"exclusive"}, registered ${l.exclusive?"exclusive":"multi"}`);if(l.exclusive)continue;o(U);const _=e.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){o(k);const g=e.getUint32(n,!0);n+=4;const A=e.getUint32(n,!0);if(n+=4,g>v)throw new d.SparseRestoreError(`relation ${i} source index ${g} exceeds MAX_INDEX (${v})`);o(A*w);const F=t(g);for(let S=0;S<A;S++){const I=c.unsafeCast(e.getFloat64(n,!0));n+=w;const E=I;if(!Number.isInteger(E)||E<0||E>x)throw new d.SparseRestoreError(`relation ${i} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);l.restoreAddTarget(g,I,F)}}}if(n!==s)throw new d.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=M;exports.MAX_INDEX=v;exports.RELATION_TARGET_FIELD=C;exports.UNASSIGNED=y;exports.createEntityId=m;exports.createRelationStore=z;exports.getEntityIndex=f;exports.restoreRelations=Y;exports.snapshotRelations=B;
@@ -0,0 +1 @@
1
+ "use strict";const l=require("../index.development.cjs"),c=require("./assertions-z5GQd_bB.cjs"),k=-1;Object.freeze(Object.create(null));const L=31,g=20,p=(1<<g)-1,E=p,M=L-g,N=(1<<M)-1,x=N<<g|E,m=(o,e)=>{{if(o<0||o>E)throw new l.ECSError(l.ECS_ERROR.EID_MAX_INDEX_OVERFLOW);if(e<0||e>N)throw new l.ECSError(l.ECS_ERROR.EID_MAX_GEN_OVERFLOW)}return c.unsafeCast(e<<g|o)},d=o=>o&p,C=o=>o>>g,X=(o,e,r)=>new l.ECSError(l.ECS_ERROR.ENTITY_NOT_ALIVE,`${o}: entity ${e} (index ${d(e)}, generation ${C(e)}) is not alive${r?`, ${r}`:""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,{entity:e,index:d(e),generation:C(e),op:o}),b="orphan",D="target",G=Object.freeze({});class O{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(e,r,t,s){this.exclusive=e,this.sparse=r,this._store=t,this.onDeleteTarget=s}_linkReverse(e,r){let t=this._reverse.get(e);t===void 0&&(t=new Set,this._reverse.set(e,t)),t.add(r)}_unlinkReverse(e,r){const t=this._reverse.get(e);t!==void 0&&(t.delete(r),t.size===0&&this._reverse.delete(e))}pruneDeadReverse(e){let r=0;for(const t of this._reverse.keys())e(c.unsafeCast(t))||(this._reverse.delete(t),r++);return r}sourcesOf(e){const r=this._reverse.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}resetIndices(){this._reverse.clear(),this._resetForward()}}class z extends O{constructor(e,r,t){super(!0,e,r,t)}_resetForward(){}link(e,r){const t=d(e),s=this._store.getField(t,0);if(s!==void 0){if(s===r)return;this._unlinkReverse(c.unsafeCast(s),e)}this._store.setRow(t,{[D]:r}),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._store.getField(t,0);s!==void 0&&(r!==void 0&&s!==r||(this._unlinkReverse(c.unsafeCast(s),e),this._store.remove(t)))}purgeSource(e){const r=d(e),t=this._store.getField(r,0);t!==void 0&&this._unlinkReverse(c.unsafeCast(t),e)}singleTargetAt(e){const r=this._store.getField(e,0);return r===void 0?void 0:c.unsafeCast(r)}targetsAt(e){const r=this._store.getField(e,0);return r===void 0?[]:[c.unsafeCast(r)]}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){}forEachCanonicalPair(e,r){const t=this._store.canonicalIndices();for(let s=0;s<t.length;s++){const n=t[s];r(e(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(e){const r=this._store.indices;for(let t=0;t<r.length;t++){const s=r[t];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),e(s))}}restoreAddTarget(){throw new l.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class B extends O{_forward=new Map;constructor(e,r,t){super(!1,e,r,t)}_resetForward(){this._forward.clear()}link(e,r){const t=d(e);let s=this._forward.get(t);s===void 0&&(s=new Set,this._forward.set(t,s),this._store.setRow(t,G)),s.add(r),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._forward.get(t);if(s!==void 0){if(r===void 0){this._forward.delete(t),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),e)),this._store.remove(t);return}s.has(r)&&(s.delete(r),this._unlinkReverse(r,e),s.size===0&&(this._forward.delete(t),this._store.remove(t)))}}purgeSource(e){const r=d(e),t=this._forward.get(r);t!==void 0&&(this._forward.delete(r),t.forEach(s=>this._unlinkReverse(c.unsafeCast(s),e)))}singleTargetAt(){}targetsAt(e){const r=this._forward.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){const r=Array.from(this._forward.keys()).sort((t,s)=>t-s);for(let t=0;t<r.length;t++){const s=this.targetsAt(r[t]);s.length!==0&&e(r[t],s)}}forEachCanonicalPair(e,r){this.forEachCanonicalTargetSet((t,s)=>{const n=e(t);for(let i=0;i<s.length;i++)r(n,s[i])})}rebuildReverse(){}restoreAddTarget(e,r,t){let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s)),s.add(r),this._linkReverse(r,t)}}function Y(o,e,r,t){return o?new z(e,r,t):new B(e,r,t)}const y=4,U=4,$=8,R=8;function V(o){const e=new Array(o.length);let r=4;for(let i=0;i<o.length;i++){r+=y;const u=o[i];if(u.exclusive){e[i]=null;continue}const a=[];u.forEachCanonicalTargetSet((h,f)=>a.push([h,f])),e[i]=a,r+=U;for(let h=0;h<a.length;h++)r+=$+a[h][1].length*R}const t=new Uint8Array(r),s=new DataView(t.buffer);let n=0;s.setUint32(n,o.length,!0),n+=4;for(let i=0;i<o.length;i++){s.setUint32(n,o[i].exclusive?0:1,!0),n+=4;const u=e[i];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let a=0;a<u.length;a++){const h=u[a][0],f=u[a][1];s.setUint32(n,h,!0),n+=4,s.setUint32(n,f.length,!0),n+=4;for(let _=0;_<f.length;_++)s.setFloat64(n,f[_],!0),n+=R}}}return t}function P(o,e,r){const t=new DataView(e.buffer,e.byteOffset,e.byteLength),s=e.byteLength;let n=0;const i=a=>{if(n+a>s)throw new l.SparseRestoreError(`relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s-n}`)};for(let a=0;a<o.length;a++)o[a].resetIndices();i(4);const u=t.getUint32(n,!0);if(n+=4,u!==o.length)throw new l.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${o.length}`);for(let a=0;a<o.length;a++){const h=o[a];i(y);const f=t.getUint32(n,!0);if(n+=4,f===1===h.exclusive)throw new l.SparseRestoreError(`relation ${a} cardinality mismatch: snapshot ${f?"multi":"exclusive"}, registered ${h.exclusive?"exclusive":"multi"}`);if(h.exclusive)continue;i(U);const _=t.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){i($);const v=t.getUint32(n,!0);n+=4;const A=t.getUint32(n,!0);if(n+=4,v>E)throw new l.SparseRestoreError(`relation ${a} source index ${v} exceeds MAX_INDEX (${E})`);i(A*R);const F=r(v);for(let S=0;S<A;S++){const I=c.unsafeCast(t.getFloat64(n,!0));n+=R;const w=I;if(!Number.isInteger(w)||w<0||w>x)throw new l.SparseRestoreError(`relation ${a} target ${w} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);h.restoreAddTarget(v,I,F)}}}if(n!==s)throw new l.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=b;exports.MAX_INDEX=E;exports.RELATION_TARGET_FIELD=D;exports.UNASSIGNED=k;exports.createEntityId=m;exports.createRelationStore=Y;exports.entityNotAliveError=X;exports.getEntityIndex=d;exports.restoreRelations=P;exports.snapshotRelations=V;
@@ -0,0 +1,328 @@
1
+ import { ECSError as T, ECS_ERROR as A, SparseRestoreError as f } from "../index.development.js";
2
+ import { u as c } from "./assertions-gtDVfbnQ.js";
3
+ const Y = -1;
4
+ Object.freeze(/* @__PURE__ */ Object.create(null));
5
+ const C = 31, g = 20, D = (1 << g) - 1, w = D, M = C - g, O = (1 << M) - 1, N = O << g | w, V = (o, e) => {
6
+ {
7
+ if (o < 0 || o > w)
8
+ throw new T(A.EID_MAX_INDEX_OVERFLOW);
9
+ if (e < 0 || e > O)
10
+ throw new T(A.EID_MAX_GEN_OVERFLOW);
11
+ }
12
+ return c(e << g | o);
13
+ }, d = (o) => o & D, $ = (o) => o >> g, P = (o, e, r) => new T(
14
+ A.ENTITY_NOT_ALIVE,
15
+ `${o}: entity ${e} (index ${d(e)}, generation ${$(
16
+ e
17
+ )}) is not alive${r ? `, ${r}` : ""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,
18
+ { entity: e, index: d(e), generation: $(e), op: o }
19
+ ), j = "orphan", L = "target", b = Object.freeze({});
20
+ class U {
21
+ /** `true` → one target per source, held in the sparse field. `false` →
22
+ * a set of targets per source. The cardinality discriminant survives as a
23
+ * field because the snapshot header and the traversal and `targetOf`
24
+ * mode guards carry it. The forward mechanics stay virtual, never branched
25
+ * on it. */
26
+ exclusive;
27
+ /** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
28
+ * multi. Carries membership (and the target, when exclusive). */
29
+ sparse;
30
+ /** Cleanup policy applied to this relation's sources when a target is
31
+ * destroyed. `orphan` (the default) is a no-op, the link dangles
32
+ * safely. `Store` reads this at destroy-flush off `sourcesOf`. */
33
+ onDeleteTarget;
34
+ /** The backing sparse store instance. Owned for registration and liveness by
35
+ * `Store`, but the relation drives the forward and membership rows on it directly.
36
+ * That is the cardinality interaction this class now encapsulates. */
37
+ _store;
38
+ /** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
39
+ * the index, so a recycled target slot can't alias a dead target's sources.
40
+ * An entry is dropped the moment its set empties (`_unlinkReverse`). */
41
+ _reverse = /* @__PURE__ */ new Map();
42
+ constructor(e, r, t, s) {
43
+ this.exclusive = e, this.sparse = r, this._store = t, this.onDeleteTarget = s;
44
+ }
45
+ // --- shared reverse index (cardinality-agnostic) ---
46
+ /** Record that `src` points at `tgt` in the reverse index. */
47
+ _linkReverse(e, r) {
48
+ let t = this._reverse.get(e);
49
+ t === void 0 && (t = /* @__PURE__ */ new Set(), this._reverse.set(e, t)), t.add(r);
50
+ }
51
+ /** Drop the `src → tgt` edge from the reverse index, removing the target's
52
+ * entry entirely once its last source is gone (so a dead-target key doesn't
53
+ * linger with an empty set). */
54
+ _unlinkReverse(e, r) {
55
+ const t = this._reverse.get(e);
56
+ t !== void 0 && (t.delete(r), t.size === 0 && this._reverse.delete(e));
57
+ }
58
+ /** Drop every reverse-index entry whose **target** is no longer alive,
59
+ * returning the count dropped. The `orphan` policy intentionally
60
+ * leaves a destroyed target's reverse entry intact (the link dangles
61
+ * safely), so a long-lived source that orphan-points at a stream of
62
+ * short-lived targets and never re-targets or dies accumulates dead-target keys
63
+ * without bound. This is the reclaim primitive behind `ecs.relations.compact`,
64
+ * a cold path the host calls at scene and snapshot boundaries. It is
65
+ * cardinality-free (reverse-index only), so it lives on the base unchanged.
66
+ *
67
+ * Pure index reclaim: the **forward** links (the exclusive sparse target
68
+ * field, the multi forward set) are left untouched, so `targetOf` and
69
+ * `targetsOf` still return the dangling dead handle exactly as `orphan`
70
+ * promises. The reverse index is derived, so dropping a dead-target entry
71
+ * changes nothing observable except `sourcesOf` on that dead handle (which
72
+ * goes from the dangling sources to `[]`, meaningless either way, the target
73
+ * is gone) and is faithfully rebuilt by snapshot and restore from the surviving
74
+ * forward links. Only the **target** role can leak here: a destroyed *source*
75
+ * is already unlinked from every reverse set by `purgeSource`, so a live
76
+ * target's set never holds a dead source. `isAlive` is supplied by `Store`,
77
+ * which owns entity liveness. Deleting during `Map` key iteration is
78
+ * well-defined, already-visited and not-yet-reached keys are unaffected. */
79
+ pruneDeadReverse(e) {
80
+ let r = 0;
81
+ for (const t of this._reverse.keys())
82
+ e(c(t)) || (this._reverse.delete(t), r++);
83
+ return r;
84
+ }
85
+ /** Sources that point at `tgt`, ascending by id (deterministic, cold-path
86
+ * sort), empty when none. */
87
+ sourcesOf(e) {
88
+ const r = this._reverse.get(e);
89
+ if (r === void 0 || r.size === 0) return [];
90
+ const t = new Array(r.size);
91
+ let s = 0;
92
+ return r.forEach((n) => {
93
+ t[s++] = c(n);
94
+ }), t.sort((n, i) => n - i), t;
95
+ }
96
+ /** Drop every derived side index, the reverse index and (for multi) the
97
+ * forward target sets. Restore path only (`restoreRelations`): the side
98
+ * indices are rebuilt from scratch, so they're cleared first to stay
99
+ * idempotent when restoring into a dirty world. The backing sparse store is
100
+ * cleared separately by `restoreSparseStores`. */
101
+ resetIndices() {
102
+ this._reverse.clear(), this._resetForward();
103
+ }
104
+ }
105
+ class X extends U {
106
+ constructor(e, r, t) {
107
+ super(!0, e, r, t);
108
+ }
109
+ _resetForward() {
110
+ }
111
+ link(e, r) {
112
+ const t = d(e), s = this._store.getField(t, 0);
113
+ if (s !== void 0) {
114
+ if (s === r) return;
115
+ this._unlinkReverse(c(s), e);
116
+ }
117
+ this._store.setRow(t, { [L]: r }), this._linkReverse(r, e);
118
+ }
119
+ unlink(e, r) {
120
+ const t = d(e), s = this._store.getField(t, 0);
121
+ s !== void 0 && (r !== void 0 && s !== r || (this._unlinkReverse(c(s), e), this._store.remove(t)));
122
+ }
123
+ purgeSource(e) {
124
+ const r = d(e), t = this._store.getField(r, 0);
125
+ t !== void 0 && this._unlinkReverse(c(t), e);
126
+ }
127
+ singleTargetAt(e) {
128
+ const r = this._store.getField(e, 0);
129
+ return r === void 0 ? void 0 : c(r);
130
+ }
131
+ targetsAt(e) {
132
+ const r = this._store.getField(e, 0);
133
+ return r === void 0 ? [] : [c(r)];
134
+ }
135
+ hasIndex(e) {
136
+ return this._store.has(e);
137
+ }
138
+ forEachCanonicalTargetSet(e) {
139
+ }
140
+ forEachCanonicalPair(e, r) {
141
+ const t = this._store.canonicalIndices();
142
+ for (let s = 0; s < t.length; s++) {
143
+ const n = t[s];
144
+ r(e(n), c(this._store.getField(n, 0)));
145
+ }
146
+ }
147
+ rebuildReverse(e) {
148
+ const r = this._store.indices;
149
+ for (let t = 0; t < r.length; t++) {
150
+ const s = r[t];
151
+ this._linkReverse(c(this._store.getField(s, 0)), e(s));
152
+ }
153
+ }
154
+ restoreAddTarget() {
155
+ throw new f(
156
+ "exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
157
+ );
158
+ }
159
+ }
160
+ class G extends U {
161
+ /** source entity **index** → set of target `EntityID`s. Keyed by source index
162
+ * so destroy-purge, which has the freed index, can drop it in O(1). An
163
+ * entry is removed the moment its set empties. */
164
+ _forward = /* @__PURE__ */ new Map();
165
+ constructor(e, r, t) {
166
+ super(!1, e, r, t);
167
+ }
168
+ _resetForward() {
169
+ this._forward.clear();
170
+ }
171
+ link(e, r) {
172
+ const t = d(e);
173
+ let s = this._forward.get(t);
174
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(t, s), this._store.setRow(t, b)), s.add(r), this._linkReverse(r, e);
175
+ }
176
+ unlink(e, r) {
177
+ const t = d(e), s = this._forward.get(t);
178
+ if (s !== void 0) {
179
+ if (r === void 0) {
180
+ this._forward.delete(t), s.forEach((n) => this._unlinkReverse(c(n), e)), this._store.remove(t);
181
+ return;
182
+ }
183
+ s.has(r) && (s.delete(r), this._unlinkReverse(r, e), s.size === 0 && (this._forward.delete(t), this._store.remove(t)));
184
+ }
185
+ }
186
+ purgeSource(e) {
187
+ const r = d(e), t = this._forward.get(r);
188
+ t !== void 0 && (this._forward.delete(r), t.forEach((s) => this._unlinkReverse(c(s), e)));
189
+ }
190
+ singleTargetAt() {
191
+ }
192
+ targetsAt(e) {
193
+ const r = this._forward.get(e);
194
+ if (r === void 0 || r.size === 0) return [];
195
+ const t = new Array(r.size);
196
+ let s = 0;
197
+ return r.forEach((n) => {
198
+ t[s++] = c(n);
199
+ }), t.sort((n, i) => n - i), t;
200
+ }
201
+ hasIndex(e) {
202
+ return this._store.has(e);
203
+ }
204
+ forEachCanonicalTargetSet(e) {
205
+ const r = Array.from(this._forward.keys()).sort((t, s) => t - s);
206
+ for (let t = 0; t < r.length; t++) {
207
+ const s = this.targetsAt(r[t]);
208
+ s.length !== 0 && e(r[t], s);
209
+ }
210
+ }
211
+ forEachCanonicalPair(e, r) {
212
+ this.forEachCanonicalTargetSet((t, s) => {
213
+ const n = e(t);
214
+ for (let i = 0; i < s.length; i++) r(n, s[i]);
215
+ });
216
+ }
217
+ rebuildReverse() {
218
+ }
219
+ restoreAddTarget(e, r, t) {
220
+ let s = this._forward.get(e);
221
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s)), s.add(r), this._linkReverse(r, t);
222
+ }
223
+ }
224
+ function K(o, e, r, t) {
225
+ return o ? new X(e, r, t) : new G(e, r, t);
226
+ }
227
+ const k = 4, y = 4, m = 8, R = 8;
228
+ function W(o) {
229
+ const e = new Array(o.length);
230
+ let r = 4;
231
+ for (let i = 0; i < o.length; i++) {
232
+ r += k;
233
+ const h = o[i];
234
+ if (h.exclusive) {
235
+ e[i] = null;
236
+ continue;
237
+ }
238
+ const a = [];
239
+ h.forEachCanonicalTargetSet((l, u) => a.push([l, u])), e[i] = a, r += y;
240
+ for (let l = 0; l < a.length; l++)
241
+ r += m + a[l][1].length * R;
242
+ }
243
+ const t = new Uint8Array(r), s = new DataView(t.buffer);
244
+ let n = 0;
245
+ s.setUint32(n, o.length, !0), n += 4;
246
+ for (let i = 0; i < o.length; i++) {
247
+ s.setUint32(n, o[i].exclusive ? 0 : 1, !0), n += 4;
248
+ const h = e[i];
249
+ if (h !== null) {
250
+ s.setUint32(n, h.length, !0), n += 4;
251
+ for (let a = 0; a < h.length; a++) {
252
+ const l = h[a][0], u = h[a][1];
253
+ s.setUint32(n, l, !0), n += 4, s.setUint32(n, u.length, !0), n += 4;
254
+ for (let _ = 0; _ < u.length; _++)
255
+ s.setFloat64(n, u[_], !0), n += R;
256
+ }
257
+ }
258
+ }
259
+ return t;
260
+ }
261
+ function H(o, e, r) {
262
+ const t = new DataView(e.buffer, e.byteOffset, e.byteLength), s = e.byteLength;
263
+ let n = 0;
264
+ const i = (a) => {
265
+ if (n + a > s)
266
+ throw new f(
267
+ `relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s - n}`
268
+ );
269
+ };
270
+ for (let a = 0; a < o.length; a++) o[a].resetIndices();
271
+ i(4);
272
+ const h = t.getUint32(n, !0);
273
+ if (n += 4, h !== o.length)
274
+ throw new f(
275
+ `relation count mismatch: snapshot=${h}, registered=${o.length}`
276
+ );
277
+ for (let a = 0; a < o.length; a++) {
278
+ const l = o[a];
279
+ i(k);
280
+ const u = t.getUint32(n, !0);
281
+ if (n += 4, u === 1 === l.exclusive)
282
+ throw new f(
283
+ `relation ${a} cardinality mismatch: snapshot ${u ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
284
+ );
285
+ if (l.exclusive) continue;
286
+ i(y);
287
+ const _ = t.getUint32(n, !0);
288
+ n += 4;
289
+ for (let I = 0; I < _; I++) {
290
+ i(m);
291
+ const v = t.getUint32(n, !0);
292
+ n += 4;
293
+ const x = t.getUint32(n, !0);
294
+ if (n += 4, v > w)
295
+ throw new f(
296
+ `relation ${a} source index ${v} exceeds MAX_INDEX (${w})`
297
+ );
298
+ i(x * R);
299
+ const F = r(v);
300
+ for (let S = 0; S < x; S++) {
301
+ const p = c(t.getFloat64(n, !0));
302
+ n += R;
303
+ const E = p;
304
+ if (!Number.isInteger(E) || E < 0 || E > N)
305
+ throw new f(
306
+ `relation ${a} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${N}])`
307
+ );
308
+ l.restoreAddTarget(v, p, F);
309
+ }
310
+ }
311
+ }
312
+ if (n !== s)
313
+ throw new f(
314
+ `relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
315
+ );
316
+ }
317
+ export {
318
+ j as D,
319
+ w as M,
320
+ L as R,
321
+ Y as U,
322
+ K as a,
323
+ V as c,
324
+ P as e,
325
+ d as g,
326
+ H as r,
327
+ W as s
328
+ };