@adobe/ecs 0.1.0 → 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 (2159) hide show
  1. package/README.md +58 -0
  2. package/dist/implementation/compiler/access.js +9 -5
  3. package/dist/implementation/compiler/access.js.map +1 -1
  4. package/dist/implementation/compiler/archetypes.d.ts +17 -0
  5. package/dist/implementation/compiler/archetypes.js +141 -0
  6. package/dist/implementation/compiler/archetypes.js.map +1 -0
  7. package/dist/implementation/compiler/assign.js.map +1 -1
  8. package/dist/implementation/compiler/augmentations.d.ts +25 -0
  9. package/dist/implementation/compiler/augmentations.js +943 -0
  10. package/dist/implementation/compiler/augmentations.js.map +1 -0
  11. package/dist/implementation/compiler/bind.js +5 -4
  12. package/dist/implementation/compiler/bind.js.map +1 -1
  13. package/dist/implementation/compiler/body-access.d.ts +20 -3
  14. package/dist/implementation/compiler/body-access.js +138 -36
  15. package/dist/implementation/compiler/body-access.js.map +1 -1
  16. package/dist/implementation/compiler/booleans.js.map +1 -1
  17. package/dist/implementation/compiler/branches.js.map +1 -1
  18. package/dist/implementation/compiler/calls.js +14 -3
  19. package/dist/implementation/compiler/calls.js.map +1 -1
  20. package/dist/implementation/compiler/columns.d.ts +8 -2
  21. package/dist/implementation/compiler/columns.js +19 -3
  22. package/dist/implementation/compiler/columns.js.map +1 -1
  23. package/dist/implementation/compiler/compile-kernel.d.ts +24 -1
  24. package/dist/implementation/compiler/compile-kernel.js +66 -22
  25. package/dist/implementation/compiler/compile-kernel.js.map +1 -1
  26. package/dist/implementation/compiler/compiler.d.ts +6 -0
  27. package/dist/implementation/compiler/compiler.js +7 -0
  28. package/dist/implementation/compiler/compiler.js.map +1 -0
  29. package/dist/implementation/compiler/data.js.map +1 -1
  30. package/dist/implementation/compiler/describe.d.ts +41 -0
  31. package/dist/implementation/compiler/describe.js +510 -0
  32. package/dist/implementation/compiler/describe.js.map +1 -0
  33. package/dist/implementation/compiler/estree.js.map +1 -1
  34. package/dist/implementation/compiler/expression.js +26 -2
  35. package/dist/implementation/compiler/expression.js.map +1 -1
  36. package/dist/implementation/compiler/failure.js.map +1 -1
  37. package/dist/implementation/compiler/identify.d.ts +18 -8
  38. package/dist/implementation/compiler/identify.js +90 -32
  39. package/dist/implementation/compiler/identify.js.map +1 -1
  40. package/dist/implementation/compiler/index.d.ts +5 -1
  41. package/dist/implementation/compiler/index.js +6 -1
  42. package/dist/implementation/compiler/index.js.map +1 -1
  43. package/dist/implementation/compiler/inferred.d.ts +32 -0
  44. package/dist/implementation/compiler/inferred.js +185 -0
  45. package/dist/implementation/compiler/inferred.js.map +1 -0
  46. package/dist/implementation/compiler/inline-kernels.d.ts +7 -0
  47. package/dist/implementation/compiler/inline-kernels.js +16 -0
  48. package/dist/implementation/compiler/inline-kernels.js.map +1 -0
  49. package/dist/implementation/compiler/input-schemas.d.ts +23 -0
  50. package/dist/implementation/compiler/input-schemas.js +102 -0
  51. package/dist/implementation/compiler/input-schemas.js.map +1 -0
  52. package/dist/implementation/compiler/ir.d.ts +13 -1
  53. package/dist/implementation/compiler/ir.js.map +1 -1
  54. package/dist/implementation/compiler/kernel-id.js +1 -0
  55. package/dist/implementation/compiler/kernel-id.js.map +1 -1
  56. package/dist/implementation/compiler/key.js.map +1 -1
  57. package/dist/implementation/compiler/link.d.ts +13 -0
  58. package/dist/implementation/compiler/link.js +17 -0
  59. package/dist/implementation/compiler/link.js.map +1 -1
  60. package/dist/implementation/compiler/lists.d.ts +12 -1
  61. package/dist/implementation/compiler/lists.js +35 -14
  62. package/dist/implementation/compiler/lists.js.map +1 -1
  63. package/dist/implementation/compiler/lookups.js.map +1 -1
  64. package/dist/implementation/compiler/math.js +1 -0
  65. package/dist/implementation/compiler/math.js.map +1 -1
  66. package/dist/implementation/compiler/memory-compiler.d.ts +61 -0
  67. package/dist/implementation/compiler/memory-compiler.js +271 -0
  68. package/dist/implementation/compiler/memory-compiler.js.map +1 -0
  69. package/dist/implementation/compiler/module-scope.js.map +1 -1
  70. package/dist/implementation/compiler/module-value.js +18 -3
  71. package/dist/implementation/compiler/module-value.js.map +1 -1
  72. package/dist/implementation/compiler/out.js.map +1 -1
  73. package/dist/implementation/compiler/oxc.d.ts +41 -0
  74. package/dist/implementation/compiler/oxc.js +80 -0
  75. package/dist/implementation/compiler/oxc.js.map +1 -0
  76. package/dist/implementation/compiler/package-copies.d.ts +60 -0
  77. package/dist/implementation/compiler/package-copies.js +140 -0
  78. package/dist/implementation/compiler/package-copies.js.map +1 -0
  79. package/dist/implementation/compiler/passes.d.ts +25 -0
  80. package/dist/implementation/compiler/passes.js +24 -0
  81. package/dist/implementation/compiler/passes.js.map +1 -0
  82. package/dist/implementation/compiler/paths.d.ts +5 -14
  83. package/dist/implementation/compiler/paths.js +16 -25
  84. package/dist/implementation/compiler/paths.js.map +1 -1
  85. package/dist/implementation/compiler/plugin.d.ts +17 -1
  86. package/dist/implementation/compiler/plugin.js +207 -35
  87. package/dist/implementation/compiler/plugin.js.map +1 -1
  88. package/dist/implementation/compiler/posix.d.ts +8 -0
  89. package/dist/implementation/compiler/posix.js +205 -0
  90. package/dist/implementation/compiler/posix.js.map +1 -0
  91. package/dist/implementation/compiler/predicates.d.ts +11 -0
  92. package/dist/implementation/compiler/predicates.js +281 -0
  93. package/dist/implementation/compiler/predicates.js.map +1 -0
  94. package/dist/implementation/compiler/print.js +27 -7
  95. package/dist/implementation/compiler/print.js.map +1 -1
  96. package/dist/implementation/compiler/program.js +3 -0
  97. package/dist/implementation/compiler/program.js.map +1 -1
  98. package/dist/implementation/compiler/public.d.ts +1 -0
  99. package/dist/implementation/compiler/public.js +3 -0
  100. package/dist/implementation/compiler/public.js.map +1 -0
  101. package/dist/implementation/compiler/scalar.js.map +1 -1
  102. package/dist/implementation/compiler/scope.js.map +1 -1
  103. package/dist/implementation/compiler/serialize.js +1 -0
  104. package/dist/implementation/compiler/serialize.js.map +1 -1
  105. package/dist/implementation/compiler/signature.d.ts +18 -3
  106. package/dist/implementation/compiler/signature.js +68 -30
  107. package/dist/implementation/compiler/signature.js.map +1 -1
  108. package/dist/implementation/compiler/snapshot.d.ts +3 -1
  109. package/dist/implementation/compiler/snapshot.js +1 -1
  110. package/dist/implementation/compiler/snapshot.js.map +1 -1
  111. package/dist/implementation/compiler/source-map.js +1 -0
  112. package/dist/implementation/compiler/source-map.js.map +1 -1
  113. package/dist/implementation/compiler/spawns.d.ts +13 -1
  114. package/dist/implementation/compiler/spawns.js +67 -5
  115. package/dist/implementation/compiler/spawns.js.map +1 -1
  116. package/dist/implementation/compiler/stamps.d.ts +10 -3
  117. package/dist/implementation/compiler/stamps.js +28 -9
  118. package/dist/implementation/compiler/stamps.js.map +1 -1
  119. package/dist/implementation/compiler/statement.js.map +1 -1
  120. package/dist/implementation/compiler/terminal.js.map +1 -1
  121. package/dist/implementation/compiler/transform.d.ts +55 -5
  122. package/dist/implementation/compiler/transform.js +311 -55
  123. package/dist/implementation/compiler/transform.js.map +1 -1
  124. package/dist/implementation/compiler/type-schemas.d.ts +130 -0
  125. package/dist/implementation/compiler/type-schemas.js +701 -0
  126. package/dist/implementation/compiler/type-schemas.js.map +1 -0
  127. package/dist/implementation/compiler/unit.d.ts +20 -3
  128. package/dist/implementation/compiler/unit.js +2 -2
  129. package/dist/implementation/compiler/unit.js.map +1 -1
  130. package/dist/implementation/compiler/value.js.map +1 -1
  131. package/dist/implementation/compiler/wat.d.ts +12 -0
  132. package/dist/implementation/compiler/wat.js +379 -0
  133. package/dist/implementation/compiler/wat.js.map +1 -0
  134. package/dist/implementation/index.js +1 -0
  135. package/dist/implementation/index.js.map +1 -1
  136. package/dist/implementation/world/activate.js +8 -3
  137. package/dist/implementation/world/activate.js.map +1 -1
  138. package/dist/implementation/world/archetype.d.ts +64 -9
  139. package/dist/implementation/world/archetype.js +103 -14
  140. package/dist/implementation/world/archetype.js.map +1 -1
  141. package/dist/implementation/world/arrays.d.ts +6 -1
  142. package/dist/implementation/world/arrays.js +3 -0
  143. package/dist/implementation/world/arrays.js.map +1 -1
  144. package/dist/implementation/world/arrivals.d.ts +52 -0
  145. package/dist/implementation/world/arrivals.js +146 -0
  146. package/dist/implementation/world/arrivals.js.map +1 -0
  147. package/dist/implementation/world/attach-kernel.d.ts +3 -2
  148. package/dist/implementation/world/attach-kernel.js +16 -8
  149. package/dist/implementation/world/attach-kernel.js.map +1 -1
  150. package/dist/implementation/world/batches.d.ts +5 -2
  151. package/dist/implementation/world/batches.js +72 -8
  152. package/dist/implementation/world/batches.js.map +1 -1
  153. package/dist/implementation/world/buffer.js +37 -4
  154. package/dist/implementation/world/buffer.js.map +1 -1
  155. package/dist/implementation/world/cascade.js +1 -1
  156. package/dist/implementation/world/cascade.js.map +1 -1
  157. package/dist/implementation/world/cells.js.map +1 -1
  158. package/dist/implementation/world/check-kernel.d.ts +7 -5
  159. package/dist/implementation/world/check-kernel.js +51 -34
  160. package/dist/implementation/world/check-kernel.js.map +1 -1
  161. package/dist/implementation/world/claims.js +1 -0
  162. package/dist/implementation/world/claims.js.map +1 -1
  163. package/dist/implementation/world/closure.js +1 -0
  164. package/dist/implementation/world/closure.js.map +1 -1
  165. package/dist/implementation/world/command-ring.js +2 -1
  166. package/dist/implementation/world/command-ring.js.map +1 -1
  167. package/dist/implementation/world/commands.js +26 -4
  168. package/dist/implementation/world/commands.js.map +1 -1
  169. package/dist/implementation/world/create.d.ts +40 -0
  170. package/dist/implementation/world/create.js +479 -257
  171. package/dist/implementation/world/create.js.map +1 -1
  172. package/dist/implementation/world/directories.js +2 -1
  173. package/dist/implementation/world/directories.js.map +1 -1
  174. package/dist/implementation/world/entities.js.map +1 -1
  175. package/dist/implementation/world/execute.d.ts +1 -7
  176. package/dist/implementation/world/execute.js +248 -107
  177. package/dist/implementation/world/execute.js.map +1 -1
  178. package/dist/implementation/world/failures.d.ts +48 -5
  179. package/dist/implementation/world/failures.js +36 -4
  180. package/dist/implementation/world/failures.js.map +1 -1
  181. package/dist/implementation/world/finalizers.d.ts +2 -0
  182. package/dist/implementation/world/finalizers.js +42 -14
  183. package/dist/implementation/world/finalizers.js.map +1 -1
  184. package/dist/implementation/world/gpu.d.ts +8 -8
  185. package/dist/implementation/world/gpu.js +21 -12
  186. package/dist/implementation/world/gpu.js.map +1 -1
  187. package/dist/implementation/world/holders.js +1 -0
  188. package/dist/implementation/world/holders.js.map +1 -1
  189. package/dist/implementation/world/index-build.js +1 -0
  190. package/dist/implementation/world/index-build.js.map +1 -1
  191. package/dist/implementation/world/index-hash.d.ts +52 -13
  192. package/dist/implementation/world/index-hash.js +440 -71
  193. package/dist/implementation/world/index-hash.js.map +1 -1
  194. package/dist/implementation/world/index-keys.js +1 -0
  195. package/dist/implementation/world/index-keys.js.map +1 -1
  196. package/dist/implementation/world/index-lookups.d.ts +3 -3
  197. package/dist/implementation/world/index-lookups.js +22 -17
  198. package/dist/implementation/world/index-lookups.js.map +1 -1
  199. package/dist/implementation/world/index-order.js.map +1 -1
  200. package/dist/implementation/world/index-readers.js.map +1 -1
  201. package/dist/implementation/world/index-sorted.d.ts +2 -2
  202. package/dist/implementation/world/index-sorted.js +10 -4
  203. package/dist/implementation/world/index-sorted.js.map +1 -1
  204. package/dist/implementation/world/indexes.d.ts +9 -14
  205. package/dist/implementation/world/indexes.js +57 -115
  206. package/dist/implementation/world/indexes.js.map +1 -1
  207. package/dist/implementation/world/input.js +1 -1
  208. package/dist/implementation/world/input.js.map +1 -1
  209. package/dist/implementation/world/intrinsics.js.map +1 -1
  210. package/dist/implementation/world/join.d.ts +10 -7
  211. package/dist/implementation/world/join.js +116 -59
  212. package/dist/implementation/world/join.js.map +1 -1
  213. package/dist/implementation/world/joined-observer.d.ts +31 -2
  214. package/dist/implementation/world/joined-observer.js +69 -17
  215. package/dist/implementation/world/joined-observer.js.map +1 -1
  216. package/dist/implementation/world/joining.d.ts +60 -6
  217. package/dist/implementation/world/joining.js +47 -3
  218. package/dist/implementation/world/joining.js.map +1 -1
  219. package/dist/implementation/world/journal.d.ts +3 -2
  220. package/dist/implementation/world/journal.js +7 -4
  221. package/dist/implementation/world/journal.js.map +1 -1
  222. package/dist/implementation/world/kernel-indexes.d.ts +9 -2
  223. package/dist/implementation/world/kernel-indexes.js +13 -3
  224. package/dist/implementation/world/kernel-indexes.js.map +1 -1
  225. package/dist/implementation/world/kernel.d.ts +39 -5
  226. package/dist/implementation/world/kernel.js +2 -0
  227. package/dist/implementation/world/kernel.js.map +1 -1
  228. package/dist/implementation/world/kernels.d.ts +10 -2
  229. package/dist/implementation/world/kernels.js +85 -13
  230. package/dist/implementation/world/kernels.js.map +1 -1
  231. package/dist/implementation/world/layout-directory.d.ts +28 -12
  232. package/dist/implementation/world/layout-directory.js +72 -17
  233. package/dist/implementation/world/layout-directory.js.map +1 -1
  234. package/dist/implementation/world/lists.d.ts +37 -7
  235. package/dist/implementation/world/lists.js +169 -29
  236. package/dist/implementation/world/lists.js.map +1 -1
  237. package/dist/implementation/world/lookup-keys.d.ts +9 -8
  238. package/dist/implementation/world/lookup-keys.js.map +1 -1
  239. package/dist/implementation/world/loop.js +4 -5
  240. package/dist/implementation/world/loop.js.map +1 -1
  241. package/dist/implementation/world/memory.js +1 -0
  242. package/dist/implementation/world/memory.js.map +1 -1
  243. package/dist/implementation/world/mirror.d.ts +16 -3
  244. package/dist/implementation/world/mirror.js +37 -9
  245. package/dist/implementation/world/mirror.js.map +1 -1
  246. package/dist/implementation/world/move-log.js.map +1 -1
  247. package/dist/implementation/world/observer.d.ts +1 -1
  248. package/dist/implementation/world/observer.js +1 -2
  249. package/dist/implementation/world/observer.js.map +1 -1
  250. package/dist/implementation/world/order.js +1 -0
  251. package/dist/implementation/world/order.js.map +1 -1
  252. package/dist/implementation/world/out-of-band.d.ts +28 -0
  253. package/dist/implementation/world/out-of-band.js +66 -0
  254. package/dist/implementation/world/out-of-band.js.map +1 -0
  255. package/dist/implementation/world/plan.js.map +1 -1
  256. package/dist/implementation/world/pool.js +1 -0
  257. package/dist/implementation/world/pool.js.map +1 -1
  258. package/dist/implementation/world/port.d.ts +4 -3
  259. package/dist/implementation/world/port.js +14 -9
  260. package/dist/implementation/world/port.js.map +1 -1
  261. package/dist/implementation/world/prepared-lookup.js +1 -0
  262. package/dist/implementation/world/prepared-lookup.js.map +1 -1
  263. package/dist/implementation/world/prepared-spawn.js +13 -9
  264. package/dist/implementation/world/prepared-spawn.js.map +1 -1
  265. package/dist/implementation/world/program.js.map +1 -1
  266. package/dist/implementation/world/protocol.d.ts +8 -1
  267. package/dist/implementation/world/protocol.js.map +1 -1
  268. package/dist/implementation/world/publish.js.map +1 -1
  269. package/dist/implementation/world/ranges.d.ts +13 -3
  270. package/dist/implementation/world/ranges.js +118 -35
  271. package/dist/implementation/world/ranges.js.map +1 -1
  272. package/dist/implementation/world/reclaim.d.ts +27 -0
  273. package/dist/implementation/world/reclaim.js +176 -0
  274. package/dist/implementation/world/reclaim.js.map +1 -0
  275. package/dist/implementation/world/reductions.d.ts +7 -6
  276. package/dist/implementation/world/reductions.js +11 -11
  277. package/dist/implementation/world/reductions.js.map +1 -1
  278. package/dist/implementation/world/register.js +2 -2
  279. package/dist/implementation/world/register.js.map +1 -1
  280. package/dist/implementation/world/remote-systems.d.ts +9 -4
  281. package/dist/implementation/world/remote-systems.js +33 -28
  282. package/dist/implementation/world/remote-systems.js.map +1 -1
  283. package/dist/implementation/world/remote.js +1 -0
  284. package/dist/implementation/world/remote.js.map +1 -1
  285. package/dist/implementation/world/render-order.d.ts +19 -0
  286. package/dist/implementation/world/render-order.js +126 -0
  287. package/dist/implementation/world/render-order.js.map +1 -0
  288. package/dist/implementation/world/required.d.ts +3 -0
  289. package/dist/implementation/world/required.js +9 -0
  290. package/dist/implementation/world/required.js.map +1 -0
  291. package/dist/implementation/world/resources.d.ts +4 -1
  292. package/dist/implementation/world/resources.js +6 -3
  293. package/dist/implementation/world/resources.js.map +1 -1
  294. package/dist/implementation/world/rows.d.ts +15 -12
  295. package/dist/implementation/world/rows.js +90 -20
  296. package/dist/implementation/world/rows.js.map +1 -1
  297. package/dist/implementation/world/runner.d.ts +10 -0
  298. package/dist/implementation/world/runner.js +398 -78
  299. package/dist/implementation/world/runner.js.map +1 -1
  300. package/dist/implementation/world/shared.d.ts +55 -0
  301. package/dist/implementation/world/shared.js +301 -0
  302. package/dist/implementation/world/shared.js.map +1 -0
  303. package/dist/implementation/world/sharing.d.ts +7 -6
  304. package/dist/implementation/world/sharing.js +86 -23
  305. package/dist/implementation/world/sharing.js.map +1 -1
  306. package/dist/implementation/world/staging.d.ts +28 -5
  307. package/dist/implementation/world/staging.js +35 -9
  308. package/dist/implementation/world/staging.js.map +1 -1
  309. package/dist/implementation/world/state.d.ts +72 -13
  310. package/dist/implementation/world/state.js +138 -14
  311. package/dist/implementation/world/state.js.map +1 -1
  312. package/dist/implementation/world/stop-lists.d.ts +25 -2
  313. package/dist/implementation/world/stop-lists.js +63 -8
  314. package/dist/implementation/world/stop-lists.js.map +1 -1
  315. package/dist/implementation/world/strings.js +1 -0
  316. package/dist/implementation/world/strings.js.map +1 -1
  317. package/dist/implementation/world/structure.d.ts +1 -1
  318. package/dist/implementation/world/structure.js +4 -1
  319. package/dist/implementation/world/structure.js.map +1 -1
  320. package/dist/implementation/world/synchronize.d.ts +1 -1
  321. package/dist/implementation/world/synchronize.js +59 -17
  322. package/dist/implementation/world/synchronize.js.map +1 -1
  323. package/dist/implementation/world/tail-blocks.d.ts +5 -2
  324. package/dist/implementation/world/tail-blocks.js +9 -4
  325. package/dist/implementation/world/tail-blocks.js.map +1 -1
  326. package/dist/implementation/world/tails.d.ts +10 -5
  327. package/dist/implementation/world/tails.js +25 -18
  328. package/dist/implementation/world/tails.js.map +1 -1
  329. package/dist/implementation/world/terminal.js +1 -0
  330. package/dist/implementation/world/terminal.js.map +1 -1
  331. package/dist/implementation/world/thread-directory.d.ts +8 -2
  332. package/dist/implementation/world/thread-directory.js +82 -12
  333. package/dist/implementation/world/thread-directory.js.map +1 -1
  334. package/dist/implementation/world/thread-finalizers.d.ts +1 -2
  335. package/dist/implementation/world/thread-finalizers.js +129 -19
  336. package/dist/implementation/world/thread-finalizers.js.map +1 -1
  337. package/dist/implementation/world/thread-indexes.d.ts +3 -1
  338. package/dist/implementation/world/thread-indexes.js +4 -3
  339. package/dist/implementation/world/thread-indexes.js.map +1 -1
  340. package/dist/implementation/world/thread-observer.d.ts +4 -2
  341. package/dist/implementation/world/thread-observer.js +53 -11
  342. package/dist/implementation/world/thread-observer.js.map +1 -1
  343. package/dist/implementation/world/thread-systems.d.ts +10 -2
  344. package/dist/implementation/world/thread-systems.js +396 -78
  345. package/dist/implementation/world/thread-systems.js.map +1 -1
  346. package/dist/implementation/world/thread-tasks.d.ts +8 -4
  347. package/dist/implementation/world/thread-tasks.js +9 -4
  348. package/dist/implementation/world/thread-tasks.js.map +1 -1
  349. package/dist/implementation/world/transfers.js.map +1 -1
  350. package/dist/implementation/world/up.d.ts +9 -6
  351. package/dist/implementation/world/up.js +291 -75
  352. package/dist/implementation/world/up.js.map +1 -1
  353. package/dist/implementation/world/wasm.d.ts +39 -8
  354. package/dist/implementation/world/wasm.js +428 -127
  355. package/dist/implementation/world/wasm.js.map +1 -1
  356. package/dist/implementation/world/wgsl.d.ts +4 -2
  357. package/dist/implementation/world/wgsl.js +20 -8
  358. package/dist/implementation/world/wgsl.js.map +1 -1
  359. package/dist/implementation/world/where.d.ts +74 -0
  360. package/dist/implementation/world/where.js +202 -0
  361. package/dist/implementation/world/where.js.map +1 -0
  362. package/dist/implementation/world/worker-platform.js.map +1 -1
  363. package/dist/implementation/world/worker-window.d.ts +7 -0
  364. package/dist/implementation/world/worker-window.js +47 -0
  365. package/dist/implementation/world/worker-window.js.map +1 -0
  366. package/dist/implementation/world/worker.js +47 -61
  367. package/dist/implementation/world/worker.js.map +1 -1
  368. package/dist/index.d.ts +20 -0
  369. package/dist/index.js +5 -0
  370. package/dist/index.js.map +1 -1
  371. package/dist/interface/component/component.d.ts +7 -1
  372. package/dist/interface/component/component.js.map +1 -1
  373. package/dist/interface/component/index.d.ts +1 -2
  374. package/dist/interface/component/index.js +1 -1
  375. package/dist/interface/component/index.js.map +1 -1
  376. package/dist/interface/component/types.d.ts +2 -2
  377. package/dist/interface/component/value.d.ts +12 -7
  378. package/dist/interface/component/values.d.ts +2 -2
  379. package/dist/interface/entity/entity.js.map +1 -1
  380. package/dist/interface/entity/index.d.ts +2 -0
  381. package/dist/interface/entity/index.js +2 -0
  382. package/dist/interface/entity/index.js.map +1 -1
  383. package/dist/interface/finalizer/body.d.ts +17 -14
  384. package/dist/interface/finalizer/create.d.ts +14 -14
  385. package/dist/interface/finalizer/create.js +43 -10
  386. package/dist/interface/finalizer/create.js.map +1 -1
  387. package/dist/interface/finalizer/created.d.ts +5 -5
  388. package/dist/interface/finalizer/declaration.d.ts +33 -13
  389. package/dist/interface/finalizer/finalizer.d.ts +2 -2
  390. package/dist/interface/finalizer/finalizer.js.map +1 -1
  391. package/dist/interface/finalizer/index.js +1 -0
  392. package/dist/interface/finalizer/index.js.map +1 -1
  393. package/dist/interface/gpu/accessors.d.ts +4 -3
  394. package/dist/interface/gpu/accessors.js +25 -8
  395. package/dist/interface/gpu/accessors.js.map +1 -1
  396. package/dist/interface/gpu/gpu.js.map +1 -1
  397. package/dist/interface/gpu/index.js +1 -0
  398. package/dist/interface/gpu/index.js.map +1 -1
  399. package/dist/interface/gpu/layout.js +1 -0
  400. package/dist/interface/gpu/layout.js.map +1 -1
  401. package/dist/interface/gpu/record.js +1 -0
  402. package/dist/interface/gpu/record.js.map +1 -1
  403. package/dist/interface/gpu/wgsl.d.ts +2 -1
  404. package/dist/interface/gpu/wgsl.js +9 -5
  405. package/dist/interface/gpu/wgsl.js.map +1 -1
  406. package/dist/interface/index.d.ts +0 -3
  407. package/dist/interface/index.js +1 -3
  408. package/dist/interface/index.js.map +1 -1
  409. package/dist/interface/indexes/create.d.ts +18 -9
  410. package/dist/interface/indexes/create.js +16 -13
  411. package/dist/interface/indexes/create.js.map +1 -1
  412. package/dist/interface/indexes/created.d.ts +2 -2
  413. package/dist/interface/indexes/declaration.d.ts +8 -3
  414. package/dist/interface/indexes/index-type.d.ts +3 -3
  415. package/dist/interface/indexes/index-type.js.map +1 -1
  416. package/dist/interface/indexes/index.js +1 -0
  417. package/dist/interface/indexes/index.js.map +1 -1
  418. package/dist/interface/math/f32/default.d.ts +4 -0
  419. package/dist/interface/math/f32/default.js +4 -0
  420. package/dist/interface/math/f32/default.js.map +1 -0
  421. package/dist/interface/math/f32/index.d.ts +3 -1
  422. package/dist/interface/math/f32/index.js.map +1 -1
  423. package/dist/interface/math/f32/public.d.ts +1 -0
  424. package/dist/interface/math/f32/public.js +2 -0
  425. package/dist/interface/math/f32/public.js.map +1 -1
  426. package/dist/interface/math/f32/round-half-even.js +1 -0
  427. package/dist/interface/math/f32/round-half-even.js.map +1 -1
  428. package/dist/interface/math/f32/schema.js.map +1 -1
  429. package/dist/interface/math/i32/default.d.ts +4 -0
  430. package/dist/interface/math/i32/default.js +4 -0
  431. package/dist/interface/math/i32/default.js.map +1 -0
  432. package/dist/interface/math/i32/index.d.ts +3 -1
  433. package/dist/interface/math/i32/index.js.map +1 -1
  434. package/dist/interface/math/i32/public.d.ts +1 -0
  435. package/dist/interface/math/i32/public.js +2 -0
  436. package/dist/interface/math/i32/public.js.map +1 -1
  437. package/dist/interface/math/i32/schema.js.map +1 -1
  438. package/dist/interface/math/i32/shift-right.js.map +1 -1
  439. package/dist/interface/math/index.js +1 -0
  440. package/dist/interface/math/index.js.map +1 -1
  441. package/dist/interface/math/intrinsic.js.map +1 -1
  442. package/dist/interface/math/mat4x4/add.js.map +1 -1
  443. package/dist/interface/math/mat4x4/determinant.js.map +1 -1
  444. package/dist/interface/math/mat4x4/identity.js.map +1 -1
  445. package/dist/interface/math/mat4x4/index.d.ts +3 -1
  446. package/dist/interface/math/mat4x4/index.js.map +1 -1
  447. package/dist/interface/math/mat4x4/inverse.js.map +1 -1
  448. package/dist/interface/math/mat4x4/look-at.js.map +1 -1
  449. package/dist/interface/math/mat4x4/multiply-vec3.js.map +1 -1
  450. package/dist/interface/math/mat4x4/multiply-vec4.js.map +1 -1
  451. package/dist/interface/math/mat4x4/multiply.js.map +1 -1
  452. package/dist/interface/math/mat4x4/orthographic.js.map +1 -1
  453. package/dist/interface/math/mat4x4/perspective.js.map +1 -1
  454. package/dist/interface/math/mat4x4/public.d.ts +1 -0
  455. package/dist/interface/math/mat4x4/public.js +2 -0
  456. package/dist/interface/math/mat4x4/public.js.map +1 -1
  457. package/dist/interface/math/mat4x4/rotation-x.js.map +1 -1
  458. package/dist/interface/math/mat4x4/rotation-y.js.map +1 -1
  459. package/dist/interface/math/mat4x4/rotation-z.js.map +1 -1
  460. package/dist/interface/math/mat4x4/scale.js.map +1 -1
  461. package/dist/interface/math/mat4x4/scaling.js.map +1 -1
  462. package/dist/interface/math/mat4x4/schema.js.map +1 -1
  463. package/dist/interface/math/mat4x4/subtract.js.map +1 -1
  464. package/dist/interface/math/mat4x4/translation.js.map +1 -1
  465. package/dist/interface/math/mat4x4/transpose.js.map +1 -1
  466. package/dist/interface/math/mat4x4/zero.js.map +1 -1
  467. package/dist/interface/math/quat/add.js.map +1 -1
  468. package/dist/interface/math/quat/align-to.js.map +1 -1
  469. package/dist/interface/math/quat/conjugate.js.map +1 -1
  470. package/dist/interface/math/quat/distance.js.map +1 -1
  471. package/dist/interface/math/quat/dot.js.map +1 -1
  472. package/dist/interface/math/quat/from-axis-angle.js.map +1 -1
  473. package/dist/interface/math/quat/from-euler.js.map +1 -1
  474. package/dist/interface/math/quat/identity.js.map +1 -1
  475. package/dist/interface/math/quat/index.d.ts +3 -1
  476. package/dist/interface/math/quat/index.js.map +1 -1
  477. package/dist/interface/math/quat/inverse.js.map +1 -1
  478. package/dist/interface/math/quat/length-squared.js.map +1 -1
  479. package/dist/interface/math/quat/length.js.map +1 -1
  480. package/dist/interface/math/quat/lerp.js.map +1 -1
  481. package/dist/interface/math/quat/look-at.js.map +1 -1
  482. package/dist/interface/math/quat/multiply.js.map +1 -1
  483. package/dist/interface/math/quat/negate.js.map +1 -1
  484. package/dist/interface/math/quat/normalize.js.map +1 -1
  485. package/dist/interface/math/quat/public.d.ts +1 -0
  486. package/dist/interface/math/quat/public.js +2 -0
  487. package/dist/interface/math/quat/public.js.map +1 -1
  488. package/dist/interface/math/quat/rotate-vec3.js.map +1 -1
  489. package/dist/interface/math/quat/scale.js.map +1 -1
  490. package/dist/interface/math/quat/schema.js.map +1 -1
  491. package/dist/interface/math/quat/slerp.js.map +1 -1
  492. package/dist/interface/math/quat/subtract.js.map +1 -1
  493. package/dist/interface/math/quat/to-axis-angle.js.map +1 -1
  494. package/dist/interface/math/quat/to-euler.js.map +1 -1
  495. package/dist/interface/math/quat/to-mat4.js.map +1 -1
  496. package/dist/interface/math/u32/count-leading-zeros.js.map +1 -1
  497. package/dist/interface/math/u32/count-one-bits.js.map +1 -1
  498. package/dist/interface/math/u32/count-trailing-zeros.js.map +1 -1
  499. package/dist/interface/math/u32/default.d.ts +4 -0
  500. package/dist/interface/math/u32/default.js +4 -0
  501. package/dist/interface/math/u32/default.js.map +1 -0
  502. package/dist/interface/math/u32/index.d.ts +3 -1
  503. package/dist/interface/math/u32/index.js.map +1 -1
  504. package/dist/interface/math/u32/public.d.ts +1 -0
  505. package/dist/interface/math/u32/public.js +2 -0
  506. package/dist/interface/math/u32/public.js.map +1 -1
  507. package/dist/interface/math/u32/reverse-bits.js.map +1 -1
  508. package/dist/interface/math/u32/schema.js.map +1 -1
  509. package/dist/interface/math/u32/shift-right.js.map +1 -1
  510. package/dist/interface/math/vec2/f32/abs.js.map +1 -1
  511. package/dist/interface/math/vec2/f32/acos.js.map +1 -1
  512. package/dist/interface/math/vec2/f32/acosh.js.map +1 -1
  513. package/dist/interface/math/vec2/f32/add.js.map +1 -1
  514. package/dist/interface/math/vec2/f32/asin.js.map +1 -1
  515. package/dist/interface/math/vec2/f32/asinh.js.map +1 -1
  516. package/dist/interface/math/vec2/f32/atan.js.map +1 -1
  517. package/dist/interface/math/vec2/f32/atanh.js.map +1 -1
  518. package/dist/interface/math/vec2/f32/ceil.js.map +1 -1
  519. package/dist/interface/math/vec2/f32/clamp.js.map +1 -1
  520. package/dist/interface/math/vec2/f32/cos.js.map +1 -1
  521. package/dist/interface/math/vec2/f32/cosh.js.map +1 -1
  522. package/dist/interface/math/vec2/f32/distance.js.map +1 -1
  523. package/dist/interface/math/vec2/f32/dot.js.map +1 -1
  524. package/dist/interface/math/vec2/f32/equals.js.map +1 -1
  525. package/dist/interface/math/vec2/f32/exp.js.map +1 -1
  526. package/dist/interface/math/vec2/f32/exp2.js.map +1 -1
  527. package/dist/interface/math/vec2/f32/f32.d.ts +3 -1
  528. package/dist/interface/math/vec2/f32/f32.js.map +1 -1
  529. package/dist/interface/math/vec2/f32/faceforward.js.map +1 -1
  530. package/dist/interface/math/vec2/f32/floor.js.map +1 -1
  531. package/dist/interface/math/vec2/f32/fract.js.map +1 -1
  532. package/dist/interface/math/vec2/f32/length.js.map +1 -1
  533. package/dist/interface/math/vec2/f32/log.js.map +1 -1
  534. package/dist/interface/math/vec2/f32/log2.js.map +1 -1
  535. package/dist/interface/math/vec2/f32/max.js.map +1 -1
  536. package/dist/interface/math/vec2/f32/min.js.map +1 -1
  537. package/dist/interface/math/vec2/f32/mix.js.map +1 -1
  538. package/dist/interface/math/vec2/f32/mod.js.map +1 -1
  539. package/dist/interface/math/vec2/f32/modf.js.map +1 -1
  540. package/dist/interface/math/vec2/f32/negate.js.map +1 -1
  541. package/dist/interface/math/vec2/f32/normalize.js.map +1 -1
  542. package/dist/interface/math/vec2/f32/pow.js.map +1 -1
  543. package/dist/interface/math/vec2/f32/public.d.ts +1 -0
  544. package/dist/interface/math/vec2/f32/public.js +2 -0
  545. package/dist/interface/math/vec2/f32/public.js.map +1 -1
  546. package/dist/interface/math/vec2/f32/reflect.js.map +1 -1
  547. package/dist/interface/math/vec2/f32/refract.js.map +1 -1
  548. package/dist/interface/math/vec2/f32/round.js.map +1 -1
  549. package/dist/interface/math/vec2/f32/scale.js.map +1 -1
  550. package/dist/interface/math/vec2/f32/schema.js.map +1 -1
  551. package/dist/interface/math/vec2/f32/sign.js.map +1 -1
  552. package/dist/interface/math/vec2/f32/sin.js.map +1 -1
  553. package/dist/interface/math/vec2/f32/sinh.js.map +1 -1
  554. package/dist/interface/math/vec2/f32/smoothstep.js.map +1 -1
  555. package/dist/interface/math/vec2/f32/sqrt.js.map +1 -1
  556. package/dist/interface/math/vec2/f32/step.js.map +1 -1
  557. package/dist/interface/math/vec2/f32/subtract.js.map +1 -1
  558. package/dist/interface/math/vec2/f32/tan.js.map +1 -1
  559. package/dist/interface/math/vec2/f32/tanh.js.map +1 -1
  560. package/dist/interface/math/vec2/f32/trunc.js.map +1 -1
  561. package/dist/interface/math/vec2/f32/zero.js.map +1 -1
  562. package/dist/interface/math/vec2/i32/abs.js.map +1 -1
  563. package/dist/interface/math/vec2/i32/add.js.map +1 -1
  564. package/dist/interface/math/vec2/i32/bitwise-and.js.map +1 -1
  565. package/dist/interface/math/vec2/i32/bitwise-not.js.map +1 -1
  566. package/dist/interface/math/vec2/i32/bitwise-or.js.map +1 -1
  567. package/dist/interface/math/vec2/i32/bitwise-xor.js.map +1 -1
  568. package/dist/interface/math/vec2/i32/clamp.js.map +1 -1
  569. package/dist/interface/math/vec2/i32/count-leading-zeros.js.map +1 -1
  570. package/dist/interface/math/vec2/i32/count-one-bits.js.map +1 -1
  571. package/dist/interface/math/vec2/i32/count-trailing-zeros.js.map +1 -1
  572. package/dist/interface/math/vec2/i32/equals.js.map +1 -1
  573. package/dist/interface/math/vec2/i32/i32.d.ts +3 -1
  574. package/dist/interface/math/vec2/i32/i32.js.map +1 -1
  575. package/dist/interface/math/vec2/i32/max.js.map +1 -1
  576. package/dist/interface/math/vec2/i32/min.js.map +1 -1
  577. package/dist/interface/math/vec2/i32/negate.js.map +1 -1
  578. package/dist/interface/math/vec2/i32/public.d.ts +1 -0
  579. package/dist/interface/math/vec2/i32/public.js +2 -0
  580. package/dist/interface/math/vec2/i32/public.js.map +1 -1
  581. package/dist/interface/math/vec2/i32/reverse-bits.js.map +1 -1
  582. package/dist/interface/math/vec2/i32/scale.js.map +1 -1
  583. package/dist/interface/math/vec2/i32/schema.js.map +1 -1
  584. package/dist/interface/math/vec2/i32/shift-left.js.map +1 -1
  585. package/dist/interface/math/vec2/i32/shift-right.js.map +1 -1
  586. package/dist/interface/math/vec2/i32/subtract.js.map +1 -1
  587. package/dist/interface/math/vec2/i32/zero.js.map +1 -1
  588. package/dist/interface/math/vec2/index.js.map +1 -1
  589. package/dist/interface/math/vec2/public.d.ts +1 -0
  590. package/dist/interface/math/vec2/public.js +2 -0
  591. package/dist/interface/math/vec2/public.js.map +1 -1
  592. package/dist/interface/math/vec2/u32/add.js.map +1 -1
  593. package/dist/interface/math/vec2/u32/bitwise-and.js.map +1 -1
  594. package/dist/interface/math/vec2/u32/bitwise-not.js.map +1 -1
  595. package/dist/interface/math/vec2/u32/bitwise-or.js.map +1 -1
  596. package/dist/interface/math/vec2/u32/bitwise-xor.js.map +1 -1
  597. package/dist/interface/math/vec2/u32/clamp.js.map +1 -1
  598. package/dist/interface/math/vec2/u32/count-leading-zeros.js.map +1 -1
  599. package/dist/interface/math/vec2/u32/count-one-bits.js.map +1 -1
  600. package/dist/interface/math/vec2/u32/count-trailing-zeros.js.map +1 -1
  601. package/dist/interface/math/vec2/u32/equals.js.map +1 -1
  602. package/dist/interface/math/vec2/u32/max.js.map +1 -1
  603. package/dist/interface/math/vec2/u32/min.js.map +1 -1
  604. package/dist/interface/math/vec2/u32/negate.js.map +1 -1
  605. package/dist/interface/math/vec2/u32/public.d.ts +1 -0
  606. package/dist/interface/math/vec2/u32/public.js +2 -0
  607. package/dist/interface/math/vec2/u32/public.js.map +1 -1
  608. package/dist/interface/math/vec2/u32/reverse-bits.js.map +1 -1
  609. package/dist/interface/math/vec2/u32/scale.js.map +1 -1
  610. package/dist/interface/math/vec2/u32/schema.js.map +1 -1
  611. package/dist/interface/math/vec2/u32/shift-left.js.map +1 -1
  612. package/dist/interface/math/vec2/u32/shift-right.js.map +1 -1
  613. package/dist/interface/math/vec2/u32/subtract.js.map +1 -1
  614. package/dist/interface/math/vec2/u32/u32.d.ts +3 -1
  615. package/dist/interface/math/vec2/u32/u32.js.map +1 -1
  616. package/dist/interface/math/vec2/u32/zero.js.map +1 -1
  617. package/dist/interface/math/vec3/f32/abs.js.map +1 -1
  618. package/dist/interface/math/vec3/f32/acos.js.map +1 -1
  619. package/dist/interface/math/vec3/f32/acosh.js.map +1 -1
  620. package/dist/interface/math/vec3/f32/add.js.map +1 -1
  621. package/dist/interface/math/vec3/f32/asin.js.map +1 -1
  622. package/dist/interface/math/vec3/f32/asinh.js.map +1 -1
  623. package/dist/interface/math/vec3/f32/atan.js.map +1 -1
  624. package/dist/interface/math/vec3/f32/atanh.js.map +1 -1
  625. package/dist/interface/math/vec3/f32/ceil.js.map +1 -1
  626. package/dist/interface/math/vec3/f32/clamp.js.map +1 -1
  627. package/dist/interface/math/vec3/f32/cos.js.map +1 -1
  628. package/dist/interface/math/vec3/f32/cosh.js.map +1 -1
  629. package/dist/interface/math/vec3/f32/cross.js.map +1 -1
  630. package/dist/interface/math/vec3/f32/distance-squared.js.map +1 -1
  631. package/dist/interface/math/vec3/f32/distance.js.map +1 -1
  632. package/dist/interface/math/vec3/f32/dot.js.map +1 -1
  633. package/dist/interface/math/vec3/f32/equals.js.map +1 -1
  634. package/dist/interface/math/vec3/f32/exp.js.map +1 -1
  635. package/dist/interface/math/vec3/f32/exp2.js.map +1 -1
  636. package/dist/interface/math/vec3/f32/f32.d.ts +3 -1
  637. package/dist/interface/math/vec3/f32/f32.js.map +1 -1
  638. package/dist/interface/math/vec3/f32/faceforward.js.map +1 -1
  639. package/dist/interface/math/vec3/f32/floor.js.map +1 -1
  640. package/dist/interface/math/vec3/f32/fract.js.map +1 -1
  641. package/dist/interface/math/vec3/f32/length-squared.js.map +1 -1
  642. package/dist/interface/math/vec3/f32/length.js.map +1 -1
  643. package/dist/interface/math/vec3/f32/log.js.map +1 -1
  644. package/dist/interface/math/vec3/f32/log2.js.map +1 -1
  645. package/dist/interface/math/vec3/f32/max.js.map +1 -1
  646. package/dist/interface/math/vec3/f32/min.js.map +1 -1
  647. package/dist/interface/math/vec3/f32/mix.js.map +1 -1
  648. package/dist/interface/math/vec3/f32/mod.js.map +1 -1
  649. package/dist/interface/math/vec3/f32/modf.js.map +1 -1
  650. package/dist/interface/math/vec3/f32/multiply.js.map +1 -1
  651. package/dist/interface/math/vec3/f32/negate.js.map +1 -1
  652. package/dist/interface/math/vec3/f32/normalize.js.map +1 -1
  653. package/dist/interface/math/vec3/f32/one.js.map +1 -1
  654. package/dist/interface/math/vec3/f32/pow.js.map +1 -1
  655. package/dist/interface/math/vec3/f32/public.d.ts +1 -0
  656. package/dist/interface/math/vec3/f32/public.js +2 -0
  657. package/dist/interface/math/vec3/f32/public.js.map +1 -1
  658. package/dist/interface/math/vec3/f32/random.js.map +1 -1
  659. package/dist/interface/math/vec3/f32/reflect.js.map +1 -1
  660. package/dist/interface/math/vec3/f32/refract.js.map +1 -1
  661. package/dist/interface/math/vec3/f32/round.js.map +1 -1
  662. package/dist/interface/math/vec3/f32/scale.js.map +1 -1
  663. package/dist/interface/math/vec3/f32/schema.js.map +1 -1
  664. package/dist/interface/math/vec3/f32/sign.js.map +1 -1
  665. package/dist/interface/math/vec3/f32/sin.js.map +1 -1
  666. package/dist/interface/math/vec3/f32/sinh.js.map +1 -1
  667. package/dist/interface/math/vec3/f32/smoothstep.js.map +1 -1
  668. package/dist/interface/math/vec3/f32/sqrt.js.map +1 -1
  669. package/dist/interface/math/vec3/f32/step.js.map +1 -1
  670. package/dist/interface/math/vec3/f32/subtract.js.map +1 -1
  671. package/dist/interface/math/vec3/f32/tan.js.map +1 -1
  672. package/dist/interface/math/vec3/f32/tanh.js.map +1 -1
  673. package/dist/interface/math/vec3/f32/trunc.js.map +1 -1
  674. package/dist/interface/math/vec3/f32/zero.js.map +1 -1
  675. package/dist/interface/math/vec3/i32/abs.js.map +1 -1
  676. package/dist/interface/math/vec3/i32/add.js.map +1 -1
  677. package/dist/interface/math/vec3/i32/bitwise-and.js.map +1 -1
  678. package/dist/interface/math/vec3/i32/bitwise-not.js.map +1 -1
  679. package/dist/interface/math/vec3/i32/bitwise-or.js.map +1 -1
  680. package/dist/interface/math/vec3/i32/bitwise-xor.js.map +1 -1
  681. package/dist/interface/math/vec3/i32/clamp.js.map +1 -1
  682. package/dist/interface/math/vec3/i32/count-leading-zeros.js.map +1 -1
  683. package/dist/interface/math/vec3/i32/count-one-bits.js.map +1 -1
  684. package/dist/interface/math/vec3/i32/count-trailing-zeros.js.map +1 -1
  685. package/dist/interface/math/vec3/i32/equals.js.map +1 -1
  686. package/dist/interface/math/vec3/i32/i32.d.ts +3 -1
  687. package/dist/interface/math/vec3/i32/i32.js.map +1 -1
  688. package/dist/interface/math/vec3/i32/max.js.map +1 -1
  689. package/dist/interface/math/vec3/i32/min.js.map +1 -1
  690. package/dist/interface/math/vec3/i32/multiply.js.map +1 -1
  691. package/dist/interface/math/vec3/i32/negate.js.map +1 -1
  692. package/dist/interface/math/vec3/i32/one.js.map +1 -1
  693. package/dist/interface/math/vec3/i32/public.d.ts +1 -0
  694. package/dist/interface/math/vec3/i32/public.js +2 -0
  695. package/dist/interface/math/vec3/i32/public.js.map +1 -1
  696. package/dist/interface/math/vec3/i32/reverse-bits.js.map +1 -1
  697. package/dist/interface/math/vec3/i32/scale.js.map +1 -1
  698. package/dist/interface/math/vec3/i32/schema.js.map +1 -1
  699. package/dist/interface/math/vec3/i32/shift-left.js.map +1 -1
  700. package/dist/interface/math/vec3/i32/shift-right.js.map +1 -1
  701. package/dist/interface/math/vec3/i32/subtract.js.map +1 -1
  702. package/dist/interface/math/vec3/i32/zero.js.map +1 -1
  703. package/dist/interface/math/vec3/index.js.map +1 -1
  704. package/dist/interface/math/vec3/public.d.ts +1 -0
  705. package/dist/interface/math/vec3/public.js +2 -0
  706. package/dist/interface/math/vec3/public.js.map +1 -1
  707. package/dist/interface/math/vec3/u32/add.js.map +1 -1
  708. package/dist/interface/math/vec3/u32/bitwise-and.js.map +1 -1
  709. package/dist/interface/math/vec3/u32/bitwise-not.js.map +1 -1
  710. package/dist/interface/math/vec3/u32/bitwise-or.js.map +1 -1
  711. package/dist/interface/math/vec3/u32/bitwise-xor.js.map +1 -1
  712. package/dist/interface/math/vec3/u32/clamp.js.map +1 -1
  713. package/dist/interface/math/vec3/u32/count-leading-zeros.js.map +1 -1
  714. package/dist/interface/math/vec3/u32/count-one-bits.js.map +1 -1
  715. package/dist/interface/math/vec3/u32/count-trailing-zeros.js.map +1 -1
  716. package/dist/interface/math/vec3/u32/equals.js.map +1 -1
  717. package/dist/interface/math/vec3/u32/max.js.map +1 -1
  718. package/dist/interface/math/vec3/u32/min.js.map +1 -1
  719. package/dist/interface/math/vec3/u32/multiply.js.map +1 -1
  720. package/dist/interface/math/vec3/u32/negate.js.map +1 -1
  721. package/dist/interface/math/vec3/u32/one.js.map +1 -1
  722. package/dist/interface/math/vec3/u32/public.d.ts +1 -0
  723. package/dist/interface/math/vec3/u32/public.js +2 -0
  724. package/dist/interface/math/vec3/u32/public.js.map +1 -1
  725. package/dist/interface/math/vec3/u32/reverse-bits.js.map +1 -1
  726. package/dist/interface/math/vec3/u32/scale.js.map +1 -1
  727. package/dist/interface/math/vec3/u32/schema.js.map +1 -1
  728. package/dist/interface/math/vec3/u32/shift-left.js.map +1 -1
  729. package/dist/interface/math/vec3/u32/shift-right.js.map +1 -1
  730. package/dist/interface/math/vec3/u32/subtract.js.map +1 -1
  731. package/dist/interface/math/vec3/u32/u32.d.ts +3 -1
  732. package/dist/interface/math/vec3/u32/u32.js.map +1 -1
  733. package/dist/interface/math/vec3/u32/volume.js.map +1 -1
  734. package/dist/interface/math/vec3/u32/zero.js.map +1 -1
  735. package/dist/interface/math/vec4/f32/abs.js.map +1 -1
  736. package/dist/interface/math/vec4/f32/acos.js.map +1 -1
  737. package/dist/interface/math/vec4/f32/acosh.js.map +1 -1
  738. package/dist/interface/math/vec4/f32/add.js.map +1 -1
  739. package/dist/interface/math/vec4/f32/asin.js.map +1 -1
  740. package/dist/interface/math/vec4/f32/asinh.js.map +1 -1
  741. package/dist/interface/math/vec4/f32/atan.js.map +1 -1
  742. package/dist/interface/math/vec4/f32/atanh.js.map +1 -1
  743. package/dist/interface/math/vec4/f32/ceil.js.map +1 -1
  744. package/dist/interface/math/vec4/f32/clamp.js.map +1 -1
  745. package/dist/interface/math/vec4/f32/cos.js.map +1 -1
  746. package/dist/interface/math/vec4/f32/cosh.js.map +1 -1
  747. package/dist/interface/math/vec4/f32/default.d.ts +4 -0
  748. package/dist/interface/math/vec4/f32/default.js +4 -0
  749. package/dist/interface/math/vec4/f32/default.js.map +1 -0
  750. package/dist/interface/math/vec4/f32/distance.js.map +1 -1
  751. package/dist/interface/math/vec4/f32/dot.js.map +1 -1
  752. package/dist/interface/math/vec4/f32/exp.js.map +1 -1
  753. package/dist/interface/math/vec4/f32/exp2.js.map +1 -1
  754. package/dist/interface/math/vec4/f32/f32.d.ts +3 -1
  755. package/dist/interface/math/vec4/f32/f32.js.map +1 -1
  756. package/dist/interface/math/vec4/f32/faceforward.js.map +1 -1
  757. package/dist/interface/math/vec4/f32/floor.js.map +1 -1
  758. package/dist/interface/math/vec4/f32/fract.js.map +1 -1
  759. package/dist/interface/math/vec4/f32/length.js.map +1 -1
  760. package/dist/interface/math/vec4/f32/log.js.map +1 -1
  761. package/dist/interface/math/vec4/f32/log2.js.map +1 -1
  762. package/dist/interface/math/vec4/f32/max.js.map +1 -1
  763. package/dist/interface/math/vec4/f32/min.js.map +1 -1
  764. package/dist/interface/math/vec4/f32/mix.js.map +1 -1
  765. package/dist/interface/math/vec4/f32/mod.js.map +1 -1
  766. package/dist/interface/math/vec4/f32/modf.js.map +1 -1
  767. package/dist/interface/math/vec4/f32/multiply.js.map +1 -1
  768. package/dist/interface/math/vec4/f32/negate.js.map +1 -1
  769. package/dist/interface/math/vec4/f32/normalize.js.map +1 -1
  770. package/dist/interface/math/vec4/f32/pow.js.map +1 -1
  771. package/dist/interface/math/vec4/f32/public.d.ts +1 -0
  772. package/dist/interface/math/vec4/f32/public.js +2 -0
  773. package/dist/interface/math/vec4/f32/public.js.map +1 -1
  774. package/dist/interface/math/vec4/f32/reflect.js.map +1 -1
  775. package/dist/interface/math/vec4/f32/refract.js.map +1 -1
  776. package/dist/interface/math/vec4/f32/round.js.map +1 -1
  777. package/dist/interface/math/vec4/f32/scale.js.map +1 -1
  778. package/dist/interface/math/vec4/f32/schema.js.map +1 -1
  779. package/dist/interface/math/vec4/f32/sign.js.map +1 -1
  780. package/dist/interface/math/vec4/f32/sin.js.map +1 -1
  781. package/dist/interface/math/vec4/f32/sinh.js.map +1 -1
  782. package/dist/interface/math/vec4/f32/smoothstep.js.map +1 -1
  783. package/dist/interface/math/vec4/f32/sqrt.js.map +1 -1
  784. package/dist/interface/math/vec4/f32/step.js.map +1 -1
  785. package/dist/interface/math/vec4/f32/subtract.js.map +1 -1
  786. package/dist/interface/math/vec4/f32/tan.js.map +1 -1
  787. package/dist/interface/math/vec4/f32/tanh.js.map +1 -1
  788. package/dist/interface/math/vec4/f32/trunc.js.map +1 -1
  789. package/dist/interface/math/vec4/i32/abs.js.map +1 -1
  790. package/dist/interface/math/vec4/i32/add.js.map +1 -1
  791. package/dist/interface/math/vec4/i32/bitwise-and.js.map +1 -1
  792. package/dist/interface/math/vec4/i32/bitwise-not.js.map +1 -1
  793. package/dist/interface/math/vec4/i32/bitwise-or.js.map +1 -1
  794. package/dist/interface/math/vec4/i32/bitwise-xor.js.map +1 -1
  795. package/dist/interface/math/vec4/i32/clamp.js.map +1 -1
  796. package/dist/interface/math/vec4/i32/count-leading-zeros.js.map +1 -1
  797. package/dist/interface/math/vec4/i32/count-one-bits.js.map +1 -1
  798. package/dist/interface/math/vec4/i32/count-trailing-zeros.js.map +1 -1
  799. package/dist/interface/math/vec4/i32/equals.js.map +1 -1
  800. package/dist/interface/math/vec4/i32/i32.d.ts +3 -1
  801. package/dist/interface/math/vec4/i32/i32.js.map +1 -1
  802. package/dist/interface/math/vec4/i32/max.js.map +1 -1
  803. package/dist/interface/math/vec4/i32/min.js.map +1 -1
  804. package/dist/interface/math/vec4/i32/multiply.js.map +1 -1
  805. package/dist/interface/math/vec4/i32/negate.js.map +1 -1
  806. package/dist/interface/math/vec4/i32/one.js.map +1 -1
  807. package/dist/interface/math/vec4/i32/public.d.ts +1 -0
  808. package/dist/interface/math/vec4/i32/public.js +2 -0
  809. package/dist/interface/math/vec4/i32/public.js.map +1 -1
  810. package/dist/interface/math/vec4/i32/reverse-bits.js.map +1 -1
  811. package/dist/interface/math/vec4/i32/scale.js.map +1 -1
  812. package/dist/interface/math/vec4/i32/schema.js.map +1 -1
  813. package/dist/interface/math/vec4/i32/shift-left.js.map +1 -1
  814. package/dist/interface/math/vec4/i32/shift-right.js.map +1 -1
  815. package/dist/interface/math/vec4/i32/subtract.js.map +1 -1
  816. package/dist/interface/math/vec4/i32/zero.js.map +1 -1
  817. package/dist/interface/math/vec4/index.js.map +1 -1
  818. package/dist/interface/math/vec4/public.d.ts +1 -0
  819. package/dist/interface/math/vec4/public.js +2 -0
  820. package/dist/interface/math/vec4/public.js.map +1 -1
  821. package/dist/interface/math/vec4/u32/add.js.map +1 -1
  822. package/dist/interface/math/vec4/u32/bitwise-and.js.map +1 -1
  823. package/dist/interface/math/vec4/u32/bitwise-not.js.map +1 -1
  824. package/dist/interface/math/vec4/u32/bitwise-or.js.map +1 -1
  825. package/dist/interface/math/vec4/u32/bitwise-xor.js.map +1 -1
  826. package/dist/interface/math/vec4/u32/clamp.js.map +1 -1
  827. package/dist/interface/math/vec4/u32/count-leading-zeros.js.map +1 -1
  828. package/dist/interface/math/vec4/u32/count-one-bits.js.map +1 -1
  829. package/dist/interface/math/vec4/u32/count-trailing-zeros.js.map +1 -1
  830. package/dist/interface/math/vec4/u32/equals.js.map +1 -1
  831. package/dist/interface/math/vec4/u32/max.js.map +1 -1
  832. package/dist/interface/math/vec4/u32/min.js.map +1 -1
  833. package/dist/interface/math/vec4/u32/multiply.js.map +1 -1
  834. package/dist/interface/math/vec4/u32/negate.js.map +1 -1
  835. package/dist/interface/math/vec4/u32/one.js.map +1 -1
  836. package/dist/interface/math/vec4/u32/public.d.ts +1 -0
  837. package/dist/interface/math/vec4/u32/public.js +2 -0
  838. package/dist/interface/math/vec4/u32/public.js.map +1 -1
  839. package/dist/interface/math/vec4/u32/reverse-bits.js.map +1 -1
  840. package/dist/interface/math/vec4/u32/scale.js.map +1 -1
  841. package/dist/interface/math/vec4/u32/schema.js.map +1 -1
  842. package/dist/interface/math/vec4/u32/shift-left.js.map +1 -1
  843. package/dist/interface/math/vec4/u32/shift-right.js.map +1 -1
  844. package/dist/interface/math/vec4/u32/subtract.js.map +1 -1
  845. package/dist/interface/math/vec4/u32/u32.d.ts +3 -1
  846. package/dist/interface/math/vec4/u32/u32.js.map +1 -1
  847. package/dist/interface/math/vec4/u32/zero.js.map +1 -1
  848. package/dist/interface/registry/archetypes.d.ts +25 -3
  849. package/dist/interface/registry/archetypes.js +40 -10
  850. package/dist/interface/registry/archetypes.js.map +1 -1
  851. package/dist/interface/registry/declarations.d.ts +7 -7
  852. package/dist/interface/registry/declarations.js +120 -10
  853. package/dist/interface/registry/declarations.js.map +1 -1
  854. package/dist/interface/registry/finalizer-order.js +3 -3
  855. package/dist/interface/registry/finalizer-order.js.map +1 -1
  856. package/dist/interface/registry/ids.d.ts +23 -0
  857. package/dist/interface/registry/ids.js +42 -0
  858. package/dist/interface/registry/ids.js.map +1 -1
  859. package/dist/interface/registry/index.d.ts +3 -3
  860. package/dist/interface/registry/index.js +3 -3
  861. package/dist/interface/registry/index.js.map +1 -1
  862. package/dist/interface/registry/indexes.js +2 -2
  863. package/dist/interface/registry/indexes.js.map +1 -1
  864. package/dist/interface/registry/items.d.ts +6 -11
  865. package/dist/interface/registry/items.js +14 -43
  866. package/dist/interface/registry/items.js.map +1 -1
  867. package/dist/interface/registry/layout.d.ts +3 -1
  868. package/dist/interface/registry/layout.js +7 -1
  869. package/dist/interface/registry/layout.js.map +1 -1
  870. package/dist/interface/registry/names.d.ts +13 -5
  871. package/dist/interface/registry/names.js +55 -38
  872. package/dist/interface/registry/names.js.map +1 -1
  873. package/dist/interface/registry/program.js.map +1 -1
  874. package/dist/interface/registry/reduction.js.map +1 -1
  875. package/dist/interface/registry/schedule.d.ts +5 -1
  876. package/dist/interface/registry/schedule.js +8 -13
  877. package/dist/interface/registry/schedule.js.map +1 -1
  878. package/dist/interface/registry/schemas.d.ts +9 -0
  879. package/dist/interface/registry/schemas.js +65 -0
  880. package/dist/interface/registry/schemas.js.map +1 -1
  881. package/dist/interface/registry/strata.js +1 -0
  882. package/dist/interface/registry/strata.js.map +1 -1
  883. package/dist/interface/registry/threads.js +3 -2
  884. package/dist/interface/registry/threads.js.map +1 -1
  885. package/dist/interface/registry/traits.js +2 -1
  886. package/dist/interface/registry/traits.js.map +1 -1
  887. package/dist/interface/registry/written.js +1 -0
  888. package/dist/interface/registry/written.js.map +1 -1
  889. package/dist/interface/resource/condition.d.ts +3 -3
  890. package/dist/interface/resource/index.d.ts +0 -2
  891. package/dist/interface/resource/index.js +1 -1
  892. package/dist/interface/resource/index.js.map +1 -1
  893. package/dist/interface/resource/resource.d.ts +4 -1
  894. package/dist/interface/resource/resource.js.map +1 -1
  895. package/dist/interface/resource/types.d.ts +4 -1
  896. package/dist/interface/resource/value.d.ts +5 -5
  897. package/dist/interface/resources/always.js +3 -2
  898. package/dist/interface/resources/always.js.map +1 -1
  899. package/dist/interface/resources/cadence.d.ts +1 -1
  900. package/dist/interface/resources/cadence.js +4 -3
  901. package/dist/interface/resources/cadence.js.map +1 -1
  902. package/dist/interface/resources/clock.js +5 -3
  903. package/dist/interface/resources/clock.js.map +1 -1
  904. package/dist/interface/resources/gpu-device.js +3 -2
  905. package/dist/interface/resources/gpu-device.js.map +1 -1
  906. package/dist/interface/resources/index.js +1 -0
  907. package/dist/interface/resources/index.js.map +1 -1
  908. package/dist/interface/resources/wake.js +3 -2
  909. package/dist/interface/resources/wake.js.map +1 -1
  910. package/dist/interface/resources/workers.js +3 -2
  911. package/dist/interface/resources/workers.js.map +1 -1
  912. package/dist/interface/rule/create.d.ts +6 -2
  913. package/dist/interface/rule/create.js +8 -6
  914. package/dist/interface/rule/create.js.map +1 -1
  915. package/dist/interface/rule/created.d.ts +3 -3
  916. package/dist/interface/rule/declaration.d.ts +8 -3
  917. package/dist/interface/rule/index.js +1 -0
  918. package/dist/interface/rule/index.js.map +1 -1
  919. package/dist/interface/rule/rule.js.map +1 -1
  920. package/dist/interface/schema/is-struct.d.ts +15 -0
  921. package/dist/interface/schema/schema.d.ts +21 -1
  922. package/dist/interface/system/access.d.ts +87 -26
  923. package/dist/interface/system/body.d.ts +53 -26
  924. package/dist/interface/system/check.d.ts +13 -3
  925. package/dist/interface/system/check.js +87 -47
  926. package/dist/interface/system/check.js.map +1 -1
  927. package/dist/interface/system/commands.d.ts +55 -6
  928. package/dist/interface/system/composite-declaration.d.ts +0 -2
  929. package/dist/interface/system/create-resolved.d.ts +9 -0
  930. package/dist/interface/system/create-resolved.js +18 -0
  931. package/dist/interface/system/create-resolved.js.map +1 -0
  932. package/dist/interface/system/create.d.ts +116 -110
  933. package/dist/interface/system/create.js +34 -8
  934. package/dist/interface/system/create.js.map +1 -1
  935. package/dist/interface/system/declaration.d.ts +33 -29
  936. package/dist/interface/system/index.js.map +1 -1
  937. package/dist/interface/system/input.d.ts +37 -6
  938. package/dist/interface/system/leaf.d.ts +10 -3
  939. package/dist/interface/system/name.d.ts +3 -3
  940. package/dist/interface/system/property.js +1 -0
  941. package/dist/interface/system/property.js.map +1 -1
  942. package/dist/interface/system/render.d.ts +35 -16
  943. package/dist/interface/system/render.js +19 -5
  944. package/dist/interface/system/render.js.map +1 -1
  945. package/dist/interface/system/resolve.d.ts +68 -0
  946. package/dist/interface/system/resolve.js +138 -0
  947. package/dist/interface/system/resolve.js.map +1 -0
  948. package/dist/interface/system/struct.d.ts +2 -2
  949. package/dist/interface/system/system.d.ts +5 -3
  950. package/dist/interface/system/system.js.map +1 -1
  951. package/dist/interface/system/threads.d.ts +8 -7
  952. package/dist/interface/system/values-of.d.ts +17 -0
  953. package/dist/interface/system/values-of.js.map +1 -0
  954. package/dist/interface/system/values.d.ts +15 -15
  955. package/dist/interface/thread/of.d.ts +4 -2
  956. package/dist/interface/trait/key.d.ts +1 -1
  957. package/dist/interface/trait/types.d.ts +26 -8
  958. package/dist/interface/world/create.d.ts +9 -7
  959. package/dist/interface/world/declarations.d.ts +37 -0
  960. package/dist/interface/world/declarations.js +2 -0
  961. package/dist/interface/world/declarations.js.map +1 -0
  962. package/dist/interface/world/filter.js +1 -0
  963. package/dist/interface/world/filter.js.map +1 -1
  964. package/dist/interface/world/join.d.ts +3 -5
  965. package/dist/interface/world/world.d.ts +31 -17
  966. package/package.json +18 -5
  967. package/src/exports.test.ts +149 -44
  968. package/src/guide/00-keys.md +34 -0
  969. package/src/guide/00-keys.out +1 -0
  970. package/src/guide/00-keys.ts +35 -0
  971. package/src/guide/00-setup.md +24 -0
  972. package/src/guide/01-resources.md +22 -0
  973. package/src/guide/01-resources.out +2 -0
  974. package/src/guide/01-resources.ts +33 -0
  975. package/src/guide/02-entities.md +19 -0
  976. package/src/guide/02-entities.out +2 -0
  977. package/src/guide/02-entities.ts +43 -0
  978. package/src/guide/03-systems.md +22 -0
  979. package/src/guide/03-systems.out +5 -0
  980. package/src/guide/03-systems.ts +68 -0
  981. package/src/guide/04-ticks.md +18 -0
  982. package/src/guide/04-ticks.out +3 -0
  983. package/src/guide/04-ticks.ts +53 -0
  984. package/src/guide/05-scheduling.md +14 -0
  985. package/src/guide/05-scheduling.out +2 -0
  986. package/src/guide/05-scheduling.ts +46 -0
  987. package/src/guide/06-sync-points.md +14 -0
  988. package/src/guide/06-sync-points.out +3 -0
  989. package/src/guide/06-sync-points.ts +42 -0
  990. package/src/guide/07-change-filters.md +14 -0
  991. package/src/guide/07-change-filters.out +6 -0
  992. package/src/guide/07-change-filters.ts +70 -0
  993. package/src/guide/08-input.md +12 -0
  994. package/src/guide/08-input.out +1 -0
  995. package/src/guide/08-input.ts +45 -0
  996. package/src/guide/09-rules.md +12 -0
  997. package/src/guide/09-rules.out +2 -0
  998. package/src/guide/09-rules.ts +50 -0
  999. package/src/guide/10-finalizers.md +13 -0
  1000. package/src/guide/10-finalizers.out +4 -0
  1001. package/src/guide/10-finalizers.ts +48 -0
  1002. package/src/guide/11-traits.md +16 -0
  1003. package/src/guide/11-traits.out +2 -0
  1004. package/src/guide/11-traits.ts +51 -0
  1005. package/src/guide/11-traits.type-test.ts +12 -14
  1006. package/src/guide/12-lookups.md +14 -0
  1007. package/src/guide/12-lookups.out +3 -0
  1008. package/src/guide/12-lookups.ts +59 -0
  1009. package/src/guide/13-indexes.md +21 -0
  1010. package/src/guide/13-indexes.out +8 -0
  1011. package/src/guide/13-indexes.ts +73 -0
  1012. package/src/guide/14-kernels.md +15 -0
  1013. package/src/guide/14-kernels.out +1 -0
  1014. package/src/guide/14-kernels.ts +48 -0
  1015. package/src/guide/15-reductions.md +12 -0
  1016. package/src/guide/15-reductions.out +1 -0
  1017. package/src/guide/15-reductions.ts +38 -0
  1018. package/src/guide/16-gpu.md +18 -0
  1019. package/src/guide/16-gpu.out +3 -0
  1020. package/src/guide/16-gpu.ts +51 -0
  1021. package/src/guide/17-hierarchies.md +11 -0
  1022. package/src/guide/17-hierarchies.out +1 -0
  1023. package/src/guide/17-hierarchies.ts +40 -0
  1024. package/src/guide/18-identity.md +10 -0
  1025. package/src/guide/18-identity.out +1 -0
  1026. package/src/guide/18-identity.ts +11 -0
  1027. package/src/guide/19-threads.md +16 -0
  1028. package/src/guide/19-threads.out +2 -0
  1029. package/src/guide/19-threads.ts +65 -0
  1030. package/src/guide/20-shared.md +29 -0
  1031. package/src/guide/20-shared.out +4 -0
  1032. package/src/guide/20-shared.ts +118 -0
  1033. package/src/guide/21-dom.md +22 -0
  1034. package/src/guide/21-dom.out +5 -0
  1035. package/src/guide/21-dom.ts +117 -0
  1036. package/src/guide/22-canvas.md +15 -0
  1037. package/src/guide/22-canvas.out +3 -0
  1038. package/src/guide/22-canvas.ts +119 -0
  1039. package/src/guide/CLAUDE.md +40 -25
  1040. package/src/guide/README.md +42 -0
  1041. package/src/guide/guide.test.ts +215 -0
  1042. package/src/implementation/compiler/access.ts +10 -4
  1043. package/src/implementation/compiler/archetypes.test.ts +64 -0
  1044. package/src/implementation/compiler/archetypes.ts +134 -0
  1045. package/src/implementation/compiler/assign.ts +1 -0
  1046. package/src/implementation/compiler/augmentations.test.ts +418 -0
  1047. package/src/implementation/compiler/augmentations.ts +871 -0
  1048. package/src/implementation/compiler/bind.ts +6 -4
  1049. package/src/implementation/compiler/body-access.ts +135 -33
  1050. package/src/implementation/compiler/booleans.ts +1 -0
  1051. package/src/implementation/compiler/branches.ts +1 -0
  1052. package/src/implementation/compiler/calls.ts +14 -3
  1053. package/src/implementation/compiler/columns.ts +21 -5
  1054. package/src/implementation/compiler/compile-kernel.ts +88 -23
  1055. package/src/implementation/compiler/compiler.ts +9 -0
  1056. package/src/implementation/compiler/data.ts +1 -0
  1057. package/src/implementation/compiler/describe.test-helper.ts +97 -0
  1058. package/src/implementation/compiler/describe.test.ts +168 -0
  1059. package/src/implementation/compiler/describe.ts +489 -0
  1060. package/src/implementation/compiler/estree.ts +1 -0
  1061. package/src/implementation/compiler/expression.ts +24 -2
  1062. package/src/implementation/compiler/failure.ts +1 -0
  1063. package/src/implementation/compiler/hygiene.test.ts +4 -11
  1064. package/src/implementation/compiler/identify.test.ts +100 -46
  1065. package/src/implementation/compiler/identify.ts +89 -32
  1066. package/src/implementation/compiler/index.ts +6 -1
  1067. package/src/implementation/compiler/inferred.test.ts +32 -0
  1068. package/src/implementation/compiler/inferred.ts +197 -0
  1069. package/src/implementation/compiler/inline-kernels.test.ts +10 -0
  1070. package/src/implementation/compiler/inline-kernels.ts +21 -0
  1071. package/src/implementation/compiler/input-schemas.test.ts +182 -0
  1072. package/src/implementation/compiler/input-schemas.ts +107 -0
  1073. package/src/implementation/compiler/ir.ts +7 -2
  1074. package/src/implementation/compiler/kernel-id.ts +1 -0
  1075. package/src/implementation/compiler/key.ts +1 -0
  1076. package/src/implementation/compiler/link.test.ts +3 -0
  1077. package/src/implementation/compiler/link.ts +29 -0
  1078. package/src/implementation/compiler/lists.ts +41 -13
  1079. package/src/implementation/compiler/lookups.ts +1 -0
  1080. package/src/implementation/compiler/math.ts +1 -0
  1081. package/src/implementation/compiler/memory-compiler.browser.test.ts +85 -0
  1082. package/src/implementation/compiler/memory-compiler.test.ts +147 -0
  1083. package/src/implementation/compiler/memory-compiler.ts +307 -0
  1084. package/src/implementation/compiler/module-scope.ts +1 -0
  1085. package/src/implementation/compiler/module-value.ts +18 -3
  1086. package/src/implementation/compiler/out.ts +1 -0
  1087. package/src/implementation/compiler/oxc.test-helper.ts +20 -0
  1088. package/src/implementation/compiler/oxc.test.ts +69 -0
  1089. package/src/implementation/compiler/oxc.ts +90 -0
  1090. package/src/implementation/compiler/package-copies.ts +208 -0
  1091. package/src/implementation/compiler/passes.ts +34 -0
  1092. package/src/implementation/compiler/paths.ts +19 -38
  1093. package/src/implementation/compiler/plugin.test.ts +373 -62
  1094. package/src/implementation/compiler/plugin.ts +199 -38
  1095. package/src/implementation/compiler/posix.test.ts +34 -0
  1096. package/src/implementation/compiler/posix.ts +183 -0
  1097. package/src/implementation/compiler/predicates.test.ts +90 -0
  1098. package/src/implementation/compiler/predicates.ts +250 -0
  1099. package/src/implementation/compiler/print.ts +26 -6
  1100. package/src/implementation/compiler/program.ts +4 -1
  1101. package/src/implementation/compiler/public.ts +2 -0
  1102. package/src/implementation/compiler/scalar.ts +1 -0
  1103. package/src/implementation/compiler/scope.ts +1 -0
  1104. package/src/implementation/compiler/serialize.ts +1 -0
  1105. package/src/implementation/compiler/shared-kernels.test.ts +57 -0
  1106. package/src/implementation/compiler/signature.ts +70 -30
  1107. package/src/implementation/compiler/snapshot.ts +5 -2
  1108. package/src/implementation/compiler/source-map.test.ts +1 -0
  1109. package/src/implementation/compiler/source-map.ts +1 -0
  1110. package/src/implementation/compiler/spawns.ts +62 -5
  1111. package/src/implementation/compiler/stamps.ts +30 -8
  1112. package/src/implementation/compiler/statement.ts +1 -0
  1113. package/src/implementation/compiler/subset.md +4 -3
  1114. package/src/implementation/compiler/terminal.ts +1 -0
  1115. package/src/implementation/compiler/transform.test.ts +371 -258
  1116. package/src/implementation/compiler/transform.ts +321 -62
  1117. package/src/implementation/compiler/type-host.test-helper.ts +27 -0
  1118. package/src/implementation/compiler/type-schemas.ts +714 -0
  1119. package/src/implementation/compiler/unit.ts +22 -4
  1120. package/src/implementation/compiler/value.ts +1 -0
  1121. package/src/implementation/compiler/wat.test.ts +135 -0
  1122. package/src/implementation/compiler/wat.ts +365 -0
  1123. package/src/implementation/index.ts +1 -0
  1124. package/src/implementation/world/activate.ts +10 -3
  1125. package/src/implementation/world/archetype.ts +133 -19
  1126. package/src/implementation/world/arrays.test.ts +1 -0
  1127. package/src/implementation/world/arrays.ts +6 -1
  1128. package/src/implementation/world/arrivals.test.ts +89 -0
  1129. package/src/implementation/world/arrivals.ts +165 -0
  1130. package/src/implementation/world/async-loading.test.ts +13 -28
  1131. package/src/implementation/world/attach-kernel.test.ts +10 -2
  1132. package/src/implementation/world/attach-kernel.ts +14 -7
  1133. package/src/implementation/world/batches.test.ts +14 -17
  1134. package/src/implementation/world/batches.ts +67 -8
  1135. package/src/implementation/world/buffer.ts +35 -4
  1136. package/src/implementation/world/builtins.test.ts +5 -10
  1137. package/src/implementation/world/cascade.ts +2 -1
  1138. package/src/implementation/world/cells.ts +1 -0
  1139. package/src/implementation/world/change-blocks.browser.test.ts +76 -0
  1140. package/src/implementation/world/change-blocks.cases.ts +14 -0
  1141. package/src/implementation/world/change-blocks.fixture.ts +70 -0
  1142. package/src/implementation/world/change-blocks.test.ts +264 -0
  1143. package/src/implementation/world/changes-finalizers.test.ts +6 -8
  1144. package/src/implementation/world/check-kernel.ts +46 -32
  1145. package/src/implementation/world/claims.test.ts +1 -0
  1146. package/src/implementation/world/claims.ts +1 -0
  1147. package/src/implementation/world/closure.test.ts +1 -0
  1148. package/src/implementation/world/closure.ts +1 -0
  1149. package/src/implementation/world/command-ring.ts +2 -1
  1150. package/src/implementation/world/command-rings.cases.ts +5 -2
  1151. package/src/implementation/world/command-rings.fixture.ts +27 -36
  1152. package/src/implementation/world/commands.test.ts +84 -43
  1153. package/src/implementation/world/commands.ts +26 -4
  1154. package/src/implementation/world/composite-input.test.ts +17 -15
  1155. package/src/implementation/world/conditions.test.ts +17 -28
  1156. package/src/implementation/world/constant-unions.test.ts +43 -0
  1157. package/src/implementation/world/create.test.ts +50 -71
  1158. package/src/implementation/world/create.ts +489 -253
  1159. package/src/implementation/world/defaults.test.ts +86 -0
  1160. package/src/implementation/world/directories.ts +2 -1
  1161. package/src/implementation/world/directory.test.ts +2 -3
  1162. package/src/implementation/world/dispatch.cases.ts +1 -0
  1163. package/src/implementation/world/dispatch.fixture.ts +16 -25
  1164. package/src/implementation/world/entities.ts +1 -0
  1165. package/src/implementation/world/entity-lookup-workers.cases.ts +1 -0
  1166. package/src/implementation/world/entity-lookup-workers.fixture.ts +9 -16
  1167. package/src/implementation/world/entity-lookups.browser.test.ts +8 -14
  1168. package/src/implementation/world/entity-lookups.test-helper.ts +28 -34
  1169. package/src/implementation/world/entity-lookups.test.ts +9 -16
  1170. package/src/implementation/world/execute.ts +232 -96
  1171. package/src/implementation/world/failing-worker.fixture.ts +3 -0
  1172. package/src/implementation/world/failures.ts +64 -7
  1173. package/src/implementation/world/finalizers.test.ts +33 -49
  1174. package/src/implementation/world/finalizers.ts +49 -17
  1175. package/src/implementation/world/fixtures.test-helper.ts +1 -0
  1176. package/src/implementation/world/generated-code.md +10 -6
  1177. package/src/implementation/world/gpu.browser.test.ts +100 -92
  1178. package/src/implementation/world/gpu.test-helper.ts +12 -0
  1179. package/src/implementation/world/gpu.ts +26 -14
  1180. package/src/implementation/world/holders.ts +1 -0
  1181. package/src/implementation/world/ids-changes.test-helper.ts +4 -0
  1182. package/src/implementation/world/ids-keys.test-helper.ts +21 -0
  1183. package/src/implementation/world/ids.test.ts +12 -49
  1184. package/src/implementation/world/imported-lists.test-helper.ts +2 -6
  1185. package/src/implementation/world/imported-lists.test.ts +4 -5
  1186. package/src/implementation/world/index-buckets.test.ts +276 -0
  1187. package/src/implementation/world/index-build-csp.test.ts +8 -9
  1188. package/src/implementation/world/index-build.cases.ts +1 -0
  1189. package/src/implementation/world/index-build.fixture.ts +12 -15
  1190. package/src/implementation/world/index-build.ts +1 -0
  1191. package/src/implementation/world/index-changed.test.ts +27 -34
  1192. package/src/implementation/world/index-hash.test.ts +34 -0
  1193. package/src/implementation/world/index-hash.ts +454 -74
  1194. package/src/implementation/world/index-joined.test.ts +232 -74
  1195. package/src/implementation/world/index-kernels.test.ts +26 -35
  1196. package/src/implementation/world/index-keyless.test.ts +21 -28
  1197. package/src/implementation/world/index-keys.ts +1 -0
  1198. package/src/implementation/world/index-lookups-csp.test.ts +5 -6
  1199. package/src/implementation/world/index-lookups.ts +28 -22
  1200. package/src/implementation/world/index-order.test.ts +13 -17
  1201. package/src/implementation/world/index-order.ts +1 -0
  1202. package/src/implementation/world/index-readers.ts +1 -0
  1203. package/src/implementation/world/index-sorted.test.ts +1 -0
  1204. package/src/implementation/world/index-sorted.ts +10 -5
  1205. package/src/implementation/world/index-workers.cases.ts +10 -0
  1206. package/src/implementation/world/index-workers.fixture.ts +98 -39
  1207. package/src/implementation/world/indexes.test.ts +62 -74
  1208. package/src/implementation/world/indexes.ts +62 -108
  1209. package/src/implementation/world/input.ts +2 -1
  1210. package/src/implementation/world/intrinsics-coverage.test.ts +1 -0
  1211. package/src/implementation/world/intrinsics.browser.test.ts +22 -62
  1212. package/src/implementation/world/intrinsics.ts +1 -0
  1213. package/src/implementation/world/join.test.ts +182 -43
  1214. package/src/implementation/world/join.ts +112 -59
  1215. package/src/implementation/world/join.type-test.ts +7 -5
  1216. package/src/implementation/world/joined-observer.test.ts +58 -0
  1217. package/src/implementation/world/joined-observer.ts +85 -19
  1218. package/src/implementation/world/joining-worker.fixture.ts +51 -11
  1219. package/src/implementation/world/joining.cases.ts +43 -7
  1220. package/src/implementation/world/joining.fixture.ts +114 -14
  1221. package/src/implementation/world/joining.test-helper.ts +25 -27
  1222. package/src/implementation/world/joining.ts +85 -7
  1223. package/src/implementation/world/journal.ts +8 -4
  1224. package/src/implementation/world/kernel-imports-sparks.test-helper.ts +3 -4
  1225. package/src/implementation/world/kernel-imports-steer.test-helper.ts +1 -0
  1226. package/src/implementation/world/kernel-imports.test.ts +10 -12
  1227. package/src/implementation/world/kernel-indexes.ts +12 -3
  1228. package/src/implementation/world/kernel-lookup.test-helper.ts +6 -10
  1229. package/src/implementation/world/kernel-path.test-helper.ts +2 -4
  1230. package/src/implementation/world/kernel-spawns.test.ts +17 -28
  1231. package/src/implementation/world/kernel-tried.test-helper.ts +31 -0
  1232. package/src/implementation/world/kernel.ts +30 -6
  1233. package/src/implementation/world/kernels-csp.test.ts +5 -5
  1234. package/src/implementation/world/kernels.test.ts +18 -14
  1235. package/src/implementation/world/kernels.ts +82 -13
  1236. package/src/implementation/world/layout-directory.browser.test.ts +18 -28
  1237. package/src/implementation/world/layout-directory.cases.ts +1 -0
  1238. package/src/implementation/world/layout-directory.fixture.ts +18 -28
  1239. package/src/implementation/world/layout-directory.ts +69 -17
  1240. package/src/implementation/world/lifetime.cases.ts +2 -1
  1241. package/src/implementation/world/lifetime.fixture.ts +12 -21
  1242. package/src/implementation/world/lifetime.test-helper.ts +2 -1
  1243. package/src/implementation/world/lifetime.test.ts +7 -14
  1244. package/src/implementation/world/lists.ts +179 -28
  1245. package/src/implementation/world/lookup-keys.ts +10 -9
  1246. package/src/implementation/world/loop.test.ts +19 -8
  1247. package/src/implementation/world/loop.ts +4 -4
  1248. package/src/implementation/world/memory.test.ts +1 -0
  1249. package/src/implementation/world/memory.ts +1 -0
  1250. package/src/implementation/world/mirror.ts +45 -10
  1251. package/src/implementation/world/move-log.test.ts +114 -11
  1252. package/src/implementation/world/move-log.ts +1 -0
  1253. package/src/implementation/world/names.test.ts +31 -31
  1254. package/src/implementation/world/observe-cases.browser.test.ts +11 -11
  1255. package/src/implementation/world/observe-cases.test.ts +49 -95
  1256. package/src/implementation/world/observe-factories.test.ts +17 -19
  1257. package/src/implementation/world/observe-joined-cases.test.ts +34 -45
  1258. package/src/implementation/world/observe-ticks-cases.test.ts +33 -35
  1259. package/src/implementation/world/observe.test-helper.ts +2 -1
  1260. package/src/implementation/world/observed-workers.cases.ts +1 -0
  1261. package/src/implementation/world/observed-workers.fixture.ts +7 -8
  1262. package/src/implementation/world/observer-contained-worker.fixture.ts +4 -3
  1263. package/src/implementation/world/observer-contained.browser.test.ts +1 -0
  1264. package/src/implementation/world/observer-contained.cases.ts +1 -0
  1265. package/src/implementation/world/observer-contained.fixture.ts +3 -7
  1266. package/src/implementation/world/observer-contained.test-helper.ts +7 -8
  1267. package/src/implementation/world/observer-contained.test.ts +11 -19
  1268. package/src/implementation/world/observer-joined-worker.fixture.ts +2 -1
  1269. package/src/implementation/world/observer-joined.cases.ts +1 -0
  1270. package/src/implementation/world/observer-joined.fixture.ts +8 -6
  1271. package/src/implementation/world/observer-joined.test-helper.ts +25 -34
  1272. package/src/implementation/world/observer-joined.test.ts +78 -62
  1273. package/src/implementation/world/observer.browser.test.ts +13 -13
  1274. package/src/implementation/world/observer.test.ts +34 -44
  1275. package/src/implementation/world/observer.ts +3 -3
  1276. package/src/implementation/world/optional-workers.cases.ts +19 -0
  1277. package/src/implementation/world/optional-workers.fixture.ts +55 -0
  1278. package/src/implementation/world/optional.test.ts +351 -0
  1279. package/src/implementation/world/order.ts +1 -0
  1280. package/src/implementation/world/out-of-band.ts +61 -0
  1281. package/src/implementation/world/outcomes.test-helper.ts +138 -0
  1282. package/src/implementation/world/package-id.test-helper.ts +9 -0
  1283. package/src/implementation/world/perf.md +124 -4
  1284. package/src/implementation/world/plan.ts +1 -0
  1285. package/src/implementation/world/platforms.test-helper.ts +1 -0
  1286. package/src/implementation/world/pool-size.cases.ts +21 -1
  1287. package/src/implementation/world/pool-size.fixture.ts +98 -6
  1288. package/src/implementation/world/pool.cases.ts +1 -0
  1289. package/src/implementation/world/pool.fixture.ts +1 -0
  1290. package/src/implementation/world/pool.ts +1 -0
  1291. package/src/implementation/world/port.test.ts +45 -0
  1292. package/src/implementation/world/port.ts +18 -11
  1293. package/src/implementation/world/ports.cases.ts +2 -2
  1294. package/src/implementation/world/ports.fixture.ts +4 -5
  1295. package/src/implementation/world/ports.type-test.ts +1 -0
  1296. package/src/implementation/world/precision.test.ts +174 -0
  1297. package/src/implementation/world/prepared-lookup.ts +1 -0
  1298. package/src/implementation/world/prepared-spawn.ts +14 -10
  1299. package/src/implementation/world/program.ts +1 -0
  1300. package/src/implementation/world/protocol.ts +9 -2
  1301. package/src/implementation/world/publish.ts +1 -0
  1302. package/src/implementation/world/ranges.test.ts +66 -0
  1303. package/src/implementation/world/ranges.ts +98 -32
  1304. package/src/implementation/world/reads.test-helper.ts +7 -6
  1305. package/src/implementation/world/reclaim.test.ts +214 -0
  1306. package/src/implementation/world/reclaim.ts +170 -0
  1307. package/src/implementation/world/reductions.cases.ts +1 -0
  1308. package/src/implementation/world/reductions.fixture.ts +5 -10
  1309. package/src/implementation/world/reductions.test.ts +36 -49
  1310. package/src/implementation/world/reductions.ts +14 -12
  1311. package/src/implementation/world/reevaluation.test-helper.ts +3 -3
  1312. package/src/implementation/world/reevaluation.test.ts +9 -8
  1313. package/src/implementation/world/register.ts +3 -2
  1314. package/src/implementation/world/remote-finalizers-worker.fixture.ts +25 -10
  1315. package/src/implementation/world/remote-finalizers.cases.ts +19 -1
  1316. package/src/implementation/world/remote-finalizers.fixture.ts +86 -11
  1317. package/src/implementation/world/remote-finalizers.test-helper.ts +119 -27
  1318. package/src/implementation/world/remote-finalizers.test.ts +86 -20
  1319. package/src/implementation/world/remote-objects-worker.fixture.ts +2 -1
  1320. package/src/implementation/world/remote-objects.cases.ts +1 -0
  1321. package/src/implementation/world/remote-objects.fixture.ts +3 -1
  1322. package/src/implementation/world/remote-objects.test-helper.ts +9 -10
  1323. package/src/implementation/world/remote-systems.ts +42 -28
  1324. package/src/implementation/world/remote.test.ts +46 -48
  1325. package/src/implementation/world/remote.ts +1 -0
  1326. package/src/implementation/world/removal-worker.fixture.ts +3 -2
  1327. package/src/implementation/world/removal.cases.ts +1 -0
  1328. package/src/implementation/world/removal.fixture.ts +3 -2
  1329. package/src/implementation/world/remove-joined.test.ts +4 -3
  1330. package/src/implementation/world/remove.test-helper.ts +11 -13
  1331. package/src/implementation/world/remove.test.ts +14 -17
  1332. package/src/implementation/world/render-order.browser.test.ts +209 -0
  1333. package/src/implementation/world/render-order.ts +150 -0
  1334. package/src/implementation/world/required.ts +10 -0
  1335. package/src/implementation/world/resources.ts +7 -3
  1336. package/src/implementation/world/rows.test.ts +8 -11
  1337. package/src/implementation/world/rows.ts +99 -30
  1338. package/src/implementation/world/rules.test.ts +38 -39
  1339. package/src/implementation/world/run-results.test.ts +374 -0
  1340. package/src/implementation/world/runner.ts +379 -73
  1341. package/src/implementation/world/schedule.test.ts +65 -67
  1342. package/src/implementation/world/semantics.test.ts +11 -16
  1343. package/src/implementation/world/share.test.ts +4 -3
  1344. package/src/implementation/world/shared-gpu.browser.test.ts +109 -0
  1345. package/src/implementation/world/shared-kernels.test.ts +117 -0
  1346. package/src/implementation/world/shared-workers.cases.ts +20 -0
  1347. package/src/implementation/world/shared-workers.fixture.ts +74 -0
  1348. package/src/implementation/world/shared.test.ts +348 -0
  1349. package/src/implementation/world/shared.ts +316 -0
  1350. package/src/implementation/world/sharing.ts +96 -32
  1351. package/src/implementation/world/staging.ts +53 -10
  1352. package/src/implementation/world/state.ts +180 -23
  1353. package/src/implementation/world/stop-lists.ts +78 -9
  1354. package/src/implementation/world/strings.test.ts +23 -34
  1355. package/src/implementation/world/strings.ts +1 -0
  1356. package/src/implementation/world/structure.ts +6 -2
  1357. package/src/implementation/world/synchronize.test.ts +1 -0
  1358. package/src/implementation/world/synchronize.ts +60 -17
  1359. package/src/implementation/world/tail-blocks.ts +9 -4
  1360. package/src/implementation/world/tails-worker.fixture.ts +9 -13
  1361. package/src/implementation/world/tails.cases.ts +3 -2
  1362. package/src/implementation/world/tails.fixture.ts +5 -2
  1363. package/src/implementation/world/tails.test-helper.ts +48 -41
  1364. package/src/implementation/world/tails.test.ts +24 -29
  1365. package/src/implementation/world/tails.ts +35 -22
  1366. package/src/implementation/world/target.test.ts +10 -13
  1367. package/src/implementation/world/terminal.ts +1 -0
  1368. package/src/implementation/world/thread-directory.ts +85 -16
  1369. package/src/implementation/world/thread-finalizers.ts +128 -22
  1370. package/src/implementation/world/thread-indexes.ts +5 -3
  1371. package/src/implementation/world/thread-observer.ts +60 -13
  1372. package/src/implementation/world/thread-systems-worker.fixture.ts +5 -6
  1373. package/src/implementation/world/thread-systems.cases.ts +15 -2
  1374. package/src/implementation/world/thread-systems.fixture.ts +41 -12
  1375. package/src/implementation/world/thread-systems.test-helper.ts +57 -52
  1376. package/src/implementation/world/thread-systems.test.ts +51 -26
  1377. package/src/implementation/world/thread-systems.ts +398 -84
  1378. package/src/implementation/world/thread-tasks.ts +9 -4
  1379. package/src/implementation/world/threads.browser.test.ts +5 -0
  1380. package/src/implementation/world/threads.test.ts +10 -0
  1381. package/src/implementation/world/ticks.browser.test.ts +3 -4
  1382. package/src/implementation/world/ticks.test.ts +5 -5
  1383. package/src/implementation/world/traits.test.ts +4 -8
  1384. package/src/implementation/world/transfers-worker.fixture.ts +17 -12
  1385. package/src/implementation/world/transfers.cases.ts +1 -0
  1386. package/src/implementation/world/transfers.fixture.ts +18 -25
  1387. package/src/implementation/world/transfers.test-helper.ts +18 -28
  1388. package/src/implementation/world/transfers.test.ts +19 -23
  1389. package/src/implementation/world/transfers.ts +1 -0
  1390. package/src/implementation/world/unidentified-finalizers.test.ts +58 -0
  1391. package/src/implementation/world/up-tree.test.ts +181 -21
  1392. package/src/implementation/world/up-workers.cases.ts +1 -0
  1393. package/src/implementation/world/up-workers.fixture.ts +6 -10
  1394. package/src/implementation/world/up.browser.test.ts +9 -12
  1395. package/src/implementation/world/up.test.ts +56 -42
  1396. package/src/implementation/world/up.ts +299 -71
  1397. package/src/implementation/world/wasm-kernels.test.ts +55 -49
  1398. package/src/implementation/world/wasm.test.ts +200 -22
  1399. package/src/implementation/world/wasm.ts +399 -127
  1400. package/src/implementation/world/wgsl.test.ts +1 -0
  1401. package/src/implementation/world/wgsl.ts +22 -5
  1402. package/src/implementation/world/where.test.ts +342 -0
  1403. package/src/implementation/world/where.ts +236 -0
  1404. package/src/implementation/world/worker-platform.ts +1 -0
  1405. package/src/implementation/world/worker-window.test.ts +43 -0
  1406. package/src/implementation/world/worker-window.ts +43 -0
  1407. package/src/implementation/world/worker.ts +47 -59
  1408. package/src/implementation/world/workers-follow.test.ts +51 -0
  1409. package/src/implementation/world/workers.cases.ts +1 -0
  1410. package/src/implementation/world/workers.fixture.ts +31 -54
  1411. package/src/implementation/world/world-host.fixture.ts +1 -0
  1412. package/src/index.ts +29 -1
  1413. package/src/interface/CLAUDE.md +1 -1
  1414. package/src/interface/component/component.ts +8 -1
  1415. package/src/interface/component/index.ts +2 -2
  1416. package/src/interface/component/key.ts +1 -0
  1417. package/src/interface/component/key.type-test.ts +1 -2
  1418. package/src/interface/component/register.test.ts +27 -34
  1419. package/src/interface/component/types.ts +3 -2
  1420. package/src/interface/component/value.ts +14 -7
  1421. package/src/interface/component/values.ts +3 -2
  1422. package/src/interface/entity/entity.ts +1 -0
  1423. package/src/interface/entity/index.ts +4 -0
  1424. package/src/interface/finalizer/body.ts +15 -14
  1425. package/src/interface/finalizer/create.test.ts +67 -72
  1426. package/src/interface/finalizer/create.ts +52 -22
  1427. package/src/interface/finalizer/created.ts +6 -5
  1428. package/src/interface/finalizer/declaration.ts +28 -9
  1429. package/src/interface/finalizer/finalizer.ts +3 -2
  1430. package/src/interface/finalizer/index.ts +1 -0
  1431. package/src/interface/gpu/accessors.ts +26 -8
  1432. package/src/interface/gpu/gpu.ts +1 -0
  1433. package/src/interface/gpu/gpu.type-test.ts +2 -2
  1434. package/src/interface/gpu/index.ts +1 -0
  1435. package/src/interface/gpu/layout.ts +1 -0
  1436. package/src/interface/gpu/record.ts +1 -0
  1437. package/src/interface/gpu/wgsl.ts +9 -6
  1438. package/src/interface/index.ts +1 -3
  1439. package/src/interface/index.type-test.ts +12 -15
  1440. package/src/interface/indexes/create.test.ts +44 -43
  1441. package/src/interface/indexes/create.ts +24 -16
  1442. package/src/interface/indexes/created.ts +3 -2
  1443. package/src/interface/indexes/declaration.ts +7 -3
  1444. package/src/interface/indexes/index-type.ts +4 -3
  1445. package/src/interface/indexes/index.ts +1 -0
  1446. package/src/interface/indexes/index.type-test.ts +45 -94
  1447. package/src/interface/math/f32/default.ts +6 -0
  1448. package/src/interface/math/f32/index.ts +5 -1
  1449. package/src/interface/math/f32/public.ts +2 -0
  1450. package/src/interface/math/f32/round-half-even.ts +1 -0
  1451. package/src/interface/math/f32/schema.ts +1 -0
  1452. package/src/interface/math/i32/default.ts +6 -0
  1453. package/src/interface/math/i32/index.ts +5 -1
  1454. package/src/interface/math/i32/public.ts +2 -0
  1455. package/src/interface/math/i32/schema.ts +1 -0
  1456. package/src/interface/math/i32/shift-right.ts +1 -0
  1457. package/src/interface/math/index.ts +1 -0
  1458. package/src/interface/math/intrinsic.ts +1 -0
  1459. package/src/interface/math/mat4x4/add.ts +1 -0
  1460. package/src/interface/math/mat4x4/determinant.ts +1 -0
  1461. package/src/interface/math/mat4x4/identity.ts +1 -0
  1462. package/src/interface/math/mat4x4/index.ts +4 -1
  1463. package/src/interface/math/mat4x4/inverse.ts +1 -0
  1464. package/src/interface/math/mat4x4/look-at.test.ts +1 -0
  1465. package/src/interface/math/mat4x4/look-at.ts +1 -0
  1466. package/src/interface/math/mat4x4/multiply-vec3.ts +1 -0
  1467. package/src/interface/math/mat4x4/multiply-vec4.ts +1 -0
  1468. package/src/interface/math/mat4x4/multiply.ts +1 -0
  1469. package/src/interface/math/mat4x4/orthographic.ts +1 -0
  1470. package/src/interface/math/mat4x4/perspective.ts +1 -0
  1471. package/src/interface/math/mat4x4/public.ts +2 -0
  1472. package/src/interface/math/mat4x4/rotation-x.ts +1 -0
  1473. package/src/interface/math/mat4x4/rotation-y.ts +1 -0
  1474. package/src/interface/math/mat4x4/rotation-z.ts +1 -0
  1475. package/src/interface/math/mat4x4/rotation.test.ts +1 -0
  1476. package/src/interface/math/mat4x4/scale.ts +1 -0
  1477. package/src/interface/math/mat4x4/scaling.ts +1 -0
  1478. package/src/interface/math/mat4x4/schema.ts +1 -0
  1479. package/src/interface/math/mat4x4/subtract.ts +1 -0
  1480. package/src/interface/math/mat4x4/translation.ts +1 -0
  1481. package/src/interface/math/mat4x4/transpose.ts +1 -0
  1482. package/src/interface/math/mat4x4/zero.ts +1 -0
  1483. package/src/interface/math/math.type-test.ts +24 -1
  1484. package/src/interface/math/quat/add.ts +1 -0
  1485. package/src/interface/math/quat/align-to.ts +1 -0
  1486. package/src/interface/math/quat/conjugate.ts +1 -0
  1487. package/src/interface/math/quat/distance.ts +1 -0
  1488. package/src/interface/math/quat/dot.ts +1 -0
  1489. package/src/interface/math/quat/from-axis-angle.ts +1 -0
  1490. package/src/interface/math/quat/from-euler.ts +1 -0
  1491. package/src/interface/math/quat/identity.ts +1 -0
  1492. package/src/interface/math/quat/index.ts +5 -1
  1493. package/src/interface/math/quat/inverse.ts +1 -0
  1494. package/src/interface/math/quat/length-squared.ts +1 -0
  1495. package/src/interface/math/quat/length.ts +1 -0
  1496. package/src/interface/math/quat/lerp.ts +1 -0
  1497. package/src/interface/math/quat/look-at.ts +1 -0
  1498. package/src/interface/math/quat/multiply.ts +1 -0
  1499. package/src/interface/math/quat/negate.ts +1 -0
  1500. package/src/interface/math/quat/normalize.ts +1 -0
  1501. package/src/interface/math/quat/public.ts +2 -0
  1502. package/src/interface/math/quat/rotate-vec3.ts +1 -0
  1503. package/src/interface/math/quat/scale.ts +1 -0
  1504. package/src/interface/math/quat/schema.ts +1 -0
  1505. package/src/interface/math/quat/slerp.ts +1 -0
  1506. package/src/interface/math/quat/subtract.ts +1 -0
  1507. package/src/interface/math/quat/to-axis-angle.ts +1 -0
  1508. package/src/interface/math/quat/to-euler.ts +1 -0
  1509. package/src/interface/math/quat/to-mat4.ts +1 -0
  1510. package/src/interface/math/semantics.test.ts +1 -0
  1511. package/src/interface/math/u32/count-leading-zeros.ts +1 -0
  1512. package/src/interface/math/u32/count-one-bits.ts +1 -0
  1513. package/src/interface/math/u32/count-trailing-zeros.ts +1 -0
  1514. package/src/interface/math/u32/default.ts +6 -0
  1515. package/src/interface/math/u32/index.ts +5 -1
  1516. package/src/interface/math/u32/public.ts +2 -0
  1517. package/src/interface/math/u32/reverse-bits.ts +1 -0
  1518. package/src/interface/math/u32/schema.ts +1 -0
  1519. package/src/interface/math/u32/shift-right.ts +1 -0
  1520. package/src/interface/math/vec2/f32/abs.ts +1 -0
  1521. package/src/interface/math/vec2/f32/acos.ts +1 -0
  1522. package/src/interface/math/vec2/f32/acosh.ts +1 -0
  1523. package/src/interface/math/vec2/f32/add.ts +1 -0
  1524. package/src/interface/math/vec2/f32/asin.ts +1 -0
  1525. package/src/interface/math/vec2/f32/asinh.ts +1 -0
  1526. package/src/interface/math/vec2/f32/atan.ts +1 -0
  1527. package/src/interface/math/vec2/f32/atanh.ts +1 -0
  1528. package/src/interface/math/vec2/f32/ceil.ts +1 -0
  1529. package/src/interface/math/vec2/f32/clamp.ts +1 -0
  1530. package/src/interface/math/vec2/f32/cos.ts +1 -0
  1531. package/src/interface/math/vec2/f32/cosh.ts +1 -0
  1532. package/src/interface/math/vec2/f32/distance.ts +1 -0
  1533. package/src/interface/math/vec2/f32/dot.ts +1 -0
  1534. package/src/interface/math/vec2/f32/equals.ts +1 -0
  1535. package/src/interface/math/vec2/f32/exp.ts +1 -0
  1536. package/src/interface/math/vec2/f32/exp2.ts +1 -0
  1537. package/src/interface/math/vec2/f32/f32.ts +5 -1
  1538. package/src/interface/math/vec2/f32/faceforward.ts +1 -0
  1539. package/src/interface/math/vec2/f32/floor.ts +1 -0
  1540. package/src/interface/math/vec2/f32/fract.ts +1 -0
  1541. package/src/interface/math/vec2/f32/length.ts +1 -0
  1542. package/src/interface/math/vec2/f32/log.ts +1 -0
  1543. package/src/interface/math/vec2/f32/log2.ts +1 -0
  1544. package/src/interface/math/vec2/f32/max.ts +1 -0
  1545. package/src/interface/math/vec2/f32/min.ts +1 -0
  1546. package/src/interface/math/vec2/f32/mix.ts +1 -0
  1547. package/src/interface/math/vec2/f32/mod.ts +1 -0
  1548. package/src/interface/math/vec2/f32/modf.ts +1 -0
  1549. package/src/interface/math/vec2/f32/negate.ts +1 -0
  1550. package/src/interface/math/vec2/f32/normalize.ts +1 -0
  1551. package/src/interface/math/vec2/f32/pow.ts +1 -0
  1552. package/src/interface/math/vec2/f32/public.ts +2 -0
  1553. package/src/interface/math/vec2/f32/reflect.ts +1 -0
  1554. package/src/interface/math/vec2/f32/refract.ts +1 -0
  1555. package/src/interface/math/vec2/f32/round.ts +1 -0
  1556. package/src/interface/math/vec2/f32/scale.ts +1 -0
  1557. package/src/interface/math/vec2/f32/schema.ts +1 -0
  1558. package/src/interface/math/vec2/f32/sign.ts +1 -0
  1559. package/src/interface/math/vec2/f32/sin.ts +1 -0
  1560. package/src/interface/math/vec2/f32/sinh.ts +1 -0
  1561. package/src/interface/math/vec2/f32/smoothstep.ts +1 -0
  1562. package/src/interface/math/vec2/f32/sqrt.ts +1 -0
  1563. package/src/interface/math/vec2/f32/step.ts +1 -0
  1564. package/src/interface/math/vec2/f32/subtract.ts +1 -0
  1565. package/src/interface/math/vec2/f32/tan.ts +1 -0
  1566. package/src/interface/math/vec2/f32/tanh.ts +1 -0
  1567. package/src/interface/math/vec2/f32/trunc.ts +1 -0
  1568. package/src/interface/math/vec2/f32/zero.ts +1 -0
  1569. package/src/interface/math/vec2/i32/abs.ts +1 -0
  1570. package/src/interface/math/vec2/i32/add.ts +1 -0
  1571. package/src/interface/math/vec2/i32/bitwise-and.ts +1 -0
  1572. package/src/interface/math/vec2/i32/bitwise-not.ts +1 -0
  1573. package/src/interface/math/vec2/i32/bitwise-or.ts +1 -0
  1574. package/src/interface/math/vec2/i32/bitwise-xor.ts +1 -0
  1575. package/src/interface/math/vec2/i32/clamp.ts +1 -0
  1576. package/src/interface/math/vec2/i32/count-leading-zeros.ts +1 -0
  1577. package/src/interface/math/vec2/i32/count-one-bits.ts +1 -0
  1578. package/src/interface/math/vec2/i32/count-trailing-zeros.ts +1 -0
  1579. package/src/interface/math/vec2/i32/equals.ts +1 -0
  1580. package/src/interface/math/vec2/i32/i32.ts +5 -1
  1581. package/src/interface/math/vec2/i32/max.ts +1 -0
  1582. package/src/interface/math/vec2/i32/min.ts +1 -0
  1583. package/src/interface/math/vec2/i32/negate.ts +1 -0
  1584. package/src/interface/math/vec2/i32/public.ts +2 -0
  1585. package/src/interface/math/vec2/i32/reverse-bits.ts +1 -0
  1586. package/src/interface/math/vec2/i32/scale.ts +1 -0
  1587. package/src/interface/math/vec2/i32/schema.ts +1 -0
  1588. package/src/interface/math/vec2/i32/shift-left.ts +1 -0
  1589. package/src/interface/math/vec2/i32/shift-right.ts +1 -0
  1590. package/src/interface/math/vec2/i32/subtract.ts +1 -0
  1591. package/src/interface/math/vec2/i32/zero.ts +1 -0
  1592. package/src/interface/math/vec2/index.ts +1 -0
  1593. package/src/interface/math/vec2/public.ts +2 -0
  1594. package/src/interface/math/vec2/u32/add.ts +1 -0
  1595. package/src/interface/math/vec2/u32/bitwise-and.ts +1 -0
  1596. package/src/interface/math/vec2/u32/bitwise-not.ts +1 -0
  1597. package/src/interface/math/vec2/u32/bitwise-or.ts +1 -0
  1598. package/src/interface/math/vec2/u32/bitwise-xor.ts +1 -0
  1599. package/src/interface/math/vec2/u32/clamp.ts +1 -0
  1600. package/src/interface/math/vec2/u32/count-leading-zeros.ts +1 -0
  1601. package/src/interface/math/vec2/u32/count-one-bits.ts +1 -0
  1602. package/src/interface/math/vec2/u32/count-trailing-zeros.ts +1 -0
  1603. package/src/interface/math/vec2/u32/equals.ts +1 -0
  1604. package/src/interface/math/vec2/u32/max.ts +1 -0
  1605. package/src/interface/math/vec2/u32/min.ts +1 -0
  1606. package/src/interface/math/vec2/u32/negate.ts +1 -0
  1607. package/src/interface/math/vec2/u32/public.ts +2 -0
  1608. package/src/interface/math/vec2/u32/reverse-bits.ts +1 -0
  1609. package/src/interface/math/vec2/u32/scale.ts +1 -0
  1610. package/src/interface/math/vec2/u32/schema.ts +1 -0
  1611. package/src/interface/math/vec2/u32/shift-left.ts +1 -0
  1612. package/src/interface/math/vec2/u32/shift-right.ts +1 -0
  1613. package/src/interface/math/vec2/u32/subtract.ts +1 -0
  1614. package/src/interface/math/vec2/u32/u32.ts +5 -1
  1615. package/src/interface/math/vec2/u32/zero.ts +1 -0
  1616. package/src/interface/math/vec3/f32/abs.ts +1 -0
  1617. package/src/interface/math/vec3/f32/acos.ts +1 -0
  1618. package/src/interface/math/vec3/f32/acosh.ts +1 -0
  1619. package/src/interface/math/vec3/f32/add.ts +1 -0
  1620. package/src/interface/math/vec3/f32/asin.ts +1 -0
  1621. package/src/interface/math/vec3/f32/asinh.ts +1 -0
  1622. package/src/interface/math/vec3/f32/atan.ts +1 -0
  1623. package/src/interface/math/vec3/f32/atanh.ts +1 -0
  1624. package/src/interface/math/vec3/f32/ceil.ts +1 -0
  1625. package/src/interface/math/vec3/f32/clamp.ts +1 -0
  1626. package/src/interface/math/vec3/f32/cos.ts +1 -0
  1627. package/src/interface/math/vec3/f32/cosh.ts +1 -0
  1628. package/src/interface/math/vec3/f32/cross.ts +1 -0
  1629. package/src/interface/math/vec3/f32/distance-squared.ts +1 -0
  1630. package/src/interface/math/vec3/f32/distance.ts +1 -0
  1631. package/src/interface/math/vec3/f32/dot.ts +1 -0
  1632. package/src/interface/math/vec3/f32/equals.ts +1 -0
  1633. package/src/interface/math/vec3/f32/exp.ts +1 -0
  1634. package/src/interface/math/vec3/f32/exp2.ts +1 -0
  1635. package/src/interface/math/vec3/f32/f32.ts +5 -1
  1636. package/src/interface/math/vec3/f32/faceforward.ts +1 -0
  1637. package/src/interface/math/vec3/f32/floor.ts +1 -0
  1638. package/src/interface/math/vec3/f32/fract.ts +1 -0
  1639. package/src/interface/math/vec3/f32/length-squared.ts +1 -0
  1640. package/src/interface/math/vec3/f32/length.ts +1 -0
  1641. package/src/interface/math/vec3/f32/log.ts +1 -0
  1642. package/src/interface/math/vec3/f32/log2.ts +1 -0
  1643. package/src/interface/math/vec3/f32/max.ts +1 -0
  1644. package/src/interface/math/vec3/f32/min.ts +1 -0
  1645. package/src/interface/math/vec3/f32/mix.ts +1 -0
  1646. package/src/interface/math/vec3/f32/mod.ts +1 -0
  1647. package/src/interface/math/vec3/f32/modf.ts +1 -0
  1648. package/src/interface/math/vec3/f32/multiply.ts +1 -0
  1649. package/src/interface/math/vec3/f32/negate.ts +1 -0
  1650. package/src/interface/math/vec3/f32/normalize.ts +1 -0
  1651. package/src/interface/math/vec3/f32/one.ts +1 -0
  1652. package/src/interface/math/vec3/f32/pow.ts +1 -0
  1653. package/src/interface/math/vec3/f32/public.ts +2 -0
  1654. package/src/interface/math/vec3/f32/random.ts +1 -0
  1655. package/src/interface/math/vec3/f32/reflect.ts +1 -0
  1656. package/src/interface/math/vec3/f32/refract.ts +1 -0
  1657. package/src/interface/math/vec3/f32/round.ts +1 -0
  1658. package/src/interface/math/vec3/f32/scale.ts +1 -0
  1659. package/src/interface/math/vec3/f32/schema.ts +1 -0
  1660. package/src/interface/math/vec3/f32/sign.ts +1 -0
  1661. package/src/interface/math/vec3/f32/sin.ts +1 -0
  1662. package/src/interface/math/vec3/f32/sinh.ts +1 -0
  1663. package/src/interface/math/vec3/f32/smoothstep.ts +1 -0
  1664. package/src/interface/math/vec3/f32/sqrt.ts +1 -0
  1665. package/src/interface/math/vec3/f32/step.ts +1 -0
  1666. package/src/interface/math/vec3/f32/subtract.ts +1 -0
  1667. package/src/interface/math/vec3/f32/tan.ts +1 -0
  1668. package/src/interface/math/vec3/f32/tanh.ts +1 -0
  1669. package/src/interface/math/vec3/f32/trunc.ts +1 -0
  1670. package/src/interface/math/vec3/f32/zero.ts +1 -0
  1671. package/src/interface/math/vec3/i32/abs.ts +1 -0
  1672. package/src/interface/math/vec3/i32/add.ts +1 -0
  1673. package/src/interface/math/vec3/i32/bitwise-and.ts +1 -0
  1674. package/src/interface/math/vec3/i32/bitwise-not.ts +1 -0
  1675. package/src/interface/math/vec3/i32/bitwise-or.ts +1 -0
  1676. package/src/interface/math/vec3/i32/bitwise-xor.ts +1 -0
  1677. package/src/interface/math/vec3/i32/clamp.ts +1 -0
  1678. package/src/interface/math/vec3/i32/count-leading-zeros.ts +1 -0
  1679. package/src/interface/math/vec3/i32/count-one-bits.ts +1 -0
  1680. package/src/interface/math/vec3/i32/count-trailing-zeros.ts +1 -0
  1681. package/src/interface/math/vec3/i32/equals.ts +1 -0
  1682. package/src/interface/math/vec3/i32/i32.ts +5 -1
  1683. package/src/interface/math/vec3/i32/max.ts +1 -0
  1684. package/src/interface/math/vec3/i32/min.ts +1 -0
  1685. package/src/interface/math/vec3/i32/multiply.ts +1 -0
  1686. package/src/interface/math/vec3/i32/negate.ts +1 -0
  1687. package/src/interface/math/vec3/i32/one.ts +1 -0
  1688. package/src/interface/math/vec3/i32/public.ts +2 -0
  1689. package/src/interface/math/vec3/i32/reverse-bits.ts +1 -0
  1690. package/src/interface/math/vec3/i32/scale.ts +1 -0
  1691. package/src/interface/math/vec3/i32/schema.ts +1 -0
  1692. package/src/interface/math/vec3/i32/shift-left.ts +1 -0
  1693. package/src/interface/math/vec3/i32/shift-right.ts +1 -0
  1694. package/src/interface/math/vec3/i32/subtract.ts +1 -0
  1695. package/src/interface/math/vec3/i32/zero.ts +1 -0
  1696. package/src/interface/math/vec3/index.ts +1 -0
  1697. package/src/interface/math/vec3/public.ts +2 -0
  1698. package/src/interface/math/vec3/u32/add.ts +1 -0
  1699. package/src/interface/math/vec3/u32/bitwise-and.ts +1 -0
  1700. package/src/interface/math/vec3/u32/bitwise-not.ts +1 -0
  1701. package/src/interface/math/vec3/u32/bitwise-or.ts +1 -0
  1702. package/src/interface/math/vec3/u32/bitwise-xor.ts +1 -0
  1703. package/src/interface/math/vec3/u32/clamp.ts +1 -0
  1704. package/src/interface/math/vec3/u32/count-leading-zeros.ts +1 -0
  1705. package/src/interface/math/vec3/u32/count-one-bits.ts +1 -0
  1706. package/src/interface/math/vec3/u32/count-trailing-zeros.ts +1 -0
  1707. package/src/interface/math/vec3/u32/equals.ts +1 -0
  1708. package/src/interface/math/vec3/u32/max.ts +1 -0
  1709. package/src/interface/math/vec3/u32/min.ts +1 -0
  1710. package/src/interface/math/vec3/u32/multiply.ts +1 -0
  1711. package/src/interface/math/vec3/u32/negate.ts +1 -0
  1712. package/src/interface/math/vec3/u32/one.ts +1 -0
  1713. package/src/interface/math/vec3/u32/public.ts +2 -0
  1714. package/src/interface/math/vec3/u32/reverse-bits.ts +1 -0
  1715. package/src/interface/math/vec3/u32/scale.ts +1 -0
  1716. package/src/interface/math/vec3/u32/schema.ts +1 -0
  1717. package/src/interface/math/vec3/u32/shift-left.ts +1 -0
  1718. package/src/interface/math/vec3/u32/shift-right.ts +1 -0
  1719. package/src/interface/math/vec3/u32/subtract.ts +1 -0
  1720. package/src/interface/math/vec3/u32/u32.ts +5 -1
  1721. package/src/interface/math/vec3/u32/volume.ts +1 -0
  1722. package/src/interface/math/vec3/u32/zero.ts +1 -0
  1723. package/src/interface/math/vec4/f32/abs.ts +1 -0
  1724. package/src/interface/math/vec4/f32/acos.ts +1 -0
  1725. package/src/interface/math/vec4/f32/acosh.ts +1 -0
  1726. package/src/interface/math/vec4/f32/add.ts +1 -0
  1727. package/src/interface/math/vec4/f32/asin.ts +1 -0
  1728. package/src/interface/math/vec4/f32/asinh.ts +1 -0
  1729. package/src/interface/math/vec4/f32/atan.ts +1 -0
  1730. package/src/interface/math/vec4/f32/atanh.ts +1 -0
  1731. package/src/interface/math/vec4/f32/ceil.ts +1 -0
  1732. package/src/interface/math/vec4/f32/clamp.ts +1 -0
  1733. package/src/interface/math/vec4/f32/cos.ts +1 -0
  1734. package/src/interface/math/vec4/f32/cosh.ts +1 -0
  1735. package/src/interface/math/vec4/f32/default.ts +6 -0
  1736. package/src/interface/math/vec4/f32/distance.ts +1 -0
  1737. package/src/interface/math/vec4/f32/dot.ts +1 -0
  1738. package/src/interface/math/vec4/f32/exp.ts +1 -0
  1739. package/src/interface/math/vec4/f32/exp2.ts +1 -0
  1740. package/src/interface/math/vec4/f32/f32.ts +5 -1
  1741. package/src/interface/math/vec4/f32/faceforward.ts +1 -0
  1742. package/src/interface/math/vec4/f32/floor.ts +1 -0
  1743. package/src/interface/math/vec4/f32/fract.ts +1 -0
  1744. package/src/interface/math/vec4/f32/length.ts +1 -0
  1745. package/src/interface/math/vec4/f32/log.ts +1 -0
  1746. package/src/interface/math/vec4/f32/log2.ts +1 -0
  1747. package/src/interface/math/vec4/f32/max.ts +1 -0
  1748. package/src/interface/math/vec4/f32/min.ts +1 -0
  1749. package/src/interface/math/vec4/f32/mix.ts +1 -0
  1750. package/src/interface/math/vec4/f32/mod.ts +1 -0
  1751. package/src/interface/math/vec4/f32/modf.ts +1 -0
  1752. package/src/interface/math/vec4/f32/multiply.ts +1 -0
  1753. package/src/interface/math/vec4/f32/negate.ts +1 -0
  1754. package/src/interface/math/vec4/f32/normalize.ts +1 -0
  1755. package/src/interface/math/vec4/f32/pow.ts +1 -0
  1756. package/src/interface/math/vec4/f32/public.ts +2 -0
  1757. package/src/interface/math/vec4/f32/reflect.ts +1 -0
  1758. package/src/interface/math/vec4/f32/refract.ts +1 -0
  1759. package/src/interface/math/vec4/f32/round.ts +1 -0
  1760. package/src/interface/math/vec4/f32/scale.ts +1 -0
  1761. package/src/interface/math/vec4/f32/schema.ts +1 -0
  1762. package/src/interface/math/vec4/f32/sign.ts +1 -0
  1763. package/src/interface/math/vec4/f32/sin.ts +1 -0
  1764. package/src/interface/math/vec4/f32/sinh.ts +1 -0
  1765. package/src/interface/math/vec4/f32/smoothstep.ts +1 -0
  1766. package/src/interface/math/vec4/f32/sqrt.ts +1 -0
  1767. package/src/interface/math/vec4/f32/step.ts +1 -0
  1768. package/src/interface/math/vec4/f32/subtract.ts +1 -0
  1769. package/src/interface/math/vec4/f32/tan.ts +1 -0
  1770. package/src/interface/math/vec4/f32/tanh.ts +1 -0
  1771. package/src/interface/math/vec4/f32/trunc.ts +1 -0
  1772. package/src/interface/math/vec4/i32/abs.ts +1 -0
  1773. package/src/interface/math/vec4/i32/add.ts +1 -0
  1774. package/src/interface/math/vec4/i32/bitwise-and.ts +1 -0
  1775. package/src/interface/math/vec4/i32/bitwise-not.ts +1 -0
  1776. package/src/interface/math/vec4/i32/bitwise-or.ts +1 -0
  1777. package/src/interface/math/vec4/i32/bitwise-xor.ts +1 -0
  1778. package/src/interface/math/vec4/i32/clamp.ts +1 -0
  1779. package/src/interface/math/vec4/i32/count-leading-zeros.ts +1 -0
  1780. package/src/interface/math/vec4/i32/count-one-bits.ts +1 -0
  1781. package/src/interface/math/vec4/i32/count-trailing-zeros.ts +1 -0
  1782. package/src/interface/math/vec4/i32/equals.ts +1 -0
  1783. package/src/interface/math/vec4/i32/i32.ts +5 -1
  1784. package/src/interface/math/vec4/i32/max.ts +1 -0
  1785. package/src/interface/math/vec4/i32/min.ts +1 -0
  1786. package/src/interface/math/vec4/i32/multiply.ts +1 -0
  1787. package/src/interface/math/vec4/i32/negate.ts +1 -0
  1788. package/src/interface/math/vec4/i32/one.ts +1 -0
  1789. package/src/interface/math/vec4/i32/public.ts +2 -0
  1790. package/src/interface/math/vec4/i32/reverse-bits.ts +1 -0
  1791. package/src/interface/math/vec4/i32/scale.ts +1 -0
  1792. package/src/interface/math/vec4/i32/schema.ts +1 -0
  1793. package/src/interface/math/vec4/i32/shift-left.ts +1 -0
  1794. package/src/interface/math/vec4/i32/shift-right.ts +1 -0
  1795. package/src/interface/math/vec4/i32/subtract.ts +1 -0
  1796. package/src/interface/math/vec4/i32/zero.ts +1 -0
  1797. package/src/interface/math/vec4/index.ts +1 -0
  1798. package/src/interface/math/vec4/public.ts +2 -0
  1799. package/src/interface/math/vec4/u32/add.ts +1 -0
  1800. package/src/interface/math/vec4/u32/bitwise-and.ts +1 -0
  1801. package/src/interface/math/vec4/u32/bitwise-not.ts +1 -0
  1802. package/src/interface/math/vec4/u32/bitwise-or.ts +1 -0
  1803. package/src/interface/math/vec4/u32/bitwise-xor.ts +1 -0
  1804. package/src/interface/math/vec4/u32/clamp.ts +1 -0
  1805. package/src/interface/math/vec4/u32/count-leading-zeros.ts +1 -0
  1806. package/src/interface/math/vec4/u32/count-one-bits.ts +1 -0
  1807. package/src/interface/math/vec4/u32/count-trailing-zeros.ts +1 -0
  1808. package/src/interface/math/vec4/u32/equals.ts +1 -0
  1809. package/src/interface/math/vec4/u32/max.ts +1 -0
  1810. package/src/interface/math/vec4/u32/min.ts +1 -0
  1811. package/src/interface/math/vec4/u32/multiply.ts +1 -0
  1812. package/src/interface/math/vec4/u32/negate.ts +1 -0
  1813. package/src/interface/math/vec4/u32/one.ts +1 -0
  1814. package/src/interface/math/vec4/u32/public.ts +2 -0
  1815. package/src/interface/math/vec4/u32/reverse-bits.ts +1 -0
  1816. package/src/interface/math/vec4/u32/scale.ts +1 -0
  1817. package/src/interface/math/vec4/u32/schema.ts +1 -0
  1818. package/src/interface/math/vec4/u32/shift-left.ts +1 -0
  1819. package/src/interface/math/vec4/u32/shift-right.ts +1 -0
  1820. package/src/interface/math/vec4/u32/subtract.ts +1 -0
  1821. package/src/interface/math/vec4/u32/u32.ts +5 -1
  1822. package/src/interface/math/vec4/u32/zero.ts +1 -0
  1823. package/src/interface/platform/platform.ts +1 -0
  1824. package/src/interface/registry/archetypes.test.ts +50 -0
  1825. package/src/interface/registry/archetypes.ts +45 -9
  1826. package/src/interface/registry/declarations.ts +107 -13
  1827. package/src/interface/registry/declared.test.ts +40 -0
  1828. package/src/interface/registry/finalizer-order.ts +4 -3
  1829. package/src/interface/registry/ids.test-helper.ts +35 -1
  1830. package/src/interface/registry/ids.test.ts +43 -56
  1831. package/src/interface/registry/ids.ts +46 -0
  1832. package/src/interface/registry/index.ts +4 -3
  1833. package/src/interface/registry/indexes.ts +3 -2
  1834. package/src/interface/registry/items.ts +17 -47
  1835. package/src/interface/registry/layout.test.ts +20 -0
  1836. package/src/interface/registry/layout.ts +11 -3
  1837. package/src/interface/registry/names.test.ts +16 -18
  1838. package/src/interface/registry/names.ts +62 -42
  1839. package/src/interface/registry/program.ts +1 -0
  1840. package/src/interface/registry/reduction.ts +1 -0
  1841. package/src/interface/registry/schedule.ts +10 -14
  1842. package/src/interface/registry/schemas.ts +58 -0
  1843. package/src/interface/registry/strata.ts +1 -0
  1844. package/src/interface/registry/threads.ts +3 -2
  1845. package/src/interface/registry/traits.ts +2 -1
  1846. package/src/interface/registry/written.ts +1 -0
  1847. package/src/interface/resource/condition.ts +4 -3
  1848. package/src/interface/resource/index.ts +1 -2
  1849. package/src/interface/resource/key.ts +1 -0
  1850. package/src/interface/resource/reduction.ts +1 -0
  1851. package/src/interface/resource/register.test.ts +42 -56
  1852. package/src/interface/resource/resource.ts +5 -1
  1853. package/src/interface/resource/types.ts +5 -1
  1854. package/src/interface/resource/value.ts +6 -5
  1855. package/src/interface/resource/written.ts +1 -0
  1856. package/src/interface/resources/always.ts +3 -2
  1857. package/src/interface/resources/cadence.ts +5 -4
  1858. package/src/interface/resources/clock.ts +5 -3
  1859. package/src/interface/resources/gpu-device.ts +3 -2
  1860. package/src/interface/resources/index.ts +1 -0
  1861. package/src/interface/resources/wake.ts +3 -2
  1862. package/src/interface/resources/workers.ts +3 -2
  1863. package/src/interface/rule/create.ts +9 -7
  1864. package/src/interface/rule/created.ts +3 -2
  1865. package/src/interface/rule/declaration.ts +7 -3
  1866. package/src/interface/rule/index.ts +1 -0
  1867. package/src/interface/rule/rule.ts +1 -0
  1868. package/src/interface/rule/rule.type-test.ts +17 -27
  1869. package/src/interface/schema/is-struct.ts +12 -0
  1870. package/src/interface/schema/schema.ts +23 -1
  1871. package/src/interface/schema/schema.type-test.ts +18 -16
  1872. package/src/interface/schema/schemas.type-test.ts +1 -0
  1873. package/src/interface/system/access.ts +68 -28
  1874. package/src/interface/system/body.ts +53 -23
  1875. package/src/interface/system/check.ts +82 -44
  1876. package/src/interface/system/commands.ts +51 -6
  1877. package/src/interface/system/commands.type-test.ts +2 -8
  1878. package/src/interface/system/composite-declaration.ts +1 -2
  1879. package/src/interface/system/composite-input.type-test.ts +13 -29
  1880. package/src/interface/system/composite.ts +1 -0
  1881. package/src/interface/system/conditions.type-test.ts +11 -22
  1882. package/src/interface/system/create-resolved.ts +21 -0
  1883. package/src/interface/system/create.test.ts +96 -116
  1884. package/src/interface/system/create.ts +121 -94
  1885. package/src/interface/system/declaration.ts +33 -25
  1886. package/src/interface/system/definition.ts +1 -0
  1887. package/src/interface/system/index.ts +1 -0
  1888. package/src/interface/system/input.ts +35 -4
  1889. package/src/interface/system/leaf.ts +10 -3
  1890. package/src/interface/system/lists.type-test.ts +53 -0
  1891. package/src/interface/system/name.ts +4 -3
  1892. package/src/interface/system/optional.type-test.ts +51 -0
  1893. package/src/interface/system/property.ts +1 -0
  1894. package/src/interface/system/render.ts +45 -20
  1895. package/src/interface/system/resolve.test.ts +49 -0
  1896. package/src/interface/system/resolve.ts +165 -0
  1897. package/src/interface/system/shared.type-test.ts +205 -0
  1898. package/src/interface/system/struct.ts +3 -2
  1899. package/src/interface/system/system.ts +5 -3
  1900. package/src/interface/system/system.type-test.ts +160 -197
  1901. package/src/interface/system/threads.ts +9 -8
  1902. package/src/interface/system/threads.type-test.ts +29 -60
  1903. package/src/interface/system/up.type-test.ts +15 -28
  1904. package/src/interface/system/values-of.ts +17 -0
  1905. package/src/interface/system/values.ts +18 -15
  1906. package/src/interface/thread/of.ts +4 -3
  1907. package/src/interface/thread/thread.ts +1 -0
  1908. package/src/interface/thread/thread.type-test.ts +4 -69
  1909. package/src/interface/trait/key.ts +2 -1
  1910. package/src/interface/trait/trait.type-test.ts +8 -81
  1911. package/src/interface/trait/types.ts +21 -8
  1912. package/src/interface/tsconfig.json +1 -1
  1913. package/src/interface/world/create.ts +10 -7
  1914. package/src/interface/world/declarations.ts +34 -0
  1915. package/src/interface/world/filter.ts +1 -0
  1916. package/src/interface/world/index.ts +1 -0
  1917. package/src/interface/world/join.ts +4 -5
  1918. package/src/interface/world/loop.type-test.ts +21 -16
  1919. package/src/interface/world/run.type-test.ts +87 -0
  1920. package/src/interface/world/share.type-test.ts +8 -2
  1921. package/src/interface/world/world.ts +32 -17
  1922. package/src/interface/world/world.type-test.ts +6 -10
  1923. package/src/observe/compare.ts +1 -0
  1924. package/src/observe/entity.ts +21 -13
  1925. package/src/observe/index.ts +1 -0
  1926. package/src/observe/members.ts +4 -3
  1927. package/src/observe/observe.ts +1 -0
  1928. package/src/observe/observe.type-test.ts +1 -4
  1929. package/src/observe/plans.ts +1 -0
  1930. package/src/observe/query.ts +2 -1
  1931. package/src/observe/resource.ts +5 -4
  1932. package/src/observe/select.ts +14 -13
  1933. package/src/observe/to-promise.ts +1 -0
  1934. package/src/observe/tsconfig.json +1 -1
  1935. package/src/observe/values.ts +3 -2
  1936. package/src/observe/world-state.ts +41 -34
  1937. package/src/observe-imports.test.ts +1 -0
  1938. package/src/perftest/benchmark.ts +1 -0
  1939. package/src/perftest/benchmarks.ts +24 -8
  1940. package/src/perftest/editor.ts +126 -0
  1941. package/src/perftest/filters.ts +124 -0
  1942. package/src/perftest/finalized.ts +72 -24
  1943. package/src/perftest/flat.ts +16 -26
  1944. package/src/perftest/growth.ts +7 -15
  1945. package/src/perftest/handoff.ts +30 -37
  1946. package/src/perftest/hierarchy.ts +23 -40
  1947. package/src/perftest/indexes.ts +132 -64
  1948. package/src/perftest/invariants.ts +63 -0
  1949. package/src/perftest/joined.ts +13 -5
  1950. package/src/perftest/journal.ts +55 -0
  1951. package/src/perftest/keys.ts +1 -0
  1952. package/src/perftest/log.ts +6 -6
  1953. package/src/perftest/loop.ts +2 -1
  1954. package/src/perftest/observed-gpu.ts +6 -7
  1955. package/src/perftest/observed.ts +6 -12
  1956. package/src/perftest/observer.ts +5 -4
  1957. package/src/perftest/optional.ts +102 -0
  1958. package/src/perftest/particles.ts +13 -20
  1959. package/src/perftest/placed.ts +1 -0
  1960. package/src/perftest/reads.ts +13 -18
  1961. package/src/perftest/remote.ts +26 -28
  1962. package/src/perftest/render-order.ts +86 -0
  1963. package/src/perftest/run.ts +1 -0
  1964. package/src/perftest/shared.ts +416 -0
  1965. package/src/perftest/strings.ts +14 -12
  1966. package/src/perftest/structural.ts +32 -46
  1967. package/src/perftest/suite.perf-browser-test.ts +3 -0
  1968. package/src/perftest/suite.perf-test.ts +1 -0
  1969. package/src/perftest/suite.ts +41 -59
  1970. package/src/perftest/systems.ts +4 -6
  1971. package/src/perftest/tails.ts +40 -48
  1972. package/src/perftest/transfers.ts +25 -20
  1973. package/src/perftest/uploads.ts +11 -13
  1974. package/src/perftest/values.ts +8 -12
  1975. package/src/perftest/wake.ts +1 -0
  1976. package/src/world.test.ts +10 -10
  1977. package/dist/implementation/compiler/exact.d.ts +0 -24
  1978. package/dist/implementation/compiler/exact.js +0 -64
  1979. package/dist/implementation/compiler/exact.js.map +0 -1
  1980. package/dist/implementation/world/reports.d.ts +0 -63
  1981. package/dist/implementation/world/reports.js +0 -180
  1982. package/dist/implementation/world/reports.js.map +0 -1
  1983. package/dist/interface/archetype/archetype.d.ts +0 -2
  1984. package/dist/interface/archetype/archetype.js +0 -2
  1985. package/dist/interface/archetype/archetype.js.map +0 -1
  1986. package/dist/interface/archetype/create.d.ts +0 -7
  1987. package/dist/interface/archetype/create.js +0 -11
  1988. package/dist/interface/archetype/create.js.map +0 -1
  1989. package/dist/interface/archetype/index.d.ts +0 -1
  1990. package/dist/interface/archetype/index.js +0 -2
  1991. package/dist/interface/archetype/index.js.map +0 -1
  1992. package/dist/interface/archetype/values-of.d.ts +0 -17
  1993. package/dist/interface/archetype/values-of.js.map +0 -1
  1994. package/dist/interface/component/declaration.d.ts +0 -74
  1995. package/dist/interface/component/declaration.js +0 -2
  1996. package/dist/interface/component/declaration.js.map +0 -1
  1997. package/dist/interface/component/register.d.ts +0 -23
  1998. package/dist/interface/component/register.js +0 -6
  1999. package/dist/interface/component/register.js.map +0 -1
  2000. package/dist/interface/finalizer/name.d.ts +0 -6
  2001. package/dist/interface/finalizer/name.js +0 -2
  2002. package/dist/interface/finalizer/name.js.map +0 -1
  2003. package/dist/interface/indexes/name.d.ts +0 -5
  2004. package/dist/interface/indexes/name.js +0 -2
  2005. package/dist/interface/indexes/name.js.map +0 -1
  2006. package/dist/interface/report/components.d.ts +0 -38
  2007. package/dist/interface/report/components.js +0 -48
  2008. package/dist/interface/report/components.js.map +0 -1
  2009. package/dist/interface/report/failure.d.ts +0 -29
  2010. package/dist/interface/report/failure.js +0 -2
  2011. package/dist/interface/report/failure.js.map +0 -1
  2012. package/dist/interface/report/index.d.ts +0 -5
  2013. package/dist/interface/report/index.js +0 -6
  2014. package/dist/interface/report/index.js.map +0 -1
  2015. package/dist/interface/report/report.d.ts +0 -12
  2016. package/dist/interface/report/report.js +0 -2
  2017. package/dist/interface/report/report.js.map +0 -1
  2018. package/dist/interface/resource/declaration.d.ts +0 -31
  2019. package/dist/interface/resource/declaration.js +0 -2
  2020. package/dist/interface/resource/declaration.js.map +0 -1
  2021. package/dist/interface/resource/register.d.ts +0 -13
  2022. package/dist/interface/resource/register.js +0 -6
  2023. package/dist/interface/resource/register.js.map +0 -1
  2024. package/dist/interface/rule/name.d.ts +0 -6
  2025. package/dist/interface/rule/name.js +0 -2
  2026. package/dist/interface/rule/name.js.map +0 -1
  2027. package/dist/interface/schema/is-data.d.ts +0 -19
  2028. package/dist/interface/schema/is-data.js +0 -2
  2029. package/dist/interface/schema/is-data.js.map +0 -1
  2030. package/dist/interface/trait/index.d.ts +0 -1
  2031. package/dist/interface/trait/index.js +0 -2
  2032. package/dist/interface/trait/index.js.map +0 -1
  2033. package/dist/interface/trait/register.d.ts +0 -7
  2034. package/dist/interface/trait/register.js +0 -8
  2035. package/dist/interface/trait/register.js.map +0 -1
  2036. package/dist/interface/trait/required.d.ts +0 -10
  2037. package/dist/interface/trait/required.js +0 -2
  2038. package/dist/interface/trait/required.js.map +0 -1
  2039. package/dist/interface/trait/symbol-keys.d.ts +0 -16
  2040. package/dist/interface/trait/symbol-keys.js +0 -2
  2041. package/dist/interface/trait/symbol-keys.js.map +0 -1
  2042. package/dist/interface/trait/trait.d.ts +0 -2
  2043. package/dist/interface/trait/trait.js +0 -2
  2044. package/dist/interface/trait/trait.js.map +0 -1
  2045. package/src/guide/01-resources.test.ts +0 -44
  2046. package/src/guide/02-entities.test.ts +0 -57
  2047. package/src/guide/03-systems.test.ts +0 -87
  2048. package/src/guide/04-ticks.test.ts +0 -73
  2049. package/src/guide/05-scheduling.test.ts +0 -60
  2050. package/src/guide/06-sync-points.test.ts +0 -59
  2051. package/src/guide/07-change-filters.test.ts +0 -87
  2052. package/src/guide/08-input.test.ts +0 -47
  2053. package/src/guide/09-rules.test.ts +0 -57
  2054. package/src/guide/10-finalizers.test.ts +0 -64
  2055. package/src/guide/11-traits.test.ts +0 -58
  2056. package/src/guide/13-indexes.test.ts +0 -95
  2057. package/src/guide/guide.md +0 -551
  2058. package/src/implementation/compiler/exact.ts +0 -77
  2059. package/src/implementation/world/reports.test-helper.ts +0 -117
  2060. package/src/implementation/world/reports.test.ts +0 -167
  2061. package/src/implementation/world/reports.ts +0 -203
  2062. package/src/interface/archetype/archetype.ts +0 -3
  2063. package/src/interface/archetype/archetype.type-test.ts +0 -37
  2064. package/src/interface/archetype/create.test.ts +0 -40
  2065. package/src/interface/archetype/create.ts +0 -12
  2066. package/src/interface/archetype/index.ts +0 -1
  2067. package/src/interface/archetype/values-of.ts +0 -16
  2068. package/src/interface/component/declaration.ts +0 -67
  2069. package/src/interface/component/declaration.type-test.ts +0 -87
  2070. package/src/interface/component/register.ts +0 -28
  2071. package/src/interface/finalizer/name.ts +0 -6
  2072. package/src/interface/indexes/name.ts +0 -5
  2073. package/src/interface/report/components.ts +0 -69
  2074. package/src/interface/report/failure.ts +0 -26
  2075. package/src/interface/report/index.ts +0 -8
  2076. package/src/interface/report/report.ts +0 -11
  2077. package/src/interface/report/report.type-test.ts +0 -63
  2078. package/src/interface/resource/declaration.ts +0 -29
  2079. package/src/interface/resource/declaration.type-test.ts +0 -89
  2080. package/src/interface/resource/register.ts +0 -18
  2081. package/src/interface/rule/name.ts +0 -6
  2082. package/src/interface/schema/is-data.ts +0 -25
  2083. package/src/interface/trait/index.ts +0 -1
  2084. package/src/interface/trait/register.ts +0 -9
  2085. package/src/interface/trait/required.ts +0 -7
  2086. package/src/interface/trait/symbol-keys.ts +0 -19
  2087. package/src/interface/trait/symbol-keys.type-test.ts +0 -14
  2088. package/src/interface/trait/trait.ts +0 -3
  2089. package/src/samples/particles/build.test.ts +0 -23
  2090. package/src/samples/particles/gpu/main.ts +0 -96
  2091. package/src/samples/particles/gpu/particles.ts +0 -138
  2092. package/src/samples/particles/index.html +0 -22
  2093. package/src/samples/particles/particles.test.ts +0 -31
  2094. package/src/samples/particles/particles.ts +0 -85
  2095. package/src/samples/particles/particles.type-test.ts +0 -7
  2096. package/src/samples/todo/README.md +0 -174
  2097. package/src/samples/todo/app/app.browser.test.ts +0 -215
  2098. package/src/samples/todo/app/app.ts +0 -30
  2099. package/src/samples/todo/app/log-failures.test.ts +0 -28
  2100. package/src/samples/todo/app/log-failures.ts +0 -7
  2101. package/src/samples/todo/app/main.ts +0 -4
  2102. package/src/samples/todo/app/profile.perf-browser-test.ts +0 -100
  2103. package/src/samples/todo/app/proportional.browser.test.ts +0 -157
  2104. package/src/samples/todo/app/todo.perf-browser-test.ts +0 -207
  2105. package/src/samples/todo/build.test.ts +0 -23
  2106. package/src/samples/todo/features/completion/data.ts +0 -5
  2107. package/src/samples/todo/features/completion/dom.browser.test.ts +0 -53
  2108. package/src/samples/todo/features/completion/dom.ts +0 -39
  2109. package/src/samples/todo/features/completion/elements/elements.browser.test.ts +0 -68
  2110. package/src/samples/todo/features/completion/elements/todo-summary.ts +0 -82
  2111. package/src/samples/todo/features/completion/elements/todo-toggle-all.ts +0 -69
  2112. package/src/samples/todo/features/completion/events.ts +0 -7
  2113. package/src/samples/todo/features/completion/feature.ts +0 -13
  2114. package/src/samples/todo/features/completion/model.test.ts +0 -40
  2115. package/src/samples/todo/features/completion/model.ts +0 -21
  2116. package/src/samples/todo/features/filter/data.ts +0 -16
  2117. package/src/samples/todo/features/filter/dom.browser.test.ts +0 -84
  2118. package/src/samples/todo/features/filter/dom.ts +0 -63
  2119. package/src/samples/todo/features/filter/elements/elements.browser.test.ts +0 -43
  2120. package/src/samples/todo/features/filter/elements/todo-filters.ts +0 -70
  2121. package/src/samples/todo/features/filter/events.ts +0 -4
  2122. package/src/samples/todo/features/filter/feature.ts +0 -12
  2123. package/src/samples/todo/features/filter/model.test.ts +0 -18
  2124. package/src/samples/todo/features/filter/model.ts +0 -10
  2125. package/src/samples/todo/features/generate/elements/elements.browser.test.ts +0 -18
  2126. package/src/samples/todo/features/generate/elements/todo-generate.ts +0 -36
  2127. package/src/samples/todo/features/generate/events.ts +0 -4
  2128. package/src/samples/todo/features/generate/feature.ts +0 -11
  2129. package/src/samples/todo/features/generate/model.test.ts +0 -13
  2130. package/src/samples/todo/features/generate/model.ts +0 -19
  2131. package/src/samples/todo/features/index.ts +0 -4
  2132. package/src/samples/todo/features/todos/data.ts +0 -31
  2133. package/src/samples/todo/features/todos/dom.browser.test.ts +0 -205
  2134. package/src/samples/todo/features/todos/dom.ts +0 -90
  2135. package/src/samples/todo/features/todos/elements/elements.browser.test.ts +0 -211
  2136. package/src/samples/todo/features/todos/elements/todo-entry.ts +0 -45
  2137. package/src/samples/todo/features/todos/elements/todo-list.ts +0 -93
  2138. package/src/samples/todo/features/todos/elements/todo-row.ts +0 -138
  2139. package/src/samples/todo/features/todos/events.ts +0 -11
  2140. package/src/samples/todo/features/todos/feature.ts +0 -14
  2141. package/src/samples/todo/features/todos/model.test.ts +0 -77
  2142. package/src/samples/todo/features/todos/model.ts +0 -80
  2143. package/src/samples/todo/features/todos/todos.test-helper.ts +0 -34
  2144. package/src/samples/todo/imports.test.ts +0 -113
  2145. package/src/samples/todo/index.html +0 -51
  2146. package/src/samples/todo/shared/attach.browser.test.ts +0 -73
  2147. package/src/samples/todo/shared/attach.ts +0 -32
  2148. package/src/samples/todo/shared/connect.ts +0 -21
  2149. package/src/samples/todo/shared/elements/define.ts +0 -7
  2150. package/src/samples/todo/shared/elements/elements.test-helper.ts +0 -28
  2151. package/src/samples/todo/shared/feature.ts +0 -20
  2152. package/src/samples/todo/shared/ticks.test-helper.ts +0 -25
  2153. package/src/samples/transfers/build.test.ts +0 -22
  2154. package/src/samples/transfers/index.html +0 -18
  2155. package/src/samples/transfers/loader.ts +0 -42
  2156. package/src/samples/transfers/main.ts +0 -46
  2157. package/src/samples/transfers/sprites.ts +0 -96
  2158. package/src/samples/transfers/world.ts +0 -11
  2159. /package/dist/interface/{archetype → system}/values-of.js +0 -0
