aiecsjs 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +1 -1
  2. package/README_ZHTW.md +4 -4
  3. package/api.json +1 -1
  4. package/dist/{chunk-B777DQR7.cjs → chunk-4QBOZQZR.cjs} +2 -2
  5. package/dist/{chunk-B777DQR7.cjs.map → chunk-4QBOZQZR.cjs.map} +1 -1
  6. package/dist/{chunk-SQWZUC2Q.js → chunk-AROBEZEB.js} +2 -2
  7. package/dist/{chunk-SQWZUC2Q.js.map → chunk-AROBEZEB.js.map} +1 -1
  8. package/dist/{chunk-SJDWI3OZ.cjs → chunk-IJ4BTSN2.cjs} +2 -2
  9. package/dist/{chunk-SJDWI3OZ.cjs.map → chunk-IJ4BTSN2.cjs.map} +1 -1
  10. package/dist/{chunk-CTESP3XL.js → chunk-JLU2PG6H.js} +2 -2
  11. package/dist/{chunk-CTESP3XL.js.map → chunk-JLU2PG6H.js.map} +1 -1
  12. package/dist/{chunk-F7KNZ27O.js → chunk-XDLAI4YT.js} +2 -2
  13. package/dist/{chunk-F7KNZ27O.js.map → chunk-XDLAI4YT.js.map} +1 -1
  14. package/dist/{chunk-RHH5JA74.cjs → chunk-Z6ATHRHC.cjs} +2 -2
  15. package/dist/{chunk-RHH5JA74.cjs.map → chunk-Z6ATHRHC.cjs.map} +1 -1
  16. package/dist/commands.cjs +1 -1
  17. package/dist/commands.js +1 -1
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.d.cts +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/observers.cjs +1 -1
  23. package/dist/observers.js +1 -1
  24. package/dist/relations.cjs +1 -1
  25. package/dist/relations.js +1 -1
  26. package/dist/serialize.cjs +1 -1
  27. package/dist/serialize.js +1 -1
  28. package/dist/worker.cjs +1 -1
  29. package/dist/worker.js +1 -1
  30. package/llms-full.txt +23 -5
  31. package/package.json +5 -8
  32. package/CHANGELOG.md +0 -292
  33. package/STABILITY.md +0 -156
  34. package/STABILITY_ZHTW.md +0 -155
  35. package/docs/MIGRATION.md +0 -252
  36. package/docs/MIGRATION_ZHTW.md +0 -252
package/README.md CHANGED
@@ -678,7 +678,7 @@ ws.onmessage = (e) => remoteDelta.apply(remoteWorld, new Uint8Array(e.data))
678
678
 
679
679
  ## Migration Guides
680
680
 
681
- Full tables in [`docs/MIGRATION.md`](./docs/MIGRATION.md).
681
+ Full tables in [`docs/MIGRATION.md`](https://github.com/yshengliao/aiecsjs/blob/main/docs/MIGRATION.md).
682
682
 
683
683
  ### From bitECS 0.4
684
684
 
package/README_ZHTW.md CHANGED
@@ -355,7 +355,7 @@ const likedSince = getRelationData(world, alice, Likes, bob) // { since: 2020 }
355
355
 
356
356
  ## API 參考
357
357
 
358
- 完整機器可讀表面在 [`api.json`](./api.json)。各 export 穩定度在 [`STABILITY.md`](./STABILITY.md)(中文:[`STABILITY_ZHTW.md`](./STABILITY_ZHTW.md))。
358
+ 完整機器可讀表面在 [`api.json`](./api.json)。各 export 穩定度在 [`STABILITY.md`](./STABILITY.md)。
359
359
 
360
360
  ### World — `aiecsjs`
361
361
 
@@ -685,7 +685,7 @@ ws.onmessage = (e) => remoteDelta.apply(remoteWorld, new Uint8Array(e.data))
685
685
 
686
686
  ## 移轉指引
687
687
 
688
- 完整表格請見 [`docs/MIGRATION.md`](./docs/MIGRATION.md) 與 [`docs/MIGRATION_ZHTW.md`](./docs/MIGRATION_ZHTW.md)。
688
+ 完整表格請見 [`docs/MIGRATION.md`](https://github.com/yshengliao/aiecsjs/blob/main/docs/MIGRATION.md) 與 [`docs/MIGRATION_ZHTW.md`](https://github.com/yshengliao/aiecsjs/blob/main/docs/MIGRATION_ZHTW.md)。
689
689
 
690
690
  ### 從 bitECS 0.4 移轉
691
691
 
@@ -863,7 +863,7 @@ if (VERSION.startsWith('0.')) {
863
863
 
864
864
  ### 穩定度契約
865
865
 
866
- 請見 [`STABILITY_ZHTW.md`](./STABILITY_ZHTW.md)。簡言之:從 `aiecsjs`(根目錄)匯入者在 0.x minor 內為 **stable**。`aiecsjs/relations` 自 0.4.0 起為 **stable**;`aiecsjs/worker` 仍為 **experimental**。任何 `aiecsjs/internal` 內的東西為 **internal**,請勿引用。
866
+ 請見 [`STABILITY.md`](./STABILITY.md)。簡言之:從 `aiecsjs`(根目錄)匯入者在 0.x minor 內為 **stable**。`aiecsjs/relations` 自 0.4.0 起為 **stable**;`aiecsjs/worker` 仍為 **experimental**。任何 `aiecsjs/internal` 內的東西為 **internal**,請勿引用。
867
867
 
868
868
  ### 遙測 / 隱私
869
869
 
@@ -920,7 +920,7 @@ aiecsjs 主要由 AI 生成、單一作者維護。問題回報與小型 PR 歡
920
920
 
921
921
  ## 變更紀錄
922
922
 
923
- 請見 [`CHANGELOG.md`](./CHANGELOG.md) 或 [`CHANGELOG_ZHTW.md`](./CHANGELOG_ZHTW.md)。
923
+ 請見 [`CHANGELOG.md`](./CHANGELOG.md)。
924
924
 
925
925
  ## 授權
926
926
 
package/api.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://yshengliao.github.io/aiecsjs/api-schema.json",
3
3
  "name": "aiecsjs",
4
- "version": "0.4.0",
4
+ "version": "0.5.0",
5
5
  "generated": "2026-05-29",
6
6
  "stability": "experimental",
7
7
  "license": "MIT",
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkSJDWI3OZ_cjs=require('./chunk-SJDWI3OZ.cjs');var d="AIEC",B=1;function P(n,o){let e=D(n);return o?.components&&(e.entities=e.entities.map(t=>({eid:t.eid,components:t.components.filter(i=>o.components.some(c=>c.__id===i.id))}))),x(e)}function Q(n,o){let e=N(n,o);return J(e)}function D(n){let o=chunkSJDWI3OZ_cjs.i(n),e=[];for(let t=1;t<o.capacity;t++){let i=o.entityArchetype[t]??0;if(i===0)continue;let c=o.archetypes[i];if(!c)continue;let r=o.generations[t]??0,a=chunkSJDWI3OZ_cjs.r(t,r,o.options);if(!c.entityRow.has(a))continue;let s=o.options.maskWordCount,l=t*s,p=[];for(let m=0;m<s;m++){let u=o.entityMask[l+m]??0;for(;u!==0;){let b=u&-u,_=(m<<5)+(31-Math.clz32(b)),f=o.componentInfoByBit[_];if(f){let S=o.componentStorageByBit[_],w=null;if(f.kind==="soa"&&S?.soa){let y={};for(let h of f.fields){let g=S.soa[h.name];if(g)if(h.vectorLen===1)y[h.name]=g[t];else {let L=[],M=t*h.vectorLen;for(let C=0;C<h.vectorLen;C++)L.push(g[M+C]??0);y[h.name]=L;}}w=y;}else f.kind==="aos"&&S?.aos?w=S.aos[t]??null:w=true;p.push({kind:f.kind,id:f.id,data:w});}u&=u-1;}}e.push({eid:t,components:p});}return {version:o.version,capacity:o.capacity,entities:e}}function J(n){let o=chunkSJDWI3OZ_cjs.k({initialCapacity:n.capacity}),e=new Map;for(let t of n.entities){let i=chunkSJDWI3OZ_cjs.u(o);e.set(t.eid,i);}for(let t of n.entities){let i=e.get(t.eid);for(let c of t.components){let r=chunkSJDWI3OZ_cjs.P(c.id);if(!r)continue;let a=A(r);a&&chunkSJDWI3OZ_cjs.I(o,i,a,c.data);}}return o}function A(n){if(n.kind==="soa")return {__kind:"soa",__id:n.id,__schema:n.schema??{}};if(n.kind==="aos"){let o=n.factory??(()=>({}));return {__kind:"aos",__id:n.id,__factory:o}}return {__kind:"tag",__id:n.id}}function x(n){let o=JSON.stringify(n),e=new TextEncoder().encode(o),t=new TextEncoder().encode(chunkSJDWI3OZ_cjs.a),c=12+t.length+4+e.length,r=new Uint8Array(c),a=new DataView(r.buffer),s=0;return r[s++]=d.charCodeAt(0),r[s++]=d.charCodeAt(1),r[s++]=d.charCodeAt(2),r[s++]=d.charCodeAt(3),a.setUint32(s,B,true),s+=4,a.setUint32(s,t.length,true),s+=4,r.set(t,s),s+=t.length,a.setUint32(s,e.length,true),s+=4,r.set(e,s),r}function N(n,o){if(n.length<12)throw new Error("aiecsjs: bytes too short to be a valid snapshot");let e=new DataView(n.buffer,n.byteOffset,n.byteLength);if(n[0]!==d.charCodeAt(0)||n[1]!==d.charCodeAt(1)||n[2]!==d.charCodeAt(2)||n[3]!==d.charCodeAt(3))throw new Error("aiecsjs: invalid magic bytes");let t=4,i=e.getUint32(t,true);t+=4;let c=o?.onUnknownVersion??"throw";if(i!==B&&c==="throw")throw new Error(`aiecsjs: format version ${i} not supported`);let r=64*1024*1024;if(t+4>n.length)throw new Error("aiecsjs: snapshot truncated before verLen");let a=e.getUint32(t,true);if(t+=4,a>r||t+a>n.length)throw new Error(`aiecsjs: snapshot verLen=${a} out of bounds`);if(t+=a,t+4>n.length)throw new Error("aiecsjs: snapshot truncated before jsonLen");let s=e.getUint32(t,true);if(t+=4,s>r||t+s>n.length)throw new Error(`aiecsjs: snapshot jsonLen=${s} out of bounds`);let l=n.subarray(t,t+s),p=new TextDecoder().decode(l);return JSON.parse(p)}function Y(n,o){let e={world:n,components:o?.components??chunkSJDWI3OZ_cjs.Q().map(t=>A(t)).filter(Boolean),lastSnapshot:null};return {capture(){let t=D(e.world),i;return e.lastSnapshot?i=V(e.lastSnapshot,t):i=t,e.lastSnapshot=t,x(i)},apply(t,i){let c=N(i),r=chunkSJDWI3OZ_cjs.i(t);for(let a of c.entities)if(!(a.eid>=r.capacity)){if(!chunkSJDWI3OZ_cjs.w(t,a.eid))for(;r.size<a.eid;)chunkSJDWI3OZ_cjs.u(t);for(let s of a.components){let l=chunkSJDWI3OZ_cjs.P(s.id);if(!l)continue;let p=A(l);p&&chunkSJDWI3OZ_cjs.I(t,a.eid,p,s.data);}}},reset(){e.lastSnapshot=null;}}}function V(n,o){let e=new Map(n.entities.map(i=>[i.eid,i])),t=[];for(let i of o.entities){let c=e.get(i.eid);if(!c){t.push(i);continue}let r=JSON.stringify(c.components),a=JSON.stringify(i.components);r!==a&&t.push(i);}return {version:o.version,capacity:o.capacity,entities:t}}exports.a=P;exports.b=Q;exports.c=D;exports.d=J;exports.e=Y;//# sourceMappingURL=chunk-B777DQR7.cjs.map
2
- //# sourceMappingURL=chunk-B777DQR7.cjs.map
1
+ 'use strict';var chunkIJ4BTSN2_cjs=require('./chunk-IJ4BTSN2.cjs');var d="AIEC",B=1;function P(n,o){let e=D(n);return o?.components&&(e.entities=e.entities.map(t=>({eid:t.eid,components:t.components.filter(i=>o.components.some(c=>c.__id===i.id))}))),x(e)}function Q(n,o){let e=N(n,o);return J(e)}function D(n){let o=chunkIJ4BTSN2_cjs.i(n),e=[];for(let t=1;t<o.capacity;t++){let i=o.entityArchetype[t]??0;if(i===0)continue;let c=o.archetypes[i];if(!c)continue;let r=o.generations[t]??0,a=chunkIJ4BTSN2_cjs.r(t,r,o.options);if(!c.entityRow.has(a))continue;let s=o.options.maskWordCount,l=t*s,p=[];for(let m=0;m<s;m++){let u=o.entityMask[l+m]??0;for(;u!==0;){let b=u&-u,_=(m<<5)+(31-Math.clz32(b)),f=o.componentInfoByBit[_];if(f){let S=o.componentStorageByBit[_],w=null;if(f.kind==="soa"&&S?.soa){let y={};for(let h of f.fields){let g=S.soa[h.name];if(g)if(h.vectorLen===1)y[h.name]=g[t];else {let L=[],M=t*h.vectorLen;for(let C=0;C<h.vectorLen;C++)L.push(g[M+C]??0);y[h.name]=L;}}w=y;}else f.kind==="aos"&&S?.aos?w=S.aos[t]??null:w=true;p.push({kind:f.kind,id:f.id,data:w});}u&=u-1;}}e.push({eid:t,components:p});}return {version:o.version,capacity:o.capacity,entities:e}}function J(n){let o=chunkIJ4BTSN2_cjs.k({initialCapacity:n.capacity}),e=new Map;for(let t of n.entities){let i=chunkIJ4BTSN2_cjs.u(o);e.set(t.eid,i);}for(let t of n.entities){let i=e.get(t.eid);for(let c of t.components){let r=chunkIJ4BTSN2_cjs.P(c.id);if(!r)continue;let a=A(r);a&&chunkIJ4BTSN2_cjs.I(o,i,a,c.data);}}return o}function A(n){if(n.kind==="soa")return {__kind:"soa",__id:n.id,__schema:n.schema??{}};if(n.kind==="aos"){let o=n.factory??(()=>({}));return {__kind:"aos",__id:n.id,__factory:o}}return {__kind:"tag",__id:n.id}}function x(n){let o=JSON.stringify(n),e=new TextEncoder().encode(o),t=new TextEncoder().encode(chunkIJ4BTSN2_cjs.a),c=12+t.length+4+e.length,r=new Uint8Array(c),a=new DataView(r.buffer),s=0;return r[s++]=d.charCodeAt(0),r[s++]=d.charCodeAt(1),r[s++]=d.charCodeAt(2),r[s++]=d.charCodeAt(3),a.setUint32(s,B,true),s+=4,a.setUint32(s,t.length,true),s+=4,r.set(t,s),s+=t.length,a.setUint32(s,e.length,true),s+=4,r.set(e,s),r}function N(n,o){if(n.length<12)throw new Error("aiecsjs: bytes too short to be a valid snapshot");let e=new DataView(n.buffer,n.byteOffset,n.byteLength);if(n[0]!==d.charCodeAt(0)||n[1]!==d.charCodeAt(1)||n[2]!==d.charCodeAt(2)||n[3]!==d.charCodeAt(3))throw new Error("aiecsjs: invalid magic bytes");let t=4,i=e.getUint32(t,true);t+=4;let c=o?.onUnknownVersion??"throw";if(i!==B&&c==="throw")throw new Error(`aiecsjs: format version ${i} not supported`);let r=64*1024*1024;if(t+4>n.length)throw new Error("aiecsjs: snapshot truncated before verLen");let a=e.getUint32(t,true);if(t+=4,a>r||t+a>n.length)throw new Error(`aiecsjs: snapshot verLen=${a} out of bounds`);if(t+=a,t+4>n.length)throw new Error("aiecsjs: snapshot truncated before jsonLen");let s=e.getUint32(t,true);if(t+=4,s>r||t+s>n.length)throw new Error(`aiecsjs: snapshot jsonLen=${s} out of bounds`);let l=n.subarray(t,t+s),p=new TextDecoder().decode(l);return JSON.parse(p)}function Y(n,o){let e={world:n,components:o?.components??chunkIJ4BTSN2_cjs.Q().map(t=>A(t)).filter(Boolean),lastSnapshot:null};return {capture(){let t=D(e.world),i;return e.lastSnapshot?i=V(e.lastSnapshot,t):i=t,e.lastSnapshot=t,x(i)},apply(t,i){let c=N(i),r=chunkIJ4BTSN2_cjs.i(t);for(let a of c.entities)if(!(a.eid>=r.capacity)){if(!chunkIJ4BTSN2_cjs.w(t,a.eid))for(;r.size<a.eid;)chunkIJ4BTSN2_cjs.u(t);for(let s of a.components){let l=chunkIJ4BTSN2_cjs.P(s.id);if(!l)continue;let p=A(l);p&&chunkIJ4BTSN2_cjs.I(t,a.eid,p,s.data);}}},reset(){e.lastSnapshot=null;}}}function V(n,o){let e=new Map(n.entities.map(i=>[i.eid,i])),t=[];for(let i of o.entities){let c=e.get(i.eid);if(!c){t.push(i);continue}let r=JSON.stringify(c.components),a=JSON.stringify(i.components);r!==a&&t.push(i);}return {version:o.version,capacity:o.capacity,entities:t}}exports.a=P;exports.b=Q;exports.c=D;exports.d=J;exports.e=Y;//# sourceMappingURL=chunk-4QBOZQZR.cjs.map
2
+ //# sourceMappingURL=chunk-4QBOZQZR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/serialize.ts"],"names":["MAGIC","FORMAT_VERSION","serializeWorld","world","options","snapshot","toJSON","e","c","comp","packBinary","deserializeWorld","bytes","unpackBinary","fromJSON","state","getWorldState","entities","idx","archId","arch","gen","packedEid","packEid","w","base","components","wi","word","lsb","bit","info","storage","data","obj","f","col","arr","baseI","i","createWorld","eidMap","eid","createEntity","getComponentByInternalId","handle","getComponentHandle","addComponent","factory","json","jsonBytes","versionBytes","VERSION","total","out","view","off","formatVersion","onUnknown","MAX_FIELD_LEN","verLen","jsonLen","createDeltaSerializer","listAllComponents","current","delta","computeDelta","targetWorld","deltaBytes","targetState","entityExists","prev","curr","prevByEid","changed","prevE","prevSig","currSig"],"mappings":"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","file":"chunk-B777DQR7.cjs","sourcesContent":["// aiecsjs/serialize — binary, JSON, and delta serializers.\n\nimport { testBit } from './internal/bitmask.js'\nimport {\n addComponent,\n defineComponent,\n defineObjectComponent,\n defineTag,\n getComponentByInternalId,\n getComponentInfo,\n listAllComponents,\n} from './internal/component.js'\nimport { createEntity, destroyEntity, entityExists, packEid } from './internal/entity.js'\nimport type {\n ComponentInfo,\n ComponentLike,\n DeltaSerializer,\n DeserializeOptions,\n EntityId,\n SerializeOptions,\n World,\n WorldSnapshot,\n} from './internal/types.js'\nimport { createWorld, getWorldState } from './internal/world.js'\nimport { VERSION } from './version.js'\n\nconst MAGIC = 'AIEC'\nconst FORMAT_VERSION = 1\n\nexport function serializeWorld(world: World, options?: SerializeOptions): Uint8Array {\n const snapshot = toJSON(world)\n if (options?.components) {\n snapshot.entities = snapshot.entities.map((e) => ({\n eid: e.eid,\n components: e.components.filter((c) =>\n options.components!.some((comp) => comp.__id === c.id),\n ),\n }))\n }\n return packBinary(snapshot)\n}\n\nexport function deserializeWorld(bytes: Uint8Array, options?: DeserializeOptions): World {\n const snapshot = unpackBinary(bytes, options)\n return fromJSON(snapshot)\n}\n\n/**\n * Serialize a world snapshot to a plain JSON-compatible object.\n *\n * Note: `EntityRef` is in-memory only — not preserved across serialize/deserialize.\n * Generation counters reset on world load. Stale refs from before serialization\n * will deref to null after loading the snapshot into a new world.\n */\nexport function toJSON(world: World): WorldSnapshot {\n const state = getWorldState(world)\n const entities: WorldSnapshot['entities'] = []\n // Iterate by raw slot index; snapshot stores raw idx in the `eid` field\n // (wire format unchanged — idx is used for load-side entity re-creation).\n for (let idx = 1; idx < state.capacity; idx++) {\n const archId = state.entityArchetype[idx] ?? 0\n if (archId === 0) continue // slot unused\n\n const arch = state.archetypes[archId]\n if (!arch) continue\n\n // Build the packed eid from idx + current generation to do alive check\n const gen = state.generations[idx] ?? 0\n const packedEid = packEid(idx, gen, state.options)\n if (!arch.entityRow.has(packedEid)) continue\n\n const w = state.options.maskWordCount\n const base = idx * w\n const components: WorldSnapshot['entities'][0]['components'] = []\n for (let wi = 0; wi < w; wi++) {\n let word = state.entityMask[base + wi] ?? 0\n while (word !== 0) {\n const lsb = word & -word\n const bit = (wi << 5) + (31 - Math.clz32(lsb))\n const info = state.componentInfoByBit[bit]\n if (info) {\n const storage = state.componentStorageByBit[bit]\n let data: unknown = null\n if (info.kind === 'soa' && storage?.soa) {\n const obj: Record<string, unknown> = {}\n for (const f of info.fields) {\n const col = storage.soa[f.name]\n if (!col) continue\n if (f.vectorLen === 1) {\n obj[f.name] = col[idx]\n } else {\n const arr: number[] = []\n const baseI = idx * f.vectorLen\n for (let i = 0; i < f.vectorLen; i++) arr.push(col[baseI + i] ?? 0)\n obj[f.name] = arr\n }\n }\n data = obj\n } else if (info.kind === 'aos' && storage?.aos) {\n data = storage.aos[idx] ?? null\n } else {\n data = true\n }\n components.push({ kind: info.kind, id: info.id, data })\n }\n word &= word - 1\n }\n }\n // Wire format stores raw idx (not packed) for cross-session portability\n entities.push({ eid: idx, components })\n }\n return {\n version: state.version,\n capacity: state.capacity,\n entities,\n }\n}\n\nexport function fromJSON(snapshot: WorldSnapshot): World {\n const world = createWorld({ initialCapacity: snapshot.capacity })\n const eidMap = new Map<number, EntityId>()\n for (const e of snapshot.entities) {\n const eid = createEntity(world)\n eidMap.set(e.eid, eid)\n }\n for (const e of snapshot.entities) {\n const eid = eidMap.get(e.eid)!\n for (const comp of e.components) {\n const info = getComponentByInternalId(comp.id)\n if (!info) {\n // Component missing — silently skip; future version may throw based on options\n continue\n }\n const handle = getComponentHandle(info)\n if (handle) {\n addComponent(world, eid, handle, comp.data as any)\n }\n }\n }\n return world\n}\n\n// Reconstruct a component handle from its ComponentInfo. Since defineComponent\n// returns plain handles { __kind, __id, __schema }, we can synthesize them.\nfunction getComponentHandle(info: ComponentInfo): ComponentLike | null {\n if (info.kind === 'soa') {\n return { __kind: 'soa', __id: info.id, __schema: info.schema ?? {} } as ComponentLike\n }\n if (info.kind === 'aos') {\n const factory = info.factory ?? (() => ({}))\n return { __kind: 'aos', __id: info.id, __factory: factory } as ComponentLike\n }\n return { __kind: 'tag', __id: info.id } as ComponentLike\n}\n\n// --- Binary packing (wrapped JSON for 0.1) ---\n\nfunction packBinary(snapshot: WorldSnapshot): Uint8Array {\n const json = JSON.stringify(snapshot)\n const jsonBytes = new TextEncoder().encode(json)\n const versionBytes = new TextEncoder().encode(VERSION)\n const headerSize = 4 + 4 + 4 + versionBytes.length + 4\n const total = headerSize + jsonBytes.length\n const out = new Uint8Array(total)\n const view = new DataView(out.buffer)\n let off = 0\n out[off++] = MAGIC.charCodeAt(0)\n out[off++] = MAGIC.charCodeAt(1)\n out[off++] = MAGIC.charCodeAt(2)\n out[off++] = MAGIC.charCodeAt(3)\n view.setUint32(off, FORMAT_VERSION, true)\n off += 4\n view.setUint32(off, versionBytes.length, true)\n off += 4\n out.set(versionBytes, off)\n off += versionBytes.length\n view.setUint32(off, jsonBytes.length, true)\n off += 4\n out.set(jsonBytes, off)\n return out\n}\n\nfunction unpackBinary(bytes: Uint8Array, options?: DeserializeOptions): WorldSnapshot {\n if (bytes.length < 12) throw new Error('aiecsjs: bytes too short to be a valid snapshot')\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n if (\n bytes[0] !== MAGIC.charCodeAt(0) ||\n bytes[1] !== MAGIC.charCodeAt(1) ||\n bytes[2] !== MAGIC.charCodeAt(2) ||\n bytes[3] !== MAGIC.charCodeAt(3)\n ) {\n throw new Error('aiecsjs: invalid magic bytes')\n }\n let off = 4\n const formatVersion = view.getUint32(off, true)\n off += 4\n const onUnknown = options?.onUnknownVersion ?? 'throw'\n if (formatVersion !== FORMAT_VERSION && onUnknown === 'throw') {\n throw new Error(`aiecsjs: format version ${formatVersion} not supported`)\n }\n\n // SECURITY: explicit bounds checks on every length field. DataView itself\n // throws on out-of-range reads, but an attacker who controls the bytes can\n // still craft a `verLen` that skips past data of their choosing — we make\n // each step's invariant explicit and impose a sane cap to short-circuit\n // pathological payloads early.\n const MAX_FIELD_LEN = 64 * 1024 * 1024 // 64 MiB\n if (off + 4 > bytes.length) {\n throw new Error('aiecsjs: snapshot truncated before verLen')\n }\n const verLen = view.getUint32(off, true)\n off += 4\n if (verLen > MAX_FIELD_LEN || off + verLen > bytes.length) {\n throw new Error(`aiecsjs: snapshot verLen=${verLen} out of bounds`)\n }\n off += verLen // skip the aiecsjs version string\n\n if (off + 4 > bytes.length) {\n throw new Error('aiecsjs: snapshot truncated before jsonLen')\n }\n const jsonLen = view.getUint32(off, true)\n off += 4\n if (jsonLen > MAX_FIELD_LEN || off + jsonLen > bytes.length) {\n throw new Error(`aiecsjs: snapshot jsonLen=${jsonLen} out of bounds`)\n }\n const jsonBytes = bytes.subarray(off, off + jsonLen)\n const json = new TextDecoder().decode(jsonBytes)\n return JSON.parse(json) as WorldSnapshot\n}\n\n// --- Delta serializer ---\n\ninterface DeltaState {\n world: World\n components: ComponentLike[]\n lastSnapshot: WorldSnapshot | null\n}\n\nexport function createDeltaSerializer(world: World, options?: SerializeOptions): DeltaSerializer {\n const state: DeltaState = {\n world,\n components:\n options?.components ??\n listAllComponents()\n .map((i) => getComponentHandle(i)!)\n .filter(Boolean),\n lastSnapshot: null,\n }\n return {\n capture(): Uint8Array {\n const current = toJSON(state.world)\n let delta: WorldSnapshot\n if (!state.lastSnapshot) {\n delta = current\n } else {\n // Compute simple delta: entities with changed components\n delta = computeDelta(state.lastSnapshot, current)\n }\n state.lastSnapshot = current\n return packBinary(delta)\n },\n apply(targetWorld: World, deltaBytes: Uint8Array): void {\n const snapshot = unpackBinary(deltaBytes)\n // Apply: ensure entities exist, then add/update their components\n const targetState = getWorldState(targetWorld)\n for (const e of snapshot.entities) {\n if (e.eid >= targetState.capacity) continue\n if (!entityExists(targetWorld, e.eid as EntityId)) {\n // Create the entity. For simplicity, we just spawn until we have enough.\n while (targetState.size < e.eid) {\n createEntity(targetWorld)\n }\n }\n for (const comp of e.components) {\n const info = getComponentByInternalId(comp.id)\n if (!info) continue\n const handle = getComponentHandle(info)\n if (handle) addComponent(targetWorld, e.eid as EntityId, handle, comp.data as any)\n }\n }\n },\n reset(): void {\n state.lastSnapshot = null\n },\n }\n}\n\nfunction computeDelta(prev: WorldSnapshot, curr: WorldSnapshot): WorldSnapshot {\n const prevByEid = new Map(prev.entities.map((e) => [e.eid, e]))\n const changed: WorldSnapshot['entities'] = []\n for (const e of curr.entities) {\n const prevE = prevByEid.get(e.eid)\n if (!prevE) {\n changed.push(e)\n continue\n }\n const prevSig = JSON.stringify(prevE.components)\n const currSig = JSON.stringify(e.components)\n if (prevSig !== currSig) changed.push(e)\n }\n return { version: curr.version, capacity: curr.capacity, entities: changed }\n}\n"]}
1
+ {"version":3,"sources":["../src/serialize.ts"],"names":["MAGIC","FORMAT_VERSION","serializeWorld","world","options","snapshot","toJSON","e","c","comp","packBinary","deserializeWorld","bytes","unpackBinary","fromJSON","state","getWorldState","entities","idx","archId","arch","gen","packedEid","packEid","w","base","components","wi","word","lsb","bit","info","storage","data","obj","f","col","arr","baseI","i","createWorld","eidMap","eid","createEntity","getComponentByInternalId","handle","getComponentHandle","addComponent","factory","json","jsonBytes","versionBytes","VERSION","total","out","view","off","formatVersion","onUnknown","MAX_FIELD_LEN","verLen","jsonLen","createDeltaSerializer","listAllComponents","current","delta","computeDelta","targetWorld","deltaBytes","targetState","entityExists","prev","curr","prevByEid","changed","prevE","prevSig","currSig"],"mappings":"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","file":"chunk-4QBOZQZR.cjs","sourcesContent":["// aiecsjs/serialize — binary, JSON, and delta serializers.\n\nimport { testBit } from './internal/bitmask.js'\nimport {\n addComponent,\n defineComponent,\n defineObjectComponent,\n defineTag,\n getComponentByInternalId,\n getComponentInfo,\n listAllComponents,\n} from './internal/component.js'\nimport { createEntity, destroyEntity, entityExists, packEid } from './internal/entity.js'\nimport type {\n ComponentInfo,\n ComponentLike,\n DeltaSerializer,\n DeserializeOptions,\n EntityId,\n SerializeOptions,\n World,\n WorldSnapshot,\n} from './internal/types.js'\nimport { createWorld, getWorldState } from './internal/world.js'\nimport { VERSION } from './version.js'\n\nconst MAGIC = 'AIEC'\nconst FORMAT_VERSION = 1\n\nexport function serializeWorld(world: World, options?: SerializeOptions): Uint8Array {\n const snapshot = toJSON(world)\n if (options?.components) {\n snapshot.entities = snapshot.entities.map((e) => ({\n eid: e.eid,\n components: e.components.filter((c) =>\n options.components!.some((comp) => comp.__id === c.id),\n ),\n }))\n }\n return packBinary(snapshot)\n}\n\nexport function deserializeWorld(bytes: Uint8Array, options?: DeserializeOptions): World {\n const snapshot = unpackBinary(bytes, options)\n return fromJSON(snapshot)\n}\n\n/**\n * Serialize a world snapshot to a plain JSON-compatible object.\n *\n * Note: `EntityRef` is in-memory only — not preserved across serialize/deserialize.\n * Generation counters reset on world load. Stale refs from before serialization\n * will deref to null after loading the snapshot into a new world.\n */\nexport function toJSON(world: World): WorldSnapshot {\n const state = getWorldState(world)\n const entities: WorldSnapshot['entities'] = []\n // Iterate by raw slot index; snapshot stores raw idx in the `eid` field\n // (wire format unchanged — idx is used for load-side entity re-creation).\n for (let idx = 1; idx < state.capacity; idx++) {\n const archId = state.entityArchetype[idx] ?? 0\n if (archId === 0) continue // slot unused\n\n const arch = state.archetypes[archId]\n if (!arch) continue\n\n // Build the packed eid from idx + current generation to do alive check\n const gen = state.generations[idx] ?? 0\n const packedEid = packEid(idx, gen, state.options)\n if (!arch.entityRow.has(packedEid)) continue\n\n const w = state.options.maskWordCount\n const base = idx * w\n const components: WorldSnapshot['entities'][0]['components'] = []\n for (let wi = 0; wi < w; wi++) {\n let word = state.entityMask[base + wi] ?? 0\n while (word !== 0) {\n const lsb = word & -word\n const bit = (wi << 5) + (31 - Math.clz32(lsb))\n const info = state.componentInfoByBit[bit]\n if (info) {\n const storage = state.componentStorageByBit[bit]\n let data: unknown = null\n if (info.kind === 'soa' && storage?.soa) {\n const obj: Record<string, unknown> = {}\n for (const f of info.fields) {\n const col = storage.soa[f.name]\n if (!col) continue\n if (f.vectorLen === 1) {\n obj[f.name] = col[idx]\n } else {\n const arr: number[] = []\n const baseI = idx * f.vectorLen\n for (let i = 0; i < f.vectorLen; i++) arr.push(col[baseI + i] ?? 0)\n obj[f.name] = arr\n }\n }\n data = obj\n } else if (info.kind === 'aos' && storage?.aos) {\n data = storage.aos[idx] ?? null\n } else {\n data = true\n }\n components.push({ kind: info.kind, id: info.id, data })\n }\n word &= word - 1\n }\n }\n // Wire format stores raw idx (not packed) for cross-session portability\n entities.push({ eid: idx, components })\n }\n return {\n version: state.version,\n capacity: state.capacity,\n entities,\n }\n}\n\nexport function fromJSON(snapshot: WorldSnapshot): World {\n const world = createWorld({ initialCapacity: snapshot.capacity })\n const eidMap = new Map<number, EntityId>()\n for (const e of snapshot.entities) {\n const eid = createEntity(world)\n eidMap.set(e.eid, eid)\n }\n for (const e of snapshot.entities) {\n const eid = eidMap.get(e.eid)!\n for (const comp of e.components) {\n const info = getComponentByInternalId(comp.id)\n if (!info) {\n // Component missing — silently skip; future version may throw based on options\n continue\n }\n const handle = getComponentHandle(info)\n if (handle) {\n addComponent(world, eid, handle, comp.data as any)\n }\n }\n }\n return world\n}\n\n// Reconstruct a component handle from its ComponentInfo. Since defineComponent\n// returns plain handles { __kind, __id, __schema }, we can synthesize them.\nfunction getComponentHandle(info: ComponentInfo): ComponentLike | null {\n if (info.kind === 'soa') {\n return { __kind: 'soa', __id: info.id, __schema: info.schema ?? {} } as ComponentLike\n }\n if (info.kind === 'aos') {\n const factory = info.factory ?? (() => ({}))\n return { __kind: 'aos', __id: info.id, __factory: factory } as ComponentLike\n }\n return { __kind: 'tag', __id: info.id } as ComponentLike\n}\n\n// --- Binary packing (wrapped JSON for 0.1) ---\n\nfunction packBinary(snapshot: WorldSnapshot): Uint8Array {\n const json = JSON.stringify(snapshot)\n const jsonBytes = new TextEncoder().encode(json)\n const versionBytes = new TextEncoder().encode(VERSION)\n const headerSize = 4 + 4 + 4 + versionBytes.length + 4\n const total = headerSize + jsonBytes.length\n const out = new Uint8Array(total)\n const view = new DataView(out.buffer)\n let off = 0\n out[off++] = MAGIC.charCodeAt(0)\n out[off++] = MAGIC.charCodeAt(1)\n out[off++] = MAGIC.charCodeAt(2)\n out[off++] = MAGIC.charCodeAt(3)\n view.setUint32(off, FORMAT_VERSION, true)\n off += 4\n view.setUint32(off, versionBytes.length, true)\n off += 4\n out.set(versionBytes, off)\n off += versionBytes.length\n view.setUint32(off, jsonBytes.length, true)\n off += 4\n out.set(jsonBytes, off)\n return out\n}\n\nfunction unpackBinary(bytes: Uint8Array, options?: DeserializeOptions): WorldSnapshot {\n if (bytes.length < 12) throw new Error('aiecsjs: bytes too short to be a valid snapshot')\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n if (\n bytes[0] !== MAGIC.charCodeAt(0) ||\n bytes[1] !== MAGIC.charCodeAt(1) ||\n bytes[2] !== MAGIC.charCodeAt(2) ||\n bytes[3] !== MAGIC.charCodeAt(3)\n ) {\n throw new Error('aiecsjs: invalid magic bytes')\n }\n let off = 4\n const formatVersion = view.getUint32(off, true)\n off += 4\n const onUnknown = options?.onUnknownVersion ?? 'throw'\n if (formatVersion !== FORMAT_VERSION && onUnknown === 'throw') {\n throw new Error(`aiecsjs: format version ${formatVersion} not supported`)\n }\n\n // SECURITY: explicit bounds checks on every length field. DataView itself\n // throws on out-of-range reads, but an attacker who controls the bytes can\n // still craft a `verLen` that skips past data of their choosing — we make\n // each step's invariant explicit and impose a sane cap to short-circuit\n // pathological payloads early.\n const MAX_FIELD_LEN = 64 * 1024 * 1024 // 64 MiB\n if (off + 4 > bytes.length) {\n throw new Error('aiecsjs: snapshot truncated before verLen')\n }\n const verLen = view.getUint32(off, true)\n off += 4\n if (verLen > MAX_FIELD_LEN || off + verLen > bytes.length) {\n throw new Error(`aiecsjs: snapshot verLen=${verLen} out of bounds`)\n }\n off += verLen // skip the aiecsjs version string\n\n if (off + 4 > bytes.length) {\n throw new Error('aiecsjs: snapshot truncated before jsonLen')\n }\n const jsonLen = view.getUint32(off, true)\n off += 4\n if (jsonLen > MAX_FIELD_LEN || off + jsonLen > bytes.length) {\n throw new Error(`aiecsjs: snapshot jsonLen=${jsonLen} out of bounds`)\n }\n const jsonBytes = bytes.subarray(off, off + jsonLen)\n const json = new TextDecoder().decode(jsonBytes)\n return JSON.parse(json) as WorldSnapshot\n}\n\n// --- Delta serializer ---\n\ninterface DeltaState {\n world: World\n components: ComponentLike[]\n lastSnapshot: WorldSnapshot | null\n}\n\nexport function createDeltaSerializer(world: World, options?: SerializeOptions): DeltaSerializer {\n const state: DeltaState = {\n world,\n components:\n options?.components ??\n listAllComponents()\n .map((i) => getComponentHandle(i)!)\n .filter(Boolean),\n lastSnapshot: null,\n }\n return {\n capture(): Uint8Array {\n const current = toJSON(state.world)\n let delta: WorldSnapshot\n if (!state.lastSnapshot) {\n delta = current\n } else {\n // Compute simple delta: entities with changed components\n delta = computeDelta(state.lastSnapshot, current)\n }\n state.lastSnapshot = current\n return packBinary(delta)\n },\n apply(targetWorld: World, deltaBytes: Uint8Array): void {\n const snapshot = unpackBinary(deltaBytes)\n // Apply: ensure entities exist, then add/update their components\n const targetState = getWorldState(targetWorld)\n for (const e of snapshot.entities) {\n if (e.eid >= targetState.capacity) continue\n if (!entityExists(targetWorld, e.eid as EntityId)) {\n // Create the entity. For simplicity, we just spawn until we have enough.\n while (targetState.size < e.eid) {\n createEntity(targetWorld)\n }\n }\n for (const comp of e.components) {\n const info = getComponentByInternalId(comp.id)\n if (!info) continue\n const handle = getComponentHandle(info)\n if (handle) addComponent(targetWorld, e.eid as EntityId, handle, comp.data as any)\n }\n }\n },\n reset(): void {\n state.lastSnapshot = null\n },\n }\n}\n\nfunction computeDelta(prev: WorldSnapshot, curr: WorldSnapshot): WorldSnapshot {\n const prevByEid = new Map(prev.entities.map((e) => [e.eid, e]))\n const changed: WorldSnapshot['entities'] = []\n for (const e of curr.entities) {\n const prevE = prevByEid.get(e.eid)\n if (!prevE) {\n changed.push(e)\n continue\n }\n const prevSig = JSON.stringify(prevE.components)\n const currSig = JSON.stringify(e.components)\n if (prevSig !== currSig) changed.push(e)\n }\n return { version: curr.version, capacity: curr.capacity, entities: changed }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {i,H as H$1,e,b as b$1,p as p$1,c,d,f as f$1}from'./chunk-F7KNZ27O.js';var C=1,f=new Map;function _(n){let e=(n.all??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-"),t=(n.any??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-"),i=(n.none??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-");return `A${e}|Y${t}|N${i}`}function q(n){let e=Array.isArray(n)?{all:n}:n;for(let o of [...e.all??[],...e.any??[],...e.none??[]])if(!o||typeof o!="object"||typeof o.__id!="number")throw new TypeError("aiecsjs: defineQuery received a non-component value");let t=_(e),i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:(e.all??[]).map(o=>o.__id),any:(e.any??[]).map(o=>o.__id),none:(e.none??[]).map(o=>o.__id),columnViewCache:[...e.all??[],...e.any??[]],reactiveKind:"normal",sourceQueryId:-1,sourceQuery:null};return f.set(t,r),r}function z(n){let e=n,t=`enter:${e.id}`,i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"enter",sourceQueryId:e.id,sourceQuery:e};return f.set(t,r),r}function T(n){let e=n,t=`exit:${e.id}`,i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"exit",sourceQueryId:e.id,sourceQuery:e};return f.set(t,r),r}function p(n,e){if(n.queries[e.id]===e&&n.queryMasks.has(e.id))return;let t=n.options.maskWordCount,i=b$1(t),r=b$1(t),o=b$1(t);for(let a of e.all){let u=b(a),d=p$1(n,u);c(i,d);}for(let a of e.any){let u=b(a),d=p$1(n,u);c(r,d);}for(let a of e.none){let u=b(a),d=p$1(n,u);c(o,d);}let c$1={withMask:i,anyMask:r,noneMask:o,anyHasBits:!d(r)};n.queryMasks.set(e.id,c$1),n.queries[e.id]=e,n.queryArchetypeCache[e.id]=null,n.queryArchetypeStamp[e.id]=-1;let s=[...f$1(i),...f$1(r),...f$1(o)];for(let a of s){let u=n.bitToQueries.get(a);u||(u=new Set,n.bitToQueries.set(a,u)),u.add(e.id);}e.reactiveKind!=="normal"&&(n.reactiveBuffers.has(e.id)||n.reactiveBuffers.set(e.id,{entered:[],exited:[]}),e.sourceQuery&&p(n,e.sourceQuery));}function v(n,e$1){if(p(n,e$1),n.queryArchetypeCache[e$1.id]&&n.queryArchetypeStamp[e$1.id]===n.queryVersion)return n.queryArchetypeCache[e$1.id];let t=n.queryMasks.get(e$1.id),i=n.options.maskWordCount,r=[];for(let o=0;o<n.archetypes.length;o++){let c=n.archetypes[o];e(c.mask,t.withMask,t.anyMask,t.noneMask,t.anyHasBits,i)&&r.push(o);}return n.queryArchetypeCache[e$1.id]=r,n.queryArchetypeStamp[e$1.id]=n.queryVersion,r}function $(n,e){let t=i(n),r=v(t,e),o=[];for(let c of r){let s=t.archetypes[c];o.push({id:s.id,mask:Array.from(s.mask),size:s.size});}return o}function D(n,e){let t=i(n),i$1=e,r=[];if(i$1.reactiveKind==="enter"){let c=t.reactiveBuffers.get(i$1.id);if(c){for(let s of c.entered)r.push(s);c.entered.length=0;}return r}if(i$1.reactiveKind==="exit"){let c=t.reactiveBuffers.get(i$1.id);if(c){for(let s of c.exited)r.push(s);c.exited.length=0;}return r}let o=v(t,i$1);for(let c of o){let s=t.archetypes[c];for(let a=0;a<s.size;a++)r.push(s.entities[a]);}return r}function*H(n,e){let t=i(n),i$1=e;if(i$1.reactiveKind!=="normal"){let o=t.reactiveBuffers.get(i$1.id);if(!o)return;let c=i$1.reactiveKind==="enter"?o.entered:o.exited;for(let s of c)yield s;c.length=0;return}let r=v(t,i$1);for(let o of r){let c=t.archetypes[o];for(let s=0;s<c.size;s++)yield c.entities[s];}}function L(n,e,t){let i$1=i(n),r=e;if(r.reactiveKind!=="normal"){let s=i$1.reactiveBuffers.get(r.id);if(!s)return;let a=r.reactiveKind==="enter"?s.entered:s.exited;if(a.length===0)return;let u=w(i$1,r);for(let d=0;d<a.length;d++){let y=a[d];x(t,y,u);}a.length=0;return}p(i$1,r);let o=v(i$1,r),c=w(i$1,r);for(let s of o){let a=i$1.archetypes[s],u=a.entities,d=a.size;for(let y=0;y<d;y++)x(t,u[y],c);}}function x(n,e,t){switch(t.length){case 0:n(e);break;case 1:n(e,t[0]);break;case 2:n(e,t[0],t[1]);break;case 3:n(e,t[0],t[1],t[2]);break;case 4:n(e,t[0],t[1],t[2],t[3]);break;case 5:n(e,t[0],t[1],t[2],t[3],t[4]);break;default:n(e,...t);}}function w(n,e){let t=[];for(let i of e.columnViewCache){let r=H$1(i),o=n.componentBitFor.get(r.id);if(o===void 0){t.push(void 0);continue}let c=n.componentStorageByBit[o];if(!c){t.push(void 0);continue}c.kind==="soa"?t.push(c.soa):c.kind==="aos"?t.push(c.aos):t.push(true);}return t}function F(n,e$1,t,i,r){for(let s of f.values())s.reactiveKind!=="normal"&&s.sourceQuery&&n.queries[s.sourceQuery.id]!==s.sourceQuery&&p(n,s.sourceQuery);let o=n.bitToQueries.get(t);if(!o)return;let c=n.options.maskWordCount;for(let s of o){let a=n.queries[s];if(!a||a.reactiveKind!=="normal")continue;let u=n.queryMasks.get(s);if(!u)continue;let d=e(i,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,c),y=e(r,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,c);!d&&y?E(n,s,"enter",e$1):d&&!y&&E(n,s,"exit",e$1);}}function E(n,e,t,i){for(let r of f.values()){if(r.sourceQueryId!==e||r.reactiveKind!==t)continue;p(n,r);let o=A(n,r.id);t==="enter"?o.entered.push(i):o.exited.push(i);}}function A(n,e){let t=n.reactiveBuffers.get(e);return t||(t={entered:[],exited:[]},n.reactiveBuffers.set(e,t)),t}function b(n){let e=W(n);if(!e)throw new Error(`aiecsjs: component id ${n} not registered`);return e}var g=null;function O(n){g=n;}function W(n){return g?g(n):void 0}export{q as a,z as b,T as c,$ as d,D as e,H as f,L as g,F as h,O as i};//# sourceMappingURL=chunk-SQWZUC2Q.js.map
2
- //# sourceMappingURL=chunk-SQWZUC2Q.js.map
1
+ import {i,H as H$1,e,b as b$1,p as p$1,c,d,f as f$1}from'./chunk-XDLAI4YT.js';var C=1,f=new Map;function _(n){let e=(n.all??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-"),t=(n.any??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-"),i=(n.none??[]).map(r=>r.__id).sort((r,o)=>r-o).join("-");return `A${e}|Y${t}|N${i}`}function q(n){let e=Array.isArray(n)?{all:n}:n;for(let o of [...e.all??[],...e.any??[],...e.none??[]])if(!o||typeof o!="object"||typeof o.__id!="number")throw new TypeError("aiecsjs: defineQuery received a non-component value");let t=_(e),i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:(e.all??[]).map(o=>o.__id),any:(e.any??[]).map(o=>o.__id),none:(e.none??[]).map(o=>o.__id),columnViewCache:[...e.all??[],...e.any??[]],reactiveKind:"normal",sourceQueryId:-1,sourceQuery:null};return f.set(t,r),r}function z(n){let e=n,t=`enter:${e.id}`,i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"enter",sourceQueryId:e.id,sourceQuery:e};return f.set(t,r),r}function T(n){let e=n,t=`exit:${e.id}`,i=f.get(t);if(i)return i;let r={id:C++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"exit",sourceQueryId:e.id,sourceQuery:e};return f.set(t,r),r}function p(n,e){if(n.queries[e.id]===e&&n.queryMasks.has(e.id))return;let t=n.options.maskWordCount,i=b$1(t),r=b$1(t),o=b$1(t);for(let a of e.all){let u=b(a),d=p$1(n,u);c(i,d);}for(let a of e.any){let u=b(a),d=p$1(n,u);c(r,d);}for(let a of e.none){let u=b(a),d=p$1(n,u);c(o,d);}let c$1={withMask:i,anyMask:r,noneMask:o,anyHasBits:!d(r)};n.queryMasks.set(e.id,c$1),n.queries[e.id]=e,n.queryArchetypeCache[e.id]=null,n.queryArchetypeStamp[e.id]=-1;let s=[...f$1(i),...f$1(r),...f$1(o)];for(let a of s){let u=n.bitToQueries.get(a);u||(u=new Set,n.bitToQueries.set(a,u)),u.add(e.id);}e.reactiveKind!=="normal"&&(n.reactiveBuffers.has(e.id)||n.reactiveBuffers.set(e.id,{entered:[],exited:[]}),e.sourceQuery&&p(n,e.sourceQuery));}function v(n,e$1){if(p(n,e$1),n.queryArchetypeCache[e$1.id]&&n.queryArchetypeStamp[e$1.id]===n.queryVersion)return n.queryArchetypeCache[e$1.id];let t=n.queryMasks.get(e$1.id),i=n.options.maskWordCount,r=[];for(let o=0;o<n.archetypes.length;o++){let c=n.archetypes[o];e(c.mask,t.withMask,t.anyMask,t.noneMask,t.anyHasBits,i)&&r.push(o);}return n.queryArchetypeCache[e$1.id]=r,n.queryArchetypeStamp[e$1.id]=n.queryVersion,r}function $(n,e){let t=i(n),r=v(t,e),o=[];for(let c of r){let s=t.archetypes[c];o.push({id:s.id,mask:Array.from(s.mask),size:s.size});}return o}function D(n,e){let t=i(n),i$1=e,r=[];if(i$1.reactiveKind==="enter"){let c=t.reactiveBuffers.get(i$1.id);if(c){for(let s of c.entered)r.push(s);c.entered.length=0;}return r}if(i$1.reactiveKind==="exit"){let c=t.reactiveBuffers.get(i$1.id);if(c){for(let s of c.exited)r.push(s);c.exited.length=0;}return r}let o=v(t,i$1);for(let c of o){let s=t.archetypes[c];for(let a=0;a<s.size;a++)r.push(s.entities[a]);}return r}function*H(n,e){let t=i(n),i$1=e;if(i$1.reactiveKind!=="normal"){let o=t.reactiveBuffers.get(i$1.id);if(!o)return;let c=i$1.reactiveKind==="enter"?o.entered:o.exited;for(let s of c)yield s;c.length=0;return}let r=v(t,i$1);for(let o of r){let c=t.archetypes[o];for(let s=0;s<c.size;s++)yield c.entities[s];}}function L(n,e,t){let i$1=i(n),r=e;if(r.reactiveKind!=="normal"){let s=i$1.reactiveBuffers.get(r.id);if(!s)return;let a=r.reactiveKind==="enter"?s.entered:s.exited;if(a.length===0)return;let u=w(i$1,r);for(let d=0;d<a.length;d++){let y=a[d];x(t,y,u);}a.length=0;return}p(i$1,r);let o=v(i$1,r),c=w(i$1,r);for(let s of o){let a=i$1.archetypes[s],u=a.entities,d=a.size;for(let y=0;y<d;y++)x(t,u[y],c);}}function x(n,e,t){switch(t.length){case 0:n(e);break;case 1:n(e,t[0]);break;case 2:n(e,t[0],t[1]);break;case 3:n(e,t[0],t[1],t[2]);break;case 4:n(e,t[0],t[1],t[2],t[3]);break;case 5:n(e,t[0],t[1],t[2],t[3],t[4]);break;default:n(e,...t);}}function w(n,e){let t=[];for(let i of e.columnViewCache){let r=H$1(i),o=n.componentBitFor.get(r.id);if(o===void 0){t.push(void 0);continue}let c=n.componentStorageByBit[o];if(!c){t.push(void 0);continue}c.kind==="soa"?t.push(c.soa):c.kind==="aos"?t.push(c.aos):t.push(true);}return t}function F(n,e$1,t,i,r){for(let s of f.values())s.reactiveKind!=="normal"&&s.sourceQuery&&n.queries[s.sourceQuery.id]!==s.sourceQuery&&p(n,s.sourceQuery);let o=n.bitToQueries.get(t);if(!o)return;let c=n.options.maskWordCount;for(let s of o){let a=n.queries[s];if(!a||a.reactiveKind!=="normal")continue;let u=n.queryMasks.get(s);if(!u)continue;let d=e(i,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,c),y=e(r,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,c);!d&&y?E(n,s,"enter",e$1):d&&!y&&E(n,s,"exit",e$1);}}function E(n,e,t,i){for(let r of f.values()){if(r.sourceQueryId!==e||r.reactiveKind!==t)continue;p(n,r);let o=A(n,r.id);t==="enter"?o.entered.push(i):o.exited.push(i);}}function A(n,e){let t=n.reactiveBuffers.get(e);return t||(t={entered:[],exited:[]},n.reactiveBuffers.set(e,t)),t}function b(n){let e=W(n);if(!e)throw new Error(`aiecsjs: component id ${n} not registered`);return e}var g=null;function O(n){g=n;}function W(n){return g?g(n):void 0}export{q as a,z as b,T as c,$ as d,D as e,H as f,L as g,F as h,O as i};//# sourceMappingURL=chunk-AROBEZEB.js.map
2
+ //# sourceMappingURL=chunk-AROBEZEB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/query.ts"],"names":["nextQueryId","moduleQueryCache","descKey","d","all","c","a","b","any","none","defineQuery","arg","desc","key","cached","q","enterQuery","query","reactive","exitQuery","ensureQueryRegistered","state","ww","withMask","createMask","anyMask","noneMask","compId","info","getComponentInfoById","bit","getOrRegisterComponentBit","setBit","bundle","isMaskZero","involvedBits","listBits","s","getQueryArchetypes","words","list","i","arch","matches","queryArchetypes","world","getWorldState","ids","out","id","runQuery","buf","e","archIds","r","iterQuery","src","forEachEntity","fn","cols","buildColumnViews","callWithCols","ents","n","eid","comp","getComponentInfo","storage","recordEntityMaskChange","changedBit","prevMask","nextMask","involved","qid","wasMatch","isMatch","pushReactive","queryId","kind","ensureReactiveBuffer","componentId","lazyGetComponentInfo","_getComponentInfoFn","registerComponentLookup"],"mappings":"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","file":"chunk-SQWZUC2Q.js","sourcesContent":["import { createMask, isMaskZero, listBits, matches, setBit } from './bitmask.js'\nimport { getComponentInfo } from './component.js'\nimport type {\n Archetype,\n ComponentInfo,\n ComponentLike,\n EntityId,\n Query,\n QueryDescriptor,\n QueryInternal,\n QueryMaskBundle,\n ReactiveBuffer,\n World,\n WorldState,\n} from './types.js'\nimport {\n getOrRegisterComponentBit,\n getWorldState,\n readEntityMask,\n tryGetComponentBit,\n} from './world.js'\n\nlet nextQueryId = 1\nconst moduleQueryCache = new Map<string, QueryInternal>()\n\nfunction descKey(d: QueryDescriptor): string {\n const all = (d.all ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n const any = (d.any ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n const none = (d.none ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n return `A${all}|Y${any}|N${none}`\n}\n\nexport function defineQuery(arg: ComponentLike[] | QueryDescriptor): Query {\n const desc: QueryDescriptor = Array.isArray(arg) ? { all: arg } : arg\n\n // Validate all members are components\n for (const c of [...(desc.all ?? []), ...(desc.any ?? []), ...(desc.none ?? [])]) {\n if (!c || typeof c !== 'object' || typeof (c as any).__id !== 'number') {\n throw new TypeError('aiecsjs: defineQuery received a non-component value')\n }\n }\n\n const key = descKey(desc)\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n\n const q: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: (desc.all ?? []).map((c) => c.__id),\n any: (desc.any ?? []).map((c) => c.__id),\n none: (desc.none ?? []).map((c) => c.__id),\n columnViewCache: [...(desc.all ?? []), ...(desc.any ?? [])],\n reactiveKind: 'normal',\n sourceQueryId: -1,\n sourceQuery: null,\n }\n moduleQueryCache.set(key, q)\n return q\n}\n\nexport function enterQuery(query: Query): Query {\n const q = query as QueryInternal\n const key = `enter:${q.id}`\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n const reactive: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: q.all,\n any: q.any,\n none: q.none,\n columnViewCache: q.columnViewCache,\n reactiveKind: 'enter',\n sourceQueryId: q.id,\n sourceQuery: q,\n }\n moduleQueryCache.set(key, reactive)\n return reactive\n}\n\nexport function exitQuery(query: Query): Query {\n const q = query as QueryInternal\n const key = `exit:${q.id}`\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n const reactive: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: q.all,\n any: q.any,\n none: q.none,\n columnViewCache: q.columnViewCache,\n reactiveKind: 'exit',\n sourceQueryId: q.id,\n sourceQuery: q,\n }\n moduleQueryCache.set(key, reactive)\n return reactive\n}\n\n// --- Per-world query setup ---\n\nfunction ensureQueryRegistered(state: WorldState, q: QueryInternal): void {\n if (state.queries[q.id] === q && state.queryMasks.has(q.id)) return\n\n // Build per-world bitmasks (this may register new bits)\n const ww = state.options.maskWordCount\n const withMask = createMask(ww)\n const anyMask = createMask(ww)\n const noneMask = createMask(ww)\n for (const compId of q.all) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(withMask, bit)\n }\n for (const compId of q.any) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(anyMask, bit)\n }\n for (const compId of q.none) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(noneMask, bit)\n }\n\n const bundle: QueryMaskBundle = {\n withMask,\n anyMask,\n noneMask,\n anyHasBits: !isMaskZero(anyMask),\n }\n state.queryMasks.set(q.id, bundle)\n\n state.queries[q.id] = q\n state.queryArchetypeCache[q.id] = null\n state.queryArchetypeStamp[q.id] = -1\n\n // Build bit → queries index for fast reactive lookup\n const involvedBits: number[] = [\n ...listBits(withMask),\n ...listBits(anyMask),\n ...listBits(noneMask),\n ]\n for (const b of involvedBits) {\n let s = state.bitToQueries.get(b)\n if (!s) {\n s = new Set<number>()\n state.bitToQueries.set(b, s)\n }\n s.add(q.id)\n }\n\n // Initialize reactive buffer for enter/exit queries\n if (q.reactiveKind !== 'normal') {\n if (!state.reactiveBuffers.has(q.id)) {\n state.reactiveBuffers.set(q.id, { entered: [], exited: [] })\n }\n // Also register the source query so recordEntityMaskChange will see it\n if (q.sourceQuery) ensureQueryRegistered(state, q.sourceQuery)\n }\n}\n\nfunction getQueryArchetypes(state: WorldState, q: QueryInternal): number[] {\n ensureQueryRegistered(state, q)\n if (state.queryArchetypeCache[q.id] && state.queryArchetypeStamp[q.id] === state.queryVersion) {\n return state.queryArchetypeCache[q.id]!\n }\n const bundle = state.queryMasks.get(q.id)!\n const words = state.options.maskWordCount\n const list: number[] = []\n for (let i = 0; i < state.archetypes.length; i++) {\n const arch = state.archetypes[i]!\n if (\n matches(arch.mask, bundle.withMask, bundle.anyMask, bundle.noneMask, bundle.anyHasBits, words)\n ) {\n list.push(i)\n }\n }\n state.queryArchetypeCache[q.id] = list\n state.queryArchetypeStamp[q.id] = state.queryVersion\n return list\n}\n\nexport function queryArchetypes(world: World, query: Query): readonly Archetype[] {\n const state = getWorldState(world)\n const q = query as QueryInternal\n const ids = getQueryArchetypes(state, q)\n const out: Archetype[] = []\n for (const id of ids) {\n const arch = state.archetypes[id]!\n out.push({ id: arch.id, mask: Array.from(arch.mask), size: arch.size })\n }\n return out\n}\n\nexport function runQuery(world: World, query: Query): readonly EntityId[] {\n const state = getWorldState(world)\n const q = query as QueryInternal\n const out: EntityId[] = []\n if (q.reactiveKind === 'enter') {\n const buf = state.reactiveBuffers.get(q.id)\n if (buf) {\n for (const e of buf.entered) out.push(e as EntityId)\n buf.entered.length = 0\n }\n return out\n }\n if (q.reactiveKind === 'exit') {\n const buf = state.reactiveBuffers.get(q.id)\n if (buf) {\n for (const e of buf.exited) out.push(e as EntityId)\n buf.exited.length = 0\n }\n return out\n }\n const archIds = getQueryArchetypes(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n for (let r = 0; r < arch.size; r++) {\n out.push(arch.entities[r] as EntityId)\n }\n }\n return out\n}\n\nexport function* iterQuery(world: World, query: Query): IterableIterator<EntityId> {\n const state = getWorldState(world)\n const q = query as QueryInternal\n if (q.reactiveKind !== 'normal') {\n const buf = state.reactiveBuffers.get(q.id)\n if (!buf) return\n const src = q.reactiveKind === 'enter' ? buf.entered : buf.exited\n for (const e of src) yield e as EntityId\n src.length = 0\n return\n }\n const archIds = getQueryArchetypes(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n for (let r = 0; r < arch.size; r++) {\n yield arch.entities[r] as EntityId\n }\n }\n}\n\nexport function forEachEntity(\n world: World,\n query: Query,\n fn: (eid: EntityId, ...cols: any[]) => void,\n): void {\n const state = getWorldState(world)\n const q = query as QueryInternal\n\n if (q.reactiveKind !== 'normal') {\n const buf = state.reactiveBuffers.get(q.id)\n if (!buf) return\n const src = q.reactiveKind === 'enter' ? buf.entered : buf.exited\n if (src.length === 0) return\n const cols = buildColumnViews(state, q)\n for (let i = 0; i < src.length; i++) {\n const e = src[i] as EntityId\n callWithCols(fn, e, cols)\n }\n src.length = 0\n return\n }\n\n ensureQueryRegistered(state, q)\n const archIds = getQueryArchetypes(state, q)\n const cols = buildColumnViews(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n const ents = arch.entities\n const n = arch.size\n for (let r = 0; r < n; r++) {\n callWithCols(fn, ents[r] as EntityId, cols)\n }\n }\n}\n\nfunction callWithCols(\n fn: (eid: EntityId, ...cols: any[]) => void,\n eid: EntityId,\n cols: any[],\n): void {\n // Specialise for low arities to avoid spread allocation.\n switch (cols.length) {\n case 0:\n fn(eid)\n break\n case 1:\n fn(eid, cols[0])\n break\n case 2:\n fn(eid, cols[0], cols[1])\n break\n case 3:\n fn(eid, cols[0], cols[1], cols[2])\n break\n case 4:\n fn(eid, cols[0], cols[1], cols[2], cols[3])\n break\n case 5:\n fn(eid, cols[0], cols[1], cols[2], cols[3], cols[4])\n break\n default:\n fn(eid, ...cols)\n }\n}\n\nfunction buildColumnViews(state: WorldState, q: QueryInternal): any[] {\n const out: any[] = []\n for (const comp of q.columnViewCache) {\n const info = getComponentInfo(comp)\n const bit = state.componentBitFor.get(info.id)\n if (bit === undefined) {\n out.push(undefined)\n continue\n }\n const storage = state.componentStorageByBit[bit]\n if (!storage) {\n out.push(undefined)\n continue\n }\n if (storage.kind === 'soa') out.push(storage.soa)\n else if (storage.kind === 'aos') out.push(storage.aos)\n else out.push(true) // tag\n }\n return out\n}\n\n// --- Reactive query updates (called from migration code) ---\n\nexport function recordEntityMaskChange(\n state: WorldState,\n eid: EntityId,\n changedBit: number,\n prevMask: Uint32Array,\n nextMask: Uint32Array,\n): void {\n // Lazy-register any reactive queries (and their sources) so we can correctly\n // determine match transitions even if the user only ever called enterQuery/exitQuery.\n for (const q of moduleQueryCache.values()) {\n if (q.reactiveKind === 'normal') continue\n if (q.sourceQuery && state.queries[q.sourceQuery.id] !== q.sourceQuery) {\n ensureQueryRegistered(state, q.sourceQuery)\n }\n }\n\n const involved = state.bitToQueries.get(changedBit)\n if (!involved) return\n const words = state.options.maskWordCount\n for (const qid of involved) {\n const q = state.queries[qid]\n if (!q) continue\n if (q.reactiveKind !== 'normal') continue\n const bundle = state.queryMasks.get(qid)\n if (!bundle) continue\n const wasMatch = matches(\n prevMask,\n bundle.withMask,\n bundle.anyMask,\n bundle.noneMask,\n bundle.anyHasBits,\n words,\n )\n const isMatch = matches(\n nextMask,\n bundle.withMask,\n bundle.anyMask,\n bundle.noneMask,\n bundle.anyHasBits,\n words,\n )\n if (!wasMatch && isMatch) {\n pushReactive(state, qid, 'enter', eid)\n } else if (wasMatch && !isMatch) {\n pushReactive(state, qid, 'exit', eid)\n }\n }\n}\n\nfunction pushReactive(\n state: WorldState,\n queryId: number,\n kind: 'enter' | 'exit',\n eid: EntityId,\n): void {\n // Walk the module cache (not just state.queries) so reactive variants that\n // haven't been registered with this world yet still receive events.\n for (const r of moduleQueryCache.values()) {\n if (r.sourceQueryId !== queryId) continue\n if (r.reactiveKind !== kind) continue\n // Lazily register the reactive query in this world so subsequent reads can find it\n ensureQueryRegistered(state, r)\n const buf = ensureReactiveBuffer(state, r.id)\n if (kind === 'enter') buf.entered.push(eid as number)\n else buf.exited.push(eid as number)\n }\n}\n\nfunction ensureReactiveBuffer(state: WorldState, qid: number): ReactiveBuffer {\n let buf = state.reactiveBuffers.get(qid)\n if (!buf) {\n buf = { entered: [], exited: [] }\n state.reactiveBuffers.set(qid, buf)\n }\n return buf\n}\n\n// --- Helpers ---\n\nfunction getComponentInfoById(componentId: number): ComponentInfo {\n // We need access to the component registry's lookup by id. Re-import dynamically to avoid cycles.\n const info = lazyGetComponentInfo(componentId)\n if (!info) throw new Error(`aiecsjs: component id ${componentId} not registered`)\n return info\n}\n\nlet _getComponentInfoFn: ((id: number) => ComponentInfo | undefined) | null = null\nexport function registerComponentLookup(fn: (id: number) => ComponentInfo | undefined): void {\n _getComponentInfoFn = fn\n}\nfunction lazyGetComponentInfo(id: number): ComponentInfo | undefined {\n return _getComponentInfoFn ? _getComponentInfoFn(id) : undefined\n}\n\nexport function _resetQueryRegistry_FOR_TESTS_ONLY(): void {\n moduleQueryCache.clear()\n nextQueryId = 1\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/query.ts"],"names":["nextQueryId","moduleQueryCache","descKey","d","all","c","a","b","any","none","defineQuery","arg","desc","key","cached","q","enterQuery","query","reactive","exitQuery","ensureQueryRegistered","state","ww","withMask","createMask","anyMask","noneMask","compId","info","getComponentInfoById","bit","getOrRegisterComponentBit","setBit","bundle","isMaskZero","involvedBits","listBits","s","getQueryArchetypes","words","list","i","arch","matches","queryArchetypes","world","getWorldState","ids","out","id","runQuery","buf","e","archIds","r","iterQuery","src","forEachEntity","fn","cols","buildColumnViews","callWithCols","ents","n","eid","comp","getComponentInfo","storage","recordEntityMaskChange","changedBit","prevMask","nextMask","involved","qid","wasMatch","isMatch","pushReactive","queryId","kind","ensureReactiveBuffer","componentId","lazyGetComponentInfo","_getComponentInfoFn","registerComponentLookup"],"mappings":"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","file":"chunk-AROBEZEB.js","sourcesContent":["import { createMask, isMaskZero, listBits, matches, setBit } from './bitmask.js'\nimport { getComponentInfo } from './component.js'\nimport type {\n Archetype,\n ComponentInfo,\n ComponentLike,\n EntityId,\n Query,\n QueryDescriptor,\n QueryInternal,\n QueryMaskBundle,\n ReactiveBuffer,\n World,\n WorldState,\n} from './types.js'\nimport {\n getOrRegisterComponentBit,\n getWorldState,\n readEntityMask,\n tryGetComponentBit,\n} from './world.js'\n\nlet nextQueryId = 1\nconst moduleQueryCache = new Map<string, QueryInternal>()\n\nfunction descKey(d: QueryDescriptor): string {\n const all = (d.all ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n const any = (d.any ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n const none = (d.none ?? [])\n .map((c) => c.__id)\n .sort((a, b) => a - b)\n .join('-')\n return `A${all}|Y${any}|N${none}`\n}\n\nexport function defineQuery(arg: ComponentLike[] | QueryDescriptor): Query {\n const desc: QueryDescriptor = Array.isArray(arg) ? { all: arg } : arg\n\n // Validate all members are components\n for (const c of [...(desc.all ?? []), ...(desc.any ?? []), ...(desc.none ?? [])]) {\n if (!c || typeof c !== 'object' || typeof (c as any).__id !== 'number') {\n throw new TypeError('aiecsjs: defineQuery received a non-component value')\n }\n }\n\n const key = descKey(desc)\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n\n const q: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: (desc.all ?? []).map((c) => c.__id),\n any: (desc.any ?? []).map((c) => c.__id),\n none: (desc.none ?? []).map((c) => c.__id),\n columnViewCache: [...(desc.all ?? []), ...(desc.any ?? [])],\n reactiveKind: 'normal',\n sourceQueryId: -1,\n sourceQuery: null,\n }\n moduleQueryCache.set(key, q)\n return q\n}\n\nexport function enterQuery(query: Query): Query {\n const q = query as QueryInternal\n const key = `enter:${q.id}`\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n const reactive: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: q.all,\n any: q.any,\n none: q.none,\n columnViewCache: q.columnViewCache,\n reactiveKind: 'enter',\n sourceQueryId: q.id,\n sourceQuery: q,\n }\n moduleQueryCache.set(key, reactive)\n return reactive\n}\n\nexport function exitQuery(query: Query): Query {\n const q = query as QueryInternal\n const key = `exit:${q.id}`\n const cached = moduleQueryCache.get(key)\n if (cached) return cached\n const reactive: QueryInternal = {\n id: nextQueryId++,\n mask: [],\n all: q.all,\n any: q.any,\n none: q.none,\n columnViewCache: q.columnViewCache,\n reactiveKind: 'exit',\n sourceQueryId: q.id,\n sourceQuery: q,\n }\n moduleQueryCache.set(key, reactive)\n return reactive\n}\n\n// --- Per-world query setup ---\n\nfunction ensureQueryRegistered(state: WorldState, q: QueryInternal): void {\n if (state.queries[q.id] === q && state.queryMasks.has(q.id)) return\n\n // Build per-world bitmasks (this may register new bits)\n const ww = state.options.maskWordCount\n const withMask = createMask(ww)\n const anyMask = createMask(ww)\n const noneMask = createMask(ww)\n for (const compId of q.all) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(withMask, bit)\n }\n for (const compId of q.any) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(anyMask, bit)\n }\n for (const compId of q.none) {\n const info = getComponentInfoById(compId)\n const bit = getOrRegisterComponentBit(state, info)\n setBit(noneMask, bit)\n }\n\n const bundle: QueryMaskBundle = {\n withMask,\n anyMask,\n noneMask,\n anyHasBits: !isMaskZero(anyMask),\n }\n state.queryMasks.set(q.id, bundle)\n\n state.queries[q.id] = q\n state.queryArchetypeCache[q.id] = null\n state.queryArchetypeStamp[q.id] = -1\n\n // Build bit → queries index for fast reactive lookup\n const involvedBits: number[] = [\n ...listBits(withMask),\n ...listBits(anyMask),\n ...listBits(noneMask),\n ]\n for (const b of involvedBits) {\n let s = state.bitToQueries.get(b)\n if (!s) {\n s = new Set<number>()\n state.bitToQueries.set(b, s)\n }\n s.add(q.id)\n }\n\n // Initialize reactive buffer for enter/exit queries\n if (q.reactiveKind !== 'normal') {\n if (!state.reactiveBuffers.has(q.id)) {\n state.reactiveBuffers.set(q.id, { entered: [], exited: [] })\n }\n // Also register the source query so recordEntityMaskChange will see it\n if (q.sourceQuery) ensureQueryRegistered(state, q.sourceQuery)\n }\n}\n\nfunction getQueryArchetypes(state: WorldState, q: QueryInternal): number[] {\n ensureQueryRegistered(state, q)\n if (state.queryArchetypeCache[q.id] && state.queryArchetypeStamp[q.id] === state.queryVersion) {\n return state.queryArchetypeCache[q.id]!\n }\n const bundle = state.queryMasks.get(q.id)!\n const words = state.options.maskWordCount\n const list: number[] = []\n for (let i = 0; i < state.archetypes.length; i++) {\n const arch = state.archetypes[i]!\n if (\n matches(arch.mask, bundle.withMask, bundle.anyMask, bundle.noneMask, bundle.anyHasBits, words)\n ) {\n list.push(i)\n }\n }\n state.queryArchetypeCache[q.id] = list\n state.queryArchetypeStamp[q.id] = state.queryVersion\n return list\n}\n\nexport function queryArchetypes(world: World, query: Query): readonly Archetype[] {\n const state = getWorldState(world)\n const q = query as QueryInternal\n const ids = getQueryArchetypes(state, q)\n const out: Archetype[] = []\n for (const id of ids) {\n const arch = state.archetypes[id]!\n out.push({ id: arch.id, mask: Array.from(arch.mask), size: arch.size })\n }\n return out\n}\n\nexport function runQuery(world: World, query: Query): readonly EntityId[] {\n const state = getWorldState(world)\n const q = query as QueryInternal\n const out: EntityId[] = []\n if (q.reactiveKind === 'enter') {\n const buf = state.reactiveBuffers.get(q.id)\n if (buf) {\n for (const e of buf.entered) out.push(e as EntityId)\n buf.entered.length = 0\n }\n return out\n }\n if (q.reactiveKind === 'exit') {\n const buf = state.reactiveBuffers.get(q.id)\n if (buf) {\n for (const e of buf.exited) out.push(e as EntityId)\n buf.exited.length = 0\n }\n return out\n }\n const archIds = getQueryArchetypes(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n for (let r = 0; r < arch.size; r++) {\n out.push(arch.entities[r] as EntityId)\n }\n }\n return out\n}\n\nexport function* iterQuery(world: World, query: Query): IterableIterator<EntityId> {\n const state = getWorldState(world)\n const q = query as QueryInternal\n if (q.reactiveKind !== 'normal') {\n const buf = state.reactiveBuffers.get(q.id)\n if (!buf) return\n const src = q.reactiveKind === 'enter' ? buf.entered : buf.exited\n for (const e of src) yield e as EntityId\n src.length = 0\n return\n }\n const archIds = getQueryArchetypes(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n for (let r = 0; r < arch.size; r++) {\n yield arch.entities[r] as EntityId\n }\n }\n}\n\nexport function forEachEntity(\n world: World,\n query: Query,\n fn: (eid: EntityId, ...cols: any[]) => void,\n): void {\n const state = getWorldState(world)\n const q = query as QueryInternal\n\n if (q.reactiveKind !== 'normal') {\n const buf = state.reactiveBuffers.get(q.id)\n if (!buf) return\n const src = q.reactiveKind === 'enter' ? buf.entered : buf.exited\n if (src.length === 0) return\n const cols = buildColumnViews(state, q)\n for (let i = 0; i < src.length; i++) {\n const e = src[i] as EntityId\n callWithCols(fn, e, cols)\n }\n src.length = 0\n return\n }\n\n ensureQueryRegistered(state, q)\n const archIds = getQueryArchetypes(state, q)\n const cols = buildColumnViews(state, q)\n for (const id of archIds) {\n const arch = state.archetypes[id]!\n const ents = arch.entities\n const n = arch.size\n for (let r = 0; r < n; r++) {\n callWithCols(fn, ents[r] as EntityId, cols)\n }\n }\n}\n\nfunction callWithCols(\n fn: (eid: EntityId, ...cols: any[]) => void,\n eid: EntityId,\n cols: any[],\n): void {\n // Specialise for low arities to avoid spread allocation.\n switch (cols.length) {\n case 0:\n fn(eid)\n break\n case 1:\n fn(eid, cols[0])\n break\n case 2:\n fn(eid, cols[0], cols[1])\n break\n case 3:\n fn(eid, cols[0], cols[1], cols[2])\n break\n case 4:\n fn(eid, cols[0], cols[1], cols[2], cols[3])\n break\n case 5:\n fn(eid, cols[0], cols[1], cols[2], cols[3], cols[4])\n break\n default:\n fn(eid, ...cols)\n }\n}\n\nfunction buildColumnViews(state: WorldState, q: QueryInternal): any[] {\n const out: any[] = []\n for (const comp of q.columnViewCache) {\n const info = getComponentInfo(comp)\n const bit = state.componentBitFor.get(info.id)\n if (bit === undefined) {\n out.push(undefined)\n continue\n }\n const storage = state.componentStorageByBit[bit]\n if (!storage) {\n out.push(undefined)\n continue\n }\n if (storage.kind === 'soa') out.push(storage.soa)\n else if (storage.kind === 'aos') out.push(storage.aos)\n else out.push(true) // tag\n }\n return out\n}\n\n// --- Reactive query updates (called from migration code) ---\n\nexport function recordEntityMaskChange(\n state: WorldState,\n eid: EntityId,\n changedBit: number,\n prevMask: Uint32Array,\n nextMask: Uint32Array,\n): void {\n // Lazy-register any reactive queries (and their sources) so we can correctly\n // determine match transitions even if the user only ever called enterQuery/exitQuery.\n for (const q of moduleQueryCache.values()) {\n if (q.reactiveKind === 'normal') continue\n if (q.sourceQuery && state.queries[q.sourceQuery.id] !== q.sourceQuery) {\n ensureQueryRegistered(state, q.sourceQuery)\n }\n }\n\n const involved = state.bitToQueries.get(changedBit)\n if (!involved) return\n const words = state.options.maskWordCount\n for (const qid of involved) {\n const q = state.queries[qid]\n if (!q) continue\n if (q.reactiveKind !== 'normal') continue\n const bundle = state.queryMasks.get(qid)\n if (!bundle) continue\n const wasMatch = matches(\n prevMask,\n bundle.withMask,\n bundle.anyMask,\n bundle.noneMask,\n bundle.anyHasBits,\n words,\n )\n const isMatch = matches(\n nextMask,\n bundle.withMask,\n bundle.anyMask,\n bundle.noneMask,\n bundle.anyHasBits,\n words,\n )\n if (!wasMatch && isMatch) {\n pushReactive(state, qid, 'enter', eid)\n } else if (wasMatch && !isMatch) {\n pushReactive(state, qid, 'exit', eid)\n }\n }\n}\n\nfunction pushReactive(\n state: WorldState,\n queryId: number,\n kind: 'enter' | 'exit',\n eid: EntityId,\n): void {\n // Walk the module cache (not just state.queries) so reactive variants that\n // haven't been registered with this world yet still receive events.\n for (const r of moduleQueryCache.values()) {\n if (r.sourceQueryId !== queryId) continue\n if (r.reactiveKind !== kind) continue\n // Lazily register the reactive query in this world so subsequent reads can find it\n ensureQueryRegistered(state, r)\n const buf = ensureReactiveBuffer(state, r.id)\n if (kind === 'enter') buf.entered.push(eid as number)\n else buf.exited.push(eid as number)\n }\n}\n\nfunction ensureReactiveBuffer(state: WorldState, qid: number): ReactiveBuffer {\n let buf = state.reactiveBuffers.get(qid)\n if (!buf) {\n buf = { entered: [], exited: [] }\n state.reactiveBuffers.set(qid, buf)\n }\n return buf\n}\n\n// --- Helpers ---\n\nfunction getComponentInfoById(componentId: number): ComponentInfo {\n // We need access to the component registry's lookup by id. Re-import dynamically to avoid cycles.\n const info = lazyGetComponentInfo(componentId)\n if (!info) throw new Error(`aiecsjs: component id ${componentId} not registered`)\n return info\n}\n\nlet _getComponentInfoFn: ((id: number) => ComponentInfo | undefined) | null = null\nexport function registerComponentLookup(fn: (id: number) => ComponentInfo | undefined): void {\n _getComponentInfoFn = fn\n}\nfunction lazyGetComponentInfo(id: number): ComponentInfo | undefined {\n return _getComponentInfoFn ? _getComponentInfoFn(id) : undefined\n}\n\nexport function _resetQueryRegistry_FOR_TESTS_ONLY(): void {\n moduleQueryCache.clear()\n nextQueryId = 1\n}\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var O="0.4.0";function R(n){return new Uint32Array(n)}function _(n,t){let e=t>>>5;n[e]=(n[e]??0)|1<<(t&31);}function j(n,t){let e=t>>>5;n[e]=(n[e]??0)&~(1<<(t&31));}function m(n,t){let e=t>>>5;return ((n[e]??0)&1<<(t&31))!==0}function w(n){let t=new Uint32Array(n.length);for(let e=0;e<n.length;e++)t[e]=n[e]??0;return t}function v(n){let t=[];for(let e=0;e<n.length;e++)t.push((n[e]??0).toString(16));return t.join(",")}function xt(n){for(let t=0;t<n.length;t++)if((n[t]??0)!==0)return false;return true}function ht(n,t,e,o,i,s){let r=!i;for(let a=0;a<s;a++){let d=n[a]??0,c=t[a]??0,u=e[a]??0,f=o[a]??0;if((d&c)!==c||(d&f)!==0)return false;!r&&(d&u)!==0&&(r=true);}return r}function At(n){let t=[];for(let e=0;e<n.length;e++){let o=n[e]??0;for(;o!==0;){let i=(e<<5)+T(o);t.push(i),o&=o-1;}}return t}function L(n,t,e,o){for(let i=0;i<e;i++){let s=n[t+i]??0;for(;s!==0;){let r=(i<<5)+T(s);o(r),s&=s-1;}}}function wt(n,t,e,o,i,s,r){let a=!r;for(let d=0;d<e;d++){let c=n[t+d]??0,u=o[d]??0,f=i[d]??0,l=s[d]??0;if((c&u)!==u||(c&l)!==0)return false;!a&&(c&f)!==0&&(a=true);}return a}function T(n){return 31-Math.clz32(n&-n)}var C={initialCapacity:1024,maxEntities:1e6,indexBits:24,generationBits:8},Q=256,Z=1,b=new Map;function y(n){let t=b.get(n.id);if(!t)throw new Error(`aiecsjs: world ${n.id} is destroyed or unknown`);if(t.destroyed)throw new Error(`aiecsjs: world ${n.id} is destroyed`);return t}function J(n){b.set(n.id,n);}function tt(n){b.delete(n);}function Et(n){return b.has(n)}function nt(n){let t=n??{},e=t.indexBits??C.indexBits,o=t.generationBits??C.generationBits,i=Q;if(e<1||e>24)throw new Error("aiecsjs: indexBits must be in [1, 24]");if(o<0||o>16)throw new Error("aiecsjs: generationBits must be in [0, 16]");if(e+o>32)throw new Error(`aiecsjs: indexBits (${e}) + generationBits (${o}) must be <= 32`);let s=1<<e,r=Math.max(1,Math.min(t.initialCapacity??C.initialCapacity,s)),a=Math.max(r,Math.min(t.maxEntities??C.maxEntities,s));return {initialCapacity:r,maxEntities:a,indexBits:e,generationBits:o,indexMask:(1<<e)-1,generationMask:o===0?0:(1<<o)-1,maxComponents:i,maskWordCount:Math.ceil(i/32),buffer:t.buffer??null,bufferByteOffset:t.bufferByteOffset??0}}function et(n,t){return {id:0,mask:R(n),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:[],edgeAdd:new Int32Array(t).fill(-1),edgeRemove:new Int32Array(t).fill(-1)}}function vt(n){let t=nt(n),e=Z++,o=t.generationBits>8?Uint16Array:Uint8Array,i=new o(t.initialCapacity),s={id:e,capacity:t.initialCapacity,version:O,options:t,size:0,nextFreshIndex:1,freeList:[],generations:i,destroyed:false,componentBitFor:new Map,componentInfoByBit:new Array(t.maxComponents).fill(null),componentStorageByBit:new Array(t.maxComponents).fill(null),nextComponentBit:0,entityArchetype:new Uint32Array(t.initialCapacity),entityMask:new Uint32Array(t.initialCapacity*t.maskWordCount),archetypes:[],archetypeByMaskHash:new Map,queryVersion:0,queries:[],queryMasks:new Map,queryArchetypeCache:[],queryArchetypeStamp:[],bitToQueries:new Map,reactiveBuffers:new Map,observers:[],relationStorage:new Map,sab:t.buffer,readOnly:false},r=et(t.maskWordCount,t.maxComponents);return r.id=0,s.archetypes.push(r),s.archetypeByMaskHash.set(v(r.mask),0),J(s),ot(s)}function ot(n){return {id:n.id,get capacity(){return n.capacity},version:n.version}}function St(n){let t=b.get(n.id);!t||t.destroyed||(t.destroyed=true,t.archetypes=[],t.archetypeByMaskHash.clear(),t.componentInfoByBit=[],t.componentStorageByBit=[],t.queries=[],t.queryMasks.clear(),t.queryArchetypeCache=[],t.observers=[],t.relationStorage.clear(),t.reactiveBuffers.clear(),tt(n.id));}function Wt(n){let t=y(n);t.size=0,t.nextFreshIndex=1,t.freeList=[],t.generations.fill(0),t.entityArchetype.fill(0),t.entityMask.fill(0);for(let e of t.archetypes)e.size=0,e.entityRow.clear();for(let e of t.componentStorageByBit)if(e)if(e.kind==="soa"&&e.soa)for(let o of Object.keys(e.soa))e.soa[o]?.fill(0);else e.kind==="aos"&&e.aos&&e.aos.fill(void 0);t.queryVersion++;for(let e of t.reactiveBuffers.values())e.entered.length=0,e.exited.length=0;}function Bt(n){return y(n).size}function Mt(n){return y(n).capacity}function F(n,t){if(t<=n.capacity)return;if(t>n.options.maxEntities)throw new Error(`aiecsjs: requested capacity ${t} exceeds maxEntities ${n.options.maxEntities}`);let e=n.capacity;for(;e<t;)e=Math.min(e*2,n.options.maxEntities);rt(n,e);}function rt(n,t){let e=n.generations.constructor,o=new e(t);o.set(n.generations),n.generations=o;let i=new Uint32Array(t);i.set(n.entityArchetype),n.entityArchetype=i;let s=n.options.maskWordCount,r=new Uint32Array(t*s);r.set(n.entityMask),n.entityMask=r;for(let a of n.componentStorageByBit)if(a)if(a.kind==="soa"&&a.soa){let d=n.componentInfoByBit[a.bit];d&&it(a.soa,d.fields,t);}else a.kind==="aos"&&a.aos&&(a.aos.length=t);n.capacity=t;}function it(n,t,e){for(let o of t){let i=n[o.name];if(!i)continue;let s=e*o.vectorLen;if(i.length>=s)continue;let r=new o.ctor(s);r.set(i),n[o.name]=r;}}function z(n,t){let e=v(t),o=n.archetypeByMaskHash.get(e);if(o!==void 0)return {archId:o,created:false};let i=n.archetypes.length,s={id:i,mask:w(t),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:st(t),edgeAdd:new Int32Array(n.options.maxComponents).fill(-1),edgeRemove:new Int32Array(n.options.maxComponents).fill(-1)};return n.archetypes.push(s),n.archetypeByMaskHash.set(e,i),n.queryVersion++,{archId:i,created:true}}function I(n,t){if(t<=n.capacity)return;let e=n.capacity;for(;e<t;)e*=2;let o=new Uint32Array(e);o.set(n.entities),n.entities=o,n.capacity=e;}function st(n){let t=[];for(let e=0;e<n.length;e++){let o=n[e]??0;for(;o!==0;){let i=o&-o,s=(e<<5)+(31-Math.clz32(i));t.push(s),o&=o-1;}}return t}function D(n,t){let e=n.componentBitFor.get(t.id);if(e!==void 0)return e;if(n.nextComponentBit>=n.options.maxComponents)throw new Error(`aiecsjs: world reached maxComponents=${n.options.maxComponents}`);let o=n.nextComponentBit++;n.componentBitFor.set(t.id,o),n.componentInfoByBit[o]=t;let i;if(t.kind==="soa"){let s={};for(let r of t.fields)s[r.name]=new r.ctor(n.capacity*r.vectorLen);i={kind:"soa",componentId:t.id,bit:o,soa:s};}else t.kind==="aos"?i={kind:"aos",componentId:t.id,bit:o,aos:new Array(n.capacity)}:i={kind:"tag",componentId:t.id,bit:o};return n.componentStorageByBit[o]=i,o}function x(n,t){let e=n.options.maskWordCount,o=new Uint32Array(e),s=(t&n.options.indexMask)*e;for(let r=0;r<e;r++)o[r]=n.entityMask[s+r]??0;return o}function N(n,t,e){let o=n.options.maskWordCount,s=(t&n.options.indexMask)*o;for(let r=0;r<o;r++)n.entityMask[s+r]=e[r]??0;}function g(n,t){return n.componentBitFor.get(t.id)}function Ut(n){if(!n||typeof n!="object")return false;let t=n;return typeof t.id!="number"||typeof t.version!="string"?false:b.has(t.id)}var W=1,at={i8:Int8Array,u8:Uint8Array,i16:Int16Array,u16:Uint16Array,i32:Int32Array,u32:Uint32Array,f32:Float32Array,f64:Float64Array,eid:Uint32Array,bool:Uint8Array},h=new Map;function Lt(n){let t=[];for(let[s,r]of Object.entries(n)){let a,d=1;if(typeof r=="string")a=r;else if(Array.isArray(r)){let[u,f]=r;a=u,d=f;}else throw new TypeError(`aiecsjs: invalid field declaration for "${s}"`);let c=at[a];if(!c)throw new TypeError(`aiecsjs: unknown field type "${a}" for field "${s}"`);t.push({name:s,type:a,vectorLen:d,ctor:c,bytesPerElement:c.BYTES_PER_ELEMENT});}let e=W++,o={id:e,kind:"soa",schema:n,fields:t,factory:null};return h.set(e,o),{__kind:"soa",__id:e,__schema:n}}function Tt(){let n=W++,t={id:n,kind:"tag",schema:null,fields:[],factory:null};return h.set(n,t),{__kind:"tag",__id:n}}function Ft(n){let t=W++,e=n??(()=>({})),o={id:t,kind:"aos",schema:null,fields:[],factory:e};return h.set(t,o),{__kind:"aos",__id:t,__factory:e}}function A(n){let t=h.get(n.__id);if(!t)throw new Error("aiecsjs: component is not registered (call defineComponent/defineTag/defineObjectComponent)");return t}function P(n,t,e,o){let i=y(n);if(i.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(i,t))throw new Error(`aiecsjs: addComponent on dead entity ${t}`);let s=A(e),r=D(i,s),a=x(i,t);if(m(a,r)){o!==void 0&&S(i,t,e,o);return}let d=w(a);_(d,r),G(i,t,d),S(i,t,e,o),ct(i,t,r),V(i,t,r,a,d);}function zt(n,t,e){let o=y(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,t))return;let i=A(e),s=g(o,i);if(s===void 0)return;let r=x(o,t);if(!m(r,s))return;let a=w(r);j(a,s),G(o,t,a),dt(o,t,s);let d=t&o.options.indexMask,c=o.componentStorageByBit[s];c?.kind==="soa"&&c.soa?q(c.soa,i.fields,d):c?.kind==="aos"&&c.aos&&(c.aos[d]=void 0),V(o,t,s,r,a);}function Dt(n,t,e){let o=y(n);if(!p(o,t))return false;let i=A(e),s=g(o,i);if(s===void 0)return false;let r=x(o,t);return m(r,s)}function Nt(n,t,e){let o=y(n);if(!p(o,t))return;let i=A(e),s=g(o,i);if(s===void 0)return;let r=x(o,t);if(!m(r,s))return;let a=o.componentStorageByBit[s];if(a){if(a.kind==="soa")return a.soa;if(a.kind==="aos"){let d=t&o.options.indexMask;return a.aos?.[d]}return true}}function Pt(n,t,e,o){let i=y(n);if(i.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(i,t))throw new Error(`aiecsjs: setComponent on dead entity ${t}`);let s=A(e),r=g(i,s);if(r===void 0){P(n,t,e,o);return}let a=x(i,t);if(!m(a,r)){P(n,t,e,o);return}S(i,t,e,o),ft(i,t,r,o);}function S(n,t,e,o){let i=A(e),s=n.componentBitFor.get(i.id);if(s===void 0)return;let r=n.componentStorageByBit[s];if(!r)return;let a=t&n.options.indexMask;if(i.kind==="soa"&&r.soa){if(o==null)return;let d=o;for(let c of i.fields){if(!(c.name in d))continue;let u=r.soa[c.name];if(!u)continue;let f=d[c.name];if(c.vectorLen===1)u[a]=typeof f=="boolean"?f?1:0:Number(f);else if(Array.isArray(f)||ArrayBuffer.isView(f)){let l=a*c.vectorLen,K=f;for(let k=0;k<c.vectorLen;k++)u[l+k]=Number(K[k]??0);}}}else if(i.kind==="aos"&&r.aos){let d=i.factory??(()=>({})),c=r.aos[a];if(c===void 0&&(c=d(),r.aos[a]=c),o&&typeof o=="object"){let u=o,f=c;for(let l of Object.keys(u))l==="__proto__"||l==="constructor"||l==="prototype"||(f[l]=u[l]);}}}function q(n,t,e){for(let o of t){let i=n[o.name];if(i)if(o.vectorLen===1)i[e]=0;else {let s=e*o.vectorLen;for(let r=0;r<o.vectorLen;r++)i[s+r]=0;}}}function $(n,t){let e=n.options.maskWordCount,o=t&n.options.indexMask,i=o*e;L(n.entityMask,i,e,s=>{let r=n.componentStorageByBit[s],a=n.componentInfoByBit[s];r?.kind==="soa"&&r.soa&&a?q(r.soa,a.fields,o):r?.kind==="aos"&&r.aos&&(r.aos[o]=void 0);});}function G(n,t,e){let o=t&n.options.indexMask,i=n.entityArchetype[o]??0,s=n.archetypes[i];if(!s)return;let a=z(n,e).archId,d=n.archetypes[a];if(d){if(a!==i){let c=s.entityRow.get(t);if(c!==void 0){let f=s.size-1;if(c!==f){let l=s.entities[f]??0;s.entities[c]=l,s.entityRow.set(l,c);}s.entities[f]=0,s.entityRow.delete(t),s.size--;}I(d,d.size+1);let u=d.size;d.entities[u]=t,d.entityRow.set(t,u),d.size++,n.entityArchetype[o]=a;}N(n,t,e);}}var E={fireAdd:()=>{},fireRemove:()=>{},fireSet:()=>{}},H=()=>{};function qt(n){H=n;}function V(n,t,e,o,i){H(n,t,e,o,i);}function $t(n){E=n;}function ct(n,t,e){E.fireAdd(n,t,e);}function dt(n,t,e){E.fireRemove(n,t,e);}function ft(n,t,e,o){E.fireSet(n,t,e,o);}function Gt(n){return h.get(n)}function Ht(){return Array.from(h.values())}var U=24,ut=8,Y=(1<<U)-1,X=(1<<ut)-1;function yt(n,t,e){return ((t&e.generationMask)<<e.indexBits|n&e.indexMask)>>>0}function Kt(n,t){return n&t.indexMask}function Qt(n,t){return n>>>t.indexBits&t.generationMask}function Zt(n){let t=y(n);if(t.readOnly)throw new Error("aiecsjs: cannot createEntity on a read-only world (worker-attached)");let e;if(t.freeList.length>0)e=t.freeList.pop();else {if(t.nextFreshIndex>=t.options.maxEntities)throw new Error(`aiecsjs: reached maxEntities ${t.options.maxEntities}`);t.nextFreshIndex>=t.capacity&&F(t,t.nextFreshIndex+1),e=t.nextFreshIndex++;}let o=t.generations[e]??0,i=yt(e,o,t.options),s=t.archetypes[0];if(!s)throw new Error("aiecsjs: missing empty archetype");I(s,s.size+1);let r=s.size;s.entities[r]=i,s.entityRow.set(i,r),s.size++,t.entityArchetype[e]=0;let a=t.options.maskWordCount,d=e*a;for(let c=0;c<a;c++)t.entityMask[d+c]=0;return t.size++,i}function Jt(n,t){let e=y(n);if(e.readOnly)throw new Error("aiecsjs: cannot destroyEntity on a read-only world");if(!p(e,t))return;let o=t&e.options.indexMask,{dispatchDestroyObservers:i}=pt();i(e,t),mt(e,t),$(e,t);let s=e.entityArchetype[o]??0,r=e.archetypes[s];if(r){let c=r.entityRow.get(t);if(c!==void 0){let u=r.size-1;if(c!==u){let f=r.entities[u]??0;r.entities[c]=f,r.entityRow.set(f,c);}r.entities[u]=0,r.entityRow.delete(t),r.size--;}}e.entityArchetype[o]=0;let a=e.options.maskWordCount,d=o*a;for(let c=0;c<a;c++)e.entityMask[d+c]=0;e.generations[o]=(e.generations[o]??0)+1&e.options.generationMask,e.freeList.push(o),e.size--;}function lt(n,t){let e=y(n);return p(e,t)}function p(n,t){let e=t&n.options.indexMask;if(e<=0||e>=n.capacity)return false;let o=n.entityArchetype[e]??0,i=n.archetypes[o];if(!i||!i.entityRow.has(t))return false;let s=n.generations[e]??0,r=t>>>n.options.indexBits&n.options.generationMask;return s===r}function tn(n){return n&Y}function nn(n){return n>>>U&X}function en(n,t){return ((t&X)<<U|n&Y)>>>0}function on(n,t){return typeof t!="number"?false:lt(n,t)}var B=null;function rn(n){B=n;}function pt(){return B||{dispatchDestroyObservers:()=>{}}}var M=null;function sn(n){M=n;}function mt(n,t){M&&M(n,t);}exports.A=en;exports.B=on;exports.C=rn;exports.D=sn;exports.E=Lt;exports.F=Tt;exports.G=Ft;exports.H=A;exports.I=P;exports.J=zt;exports.K=Dt;exports.L=Nt;exports.M=Pt;exports.N=qt;exports.O=$t;exports.P=Gt;exports.Q=Ht;exports.a=O;exports.b=R;exports.c=_;exports.d=xt;exports.e=ht;exports.f=At;exports.g=L;exports.h=wt;exports.i=y;exports.j=Et;exports.k=vt;exports.l=St;exports.m=Wt;exports.n=Bt;exports.o=Mt;exports.p=D;exports.q=Ut;exports.r=yt;exports.s=Kt;exports.t=Qt;exports.u=Zt;exports.v=Jt;exports.w=lt;exports.x=p;exports.y=tn;exports.z=nn;//# sourceMappingURL=chunk-SJDWI3OZ.cjs.map
2
- //# sourceMappingURL=chunk-SJDWI3OZ.cjs.map
1
+ 'use strict';var O="0.5.0";function R(n){return new Uint32Array(n)}function _(n,t){let e=t>>>5;n[e]=(n[e]??0)|1<<(t&31);}function j(n,t){let e=t>>>5;n[e]=(n[e]??0)&~(1<<(t&31));}function m(n,t){let e=t>>>5;return ((n[e]??0)&1<<(t&31))!==0}function w(n){let t=new Uint32Array(n.length);for(let e=0;e<n.length;e++)t[e]=n[e]??0;return t}function v(n){let t=[];for(let e=0;e<n.length;e++)t.push((n[e]??0).toString(16));return t.join(",")}function xt(n){for(let t=0;t<n.length;t++)if((n[t]??0)!==0)return false;return true}function ht(n,t,e,o,i,s){let r=!i;for(let a=0;a<s;a++){let d=n[a]??0,c=t[a]??0,u=e[a]??0,f=o[a]??0;if((d&c)!==c||(d&f)!==0)return false;!r&&(d&u)!==0&&(r=true);}return r}function At(n){let t=[];for(let e=0;e<n.length;e++){let o=n[e]??0;for(;o!==0;){let i=(e<<5)+T(o);t.push(i),o&=o-1;}}return t}function L(n,t,e,o){for(let i=0;i<e;i++){let s=n[t+i]??0;for(;s!==0;){let r=(i<<5)+T(s);o(r),s&=s-1;}}}function wt(n,t,e,o,i,s,r){let a=!r;for(let d=0;d<e;d++){let c=n[t+d]??0,u=o[d]??0,f=i[d]??0,l=s[d]??0;if((c&u)!==u||(c&l)!==0)return false;!a&&(c&f)!==0&&(a=true);}return a}function T(n){return 31-Math.clz32(n&-n)}var C={initialCapacity:1024,maxEntities:1e6,indexBits:24,generationBits:8},Q=256,Z=1,b=new Map;function y(n){let t=b.get(n.id);if(!t)throw new Error(`aiecsjs: world ${n.id} is destroyed or unknown`);if(t.destroyed)throw new Error(`aiecsjs: world ${n.id} is destroyed`);return t}function J(n){b.set(n.id,n);}function tt(n){b.delete(n);}function Et(n){return b.has(n)}function nt(n){let t=n??{},e=t.indexBits??C.indexBits,o=t.generationBits??C.generationBits,i=Q;if(e<1||e>24)throw new Error("aiecsjs: indexBits must be in [1, 24]");if(o<0||o>16)throw new Error("aiecsjs: generationBits must be in [0, 16]");if(e+o>32)throw new Error(`aiecsjs: indexBits (${e}) + generationBits (${o}) must be <= 32`);let s=1<<e,r=Math.max(1,Math.min(t.initialCapacity??C.initialCapacity,s)),a=Math.max(r,Math.min(t.maxEntities??C.maxEntities,s));return {initialCapacity:r,maxEntities:a,indexBits:e,generationBits:o,indexMask:(1<<e)-1,generationMask:o===0?0:(1<<o)-1,maxComponents:i,maskWordCount:Math.ceil(i/32),buffer:t.buffer??null,bufferByteOffset:t.bufferByteOffset??0}}function et(n,t){return {id:0,mask:R(n),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:[],edgeAdd:new Int32Array(t).fill(-1),edgeRemove:new Int32Array(t).fill(-1)}}function vt(n){let t=nt(n),e=Z++,o=t.generationBits>8?Uint16Array:Uint8Array,i=new o(t.initialCapacity),s={id:e,capacity:t.initialCapacity,version:O,options:t,size:0,nextFreshIndex:1,freeList:[],generations:i,destroyed:false,componentBitFor:new Map,componentInfoByBit:new Array(t.maxComponents).fill(null),componentStorageByBit:new Array(t.maxComponents).fill(null),nextComponentBit:0,entityArchetype:new Uint32Array(t.initialCapacity),entityMask:new Uint32Array(t.initialCapacity*t.maskWordCount),archetypes:[],archetypeByMaskHash:new Map,queryVersion:0,queries:[],queryMasks:new Map,queryArchetypeCache:[],queryArchetypeStamp:[],bitToQueries:new Map,reactiveBuffers:new Map,observers:[],relationStorage:new Map,sab:t.buffer,readOnly:false},r=et(t.maskWordCount,t.maxComponents);return r.id=0,s.archetypes.push(r),s.archetypeByMaskHash.set(v(r.mask),0),J(s),ot(s)}function ot(n){return {id:n.id,get capacity(){return n.capacity},version:n.version}}function St(n){let t=b.get(n.id);!t||t.destroyed||(t.destroyed=true,t.archetypes=[],t.archetypeByMaskHash.clear(),t.componentInfoByBit=[],t.componentStorageByBit=[],t.queries=[],t.queryMasks.clear(),t.queryArchetypeCache=[],t.observers=[],t.relationStorage.clear(),t.reactiveBuffers.clear(),tt(n.id));}function Wt(n){let t=y(n);t.size=0,t.nextFreshIndex=1,t.freeList=[],t.generations.fill(0),t.entityArchetype.fill(0),t.entityMask.fill(0);for(let e of t.archetypes)e.size=0,e.entityRow.clear();for(let e of t.componentStorageByBit)if(e)if(e.kind==="soa"&&e.soa)for(let o of Object.keys(e.soa))e.soa[o]?.fill(0);else e.kind==="aos"&&e.aos&&e.aos.fill(void 0);t.queryVersion++;for(let e of t.reactiveBuffers.values())e.entered.length=0,e.exited.length=0;}function Bt(n){return y(n).size}function Mt(n){return y(n).capacity}function F(n,t){if(t<=n.capacity)return;if(t>n.options.maxEntities)throw new Error(`aiecsjs: requested capacity ${t} exceeds maxEntities ${n.options.maxEntities}`);let e=n.capacity;for(;e<t;)e=Math.min(e*2,n.options.maxEntities);rt(n,e);}function rt(n,t){let e=n.generations.constructor,o=new e(t);o.set(n.generations),n.generations=o;let i=new Uint32Array(t);i.set(n.entityArchetype),n.entityArchetype=i;let s=n.options.maskWordCount,r=new Uint32Array(t*s);r.set(n.entityMask),n.entityMask=r;for(let a of n.componentStorageByBit)if(a)if(a.kind==="soa"&&a.soa){let d=n.componentInfoByBit[a.bit];d&&it(a.soa,d.fields,t);}else a.kind==="aos"&&a.aos&&(a.aos.length=t);n.capacity=t;}function it(n,t,e){for(let o of t){let i=n[o.name];if(!i)continue;let s=e*o.vectorLen;if(i.length>=s)continue;let r=new o.ctor(s);r.set(i),n[o.name]=r;}}function z(n,t){let e=v(t),o=n.archetypeByMaskHash.get(e);if(o!==void 0)return {archId:o,created:false};let i=n.archetypes.length,s={id:i,mask:w(t),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:st(t),edgeAdd:new Int32Array(n.options.maxComponents).fill(-1),edgeRemove:new Int32Array(n.options.maxComponents).fill(-1)};return n.archetypes.push(s),n.archetypeByMaskHash.set(e,i),n.queryVersion++,{archId:i,created:true}}function I(n,t){if(t<=n.capacity)return;let e=n.capacity;for(;e<t;)e*=2;let o=new Uint32Array(e);o.set(n.entities),n.entities=o,n.capacity=e;}function st(n){let t=[];for(let e=0;e<n.length;e++){let o=n[e]??0;for(;o!==0;){let i=o&-o,s=(e<<5)+(31-Math.clz32(i));t.push(s),o&=o-1;}}return t}function D(n,t){let e=n.componentBitFor.get(t.id);if(e!==void 0)return e;if(n.nextComponentBit>=n.options.maxComponents)throw new Error(`aiecsjs: world reached maxComponents=${n.options.maxComponents}`);let o=n.nextComponentBit++;n.componentBitFor.set(t.id,o),n.componentInfoByBit[o]=t;let i;if(t.kind==="soa"){let s={};for(let r of t.fields)s[r.name]=new r.ctor(n.capacity*r.vectorLen);i={kind:"soa",componentId:t.id,bit:o,soa:s};}else t.kind==="aos"?i={kind:"aos",componentId:t.id,bit:o,aos:new Array(n.capacity)}:i={kind:"tag",componentId:t.id,bit:o};return n.componentStorageByBit[o]=i,o}function x(n,t){let e=n.options.maskWordCount,o=new Uint32Array(e),s=(t&n.options.indexMask)*e;for(let r=0;r<e;r++)o[r]=n.entityMask[s+r]??0;return o}function N(n,t,e){let o=n.options.maskWordCount,s=(t&n.options.indexMask)*o;for(let r=0;r<o;r++)n.entityMask[s+r]=e[r]??0;}function g(n,t){return n.componentBitFor.get(t.id)}function Ut(n){if(!n||typeof n!="object")return false;let t=n;return typeof t.id!="number"||typeof t.version!="string"?false:b.has(t.id)}var W=1,at={i8:Int8Array,u8:Uint8Array,i16:Int16Array,u16:Uint16Array,i32:Int32Array,u32:Uint32Array,f32:Float32Array,f64:Float64Array,eid:Uint32Array,bool:Uint8Array},h=new Map;function Lt(n){let t=[];for(let[s,r]of Object.entries(n)){let a,d=1;if(typeof r=="string")a=r;else if(Array.isArray(r)){let[u,f]=r;a=u,d=f;}else throw new TypeError(`aiecsjs: invalid field declaration for "${s}"`);let c=at[a];if(!c)throw new TypeError(`aiecsjs: unknown field type "${a}" for field "${s}"`);t.push({name:s,type:a,vectorLen:d,ctor:c,bytesPerElement:c.BYTES_PER_ELEMENT});}let e=W++,o={id:e,kind:"soa",schema:n,fields:t,factory:null};return h.set(e,o),{__kind:"soa",__id:e,__schema:n}}function Tt(){let n=W++,t={id:n,kind:"tag",schema:null,fields:[],factory:null};return h.set(n,t),{__kind:"tag",__id:n}}function Ft(n){let t=W++,e=n??(()=>({})),o={id:t,kind:"aos",schema:null,fields:[],factory:e};return h.set(t,o),{__kind:"aos",__id:t,__factory:e}}function A(n){let t=h.get(n.__id);if(!t)throw new Error("aiecsjs: component is not registered (call defineComponent/defineTag/defineObjectComponent)");return t}function P(n,t,e,o){let i=y(n);if(i.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(i,t))throw new Error(`aiecsjs: addComponent on dead entity ${t}`);let s=A(e),r=D(i,s),a=x(i,t);if(m(a,r)){o!==void 0&&S(i,t,e,o);return}let d=w(a);_(d,r),G(i,t,d),S(i,t,e,o),ct(i,t,r),V(i,t,r,a,d);}function zt(n,t,e){let o=y(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,t))return;let i=A(e),s=g(o,i);if(s===void 0)return;let r=x(o,t);if(!m(r,s))return;let a=w(r);j(a,s),G(o,t,a),dt(o,t,s);let d=t&o.options.indexMask,c=o.componentStorageByBit[s];c?.kind==="soa"&&c.soa?q(c.soa,i.fields,d):c?.kind==="aos"&&c.aos&&(c.aos[d]=void 0),V(o,t,s,r,a);}function Dt(n,t,e){let o=y(n);if(!p(o,t))return false;let i=A(e),s=g(o,i);if(s===void 0)return false;let r=x(o,t);return m(r,s)}function Nt(n,t,e){let o=y(n);if(!p(o,t))return;let i=A(e),s=g(o,i);if(s===void 0)return;let r=x(o,t);if(!m(r,s))return;let a=o.componentStorageByBit[s];if(a){if(a.kind==="soa")return a.soa;if(a.kind==="aos"){let d=t&o.options.indexMask;return a.aos?.[d]}return true}}function Pt(n,t,e,o){let i=y(n);if(i.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(i,t))throw new Error(`aiecsjs: setComponent on dead entity ${t}`);let s=A(e),r=g(i,s);if(r===void 0){P(n,t,e,o);return}let a=x(i,t);if(!m(a,r)){P(n,t,e,o);return}S(i,t,e,o),ft(i,t,r,o);}function S(n,t,e,o){let i=A(e),s=n.componentBitFor.get(i.id);if(s===void 0)return;let r=n.componentStorageByBit[s];if(!r)return;let a=t&n.options.indexMask;if(i.kind==="soa"&&r.soa){if(o==null)return;let d=o;for(let c of i.fields){if(!(c.name in d))continue;let u=r.soa[c.name];if(!u)continue;let f=d[c.name];if(c.vectorLen===1)u[a]=typeof f=="boolean"?f?1:0:Number(f);else if(Array.isArray(f)||ArrayBuffer.isView(f)){let l=a*c.vectorLen,K=f;for(let k=0;k<c.vectorLen;k++)u[l+k]=Number(K[k]??0);}}}else if(i.kind==="aos"&&r.aos){let d=i.factory??(()=>({})),c=r.aos[a];if(c===void 0&&(c=d(),r.aos[a]=c),o&&typeof o=="object"){let u=o,f=c;for(let l of Object.keys(u))l==="__proto__"||l==="constructor"||l==="prototype"||(f[l]=u[l]);}}}function q(n,t,e){for(let o of t){let i=n[o.name];if(i)if(o.vectorLen===1)i[e]=0;else {let s=e*o.vectorLen;for(let r=0;r<o.vectorLen;r++)i[s+r]=0;}}}function $(n,t){let e=n.options.maskWordCount,o=t&n.options.indexMask,i=o*e;L(n.entityMask,i,e,s=>{let r=n.componentStorageByBit[s],a=n.componentInfoByBit[s];r?.kind==="soa"&&r.soa&&a?q(r.soa,a.fields,o):r?.kind==="aos"&&r.aos&&(r.aos[o]=void 0);});}function G(n,t,e){let o=t&n.options.indexMask,i=n.entityArchetype[o]??0,s=n.archetypes[i];if(!s)return;let a=z(n,e).archId,d=n.archetypes[a];if(d){if(a!==i){let c=s.entityRow.get(t);if(c!==void 0){let f=s.size-1;if(c!==f){let l=s.entities[f]??0;s.entities[c]=l,s.entityRow.set(l,c);}s.entities[f]=0,s.entityRow.delete(t),s.size--;}I(d,d.size+1);let u=d.size;d.entities[u]=t,d.entityRow.set(t,u),d.size++,n.entityArchetype[o]=a;}N(n,t,e);}}var E={fireAdd:()=>{},fireRemove:()=>{},fireSet:()=>{}},H=()=>{};function qt(n){H=n;}function V(n,t,e,o,i){H(n,t,e,o,i);}function $t(n){E=n;}function ct(n,t,e){E.fireAdd(n,t,e);}function dt(n,t,e){E.fireRemove(n,t,e);}function ft(n,t,e,o){E.fireSet(n,t,e,o);}function Gt(n){return h.get(n)}function Ht(){return Array.from(h.values())}var U=24,ut=8,Y=(1<<U)-1,X=(1<<ut)-1;function yt(n,t,e){return ((t&e.generationMask)<<e.indexBits|n&e.indexMask)>>>0}function Kt(n,t){return n&t.indexMask}function Qt(n,t){return n>>>t.indexBits&t.generationMask}function Zt(n){let t=y(n);if(t.readOnly)throw new Error("aiecsjs: cannot createEntity on a read-only world (worker-attached)");let e;if(t.freeList.length>0)e=t.freeList.pop();else {if(t.nextFreshIndex>=t.options.maxEntities)throw new Error(`aiecsjs: reached maxEntities ${t.options.maxEntities}`);t.nextFreshIndex>=t.capacity&&F(t,t.nextFreshIndex+1),e=t.nextFreshIndex++;}let o=t.generations[e]??0,i=yt(e,o,t.options),s=t.archetypes[0];if(!s)throw new Error("aiecsjs: missing empty archetype");I(s,s.size+1);let r=s.size;s.entities[r]=i,s.entityRow.set(i,r),s.size++,t.entityArchetype[e]=0;let a=t.options.maskWordCount,d=e*a;for(let c=0;c<a;c++)t.entityMask[d+c]=0;return t.size++,i}function Jt(n,t){let e=y(n);if(e.readOnly)throw new Error("aiecsjs: cannot destroyEntity on a read-only world");if(!p(e,t))return;let o=t&e.options.indexMask,{dispatchDestroyObservers:i}=pt();i(e,t),mt(e,t),$(e,t);let s=e.entityArchetype[o]??0,r=e.archetypes[s];if(r){let c=r.entityRow.get(t);if(c!==void 0){let u=r.size-1;if(c!==u){let f=r.entities[u]??0;r.entities[c]=f,r.entityRow.set(f,c);}r.entities[u]=0,r.entityRow.delete(t),r.size--;}}e.entityArchetype[o]=0;let a=e.options.maskWordCount,d=o*a;for(let c=0;c<a;c++)e.entityMask[d+c]=0;e.generations[o]=(e.generations[o]??0)+1&e.options.generationMask,e.freeList.push(o),e.size--;}function lt(n,t){let e=y(n);return p(e,t)}function p(n,t){let e=t&n.options.indexMask;if(e<=0||e>=n.capacity)return false;let o=n.entityArchetype[e]??0,i=n.archetypes[o];if(!i||!i.entityRow.has(t))return false;let s=n.generations[e]??0,r=t>>>n.options.indexBits&n.options.generationMask;return s===r}function tn(n){return n&Y}function nn(n){return n>>>U&X}function en(n,t){return ((t&X)<<U|n&Y)>>>0}function on(n,t){return typeof t!="number"?false:lt(n,t)}var B=null;function rn(n){B=n;}function pt(){return B||{dispatchDestroyObservers:()=>{}}}var M=null;function sn(n){M=n;}function mt(n,t){M&&M(n,t);}exports.A=en;exports.B=on;exports.C=rn;exports.D=sn;exports.E=Lt;exports.F=Tt;exports.G=Ft;exports.H=A;exports.I=P;exports.J=zt;exports.K=Dt;exports.L=Nt;exports.M=Pt;exports.N=qt;exports.O=$t;exports.P=Gt;exports.Q=Ht;exports.a=O;exports.b=R;exports.c=_;exports.d=xt;exports.e=ht;exports.f=At;exports.g=L;exports.h=wt;exports.i=y;exports.j=Et;exports.k=vt;exports.l=St;exports.m=Wt;exports.n=Bt;exports.o=Mt;exports.p=D;exports.q=Ut;exports.r=yt;exports.s=Kt;exports.t=Qt;exports.u=Zt;exports.v=Jt;exports.w=lt;exports.x=p;exports.y=tn;exports.z=nn;//# sourceMappingURL=chunk-IJ4BTSN2.cjs.map
2
+ //# sourceMappingURL=chunk-IJ4BTSN2.cjs.map