@@ -1,13 +1,14 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
1
2
  /// <reference types="node" />
2
3
  import { existsSync } from 'node:fs';
3
4
  import { readFile } from 'node:fs/promises';
4
5
  import { dirname, resolve } from 'node:path';
5
6
  import { describe, expect, test } from 'vitest';
6
7
  import { parseAst } from 'vite';
7
- import { chunkShift, type KernelDescription, type KernelModule, type Program } from '../world/kernel.js';
8
+ import { blockShift, chunkShift, type KernelDescription, type KernelModule, type Program } from '../world/kernel.js';
8
9
  import { transformKernels } from './transform.js';
9
10
  import { createLinker, type LinkHost } from './link.js';
10
- import { packageIndex } from './paths.js';
11
+ import { nodeCopies, ownCopy } from './paths.js';
11
12
  import { locateThroughMap } from './source-map.js';
12
13
  import { estreeOf } from './estree.js';
13
14
  import { Mat4x4, Quat, Vec3 } from '../../interface/math/index.js';
@@ -27,10 +28,19 @@ const delta = "delta";
27
28
  const target = "target";
28
29
  `;
29
30
 
30
- /** Modules by absolute path, for tests of imports: real files for anything not in `files`, and "ecs" for the package. */
31
- const host = (files: { readonly [file: string]: string }): LinkHost => ({
31
+ /** The operators the test module's resources declare in their `reduce` traits, by binding. */
32
+ type Reductions = { readonly [binding: string]: string };
33
+ const reductions: Reductions = { total: "+", low: "min", bits: "|" };
34
+
35
+ /**
36
+ * Modules by absolute path, for tests of imports: real files for anything not in `files`, and "ecs" for the package;
37
+ * the test module's resources reduce with `reduced`.
38
+ */
39
+ const host = (files: { readonly [file: string]: string }, reduced: Reductions = reductions): LinkHost => ({
40
+ packages: nodeCopies,
41
+ reductions: file => new Map(file === "/test.js" ? Object.entries(reduced) : []),
32
42
  resolve: async (specifier, importer) => {
33
- if (specifier === "ecs") return packageIndex;
43
+ if (specifier === "ecs") return ownCopy.index;
34
44
  if (specifier === "external") return { error: "external is external to the build", unreadable: true };
35
45
  if (!specifier.startsWith(".")) return { error: `${specifier} can't be resolved from ${importer}` };
36
46
  const path = resolve(dirname(importer), specifier);
@@ -46,8 +56,8 @@ const host = (files: { readonly [file: string]: string }): LinkHost => ({
46
56
  },
47
57
  });
48
58
 
49
- const transform = (source: string, files: { readonly [file: string]: string } = {}) => transformKernels(`${header}${source}`, "/test.js", parse,
50
- async specifier => specifier === "ecs", index => JSON.stringify(`kernel:${index}`), createLinker(host(files), parse));
59
+ const transform = (source: string, files: { readonly [file: string]: string } = {}, reduced: Reductions = reductions, automatic = true) => transformKernels(`${header}${source}`, "/test.js", parse,
60
+ async specifier => specifier === "ecs" ? ownCopy : null, index => JSON.stringify(`kernel:${index}`), createLinker(host(files, reduced), parse), automatic);
51
61
 
52
62
  type Compiled = KernelDescription & KernelModule;
53
63
 
@@ -55,8 +65,8 @@ type Compiled = KernelDescription & KernelModule;
55
65
  * Compiles `source`, which assigns its kernel system to `kernel`: the attached description plus its kernel module's
56
66
  * `create`. `imported` gives the values of the bindings `source` imports, since its imports aren't evaluated.
57
67
  */
58
- const compile = async (source: string, files: { readonly [file: string]: string } = {}, imported: { readonly [name: string]: unknown } = {}): Promise<Compiled> => {
59
- const result = await transform(source, files);
68
+ const compile = async (source: string, files: { readonly [file: string]: string } = {}, imported: { readonly [name: string]: unknown } = {}, reduced: Reductions = reductions): Promise<Compiled> => {
69
+ const result = await transform(source, files, reduced);
60
70
  if (result === null || "failure" in result) throw new Error(result === null ? "no kernel" : result.failure.message);
61
71
  const module = result.code.split("\n").filter(line => !line.startsWith("import ")).join("\n");
62
72
  const evaluate = new Function("System", "attachKernel$", "Archetype", ...Object.keys(imported), `${module}\nreturn kernel;`);
@@ -67,8 +77,8 @@ const compile = async (source: string, files: { readonly [file: string]: string
67
77
  return { ...description, ...kernelModule };
68
78
  };
69
79
 
70
- const failure = async (source: string, files: { readonly [file: string]: string } = {}): Promise<string> => {
71
- const result = await transform(source, files);
80
+ const failure = async (source: string, files: { readonly [file: string]: string } = {}, reduced: Reductions = reductions): Promise<string> => {
81
+ const result = await transform(source, files, reduced);
72
82
  return result !== null && "failure" in result ? result.failure.message : "compiled";
73
83
  };
74
84
 
@@ -97,7 +107,7 @@ type Layout = { readonly strides: readonly number[]; readonly offsets: readonly
97
107
 
98
108
  /** A reference interpreter for `Program`, indexing columns by the layout as the WASM generator does. */
99
109
  const interpret = (program: Program, columns: readonly (Float64Array | Uint32Array)[], booleans: readonly boolean[], layout: Layout, start: number, end: number, resources: readonly unknown[], args: unknown,
100
- lookups: readonly ((entity: number) => readonly unknown[] | null)[], partials: Float64Array): void => {
110
+ lookups: readonly ((entity: number) => readonly unknown[] | null)[], partials: Float64Array, shared: readonly unknown[] = []): void => {
101
111
  const accumulators = program.reductions ?? [];
102
112
  /** Accumulators carry from row to row, from their partials and back. */
103
113
  const carried = accumulators.map((_, k) => partials[k] ?? NaN);
@@ -119,6 +129,7 @@ const interpret = (program: Program, columns: readonly (Float64Array | Uint32Arr
119
129
  }
120
130
  case "resource": return scalarAt(resources[node.index], node.path);
121
131
  case "args": return scalarAt(args, node.path);
132
+ case "shared": return scalarAt(shared[node.index], node.path);
122
133
  case "local": return locals[node.local] ?? NaN;
123
134
  case "unary": {
124
135
  const operand = evaluate(node.operand);
@@ -195,8 +206,10 @@ const interpret = (program: Program, columns: readonly (Float64Array | Uint32Arr
195
206
  case "stamp": {
196
207
  const column = columns[statement.column];
197
208
  const chunks = columns[statement.chunks];
209
+ const blocks = columns[statement.blocks];
198
210
  if (column) column[at(statement.column, row)] = tick;
199
211
  if (chunks) chunks[row >> chunkShift] = tick;
212
+ if (blocks) blocks[row >> blockShift] = tick;
200
213
  return normal;
201
214
  }
202
215
  case "if": return execute(evaluate(statement.test) ? statement.consequent : statement.alternate);
@@ -247,6 +260,8 @@ const run = (description: Compiled, rows: number, fields: Fields, options: Optio
247
260
  if (column.kind === "entity") return Float64Array.from({ length: rows }, (_, row) => 100 + row);
248
261
  if (column.kind === "changed") return new Uint32Array(rows);
249
262
  if (column.kind === "chunks") return new Float64Array(Math.ceil(rows / 2 ** chunkShift));
263
+ if (column.kind === "blocks") return new Float64Array(Math.ceil(rows / 2 ** blockShift));
264
+ if (column.kind === "present") return new Float64Array(rows);
250
265
  const component = String(column.component);
251
266
  const values = fields[component]?.[JSON.stringify(column.path)] ?? new Array<number>(rows).fill(0);
252
267
  const stride = interleaved[component]?.stride;
@@ -307,11 +322,63 @@ const run = (description: Compiled, rows: number, fields: Fields, options: Optio
307
322
 
308
323
  const vec3 = (x: readonly number[], y: readonly number[], z: readonly number[]) => ({ "[0]": x, "[1]": y, "[2]": z });
309
324
 
325
+ describe("kernels by default", () => {
326
+ /** Whether the transform attached a kernel to the module's system, and the failure if it failed. */
327
+ const attached = async (source: string, automatic = true): Promise<boolean | string> => {
328
+ const result = await transform(source, {}, reductions, automatic);
329
+ if (result === null) return false;
330
+ return "failure" in result ? result.failure.message : result.code.includes("attachKernel$(");
331
+ };
332
+ test("compiles a system with components whose body is in the subset, unflagged", async () => {
333
+ expect(await attached(`const kernel = System.create({ components: { with: [mass, score] } }, row => { row[score] = row[mass] * 2; });`)).toBe(true);
334
+ });
335
+ test("runs as written, without failing, a body that leaves the subset or a declaration a kernel can't have", async () => {
336
+ expect(await attached(`const log = []; const kernel = System.create({ components: { with: [mass] } }, row => { log.push(row[mass]); });`)).toBe(false);
337
+ expect(await attached(`const kernel = System.create({ components: { with: [mass] } }, (row, { resources }) => { resources[delta] = row[mass]; });`)).toBe(false);
338
+ expect(await attached(`const kernel = System.create({ observer: true, components: { with: [mass] } }, row => { void row[mass]; });`)).toBe(false);
339
+ expect(await attached(`const kernel = System.create({ target: "entity", components: { with: [score] } }, row => { row[score] = 1; });`)).toBe(false);
340
+ expect(await attached(`const make = () => System.create({ components: { with: [score] } }, row => { row[score] = 1; });`)).toBe(false);
341
+ });
342
+ test("runs as written a body reading data of a module object or array, which may change, and compiles one reading constants and functions", async () => {
343
+ expect(await attached(`export const scene = { subject: 0 }; const kernel = System.create({ components: { with: [score] } }, row => { row[score] = scene.subject; });`)).toBe(false);
344
+ expect(await attached(`const values = [1, 2]; const kernel = System.create({ components: { with: [score] } }, row => { row[score] = values[0]; });`)).toBe(false);
345
+ expect(await attached(`const make = () => ({ speed: 2 }); export const settings = make(); const kernel = System.create({ components: { with: [score] } }, row => { row[score] = settings.speed; });`)).toBe(false);
346
+ expect(await attached(`const pair = (a, b) => [a, b]; export const range = pair(1, 2); const kernel = System.create({ components: { with: [score] } }, row => { row[score] = range[1]; });`)).toBe(false);
347
+ expect(await attached(`const wide = true; export const shape = wide ? { size: 2 } : { size: 1 }; const kernel = System.create({ components: { with: [score] } }, row => { row[score] = shape.size; });`)).toBe(false);
348
+ expect(await attached(`const make = () => 3; const three = make(); const kernel = System.create({ components: { with: [score] } }, row => { row[score] = three; });`)).toBe(true);
349
+ expect(await attached(`const half = 0.5; const twice = x => x * 2; const kernel = System.create({ components: { with: [mass, score] } }, row => { row[score] = twice(row[mass]) * half; });`)).toBe(true);
350
+ expect(await failure(`export const scene = { subject: 0 }; const kernel = System.create({ kernel: true, components: { with: [score] } }, row => { row[score] = scene.subject; });`)).toBe("compiled");
351
+ });
352
+ test("tries none unflagged when automatic compilation is off, as the suites of bodies as written turn it", async () => {
353
+ expect(await attached(`const kernel = System.create({ components: { with: [mass, score] } }, row => { row[score] = row[mass] * 2; });`, false)).toBe(false);
354
+ expect(await attached(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, row => { row[score] = row[mass] * 2; });`, false)).toBe(true);
355
+ });
356
+ test("never compiles a system without components or with kernel: false", async () => {
357
+ expect(await attached(`const kernel = System.create({ resources: {} }, ({ resources }) => { void resources[delta]; });`)).toBe(false);
358
+ expect(await attached(`const kernel = System.create({ kernel: false, components: { with: [mass, score] } }, row => { row[score] = row[mass]; });`)).toBe(false);
359
+ });
360
+ test("compiles a system with optional components, testing their presence once per call, and fails a GPU kernel with them", async () => {
361
+ expect(await attached(`const kernel = System.create({ components: { with: [score], optional: [mass] } }, row => { const found = row[mass]; if (found !== undefined) row[score] = found; });`)).toBe(true);
362
+ expect(await attached(`const kernel = System.create({ kernel: true, components: { with: [score], optional: [mass] } }, row => { if (row[mass] !== undefined) row[mass] = row[score]; });`)).toBe(true);
363
+ expect(await failure(`const kernel = System.create({ kernel: "gpu", components: { with: [score], optional: [mass] } }, row => { row[score] = 1; });`))
364
+ .toBe("a GPU kernel can't have optional components: WGSL has no undefined to read where an archetype lacks one, and a GPU kernel can't fail its system for one row; list them in with, or use kernel: true to run it on the CPU");
365
+ expect(await failure(`const kernel = System.create({ components: { with: [score] } }, row => { row[score] = row[mass]; });`))
366
+ .toBe("mass isn't in components with or optional, so the system doesn't require it: add it there to use it");
367
+ });
368
+ test("fails, saying why, a system with kernel: true that can't compile", async () => {
369
+ expect(await attached(`const kernel = System.create({ kernel: true }, ({ resources }) => { void resources[delta]; });`))
370
+ .toBe("a system without components runs once, so there's nothing to compile");
371
+ expect(await attached(`const log = []; const kernel = System.create({ kernel: true, components: { with: [mass] } }, row => { log.push(row[mass]); });`)).not.toBe(true);
372
+ expect(await attached(`const make = () => System.create({ kernel: true, components: { with: [score] } }, row => { row[score] = 1; });`))
373
+ .toBe("kernel systems must be declared at module scope");
374
+ });
375
+ });
376
+
310
377
  describe("particles", () => {
311
378
  test("gravity and integrate", async () => {
312
379
  const gravity = await compile(`const kernel = System.create({
313
- name: "particles/gravity", kernel: "cpu",
314
- components: { write: [velocity] }, resources: { read: [delta] },
380
+ kernel: true,
381
+ components: { with: [velocity] },
315
382
  }, (row, { resources }) => {
316
383
  const [x, y, z] = row[velocity];
317
384
  row[velocity] = [x, y - 9.8 * resources[delta], z];
@@ -323,8 +390,8 @@ describe("particles", () => {
323
390
  expect(gravity.resources).toEqual(["delta"]);
324
391
 
325
392
  const integrate = await compile(`const kernel = System.create({
326
- name: "particles/integrate", kernel: "cpu",
327
- components: { read: [velocity], write: [position] }, resources: { read: [delta] }, after: [{ name: "particles/gravity" }],
393
+ kernel: true,
394
+ components: { with: [velocity, position] }, after: [{}],
328
395
  }, (row, { resources }) => {
329
396
  const [px, py, pz] = row[position];
330
397
  const [vx, vy, vz] = row[velocity];
@@ -342,7 +409,7 @@ describe("particles", () => {
342
409
 
343
410
  describe("layout", () => {
344
411
  test("interleaved components are read and written at row * stride + offset, leaving padding untouched", async () => {
345
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [alive], write: [velocity] } }, (row) => {
412
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [alive, velocity] } }, (row) => {
346
413
  const [x, y, z] = row[velocity];
347
414
  row[velocity] = [z, row[alive] === true ? y * 10 : y, x];
348
415
  });`);
@@ -355,7 +422,7 @@ describe("layout", () => {
355
422
  });
356
423
 
357
424
  test("stamps set the changed row and its chunk; each changed column is followed by its chunk column", async () => {
358
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => {
425
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => {
359
426
  if (row[mass] > 0) row[score] = 1;
360
427
  });`);
361
428
  const rows = 2 * 2 ** chunkShift + 5;
@@ -369,12 +436,12 @@ describe("layout", () => {
369
436
  });
370
437
 
371
438
  test("an unconditional stamp stamps the call's chunks once; a stamp after return stays per row", async () => {
372
- const always = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => {
439
+ const always = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => {
373
440
  row[score] = row[mass];
374
441
  });`);
375
442
  expect(String(always.create)).not.toContain(">> 10] = tick");
376
443
  expect(run(always, 3200, {}, { range: [1000, 2100] }).chunks("score")).toEqual([tick, tick, tick, 0]);
377
- const after = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => {
444
+ const after = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => {
378
445
  if (row[mass] > 0) return;
379
446
  row[score] = 1;
380
447
  });`);
@@ -384,7 +451,7 @@ describe("layout", () => {
384
451
  });
385
452
 
386
453
  test("indices stay in step when return skips the rest of a row", async () => {
387
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [velocity] } }, (row) => {
454
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [velocity] } }, (row) => {
388
455
  const [x, y, z] = row[velocity];
389
456
  if (x > 1 && x < 5) return;
390
457
  row[velocity] = [z, y, x];
@@ -396,14 +463,14 @@ describe("layout", () => {
396
463
  });
397
464
 
398
465
  describe("reductions", () => {
399
- const reducing = (reduce: string, body: string, read = "[position, mass]") => `const total = "total";
466
+ const reducing = (body: string, read = "[position, mass]") => `const total = "total";
400
467
  const low = "low";
401
468
  const bits = "bits";
402
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: ${read} }, reduce: { ${reduce} } }, (row, { reduce }) => { ${body} });`;
469
+ const kernel = System.create({ kernel: true, components: { with: ${read} } }, (row, { reduce, resources }) => { ${body} });`;
403
470
  const fields = { position: vec3([1, -4, 2], [5, 0, -1], [3, 9, 6]), mass: { "[]": [2, 3, 12] } };
404
471
 
405
472
  test("fold each contribution into its resource, leaf by leaf, from the partial", async () => {
406
- const kernel = await compile(reducing(`[total]: "+", [low]: "min", [bits]: "|"`, `
473
+ const kernel = await compile(reducing(`
407
474
  const [x, y, z] = row[position];
408
475
  reduce[total](row[mass]);
409
476
  reduce[total](1);
@@ -418,23 +485,22 @@ const kernel = System.create({ name: "a", kernel: "cpu", components: { read: ${r
418
485
  });
419
486
 
420
487
  test("fold the values of inlined functions", async () => {
421
- const kernel = await compile(`import { Vec3 } from "ecs";\n${reducing(`[low]: "max"`, "reduce[low](Vec3.scale(row[position], 2));", "[position]")}`);
488
+ const kernel = await compile(`import { Vec3 } from "ecs";\n${reducing("reduce[low](Vec3.scale(row[position], 2));", "[position]")}`, {}, {}, { low: "max" });
422
489
  expect([0, 1, 2].map(k => run(kernel, 3, fields).reduced("low", [k]))).toEqual([4, 10, 18]);
423
490
  });
424
491
 
425
492
  test("that can't be compiled fail with the reason", async () => {
426
- expect(await failure(reducing(`[total]: "+"`, "reduce[total](1, 2);"))).toBe("total takes the one value it reduces");
427
- expect(await failure(reducing(`[total]: "avg"`, "reduce[total](1);"))).toBe(`a resource is reduced with one of "+", "*", "min", "max", "&", "|", "^"`);
428
- expect(await failure(reducing(`total: "+"`, "reduce[total](1);"))).toBe(`reduce names each resource as a computed key bound at module scope, as in { [total]: "+" }`);
429
- expect(await failure(reducing(`[total]: "+"`, "reduce[total](1);").replace(`kernel: "cpu"`, `kernel: "gpu"`))).toBe("a GPU kernel can't use reductions yet");
430
- expect(await failure(reducing(`[total]: "+"`, "reduce[total](1);").replace("reduce: {", "resources: { read: [total] }, reduce: {"))).toBe("total is reduced, so it can't also be read or filtered on");
431
- expect(await failure(reducing(`[total]: "+", [total]: "max"`, "reduce[total](1);"))).toBe("total is reduced twice");
493
+ expect(await failure(reducing("reduce[total](1, 2);"))).toBe("total takes the one value it reduces");
494
+ expect(await failure(reducing("reduce[total](1);"), {}, { total: "avg" })).toBe(`total is reduced, so the build reads its operator from its declaration's reduce trait, "avg", which isn't one of "+", "*", "min", "max", "&", "|", "^"`);
495
+ expect(await failure(reducing("reduce[total](1);"), {}, {})).toBe(`total is reduced, so the build reads its operator from its declaration's reduce trait, ${"which its module's JavaScript doesn't register: declare it in TypeScript, and build a library declaring it with Compiler.plugin({ library: true })"}`);
496
+ expect(await failure(reducing("reduce[total](1);").replace(`kernel: true`, `kernel: "gpu"`))).toBe("a GPU kernel can't use reductions yet");
497
+ expect(await failure(reducing("reduce[total](resources[total]);"))).toBe("total is reduced, so it can't also be read or filtered on");
432
498
  });
433
499
  });
434
500
 
435
501
  describe("let locals of component values", () => {
436
502
  test("written back whole after a tuple assignment have the tuple's shape", async () => {
437
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [alive], write: [position] } }, (row) => {
503
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [alive, position] } }, (row) => {
438
504
  let v = row[position];
439
505
  if (row[alive]) v = [7, 8, 9];
440
506
  row[position] = v;
@@ -447,22 +513,22 @@ describe("let locals of component values", () => {
447
513
 
448
514
  describe("binding identity", () => {
449
515
  test("a local shadowing a component key is not that component", async () => {
450
- expect(await failure(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [velocity], write: [position] } }, (row) => {
516
+ expect(await failure(`const kernel = System.create({ kernel: true, components: { with: [velocity, position] } }, (row) => {
451
517
  const velocity = 1;
452
518
  row[position] = row[velocity];
453
- });`)).toBe("row is indexed by a component in components read or write, or .entity");
519
+ });`)).toBe("a kernel's body indexes its row and context by key directly, or destructures them by key, so the build sees what it reads and writes; it can't pass them on, alias or spread them");
454
520
  });
455
521
 
456
522
  test("another binding with the same key string is not the declared component", async () => {
457
523
  expect(await failure(`const speed = "velocity";
458
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [velocity], write: [position] } }, (row) => {
524
+ const kernel = System.create({ kernel: true, components: { with: [velocity, position] } }, (row) => {
459
525
  row[position] = row[speed];
460
- });`)).toBe("speed is not in components read or write");
526
+ });`)).toBe("speed isn't in components with or optional, so the system doesn't require it: add it there to use it");
461
527
  });
462
528
 
463
529
  test("a helper parameter shadows a module binding only inside the helper", async () => {
464
530
  const kernel = await compile(`const twice = (velocity) => velocity * 2;
465
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [velocity], write: [position] } }, (row) => {
531
+ const kernel = System.create({ kernel: true, components: { with: [velocity, position] } }, (row) => {
466
532
  row[position] = twice(row[velocity]) + row[velocity];
467
533
  });`);
468
534
  expect(run(kernel, 1, { velocity: { "[]": [3] } }).field("position")).toEqual([9]);
@@ -471,7 +537,7 @@ describe("binding identity", () => {
471
537
 
472
538
  describe("value semantics", () => {
473
539
  test("tuple locals are copies, and snapshots read before later writes", async () => {
474
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position, score] } }, (row) => {
540
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [position, score] } }, (row) => {
475
541
  const before = row[position];
476
542
  let v = [before[0], before[1]];
477
543
  const w = v;
@@ -485,7 +551,7 @@ describe("value semantics", () => {
485
551
  });
486
552
 
487
553
  test("whole-value writes evaluate every leaf before storing", async () => {
488
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position, score] } }, (row) => {
554
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [position, score] } }, (row) => {
489
555
  row[position] = [row[position][1], row[position][0]];
490
556
  let a = 1;
491
557
  let b = 2;
@@ -498,7 +564,7 @@ describe("value semantics", () => {
498
564
  });
499
565
 
500
566
  test("struct values and conditional tuples", async () => {
501
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [position] } }, (row) => {
567
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, position] } }, (row) => {
502
568
  const p = row[mass] > 1 ? { x: 1, y: [2, 3] } : { x: 4, y: [5, 6] };
503
569
  row[position] = p;
504
570
  });`);
@@ -516,7 +582,7 @@ describe("helpers", () => {
516
582
  return [x * k, y * k];
517
583
  };
518
584
  const length = ([x, y]) => Math.sqrt(x * x + y * y);
519
- const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position, score] } }, (row) => {
585
+ const kernel = System.create({ kernel: true, components: { with: [position, score] } }, (row) => {
520
586
  const k = 100;
521
587
  const x = 1;
522
588
  row[position] = scale(row[position], 0.5);
@@ -529,14 +595,14 @@ describe("helpers", () => {
529
595
 
530
596
  test("recursive helpers are rejected", async () => {
531
597
  expect(await failure(`const f = (x) => f(x);
532
- const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [score] } }, (row) => { row[score] = f(1); });`))
598
+ const kernel = System.create({ kernel: true, components: { with: [score] } }, (row) => { row[score] = f(1); });`))
533
599
  .toBe("f is recursive");
534
600
  });
535
601
  });
536
602
 
537
603
  describe("control flow", () => {
538
604
  test("return ends the row, also from inside a loop", async () => {
539
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => {
605
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => {
540
606
  if (row[mass] < 0) return;
541
607
  let total = 0;
542
608
  for (let i = 0; i < 10; i++) {
@@ -551,7 +617,7 @@ describe("control flow", () => {
551
617
 
552
618
  test("a loop test that inlines a helper is re-evaluated each iteration", async () => {
553
619
  const kernel = await compile(`const below = (a, b) => { const limit = b * 2; return a < limit; };
554
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => {
620
+ const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => {
555
621
  let n = 0;
556
622
  while (below(n, row[mass])) { n++; }
557
623
  let m = 0;
@@ -565,7 +631,7 @@ describe("control flow", () => {
565
631
  describe("context", () => {
566
632
  test("lookups map components to their read index, with null guards", async () => {
567
633
  const kernel = await compile(`const half = (value) => { const h = value / 2; return h; };
568
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [target], write: [position, score] }, lookup: { targets: { read: [mass, position] } } }, (row, { lookup: { targets } }) => {
634
+ const kernel = System.create({ kernel: true, components: { with: [target, position, score] }, lookup: { targets: { with: [mass, position] } } }, (row, { lookup: { targets } }) => {
569
635
  const other = targets(row[target]);
570
636
  if (other !== null) { row[position] = other[position] - other[mass]; }
571
637
  row[score] = (other !== null && half(other[position])) || -1;
@@ -578,7 +644,7 @@ describe("context", () => {
578
644
  });
579
645
 
580
646
  test("optional lookup access, destructured context groups and input", async () => {
581
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", input: { type: "number" }, components: { read: [target], write: [score] }, resources: { read: [delta] }, lookup: { targets: { read: [mass] } } }, (row, { resources: { [delta]: d }, lookup: { targets }, input }) => {
647
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [target, score] }, lookup: { targets: { with: [mass] } } }, (row, { resources: { [delta]: d }, lookup: { targets } }, input) => {
582
648
  row[score] = (targets(row[target])?.[mass] ?? 0) + d + input;
583
649
  });`);
584
650
  const found = (entity: number) => entity === 1 ? [3] : null;
@@ -586,16 +652,16 @@ describe("context", () => {
586
652
  });
587
653
 
588
654
  test("context groups reached through the context parameter", async () => {
589
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", input: { type: "number" }, components: { read: [target], write: [score] }, resources: { read: [delta] }, lookup: { targets: { read: [mass] } } }, (row, context) => {
655
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [target, score] }, lookup: { targets: { with: [mass] } } }, (row, context, input) => {
590
656
  const { resources } = context;
591
- row[score] = (context.lookup.targets(row[target])?.[mass] ?? 0) + resources[delta] + context.input;
657
+ row[score] = (context.lookup.targets(row[target])?.[mass] ?? 0) + resources[delta] + input;
592
658
  });`);
593
659
  const found = (entity: number) => entity === 1 ? [3] : null;
594
660
  expect(run(kernel, 2, { target: { "[]": [1, 2] } }, { lookups: [found], resources: [10], args: 100, program: false }).field("score")).toEqual([113, 110]);
595
661
  });
596
662
 
597
663
  test("boolean columns read as booleans", async () => {
598
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [alive], write: [score] } }, (row) => {
664
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [alive, score] } }, (row) => {
599
665
  row[score] = row[alive] === true ? 1 : 2;
600
666
  });`);
601
667
  expect(run(kernel, 2, { alive: { "[]": [1, 0] } }, { booleans: ["alive"] }).field("score")).toEqual([1, 2]);
@@ -603,7 +669,7 @@ describe("context", () => {
603
669
  });
604
670
 
605
671
  test("boolean reads convert only where observable, including through locals", async () => {
606
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [alive, mass], write: [score] } }, (row, { commands }) => {
672
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [alive, mass, score] } }, (row, { commands }) => {
607
673
  const flag = row[alive];
608
674
  const copy = flag;
609
675
  row[score] = (copy === true ? 10 : 20) + row[mass] * 2 + (flag ? 1 : 0);
@@ -622,7 +688,7 @@ describe("context", () => {
622
688
  });
623
689
 
624
690
  test("a spawn nested in an add's value is issued before the add begins", async () => {
625
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass] } }, (row, { commands }) => {
691
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass] } }, (row, { commands }) => {
626
692
  commands.add(row.entity, [target, score], { [target]: commands.spawn([mass])({ [mass]: row[mass] }), [score]: 1 });
627
693
  commands.despawn(row.entity);
628
694
  });`);
@@ -636,7 +702,7 @@ describe("context", () => {
636
702
  });
637
703
 
638
704
  test("commands name components through keys", async () => {
639
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [position] } }, (row, context) => {
705
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [position] } }, (row, context) => {
640
706
  const { commands } = context;
641
707
  const spawned = commands.spawn([position, alive])({ [position]: [row[position][0], 1] });
642
708
  commands.add(spawned, score, row.entity);
@@ -657,11 +723,11 @@ describe("context", () => {
657
723
  ]);
658
724
  });
659
725
 
660
- test("commands name lists through module constants: array literals and Archetype.create", async () => {
661
- const kernel = await compile(`import { Archetype } from "ecs";
662
- const unit = Archetype.create([position, alive, score]);
726
+ test("commands name lists through module constants: array literals, and lists the build gave an index", async () => {
727
+ const kernel = await compile(`function archetype$(list) { return list; }
728
+ const unit = archetype$([position, alive, score]);
663
729
  const pair = [mass, score];
664
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [position] } }, (row, { commands }) => {
730
+ const kernel = System.create({ kernel: true, components: { with: [position] } }, (row, { commands }) => {
665
731
  const spawned = commands.spawn(unit)({ [score]: 2, [position]: [row[position][0], 1] });
666
732
  commands.add(spawned, pair, { [mass]: 3 });
667
733
  commands.remove(row.entity, unit);
@@ -676,9 +742,9 @@ describe("context", () => {
676
742
  });
677
743
 
678
744
  test("kernel declarations list components through module constants", async () => {
679
- const kernel = await compile(`import { Archetype } from "ecs";
680
- const moving = Archetype.create([position, velocity]);
681
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: moving, write: [score] } }, row => {
745
+ const kernel = await compile(`
746
+ const moving = [position, velocity];
747
+ const kernel = System.create({ kernel: true, components: { with: [score, ...moving] } }, row => {
682
748
  row[score] = row[position] + row[velocity];
683
749
  });`);
684
750
  expect(run(kernel, 2, { position: { "[]": [1, 2] }, velocity: { "[]": [10, 20] } }).field("score")).toEqual([11, 22]);
@@ -687,19 +753,19 @@ describe("context", () => {
687
753
  test.each([
688
754
  ["a value for a component the list doesn't name", "commands.spawn([mass])({ [mass]: 1, [score]: 2 });", "score isn't one of the command's components"],
689
755
  ["a spawner kept rather than called", "const spawn = commands.spawn([mass]); spawn({ [mass]: 1 });", "a kernel calls the spawner where it gets it, as commands.spawn(components)(values)"],
690
- ["a list holding a spread", "commands.spawn([...pair])({});", "commands.spawn: lists name keys by identifiers bound at module scope"],
756
+ ["a list holding a spread of what isn't a list", "commands.spawn([...mass])({});", "commands.spawn: mass is a key, not a list of components; list it as [mass]"],
691
757
  ["a list that isn't a module constant", "const list = 1; commands.add(row.entity, list, {});", "commands name components by identifiers bound at module scope"],
692
758
  ["a component listed twice", "commands.remove(row.entity, [mass, mass]);", "mass is listed twice"],
693
759
  ["an add with too many arguments", "commands.add(row.entity, mass, 1, 2);", "an add is commands.add(entity, component, value) or commands.add(entity, components, values)"],
694
760
  ["a remove with rest components", "commands.remove(row.entity, mass, score);", "a remove is commands.remove(entity, component) or commands.remove(entity, components)"],
695
761
  ])("fail the build for %s", async (_, body, message) => {
696
- expect(await failure(`const pair = [mass, score];\nconst kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass] } }, (row, { commands }) => { const m = row[mass]; ${body} });`)).toBe(message);
762
+ expect(await failure(`const pair = [mass, score];\nconst kernel = System.create({ kernel: true, components: { with: [mass] } }, (row, { commands }) => { const m = row[mass]; ${body} });`)).toBe(message);
697
763
  });
698
764
  });
699
765
 
700
766
  describe("program", () => {
701
767
  test("input and resource paths are scalars in the program", async () => {
702
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", input: { type: "object" }, components: { write: [score] }, resources: { read: [delta] } }, (row, { resources: { [delta]: d }, input }) => {
768
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [score] } }, (row, { resources: { [delta]: d } }, input) => {
703
769
  const [, y] = d;
704
770
  row[score] = y * input.scale + Math.max(input.scale, Math.PI) + (input.flag ? 1 : 0);
705
771
  });`);
@@ -710,7 +776,7 @@ describe("program", () => {
710
776
  });
711
777
 
712
778
  test("runtime indexing into a resource has no program", async () => {
713
- const kernel = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] }, resources: { read: [delta] } }, (row, { resources: { [delta]: d } }) => {
779
+ const kernel = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row, { resources: { [delta]: d } }) => {
714
780
  row[score] = d[row[mass]];
715
781
  });`);
716
782
  expect(run(kernel, 1, { mass: { "[]": [1] } }, { resources: [[5, 6]], program: false }).field("score")).toEqual([6]);
@@ -719,17 +785,17 @@ describe("program", () => {
719
785
 
720
786
  describe("composites", () => {
721
787
  test("one argument to System.create that isn't a body is a composite, never a kernel", async () => {
722
- const result = await transform(`const a = System.create({ name: "a" }, () => {});
788
+ const result = await transform(`const a = System.create({}, () => {});
723
789
  const listed = System.create([a]);
724
- const declared = System.create({ kernel: "cpu", systems: [a], components: { write: [score] } });`);
790
+ const declared = System.create({ kernel: true, systems: [a], components: { with: [score] } });`);
725
791
  expect(result !== null && "failure" in result ? result.failure.message : result?.kernels ?? []).toEqual([]);
726
792
  });
727
793
  });
728
794
 
729
795
  describe("lookups in the program", () => {
730
796
  const targets = (entity: number) => entity === 1 ? [3, [10, 20, 30]] : entity === 2 ? [4, [40, 50, 60]] : null;
731
- const declaration = (body: string, read = "[target]", lookup = "targets: { read: [mass, position] }") => `const kernel = System.create({ name: "a", kernel: "cpu",
732
- components: { read: ${read}, write: [score] }, lookup: { ${lookup} } },
797
+ const declaration = (body: string, read = "[target]", lookup = "targets: { with: [mass, position] }") => `const kernel = System.create({ kernel: true,
798
+ components: { with: ${read.replace("]", ", score]")} }, lookup: { ${lookup} } },
733
799
  (row, { lookup: { ${lookup.includes("others") ? "targets, others" : "targets"} } }) => { ${body} });`;
734
800
 
735
801
  test("guarded leaf access, early return and a second lookup in its own handle", async () => {
@@ -740,7 +806,7 @@ describe("lookups in the program", () => {
740
806
  const second = others(row[mass]);
741
807
  const extra = second !== null ? second[position][2] : 0;
742
808
  row[score] = tx - other[mass] + ty * 0 + extra;
743
- `, "[target, mass]", "targets: { read: [mass, position] }, others: { read: [position] }"));
809
+ `, "[target, mass]", "targets: { with: [mass, position] }, others: { with: [position] }"));
744
810
  expect(kernel.program?.handles).toBe(2);
745
811
  const others = (entity: number) => entity === 2 ? [[0, 0, 7]] : null;
746
812
  expect(run(kernel, 3, { target: { "[]": [1, 2, 3] }, mass: { "[]": [2, 0, 0] }, score: { "[]": [-1, -1, -1] } }, { lookups: [targets, others] }).field("score"))
@@ -748,7 +814,7 @@ describe("lookups in the program", () => {
748
814
  });
749
815
 
750
816
  test("optional chains read NaN when nothing was found, anywhere", async () => {
751
- const kernel = await compile(declaration(`row[score] = targets(row[target])?.[position]?.[1] * 2;`, "[target]", "targets: { read: [position] }"));
817
+ const kernel = await compile(declaration(`row[score] = targets(row[target])?.[position]?.[1] * 2;`, "[target]", "targets: { with: [position] }"));
752
818
  expect(kernel.program).not.toBeNull();
753
819
  expect(run(kernel, 2, { target: { "[]": [1, 5] } }, { lookups: [entity => targets(entity)?.slice(1) ?? null] }).field("score")).toEqual([40, NaN]);
754
820
  });
@@ -763,9 +829,9 @@ describe("lookups in the program", () => {
763
829
  });
764
830
 
765
831
  test.each([
766
- ["an unguarded leaf access", `const other = targets(row[target]); row[score] = other[mass];`, "targets: { read: [mass] }"],
767
- ["a lookup result used whole", `const other = targets(row[target]); row[score] = other;`, "targets: { has: [mass] }"],
768
- ["a leaf access after the guard's scope", `const other = targets(row[target]); if (other !== null) { row[score] = 1; } row[score] = other[mass];`, "targets: { read: [mass] }"],
832
+ ["an unguarded leaf access", `const other = targets(row[target]); row[score] = other[mass];`, "targets: { with: [mass] }"],
833
+ ["a lookup result used whole", `const other = targets(row[target]); row[score] = other;`, "targets: { with: [mass] }"],
834
+ ["a leaf access after the guard's scope", `const other = targets(row[target]); if (other !== null) { row[score] = 1; } row[score] = other[mass];`, "targets: { with: [mass] }"],
769
835
  ])("no program for %s", async (_, body, lookup) => {
770
836
  const kernel = await compile(declaration(body, "[target]", lookup));
771
837
  expect(kernel.program).toBeNull();
@@ -773,11 +839,11 @@ describe("lookups in the program", () => {
773
839
  });
774
840
 
775
841
  describe("subset", () => {
776
- const kernel = (body: string, components = "{ read: [mass], write: [score] }") =>
777
- `const kernel = System.create({ name: "a", kernel: "cpu", components: ${components} }, (row, { commands }) => { ${body} });`;
842
+ const kernel = (body: string, components = "{ with: [mass, score] }") =>
843
+ `const kernel = System.create({ kernel: true, components: ${components} }, (row, { commands }) => { ${body} });`;
778
844
 
779
845
  test.each([
780
- ["row[mass] = 1;", "mass is not in components write"],
846
+ ["row[mass] = 1;", "compiled"],
781
847
  ["row[score] = row[score] + row[mass];", "compiled"],
782
848
  ["const f = () => 1;", "functions can't be created in a kernel; define helpers at module scope"],
783
849
  ["row[score] = \"a\";", "only number, boolean and null literals are in the kernel subset"],
@@ -793,64 +859,76 @@ describe("subset", () => {
793
859
  });
794
860
 
795
861
  test("component values are written whole", async () => {
796
- expect(await failure(kernel("row[position][0] = 1;", "{ write: [position] }"))).toBe("component values are immutable; write the whole value");
862
+ expect(await failure(kernel("row[position][0] = 1;", "{ with: [position] }"))).toBe("component values are immutable; write the whole value");
797
863
  });
798
864
 
799
865
  test("GPU kernels", async () => {
800
866
  const gpu = (declaration: string, body: string) =>
801
- `const kernel = System.create({ name: "a", kernel: "gpu", ${declaration} }, (row, context) => { ${body} });`;
802
- expect(await failure(gpu("components: { read: [mass], write: [score] }", "row[score] = row[mass] * 2;"))).toBe("compiled");
803
- expect(await failure(gpu("components: { read: [target], write: [score] }, lookup: { targets: { read: [mass] } }", "row[score] = 1;")))
867
+ `const kernel = System.create({ kernel: "gpu", ${declaration} }, (row, context) => { ${body} });`;
868
+ expect(await failure(gpu("components: { with: [mass, score] }", "row[score] = row[mass] * 2;"))).toBe("compiled");
869
+ expect(await failure(gpu("components: { with: [target, score] }, lookup: { targets: { with: [mass] } }", "row[score] = 1;")))
804
870
  .toBe("a GPU kernel can't use lookups yet");
805
- expect(await failure(gpu("components: { write: [score], changed: [mass] }", "row[score] = 1;"))).toBe("a GPU kernel can't use change filters yet");
806
- expect(await failure(gpu("components: { read: [mass], write: [score] }", "context.commands.despawn(row.entity);")))
871
+ expect(await failure(gpu("components: { with: [score], changed: [mass] }", "row[score] = 1;"))).toBe("a GPU kernel can't use change filters yet");
872
+ expect(await failure(gpu("components: { with: [mass, score] }", "context.commands.despawn(row.entity);")))
807
873
  .toBe("a GPU kernel can't issue commands or use values that aren't numbers or booleans");
808
- expect(await failure(gpu("components: { read: [mass], write: [score] }", "let s = 0; for (let i = 0; i < 3; i++) s += i; row[score] = s;")))
874
+ expect(await failure(gpu("components: { with: [mass, score] }", "let s = 0; for (let i = 0; i < 3; i++) s += i; row[score] = s;")))
809
875
  .toBe("a GPU kernel can't use loops or labeled blocks yet");
810
- expect(await failure(`const kernel = System.create({ name: "a", kernel: true, components: { write: [score] } }, (row) => {});`))
811
- .toBe(`kernel must be the literal "cpu" or "gpu"`);
876
+ expect(await failure(`const kernel = System.create({ kernel: "cpu", components: { with: [score] } }, (row) => {});`))
877
+ .toBe(`kernel must be the literal true, false or "gpu"`);
812
878
  });
813
879
 
814
880
  test("GPU programs carry their locals' names", async () => {
815
881
  const body = "(row) => { const doubled = row[mass] * 2; row[score] = doubled; }";
816
- const gpu = await compile(`const kernel = System.create({ name: "a", kernel: "gpu", components: { read: [mass], write: [score] } }, ${body});`);
817
- const cpu = await compile(`const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, ${body});`);
882
+ const gpu = await compile(`const kernel = System.create({ kernel: "gpu", components: { with: [mass, score] } }, ${body});`);
883
+ const cpu = await compile(`const kernel = System.create({ kernel: true, components: { with: [mass, score] } }, ${body});`);
818
884
  expect(gpu.program?.names).toEqual([expect.stringMatching(/^doubled_\d+$/)]);
819
885
  expect(cpu.program?.names).toBeUndefined();
820
886
  });
821
887
 
822
888
  test("kernels inside functions", async () => {
823
- expect(await failure(`const make = () => System.create({ name: "a", kernel: "cpu", components: { write: [score] } }, (row) => {});`))
889
+ expect(await failure(`const make = () => System.create({ kernel: true, components: { with: [score] } }, (row) => {});`))
824
890
  .toBe("kernel systems must be declared at module scope");
825
891
  });
826
892
 
827
893
  test("failures carry the offending position", async () => {
828
- const source = kernel("row[mass] = 1;");
894
+ const source = kernel("var x = 1;");
829
895
  const result = await transform(source);
830
- const position = `${header}${source}`.indexOf("row[mass] = 1");
896
+ const position = `${header}${source}`.indexOf("var x = 1");
831
897
  expect(result !== null && "failure" in result ? result.failure.position : -1).toBe(position);
832
898
  });
833
899
 
834
900
  test("non-kernel systems that may reach their commands and other modules are left untouched", async () => {
835
- expect(await transform(`const s = System.create({ name: "a", components: { read: [mass] } }, (row, context) => { const f = () => [row, context]; });`)).toBeNull();
836
- expect(await transformKernels(`import { System } from "other";\nSystem.create({ name: "a", kernel: "cpu" }, () => {});`, "/x.js", parse, async () => false, () => "")).toBeNull();
901
+ const reaching = await transform(`const s = System.create({ components: { with: [mass] } }, (row, context) => { const f = () => [row, context]; });`);
902
+ expect(reaching !== null && "code" in reaching ? reaching.code : "").not.toContain("terminal$(");
903
+ expect(await transformKernels(`import { System } from "other";\nSystem.create({ kernel: true }, () => {});`, "/x.js", parse, async () => null, () => "")).toBeNull();
904
+ });
905
+ });
906
+
907
+ describe("without a linker", () => {
908
+ test("a kernel tried in the package's interface inlines that module's data, which the interface keeps fixed", async () => {
909
+ const file = ownCopy.index.replace(/\/index\.[jt]s$/, "/interface/fixed.js");
910
+ const source = `import { System } from "ecs";\nconst position = "position";\nconst weights = [1, 2];\nexport const scaled = System.create({ components: { with: [position] } }, (row) => { row[position] = weights[0]; });\n`;
911
+ const result = await transformKernels(source, file, parse, async () => ownCopy, index => JSON.stringify(`kernel:${index}`), undefined, true, undefined, nodeCopies);
912
+ expect(result !== null && "kernels" in result ? result.kernels.length : 0).toBe(1);
913
+ const elsewhere = await transformKernels(source, "/app/fixed.js", parse, async () => ownCopy, index => JSON.stringify(`kernel:${index}`), undefined, true, undefined, nodeCopies);
914
+ expect(elsewhere !== null && "kernels" in elsewhere ? elsewhere.kernels.length : 0).toBe(0);
837
915
  });
838
916
  });
839
917
 
840
918
  describe("terminal bodies", () => {
841
919
  /** Whether the transform marks a main-thread system's body as one that never reaches its commands. */
842
- const marked = async (parameters: string, body: string, declaration = `{ name: "a" }`): Promise<boolean> => {
920
+ const marked = async (parameters: string, body: string, declaration = `{}`): Promise<boolean> => {
843
921
  const result = await transform(`const system = System.create(${declaration}, ${parameters} => { ${body} });`);
844
922
  if (result !== null && "failure" in result) throw new Error(result.failure.message);
845
923
  const code = result?.code ?? "";
846
924
  return code.includes("terminal$((") && code.includes("function terminal$(body)");
847
925
  };
848
926
  test.each([
849
- ["no context", "(row)", "console.log(row);", `{ name: "a", components: { has: [mass] } }`],
850
- ["a context destructured without commands", "({ resources })", "console.log(resources);", `{ name: "a" }`],
851
- ["a context used only through its other properties", "(context)", "console.log(context.input);", `{ name: "a", input: { type: "number" } }`],
852
- ["a context reaching resources and lookups", "(row, context)", "console.log(context.resources, context.lookup, row);", `{ name: "a", components: { has: [mass] } }`],
853
- ["nested destructuring", "({ resources: { [delta]: d } })", "console.log(d);", `{ name: "a", resources: { read: [delta] } }`],
927
+ ["no context", "(row)", "console.log(row);", `{ components: { with: [mass] } }`],
928
+ ["a context destructured without commands", "({ resources })", "console.log(resources);", `{}`],
929
+ ["a context used only through its other properties", "(context)", "console.log(context.resources);", `{ resources: {} }`],
930
+ ["a context reaching resources and lookups", "(row, context)", "console.log(context.resources, context.lookup, row);", `{ components: { with: [mass] } }`],
931
+ ["nested destructuring", "({ resources: { [delta]: d } })", "console.log(d);", `{ resources: {} }`],
854
932
  ])("mark a body with %s", async (_, parameters, body, declaration) => {
855
933
  expect(await marked(parameters, body, declaration)).toBe(true);
856
934
  });
@@ -870,23 +948,23 @@ describe("terminal bodies", () => {
870
948
  expect(await marked(parameters, body)).toBe(false);
871
949
  });
872
950
  test("leave a function body unmarked that uses arguments", async () => {
873
- const result = await transform(`const system = System.create({ name: "a" }, function () { console.log(arguments); });`);
874
- expect(result).toBeNull();
951
+ const result = await transform(`const system = System.create({}, function () { console.log(arguments); });`);
952
+ expect(result !== null && "code" in result ? result.code : "").not.toContain("terminal$(");
875
953
  });
876
954
  test("mark a system made from its body alone, and no kernel or finalizer", async () => {
877
955
  const alone = await transform("const system = System.create(() => { console.log(1); });");
878
- expect(alone !== null && "code" in alone ? alone.code : "").toContain("System.create(terminal$(() =>");
879
- const kernel = await transform(`const kernel = System.create({ name: "k", kernel: "cpu", components: { write: [score] } }, (row) => { row[score] = 1; });`);
956
+ expect(alone !== null && "code" in alone ? alone.code : "").toContain("System.create(access$(terminal$(() =>");
957
+ const kernel = await transform(`const kernel = System.create({ kernel: true, components: { with: [score] } }, (row) => { row[score] = 1; });`);
880
958
  expect(kernel !== null && "code" in kernel ? kernel.code : "").not.toContain("terminal$");
881
- const finalizer = await transformKernels(`import { Finalizer } from "ecs";\nconst f = Finalizer.create({ components: { read: [] } }, () => {});`, "/x.js", parse, async () => true, () => "");
882
- expect(finalizer).toBeNull();
959
+ const finalizer = await transformKernels(`import { Finalizer } from "ecs";\nconst f = Finalizer.create({ components: { with: [] } }, () => {});`, "/x.js", parse, async () => ownCopy, () => "");
960
+ expect(finalizer !== null && "code" in finalizer ? finalizer.code : "").not.toContain("terminal$(");
883
961
  });
884
962
  });
885
963
 
886
964
  describe("index lookups in main-thread systems", () => {
887
965
  /** Runs the transformed body once, recording each lookup as the runtime hook receives it. */
888
966
  const looked = async (body: string, parameters = "({ lookup })", lookup = "near: { index: grid }"): Promise<{ readonly code: string; readonly calls: readonly unknown[] }> => {
889
- const source = `const grid = "grid";\nconst system = System.create({ name: "a", lookup: { ${lookup} } }, ${parameters} => { ${body} });`;
967
+ const source = `const grid = "grid";\nconst system = System.create({ lookup: { ${lookup} } }, ${parameters} => { ${body} });`;
890
968
  const result = await transform(source);
891
969
  if (result !== null && "failure" in result) return { code: result.failure.message, calls: [] };
892
970
  const module = (result?.code ?? `${header}${source}`).split("\n").filter(line => !line.startsWith("import ")).join("\n");
@@ -925,7 +1003,7 @@ describe("index lookups in main-thread systems", () => {
925
1003
 
926
1004
  describe("commands in main-thread systems", () => {
927
1005
  /** Runs the transformed system's body once, recording each spawn's and add's keys and values as the runtime hooks receive them. */
928
- const spawned = async (body: string, parameters = "({ commands })", declaration = `{ name: "a" }`): Promise<{ readonly code: string; readonly calls: readonly unknown[] }> => {
1006
+ const spawned = async (body: string, parameters = "({ commands })", declaration = `{}`): Promise<{ readonly code: string; readonly calls: readonly unknown[] }> => {
929
1007
  const source = `const system = System.create(${declaration}, ${parameters} => { ${body} });`;
930
1008
  const result = await transform(source);
931
1009
  if (result !== null && "failure" in result) return { code: result.failure.message, calls: [] };
@@ -969,10 +1047,10 @@ describe("commands in main-thread systems", () => {
969
1047
  });
970
1048
 
971
1049
  test.each([
972
- ["the context's commands", "context.commands.spawn([score])({ [score]: 1 });", "(context)", `{ name: "a" }`],
973
- ["renamed commands", "issue.spawn([score])({ [score]: 1 });", "({ commands: issue })", `{ name: "a" }`],
974
- ["a system with components", "commands.spawn([score])({ [score]: 1 });", "(row, { commands })", `{ name: "a", components: { has: [mass] } }`],
975
- ["the context of a system with components", "context.commands.spawn([score])({ [score]: 1 });", "(row, context)", `{ name: "a", components: { has: [mass] } }`],
1050
+ ["the context's commands", "context.commands.spawn([score])({ [score]: 1 });", "(context)", `{}`],
1051
+ ["renamed commands", "issue.spawn([score])({ [score]: 1 });", "({ commands: issue })", `{}`],
1052
+ ["a system with components", "commands.spawn([score])({ [score]: 1 });", "(row, { commands })", `{ kernel: false, components: { with: [mass] } }`],
1053
+ ["the context of a system with components", "context.commands.spawn([score])({ [score]: 1 });", "(row, context)", `{ kernel: false, components: { with: [mass] } }`],
976
1054
  ])("pass values positionally through %s", async (_, body, parameters, declaration) => {
977
1055
  const { calls } = await spawned(body, parameters, declaration);
978
1056
  expect(calls).toEqual([["prepared", ["score"], ["score"], [1]]]);
@@ -995,6 +1073,35 @@ describe("commands in main-thread systems", () => {
995
1073
  expect(calls.every(call => Array.isArray(call) && call[0] === "spawn")).toBe(true);
996
1074
  expect(calls.length).toBe(1);
997
1075
  });
1076
+ describe("lists of keys", () => {
1077
+ const keys = "const a = Symbol(); const b = Symbol();\n";
1078
+ test("are made once, with an index, for spawns, adds and removes", async () => {
1079
+ const result = await transform(`${keys}const system = System.create(({ commands }) => { commands.spawn([a, b])({ [a]: 1, [b]: 2 }); commands.add(1, [b], { [b]: 3 }); commands.remove(1, [a, b]); commands.spawn([a]); });`);
1080
+ const transformed = result !== null && "code" in result ? result.code : "";
1081
+ expect(transformed.match(/\(list\$\d+ \?\?= archetype\$\(\[[ab, ]+\]\)\)/g)).toEqual([
1082
+ "(list$0 ??= archetype$([a, b]))", "(list$1 ??= archetype$([b]))", "(list$2 ??= archetype$([a, b]))", "(list$3 ??= archetype$([a]))",
1083
+ ]);
1084
+ expect(transformed).toContain("function archetype$(list)");
1085
+ });
1086
+ test("leave a list naming anything but module keys as written", async () => {
1087
+ const result = await transform(`${keys}const system = System.create(({ commands }) => { const c = a; commands.spawn([a, c]); commands.remove(1, [a, 2]); });`);
1088
+ const transformed = result !== null && "code" in result ? result.code : "";
1089
+ expect(transformed).toContain("commands.spawn([a, c]); commands.remove(1, [a, 2]);");
1090
+ expect(transformed).not.toContain("archetype$");
1091
+ });
1092
+ test("leave a list naming a key shadowed around the body, or by its parameters, as written", async () => {
1093
+ const result = await transform(`${keys}const make = (a) => System.create(({ commands }) => { commands.spawn([a]); });
1094
+ const remove = System.create(({ commands }, b) => { commands.remove(1, [a, b]); });`);
1095
+ const transformed = result !== null && "code" in result ? result.code : "";
1096
+ expect(transformed).toContain("commands.spawn([a]);");
1097
+ expect(transformed).toContain("commands.remove(1, [a, b]);");
1098
+ expect(transformed).not.toContain("archetype$");
1099
+ });
1100
+ test("fail the build for a list naming a key twice", async () => {
1101
+ const result = await transform(`${keys}const system = System.create(({ commands }) => { commands.remove(1, [a, b, a]); });`);
1102
+ expect(result !== null && "failure" in result ? result.failure.message : null).toBe("this list names a twice; a list of components names each once");
1103
+ });
1104
+ });
998
1105
  describe("adds", () => {
999
1106
  test("pass literal values positionally, after the entity, in source order", async () => {
1000
1107
  const { code, calls } = await spawned("let i = 0; commands.add(++i, [score, mass, ++i], { [score]: ++i, [mass]: ++i });");
@@ -1028,7 +1135,7 @@ describe("helpers that return early", () => {
1028
1135
  }
1029
1136
  return [c, 2];
1030
1137
  };
1031
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [position] } }, (row) => {
1138
+ const kernel = System.create({ kernel: true, components: { with: [mass, position] } }, (row) => {
1032
1139
  const [value, path] = pick(row[mass], 4);
1033
1140
  row[position] = [value, path, 0];
1034
1141
  });`);
@@ -1044,7 +1151,7 @@ describe("math builtins", () => {
1044
1151
  const results = (result: ReturnType<typeof run>) => [0, 1, 2].map(row => [0, 1, 2].map(k => result.field("position", [k])[row]));
1045
1152
 
1046
1153
  test("inline as scalar code, nested namespaces and helpers they call included", async () => {
1047
- const kernel = await compile(`${math}const kernel = System.create({ name: "a", kernel: "cpu", components: { read: [velocity], write: [position, score] } }, (row) => {
1154
+ const kernel = await compile(`${math}const kernel = System.create({ kernel: true, components: { with: [velocity, position, score] } }, (row) => {
1048
1155
  const p = row[position];
1049
1156
  const v = row[velocity];
1050
1157
  row[position] = Vec3.add(Vec3.normalize(Vec3.cross(p, v)), Vec3.F32.scale(Vec3.clamp(v, Vec3.zero, [1, 1, 1]), Vec3.dot(p, v)));
@@ -1063,7 +1170,7 @@ describe("math builtins", () => {
1063
1170
  });
1064
1171
 
1065
1172
  test("across namespaces: quaternions rotating vectors, and matrices", async () => {
1066
- const kernel = await compile(`${math}const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position] } }, (row) => {
1173
+ const kernel = await compile(`${math}const kernel = System.create({ kernel: true, components: { with: [position] } }, (row) => {
1067
1174
  const q = Quat.fromAxisAngle([0, 0, 1], Math.PI / 2);
1068
1175
  const m = Mat4x4.multiply(Mat4x4.translation(1, 2, 3), Mat4x4.scaling(2, 2, 2));
1069
1176
  row[position] = Mat4x4.multiplyVec3(m, Quat.rotateVec3(q, row[position]));
@@ -1076,9 +1183,9 @@ describe("math builtins", () => {
1076
1183
 
1077
1184
  test("in GPU kernels, become regions WGSL emits as builtins, and other backends run as the inlined body", async () => {
1078
1185
  const body = `(row) => { row[position] = Vec3.scale(Vec3.normalize(Vec3.cross(row[position], row[velocity])), Vec3.dot(row[position], row[velocity])); }`;
1079
- const declaration = `components: { read: [velocity], write: [position] }`;
1080
- const gpu = await compile(`${math}const kernel = System.create({ name: "a", kernel: "gpu", ${declaration} }, ${body});`);
1081
- const cpu = await compile(`${math}const kernel = System.create({ name: "a", kernel: "cpu", ${declaration} }, ${body});`);
1186
+ const declaration = `components: { with: [velocity, position] }`;
1187
+ const gpu = await compile(`${math}const kernel = System.create({ kernel: "gpu", ${declaration} }, ${body});`);
1188
+ const cpu = await compile(`${math}const kernel = System.create({ kernel: true, ${declaration} }, ${body});`);
1082
1189
  const regions = (gpu.program?.body ?? []).flatMap(statement => statement.kind === "intrinsic" ? [statement.intrinsic.operation] : []);
1083
1190
  expect(regions).toEqual(["cross", "normalize", "dot", "*"]);
1084
1191
  expect((cpu.program?.body ?? []).some(statement => statement.kind === "intrinsic")).toBe(false);
@@ -1092,17 +1199,17 @@ describe("math builtins", () => {
1092
1199
  });
1093
1200
 
1094
1201
  test("that leave the kernel subset fail with the function's reason", async () => {
1095
- expect(await failure(`${math}const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position] } }, (row) => {
1202
+ expect(await failure(`${math}const kernel = System.create({ kernel: true, components: { with: [position] } }, (row) => {
1096
1203
  row[position] = Vec3.random();
1097
1204
  });`)).toBe("Math.random is not in the kernel subset");
1098
- expect(await failure(`${math}const kernel = System.create({ name: "a", kernel: "cpu", components: { write: [position] } }, (row) => {
1205
+ expect(await failure(`${math}const kernel = System.create({ kernel: true, components: { with: [position] } }, (row) => {
1099
1206
  row[position] = Vec3.missing([1, 2, 3]);
1100
1207
  });`)).toMatch(/^missing isn't exported by .*\/math\/vec3\/public\.ts$/);
1101
1208
  });
1102
1209
  });
1103
1210
 
1104
1211
  describe("imported functions and constants", () => {
1105
- const kernel = (imports: string, body: string) => `${imports}\nconst kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass], write: [score] } }, (row) => { ${body} });`;
1212
+ const kernel = (imports: string, body: string) => `${imports}\nconst kernel = System.create({ kernel: true, components: { with: [mass, score] } }, (row) => { ${body} });`;
1106
1213
  const scores = async (source: string, files: { readonly [file: string]: string }) =>
1107
1214
  run(await compile(source, files), 2, { mass: { "[]": [2, 3] } }).field("score");
1108
1215
 
@@ -1171,10 +1278,10 @@ describe("imported lists", () => {
1171
1278
  const files = {
1172
1279
  "/components.js": `export const health = "health";\nexport const armor = "armor";\nexport const tagged = "tagged";\n`,
1173
1280
  "/archetypes.js": [
1174
- `import { Archetype } from "ecs";`,
1175
1281
  `import { health, armor, tagged } from "./components.js";`,
1176
1282
  `export const shield = "shield";`,
1177
- `export const Unit = Archetype.create([health, armor, tagged]);`,
1283
+ `export const Unit = archetype$([health, armor, tagged]);`,
1284
+ `function archetype$(list) { return list; }`,
1178
1285
  `export const Guard = [shield, armor];`,
1179
1286
  `export const Alias = Unit;`,
1180
1287
  `export const Computed = [health].concat([armor]);`,
@@ -1187,7 +1294,7 @@ describe("imported lists", () => {
1187
1294
  const Unit = ["health", "armor", "tagged"];
1188
1295
  const Guard = ["shield", "armor"];
1189
1296
  const commanding = (imports: string, body: string) =>
1190
- `${imports}\nconst kernel = System.create({ name: "a", kernel: "cpu", components: { read: [mass] } }, (row, { commands }) => { ${body} });`;
1297
+ `${imports}\nconst kernel = System.create({ kernel: true, components: { with: [mass] } }, (row, { commands }) => { ${body} });`;
1191
1298
 
1192
1299
  test("name the keys of a list imported from another module, by the kernel's bindings or else through the list", async () => {
1193
1300
  const source = commanding(`import { health, armor } from "./components.js";\nimport { Unit, Guard } from "./archetypes.js";`, `
@@ -1226,16 +1333,16 @@ describe("imported lists", () => {
1226
1333
 
1227
1334
  test("in a declaration, bind keys the list's module defines to the kernel's imports of them, under any name", async () => {
1228
1335
  const source = `import { shield, Guard } from "./archetypes.js";\nimport { armor as plate } from "./components.js";
1229
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: Guard, write: [score] } }, (row) => { row[score] = row[shield] * 10 + row[plate]; });`;
1336
+ const kernel = System.create({ kernel: true, components: { with: [score, ...Guard] } }, (row) => { row[score] = row[shield] * 10 + row[plate]; });`;
1230
1337
  const kernel = await compile(source, files, { shield: "shield", Guard, plate: "armor" });
1231
1338
  expect(run(kernel, 2, { shield: { "[]": [1, 2] }, armor: { "[]": [3, 4] } }).field("score")).toEqual([13, 24]);
1339
+ // What it requires but doesn't use, it only requires.
1232
1340
  expect(await failure(`import { shield, Guard } from "./archetypes.js";
1233
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: Guard, write: [score] } }, (row) => { row[score] = row[shield]; });`, files))
1234
- .toBe("Guard[1] is in components read but never read; remove it, or move it to components has to keep requiring it");
1341
+ const kernel = System.create({ kernel: true, components: { with: [score, ...Guard] } }, (row) => { row[score] = row[shield]; });`, files)).toBe("compiled");
1235
1342
  });
1236
1343
 
1237
1344
  test.each([
1238
- ["computed when its module runs", "commands.spawn(Computed)({});", "commands.spawn: Computed is computed when /archetypes.js runs, so the compiler can't read its components; declare it as an array literal, or Archetype.create of one"],
1345
+ ["computed when its module runs", "commands.spawn(Computed)({});", "commands.spawn: Computed is computed when /archetypes.js runs, so the compiler can't read its components; declare it as an array literal, `as const`"],
1239
1346
  ["not a const", "commands.spawn(Changing)({});", "commands.spawn: Changing isn't a module-scope const, so the compiler can't read its components"],
1240
1347
  ["holding a spread", "commands.spawn(Spread)({});", "commands.spawn: Spread names a key by something other than an identifier bound at the scope of /archetypes.js"],
1241
1348
  ["not exported", "commands.spawn(Missing)({});", "commands.spawn: Missing isn't exported by /archetypes.js"],
@@ -1266,7 +1373,7 @@ const kernel = System.create({ name: "a", kernel: "cpu", components: { read: Gua
1266
1373
  });
1267
1374
 
1268
1375
  test.each([
1269
- ["computed when its module runs", "commands.add(row.entity, Computed, {});", "commands.add: Computed is computed when /archetypes.js runs, so the compiler can't tell whether it's a key or a list; declare a key as Symbol(...), or a list as an array literal or Archetype.create of one"],
1376
+ ["computed when its module runs", "commands.add(row.entity, Computed, {});", "commands.add: Computed is computed when /archetypes.js runs, so the compiler can't tell whether it's a key or a list; declare a key as Symbol(...), or a list as an array literal, `as const`"],
1270
1377
  ["not a const", "commands.remove(row.entity, Changing);", "commands.remove: Changing isn't a module-scope const, so the compiler can't tell whether it's a key or a list"],
1271
1378
  ["not exported", "commands.remove(row.entity, Missing);", "commands.remove: Missing isn't exported by /archetypes.js"],
1272
1379
  ["a namespace", "commands.add(row.entity, Archetypes, 1);", "commands.add: Archetypes is a module namespace, not a key or a list of components"],
@@ -1282,140 +1389,146 @@ const kernel = System.create({ name: "a", kernel: "cpu", components: { read: Gua
1282
1389
 
1283
1390
  test("fail the build for a declaration's list computed when its module runs", async () => {
1284
1391
  expect(await failure(`import { Computed } from "./archetypes.js";
1285
- const kernel = System.create({ name: "a", kernel: "cpu", components: { read: Computed, write: [score] } }, (row) => { row[score] = 1; });`, files))
1286
- .toBe("components.read: Computed is computed when /archetypes.js runs, so the compiler can't read its components; declare it as an array literal, or Archetype.create of one");
1392
+ const kernel = System.create({ kernel: true, components: { with: Computed } }, (row) => { void row.entity; });`, files))
1393
+ .toBe("components.with: Computed is computed when /archetypes.js runs, so the compiler can't read its components; declare it as an array literal, `as const`");
1287
1394
  });
1288
1395
  });
1289
1396
 
1290
- describe("declared access", () => {
1291
- const kernel = (declaration: string, body: string) =>
1292
- `const kernel = System.create({ name: "a", kernel: "cpu", ${declaration} }, (row, { resources, lookup, reduce }) => { ${body} });`;
1293
- const system = (declaration: string, body: string) => `const system = System.create({ name: "a", ${declaration} }, ${body});`;
1294
-
1295
- test("a kernel uses every component and resource it lists", async () => {
1296
- expect(await failure(kernel("components: { read: [position, velocity], write: [score] }", "row[score] = row[velocity];")))
1297
- .toBe("position is in components read but never read; remove it, or move it to components has to keep requiring it");
1298
- expect(await failure(kernel("components: { read: [position], write: [velocity, mass] }", "row[velocity] = row[position];")))
1299
- .toBe("mass is in components write but never written; remove it, or move it to components read if it's only read");
1300
- expect(await failure(kernel("components: { write: [score] }, resources: { read: [delta] }", "row[score] = 1;")))
1301
- .toBe("delta is in resources read but never read; remove it");
1302
- expect(await failure(kernel("components: { read: [target], write: [score] }, lookup: { targets: { read: [mass, position] } }",
1303
- "const found = lookup.targets(row[target]); row[score] = found === null ? 0 : found[mass];")))
1304
- .toBe("position is in lookup.targets read but never read; remove it, or move it to lookup.targets has to keep requiring it");
1305
- expect(await failure(kernel("components: { read: [mass], has: [alive] }", "const entity = row.entity;")))
1306
- .toBe("mass is in components read but never read; remove it, or move it to components has to keep requiring it");
1307
- expect(await failure(kernel("components: { read: [position, mass], write: [score] }, resources: { read: [delta] }",
1308
- "row[score] = row[mass] * resources[delta] + row[position][0];"))).toBe("compiled");
1309
- });
1310
-
1311
- test("a kernel reads every component it lists in up.read, and up holds only those", async () => {
1312
- const up = (kind: string, read: string, body: string) =>
1313
- `const kernel = System.create({ name: "a", kernel: "${kind}", components: { read: [mass], write: [score] }, up: { through: target, read: [${read}] } }, (row, { up }) => { ${body} });`;
1314
- const propagate = "row[score] = (up === null ? 0 : up[score]) + row[mass];";
1315
- expect(await failure(up("cpu", "score, position", propagate))).toBe("position is in up.read but never read; remove it");
1316
- expect(await failure(up("cpu", "score", "row[score] = up === null ? row[mass] : up[position];"))).toBe("up is indexed by a component in up.read");
1317
- expect(await failure(up("gpu", "score", propagate))).toBe("compiled");
1318
- expect(await failure(up("cpu", "score", propagate))).toBe("compiled");
1319
- });
1320
-
1321
- test("a main-thread system uses every component and resource it lists, where its body shows every access", async () => {
1322
- const unread = "mass is in components read but never read; remove it, or move it to components has to keep requiring it";
1323
- expect(await failure(system("components: { read: [position, mass], write: [velocity] }", "(row) => { row[velocity] = row[position]; }"))).toBe(unread);
1324
- expect(await failure(system("components: { read: [position], write: [velocity] }", "(row) => { console.log(row[position]); }")))
1325
- .toBe("velocity is in components write but never written; remove it, or move it to components read if it's only read");
1326
- expect(await failure(system("components: { read: [mass] }", "() => {}"))).toBe(unread);
1327
- expect(await failure(system("components: { read: [mass] }", "(row, { commands }) => commands.despawn(row.entity)"))).toBe(unread);
1328
- expect(await failure(system("components: { write: [score] }", "(row) => { row[score] += 1; }"))).toBe("compiled");
1329
- });
1330
-
1331
- test("a main-thread system uses every resource it lists, through its context's resources however it reaches them", async () => {
1332
- const unread = "delta is in resources read but never read; remove it";
1333
- // Without components, the context is the first parameter.
1334
- expect(await failure(system("resources: { read: [delta], write: [score] }", "(context) => { context.resources[score] = 1; }"))).toBe(unread);
1335
- expect(await failure(system("resources: { read: [delta], write: [score] }", "({ resources }) => { resources[score] = 1; }"))).toBe(unread);
1336
- expect(await failure(system("resources: { read: [delta], write: [score] }", "(context) => { const { resources } = context; resources[score] = 1; }"))).toBe(unread);
1337
- expect(await failure(system("resources: { read: [delta] }, input: { type: \"number\" }", "({ input }) => { console.log(input); }"))).toBe(unread);
1338
- expect(await failure(system("resources: { write: [score, mass] }", "({ resources }) => { resources[score] = 1; }"))).toBe("mass is in resources write but never written; remove it, or move it to resources read if it's only read");
1339
- expect(await failure(system("components: { has: [mass] }, resources: { read: [delta], write: [score] }",
1340
- "(_, context) => { context.resources[score] = context.resources[delta]; }"))).toBe("compiled");
1341
- expect(await failure(system("resources: { read: [delta] }", "({ resources: { [delta]: d } }) => { console.log(d); }"))).toBe("compiled");
1342
- });
1343
-
1344
- test("a system contributes to every resource it reduces", async () => {
1345
- const totals = `const total = "total";\nconst low = "low";\n`;
1346
- const missing = "low is in reduce but never contributed to; remove it";
1347
- expect(await failure(`${totals}${kernel(`components: { read: [mass] }, reduce: { [total]: "+", [low]: "min" }`, "reduce[total](row[mass]);")}`)).toBe(missing);
1348
- expect(await failure(`${totals}${system(`components: { read: [mass] }, reduce: { [total]: "+", [low]: "min" }`, "(row, { reduce }) => { reduce[total](row[mass]); }")}`)).toBe(missing);
1349
- expect(await failure(`${totals}${system(`components: { read: [mass] }, reduce: { [total]: "+", [low]: "min" }`, "(row, context) => { context.reduce[total](row[mass]); }")}`)).toBe(missing);
1350
- expect(await failure(`${totals}${system(`components: { read: [mass] }, reduce: { [total]: "+" }`, "(row, { reduce }) => { const add = reduce[total]; add(row[mass]); }")}`)).toBe("compiled");
1351
- });
1352
-
1353
- test("a main-thread system reads every component it lists in a lookup, where its body shows every use of the result", async () => {
1354
- const looking = (lookup: string, body: string) => system(`components: { read: [target] }, lookup: { targets: { read: ${lookup} } }`, body);
1355
- const unread = "position is in lookup.targets read but never read; remove it, or move it to lookup.targets has to keep requiring it";
1356
- expect(await failure(looking("[mass, position]", "(row, context) => { const found = context.lookup.targets(row[target]); if (found !== null) console.log(found[mass]); }"))).toBe(unread);
1357
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { console.log(lookup.targets(row[target])?.[mass]); }"))).toBe(unread);
1358
- expect(await failure(looking("[mass, position]", "(row, { lookup: { targets } }) => { console.log(targets(row[target])?.[mass]); }"))).toBe(unread);
1359
- expect(await failure(looking("[mass]", "(row, { lookup: { targets } }) => { const found = targets(row[target]); if (!found) return; console.log(found[mass]); }")))
1360
- .toBe("compiled");
1361
- expect(await failure(looking("[mass, position]", "(row, { lookup: { targets } }) => { const found = targets(row[target]); console.log(found); }"))).toBe("compiled");
1362
- expect(await failure(looking("[mass, position]", "(row, { lookup: { targets } }) => { let found = targets(row[target]); console.log(found?.[mass]); }"))).toBe("compiled");
1363
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { helper(lookup); console.log(row[target]); }"))).toBe("compiled");
1364
- });
1365
-
1366
- test("a main-thread system reads every component it lists in a lookup through an index, from its lists' rows", async () => {
1367
- const looking = (lookup: string, body: string) => system(`components: { read: [target] }, lookup: { near: { index: grid, read: ${lookup} } }`, body);
1368
- const unread = "position is in lookup.near read but never read; remove it";
1369
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { const near = lookup.near(row[target]); for (let i = 0; i < near.length; i++) console.log(near.at(i)[mass], near.changed); }"))).toBe(unread);
1370
- expect(await failure(looking("[mass, position]", "(row, context) => { const other = context.lookup.near(row[target]).at(0); console.log(other[mass], other.entity); }"))).toBe(unread);
1371
- expect(await failure(looking("[mass, position]", "(row, { lookup: { near } }) => { console.log(near(row[target])?.[mass]); }"))).toBe(unread);
1372
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { const near = lookup.near(row[target]); console.log(near.at(0)[mass], near.at(1)[position]); }"))).toBe("compiled");
1373
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { helper(lookup.near(row[target])); }"))).toBe("compiled");
1374
- expect(await failure(looking("[mass, position]", "(row, { lookup }) => { const near = lookup.near(row[target]); const all = near.at; console.log(all); }"))).toBe("compiled");
1375
- });
1376
-
1377
- test("a main-thread system reads every component it lists through a destructured row", async () => {
1378
- const unread = "mass is in components read but never read; remove it, or move it to components has to keep requiring it";
1379
- expect(await failure(system("components: { read: [position, mass] }", "({ [position]: p, entity }) => { console.log(p, entity); }"))).toBe(unread);
1380
- expect(await failure(system("components: { read: [position, mass] }", "(row) => { const { [position]: p } = row; console.log(p); }"))).toBe(unread);
1381
- expect(await failure(system("components: { read: [position] }", "({ ...all }) => { console.log(all); }"))).toBe("compiled");
1382
- });
1383
-
1384
- test("finalizers are checked as main-thread bodies, in files that import only Finalizer", async () => {
1385
- const finalizing = (source: string) => transformKernels(source, "/finalizer.js", parse, async specifier => specifier === "ecs", index => JSON.stringify(`kernel:${index}`));
1386
- const failed = async (source: string) => {
1387
- const result = await finalizing(source);
1388
- return result !== null && "failure" in result ? result.failure.message : "compiled";
1389
- };
1390
- const header = `import { Finalizer } from "ecs";\nconst handle = "handle";\nconst count = "count";\n`;
1391
- expect(await failed(`${header}const f = Finalizer.create({ name: "f", components: { read: [handle, count] } }, (row) => { console.log(row[handle]); });`))
1392
- .toBe("count is in components read but never read; remove it, or move it to components has to keep requiring it");
1393
- expect(await failed(`${header}const f = Finalizer.changes({ name: "f", resources: { read: [count] } }, (changes, { resources }) => { console.log(changes); });`))
1394
- .toBe("count is in resources read but never read; remove it");
1395
- expect(await failed(`${header}const f = Finalizer.changes({ name: "f", resources: { read: [count] } }, (changes, { resources }) => { console.log(changes, resources[count]); });`))
1396
- .toBe("compiled");
1397
- expect(await failed(`${header}const f = Finalizer.create({ name: "f", components: { read: [handle] } }, (row) => { console.log(row[handle]); });`)).toBe("compiled");
1398
- });
1399
-
1400
- test("a list declared as a module constant is checked as its array literal", async () => {
1401
- const moving = `const moving = [position, velocity];\n`;
1402
- expect(await failure(`${moving}${system("components: { read: moving }", "(row) => { console.log(row[position]); }")}`))
1403
- .toBe("velocity is in components read but never read; remove it, or move it to components has to keep requiring it");
1404
- expect(await failure(`${moving}${system("components: { read: moving }", "(row) => { console.log(row[position], row[velocity]); }")}`)).toBe("compiled");
1405
- expect(await failure(`${moving}${kernel("components: { read: moving, write: [score] }", "row[score] = row[position];")}`))
1406
- .toBe("velocity is in components read but never read; remove it, or move it to components has to keep requiring it");
1407
- });
1408
-
1409
- test("a main-thread system whose body hides an access isn't checked", async () => {
1410
- expect(await failure(system("components: { read: [mass] }", "(row) => { helper(row); }"))).toBe("compiled");
1411
- expect(await failure(system("components: { read: [mass] }", "(row) => { for (const key of [mass]) console.log(row[key]); }"))).toBe("compiled");
1412
- expect(await failure(system("components: { read: [mass] }", "(row) => { const mass = \"other\"; console.log(row[mass]); }"))).toBe("compiled");
1413
- expect(await failure(system("components: { read: [mass] }", "function (row) { console.log(arguments[0][mass]); }"))).toBe("compiled");
1414
- expect(await failure(system("resources: { read: [delta] }", "({ ...all }) => { console.log(all); }"))).toBe("compiled");
1415
- expect(await failure(system("resources: { read: [delta] }", "({ resources: { ...all } }) => { console.log(all); }"))).toBe("compiled");
1416
- expect(await failure(system("resources: { read: [delta] }", "(context) => { helper(context.resources); }"))).toBe("compiled");
1417
- expect(await failure(system("resources: { read: [delta] }", "(context) => { let r = context.resources; console.log(r); }"))).toBe("compiled");
1418
- expect(await failure(system("components: { read: [mass] }", "body"))).toBe("compiled");
1419
- expect(await failure("const decay = (k) => System.create({ name: \"a\", components: { read: [k] } }, (row) => { console.log(row[k]); });")).toBe("compiled");
1397
+ describe("inferred access", () => {
1398
+ /** What the build inferred the first system's body uses, as the source it gives its declaration, or why it failed. */
1399
+ const inferred = async (source: string): Promise<string> => {
1400
+ const result = await transform(source);
1401
+ if (result === null) return "none";
1402
+ if ("failure" in result) return result.failure.message;
1403
+ return /\{ components: .*?, at: "[^"]*" \}/.exec(result.code)?.[0] ?? "none";
1404
+ };
1405
+ const system = (declaration: string, body: string) => `const system = System.create({ ${declaration} }, ${body});`;
1406
+
1407
+ test("a row's reads and writes, its members in with's order", async () => {
1408
+ expect(await inferred(system("components: { with: [position, velocity, mass] }", "(row) => { row[velocity] = row[mass] + row[position]; }")))
1409
+ .toContain("components: { read: [position, mass], write: [velocity] }");
1410
+ expect(await inferred(system("components: { with: [score] }", "(row) => { row[score] += 1; }"))).toContain("components: { read: [], write: [score] }");
1411
+ expect(await inferred(system("components: { with: [position, mass] }", "({ [position]: p, entity }) => { console.log(p, entity); }")))
1412
+ .toContain("components: { read: [position], write: [] }");
1413
+ });
1414
+
1415
+ test("a row it can't follow as unknown, which the world takes as every member written, with a warning", async () => {
1416
+ const result = await transform(system("components: { with: [position] }", "(row) => { helper(row); }"));
1417
+ expect(result !== null && "code" in result ? [result.code.includes("components: null"), result.warnings.length] : null).toEqual([true, 1]);
1418
+ });
1419
+
1420
+ test("an observer's row it can't follow as unknown without a warning, since the world takes an observer's as read", async () => {
1421
+ const result = await transform(system("observer: true, components: { with: [position] }", "(row) => { helper(row); }"));
1422
+ expect(result !== null && "code" in result ? [result.code.includes("components: null"), result.warnings] : null).toEqual([true, []]);
1423
+ });
1424
+
1425
+ test("a row it can't follow with a warning unless the declaration says observer: true, as the world reads it", async () => {
1426
+ for (const observer of ["observer: false, ", "observer: watching, "]) {
1427
+ const result = await transform(`const watching = true;\n${system(`${observer}components: { with: [position] }`, "(row) => { helper(row); }")}`);
1428
+ expect(result !== null && "code" in result ? result.warnings.length : null).toBe(1);
1429
+ }
1430
+ });
1431
+
1432
+ test("a lookup's rows it can't follow without a warning, since what they hold is what the declaration says", async () => {
1433
+ const result = await transform(system("components: { with: [target] }, lookup: { targets: { with: [mass] } }", "(row, { lookup }) => { helper(lookup.targets(row[target])); }"));
1434
+ expect(result !== null && "code" in result ? [result.code.includes(`"targets": null`), result.warnings] : null).toEqual([true, []]);
1435
+ });
1436
+
1437
+ test("warnings name the module by the label given, with line and column", async () => {
1438
+ const result = await transformKernels(`${header}${system("components: { with: [position] }", "(row) => { helper(row); }")}`, "/repo/app/src/features/a/model.ts", parse,
1439
+ async specifier => specifier === "ecs" ? ownCopy : null, () => "", createLinker(host({}, reductions), parse), true, "src/features/a/model.ts");
1440
+ expect(result !== null && "code" in result ? result.warnings.map(warning => /^[^ ]*:/.exec(warning)?.[0]) : null).toEqual([`src/features/a/model.ts:${header.split("\n").length}:${"const system = System.create({ components: { with: [position] } }, ".length + 1}:`]);
1441
+ });
1442
+
1443
+ test("resources read, written and reduced, however its context reaches them", async () => {
1444
+ expect(await inferred(system("", "(context) => { context.resources[score] = context.resources[delta]; }")))
1445
+ .toContain("resources: { read: [delta], write: [score], reduce: [] }");
1446
+ expect(await inferred(system("", "(context) => { const { resources } = context; resources[score] += 1; }")))
1447
+ .toContain("resources: { read: [score], write: [score], reduce: [] }");
1448
+ expect(await inferred(system("", "({ resources: { [delta]: d } }) => { console.log(d); }"))).toContain("resources: { read: [delta], write: [], reduce: [] }");
1449
+ expect(await inferred(`const total = "total";\n${system("components: { with: [mass] }", "(row, { reduce }) => { reduce[total](row[mass]); }")}`))
1450
+ .toContain("resources: { read: [], write: [], reduce: [total] }");
1451
+ expect(await inferred(system("", "(context) => { helper(context); }"))).toContain("resources: null");
1452
+ });
1453
+
1454
+ test("what a lookup's rows are read for, by entity and through an index, or unknown", async () => {
1455
+ expect(await inferred(system("components: { with: [target] }, lookup: { targets: { with: [mass, position] } }",
1456
+ "(row, { lookup }) => { console.log(lookup.targets(row[target])?.[mass]); }"))).toContain(`lookup: { "targets": [mass] }`);
1457
+ expect(await inferred(system("components: { with: [target] }, lookup: { near: { index: grid } }",
1458
+ "(row, { lookup }) => { const near = lookup.near(row[target]); console.log(near.at(0)[mass], near.length); }"))).toContain(`lookup: { "near": [mass] }`);
1459
+ expect(await inferred(system("components: { with: [target] }, lookup: { targets: { with: [mass] } }",
1460
+ "(row, { lookup }) => { helper(lookup.targets(row[target])); }"))).toContain(`lookup: { "targets": null }`);
1461
+ });
1462
+
1463
+ test("what its body reads of its parent", async () => {
1464
+ expect(await inferred(system("components: { with: [mass, score] }, up: { through: target }", "(row, { up }) => { row[score] = (up === null ? 0 : up[score]) + row[mass]; }")))
1465
+ .toContain("up: [score]");
1466
+ });
1467
+
1468
+ test("fail the build for a key a body uses that its declaration doesn't require", async () => {
1469
+ expect(await inferred(system("components: { with: [position] }", "(row) => { console.log(row[mass]); }")))
1470
+ .toBe("mass isn't in components with or optional, so the system doesn't require it: add it there to use it");
1471
+ expect(await inferred(system("components: { with: [target] }, lookup: { targets: { with: [mass] } }", "(row, { lookup }) => { console.log(lookup.targets(row[target])?.[position]); }")))
1472
+ .toBe("position isn't in lookup.targets.with or optional, so the system doesn't require it: add it there to use it");
1473
+ });
1474
+
1475
+ test("finalizers, in files that import only Finalizer", async () => {
1476
+ const result = await transformKernels(`import { Finalizer } from "ecs";\nconst handle = "handle";\nconst count = "count";\nconst f = Finalizer.create({ components: { with: [handle, count] } }, (row, { resources }) => { console.log(row[handle], resources[count]); });`,
1477
+ "/finalizer.js", parse, async specifier => specifier === "ecs" ? ownCopy : null, index => JSON.stringify(`kernel:${index}`));
1478
+ expect(result !== null && "code" in result ? result.code : "").toContain("{ components: { read: [handle], write: [] }, resources: { read: [count], write: [], reduce: [] }");
1479
+ });
1480
+
1481
+ test("a destructuring target, or a for…of target, written", async () => {
1482
+ expect(await inferred(system("components: { with: [position] }", "(row) => { ({ x: row[position] } = source); }")))
1483
+ .toContain("components: { read: [], write: [position] }");
1484
+ expect(await inferred(system("components: { with: [position] }", "(row) => { for ({ x: row[position] } of sources); }")))
1485
+ .toContain("components: { read: [], write: [position] }");
1486
+ expect(await inferred(system("components: { with: [position] }", "(row) => { [row[position]] = pair; }")))
1487
+ .toContain("components: { read: [], write: [position] }");
1488
+ expect(await inferred(system("", "(context) => { ({ x: context.resources[score] } = source); }")))
1489
+ .toContain("resources: { read: [], write: [score], reduce: [] }");
1490
+ });
1491
+
1492
+ test("defaults and computed keys of declared patterns, and of parameters, as uses", async () => {
1493
+ expect(await inferred(system("components: { with: [position] }", "(row) => { const { a = (row[position] = 5) } = {}; }")))
1494
+ .toContain("components: { read: [], write: [position] }");
1495
+ expect(await inferred(system("components: { with: [position, velocity] }", "(row) => { const { [row[velocity]]: v } = table; console.log(v); }")))
1496
+ .toContain("components: { read: [velocity], write: [] }");
1497
+ expect(await inferred(system("", "(context) => { const { a = context.resources[delta] } = {}; console.log(a); }")))
1498
+ .toContain("resources: { read: [delta], write: [], reduce: [] }");
1499
+ expect(await inferred(system("components: { with: [position, velocity] }", "(row, context, step = row[velocity]) => { console.log(step); }")))
1500
+ .toContain("components: { read: [velocity], write: [] }");
1501
+ });
1502
+
1503
+ test("what a for…of or for…in loop goes over, as a read", async () => {
1504
+ expect(await inferred(system("", "({ resources }) => { for (const name of resources[delta]) console.log(name); }")))
1505
+ .toContain("resources: { read: [delta], write: [], reduce: [] }");
1506
+ expect(await inferred(system("components: { with: [position] }", "(row) => { for (const x of row[position]) console.log(x); }")))
1507
+ .toContain("components: { read: [position], write: [] }");
1508
+ });
1509
+
1510
+ test("a change inside a value, at any depth, as a change in place, for registration to judge by its kind", async () => {
1511
+ expect(await inferred(system("components: { with: [position] }", "(row) => { row[position].a.b = 1; }")))
1512
+ .toContain("components: { read: [position], write: [], mutate: [position] }");
1513
+ expect(await inferred(system("components: { with: [position] }", "(row) => { delete row[position].a; }")))
1514
+ .toContain("components: { read: [position], write: [], mutate: [position] }");
1515
+ expect(await inferred(system("components: { with: [position] }", "(row) => { [row[position][0]] = pair; }")))
1516
+ .toContain("components: { read: [position], write: [], mutate: [position] }");
1517
+ expect(await inferred(system("", "(context) => { context.resources[score].a = 1; }")))
1518
+ .toContain("resources: { read: [score], write: [], reduce: [], mutate: [score] }");
1519
+ });
1520
+
1521
+ test("a body mentioning eval as one it can't follow", async () => {
1522
+ expect(await inferred(system("components: { with: [position] }", "(row) => { eval(\"row[position] = 1\"); }"))).toContain("components: null");
1523
+ });
1524
+
1525
+ test("fail the build for an async or generator body", async () => {
1526
+ expect(await inferred(system("components: { with: [position] }", "async (row) => { row[position] = 1; }"))).toContain("a body can't be async");
1527
+ expect(await inferred(system("components: { with: [position] }", "function* (row) { row[position] = 1; }"))).toContain("a body can't be a generator");
1528
+ });
1529
+
1530
+ test("a body given by name, read where it's bound", async () => {
1531
+ expect(await inferred(`const move = (row) => { row[position] = row[velocity]; };\n${system("components: { with: [position, velocity] }", "move")}`))
1532
+ .toContain("components: { read: [velocity], write: [position] }");
1420
1533
  });
1421
1534
  });