aiecsjs 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +46 -12
  2. package/README_ZHTW.md +46 -12
  3. package/api.json +171 -48
  4. package/dist/chunk-27JX7WHY.js +2 -0
  5. package/dist/chunk-27JX7WHY.js.map +1 -0
  6. package/dist/chunk-GJ6U2TIU.js +2 -0
  7. package/dist/chunk-GJ6U2TIU.js.map +1 -0
  8. package/dist/chunk-LNZZ4WWC.js +2 -0
  9. package/dist/chunk-LNZZ4WWC.js.map +1 -0
  10. package/dist/chunk-MVBFYRHY.cjs +2 -0
  11. package/dist/chunk-MVBFYRHY.cjs.map +1 -0
  12. package/dist/chunk-NPNWRCB5.cjs +2 -0
  13. package/dist/chunk-NPNWRCB5.cjs.map +1 -0
  14. package/dist/chunk-O4UVAWFU.cjs +2 -0
  15. package/dist/chunk-O4UVAWFU.cjs.map +1 -0
  16. package/dist/commands.cjs +1 -1
  17. package/dist/commands.cjs.map +1 -1
  18. package/dist/commands.d.cts +1 -1
  19. package/dist/commands.d.ts +1 -1
  20. package/dist/commands.js +1 -1
  21. package/dist/commands.js.map +1 -1
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +79 -13
  25. package/dist/index.d.ts +79 -13
  26. package/dist/index.js +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/loop.cjs +1 -1
  29. package/dist/loop.cjs.map +1 -1
  30. package/dist/loop.d.cts +12 -0
  31. package/dist/loop.d.ts +12 -0
  32. package/dist/loop.js +1 -1
  33. package/dist/loop.js.map +1 -1
  34. package/dist/observers.cjs +1 -1
  35. package/dist/observers.cjs.map +1 -1
  36. package/dist/observers.d.cts +7 -1
  37. package/dist/observers.d.ts +7 -1
  38. package/dist/observers.js +1 -1
  39. package/dist/observers.js.map +1 -1
  40. package/dist/relations.cjs +1 -1
  41. package/dist/relations.cjs.map +1 -1
  42. package/dist/relations.d.cts +18 -9
  43. package/dist/relations.d.ts +18 -9
  44. package/dist/relations.js +1 -1
  45. package/dist/relations.js.map +1 -1
  46. package/dist/serialize.cjs +1 -1
  47. package/dist/serialize.d.cts +30 -5
  48. package/dist/serialize.d.ts +30 -5
  49. package/dist/serialize.js +1 -1
  50. package/dist/{types-BeVLA7xG.d.cts → types-C6TkQ7HW.d.cts} +33 -0
  51. package/dist/{types-BeVLA7xG.d.ts → types-C6TkQ7HW.d.ts} +33 -0
  52. package/dist/worker.cjs +1 -1
  53. package/dist/worker.cjs.map +1 -1
  54. package/dist/worker.d.cts +10 -3
  55. package/dist/worker.d.ts +10 -3
  56. package/dist/worker.js +1 -1
  57. package/dist/worker.js.map +1 -1
  58. package/llms-full.txt +120 -18
  59. package/llms.txt +1 -0
  60. package/package.json +57 -22
  61. package/dist/chunk-3FV6UMUS.cjs +0 -2
  62. package/dist/chunk-3FV6UMUS.cjs.map +0 -1
  63. package/dist/chunk-3ZLNR4JX.cjs +0 -2
  64. package/dist/chunk-3ZLNR4JX.cjs.map +0 -1
  65. package/dist/chunk-N5OETPTK.js +0 -2
  66. package/dist/chunk-N5OETPTK.js.map +0 -1
  67. package/dist/chunk-TNZMD7E5.js +0 -2
  68. package/dist/chunk-TNZMD7E5.js.map +0 -1
  69. package/dist/chunk-YFTCD2UG.js +0 -2
  70. package/dist/chunk-YFTCD2UG.js.map +0 -1
  71. package/dist/chunk-ZIZSWIHW.cjs +0 -2
  72. package/dist/chunk-ZIZSWIHW.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/version.ts","../src/internal/bitmask.ts","../src/internal/errors.ts","../src/internal/world.ts","../src/internal/component.ts","../src/internal/entity.ts"],"names":["VERSION","createMask","wordCount","setBit","mask","bit","w","clearBit","testBit","cloneMask","src","out","i","maskHash","m","parts","isMaskZero","matches","withMask","anyMask","noneMask","anyHasBits","words","anyHit","wm","am","nm","listBits","word","ctz32","forEachSetBit","base","fn","wi","matchesEntityMask","entityMask","v","EcsError","message","DEFAULT_OPTIONS","DEFAULT_MAX_COMPONENTS","nextWorldId","worldRegistry","getWorldState","world","state","registerWorld","unregisterWorld","id","isWorldRegistered","resolveOptions","opts","o","indexBits","generationBits","maxComponents","maxByIndex","initialCapacity","maxEntities","createEmptyArchetype","maskWordCount","createWorld","options","resolved","generationCtor","generations","empty","makePublicWorld","destroyWorld","resetWorld","arch","storage","k","buf","getWorldSize","getWorldCapacity","ensureCapacity","needed","newCap","growEntityArrays","genCtor","newGen","newArch","newMask","info","growSoAColumns","soa","fields","f","old","newLen","next","findOrCreateArchetype","key","existing","collectBits","ensureArchetypeCapacity","bits","lsb","getOrRegisterComponentBit","readEntityMask","eid","writeEntityMask","tryGetComponentBit","isWorld","x","obj","nextComponentId","TYPE_CTOR","componentInfoById","defineComponent","schema","name","decl","type","vectorLen","t","len","ctor","defineTag","defineObjectComponent","factory","fac","getComponentInfo","component","addComponent","initial","isAliveInternal","prevMask","writeInitial","migrateEntity","fireAddObservers","notifyMaskChange","removeComponent","fireRemoveObservers","idx","clearSoAEntity","hasComponent","getComponent","setComponent","value","fireSetObservers","packedEid","col","val","arr","inst","target","clearAllEntityStorages","srcArchId","srcArch","destArchId","destArch","row","lastRow","moved","newRow","_dispatch","_maskChange","registerMaskChangeDispatch","prev","dispatchDestroyMaskChange","before","after","registerObserverDispatch","api","getComponentByInternalId","listAllComponents","DEFAULT_INDEX_BITS","DEFAULT_GENERATION_BITS","DEFAULT_INDEX_MASK","DEFAULT_GENERATION_MASK","packEid","gen","unpackIdx","unpackGen","createEntity","ensureEntityAtSlot","s","pos","last","destroyEntity","dispatchDestroyObservers","lazyObservers","cleanupRelationsOnDestroy","archId","entityExists","storedGen","refGen","getEntityIndex","getEntityGeneration","packEntity","index","generation","isEntity","_observersAPI","registerObserversAPI","_relationsCleanup","registerRelationsCleanup"],"mappings":"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","file":"chunk-ZIZSWIHW.cjs","sourcesContent":["export const VERSION = '0.5.8'\n","// Multi-word Uint32 bitmask helpers.\n\nexport function createMask(wordCount: number): Uint32Array {\n return new Uint32Array(wordCount)\n}\n\nexport function setBit(mask: Uint32Array, bit: number): void {\n const w = bit >>> 5\n mask[w] = (mask[w] ?? 0) | (1 << (bit & 31))\n}\n\nexport function clearBit(mask: Uint32Array, bit: number): void {\n const w = bit >>> 5\n mask[w] = (mask[w] ?? 0) & ~(1 << (bit & 31))\n}\n\nexport function testBit(mask: Uint32Array, bit: number): boolean {\n const w = bit >>> 5\n return ((mask[w] ?? 0) & (1 << (bit & 31))) !== 0\n}\n\nexport function copyMask(dst: Uint32Array, src: Uint32Array): void {\n const n = src.length\n for (let i = 0; i < n; i++) dst[i] = src[i] ?? 0\n}\n\nexport function cloneMask(src: Uint32Array): Uint32Array {\n const out = new Uint32Array(src.length)\n for (let i = 0; i < src.length; i++) out[i] = src[i] ?? 0\n return out\n}\n\nexport function maskEquals(a: Uint32Array, b: Uint32Array): boolean {\n const n = a.length\n if (b.length !== n) return false\n for (let i = 0; i < n; i++) if ((a[i] ?? 0) !== (b[i] ?? 0)) return false\n return true\n}\n\nexport function maskHash(m: Uint32Array): string {\n // Stable string key for Map lookups. Hex-joined.\n const parts: string[] = []\n for (let i = 0; i < m.length; i++) {\n parts.push((m[i] ?? 0).toString(16))\n }\n return parts.join(',')\n}\n\nexport function isMaskZero(m: Uint32Array): boolean {\n for (let i = 0; i < m.length; i++) if ((m[i] ?? 0) !== 0) return false\n return true\n}\n\nexport function unionMask(a: Uint32Array, b: Uint32Array): Uint32Array {\n const out = new Uint32Array(a.length)\n for (let i = 0; i < a.length; i++) out[i] = (a[i] ?? 0) | (b[i] ?? 0)\n return out\n}\n\n/**\n * Test whether an archetype's mask matches a query.\n * - withMask: all of these bits must be present\n * - anyMask: if anyHasBits, at least one of these bits must be present\n * - noneMask: none of these bits may be present\n */\nexport function matches(\n mask: Uint32Array,\n withMask: Uint32Array,\n anyMask: Uint32Array,\n noneMask: Uint32Array,\n anyHasBits: boolean,\n words: number,\n): boolean {\n let anyHit = !anyHasBits\n for (let w = 0; w < words; w++) {\n const m = mask[w] ?? 0\n const wm = withMask[w] ?? 0\n const am = anyMask[w] ?? 0\n const nm = noneMask[w] ?? 0\n if ((m & wm) !== wm) return false\n if ((m & nm) !== 0) return false\n if (!anyHit && (m & am) !== 0) anyHit = true\n }\n return anyHit\n}\n\nexport function listBits(mask: Uint32Array): number[] {\n const out: number[] = []\n for (let w = 0; w < mask.length; w++) {\n let word = mask[w] ?? 0\n while (word !== 0) {\n const bit = (w << 5) + ctz32(word)\n out.push(bit)\n word &= word - 1\n }\n }\n return out\n}\n\n// Iterate set bits in a slice of a larger Uint32Array starting at `base`.\n// Shared by destroy paths and storage cleanup so the bit-extraction maths\n// lives in exactly one place.\nexport function forEachSetBit(\n mask: Uint32Array,\n base: number,\n words: number,\n fn: (bit: number) => void,\n): void {\n for (let wi = 0; wi < words; wi++) {\n let word = mask[base + wi] ?? 0\n while (word !== 0) {\n const bit = (wi << 5) + ctz32(word)\n fn(bit)\n word &= word - 1\n }\n }\n}\n\n// Match a query against an entity's mask stored as a slice inside a larger\n// Uint32Array. Reading directly from the parent array avoids the temporary\n// Uint32Array allocation on every observer dispatch.\nexport function matchesEntityMask(\n entityMask: Uint32Array,\n base: number,\n words: number,\n withMask: Uint32Array,\n anyMask: Uint32Array,\n noneMask: Uint32Array,\n anyHasBits: boolean,\n): boolean {\n let anyHit = !anyHasBits\n for (let i = 0; i < words; i++) {\n const m = entityMask[base + i] ?? 0\n const wm = withMask[i] ?? 0\n const am = anyMask[i] ?? 0\n const nm = noneMask[i] ?? 0\n if ((m & wm) !== wm) return false\n if ((m & nm) !== 0) return false\n if (!anyHit && (m & am) !== 0) anyHit = true\n }\n return anyHit\n}\n\nfunction ctz32(v: number): number {\n // Count trailing zeros in a 32-bit integer (assumes v !== 0)\n return 31 - Math.clz32(v & -v)\n}\n","// aiecsjs/internal/errors — named error types for the core.\n\n/**\n * Thrown by core world/entity/component operations for invariant violations and\n * misuse (bad world options, a destroyed/unknown world, exhausted component\n * slots, capacity overflow). Carries the existing `aiecsjs: `-prefixed message.\n *\n * Catch this to distinguish an aiecsjs-originated failure from an unrelated\n * runtime error, instead of string-matching on the message. Mirrors the\n * {@link EntityNotAliveError} class style.\n *\n * @example\n * try {\n * createWorld({ indexBits: 99 })\n * } catch (err) {\n * if (err instanceof EcsError) {\n * // an aiecsjs invariant was violated\n * }\n * }\n */\nexport class EcsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'EcsError'\n }\n}\n","import { VERSION } from '../version.js'\nimport { cloneMask, copyMask, createMask, maskHash } from './bitmask.js'\nimport { EcsError } from './errors.js'\nimport type {\n ArchetypeState,\n ComponentInfo,\n FieldInfo,\n ResolvedWorldOptions,\n SoAColumns,\n World,\n WorldComponentStorage,\n WorldOptions,\n WorldState,\n} from './types.js'\n\nexport const WORLD_BRAND = Symbol.for('aiecsjs.world')\n\nconst DEFAULT_OPTIONS: Required<Omit<WorldOptions, 'buffer' | 'bufferByteOffset'>> = {\n initialCapacity: 1024,\n maxEntities: 1_000_000,\n indexBits: 24,\n generationBits: 8,\n}\n\nconst DEFAULT_MAX_COMPONENTS = 256\n\nlet nextWorldId = 1\nconst worldRegistry = new Map<number, WorldState>()\n\nexport function getWorldState(world: World): WorldState {\n const state = worldRegistry.get(world.id)\n if (!state) throw new EcsError(`aiecsjs: world ${world.id} is destroyed or unknown`)\n if (state.destroyed) throw new EcsError(`aiecsjs: world ${world.id} is destroyed`)\n return state\n}\n\nexport function registerWorld(state: WorldState): void {\n worldRegistry.set(state.id, state)\n}\n\nexport function unregisterWorld(id: number): void {\n worldRegistry.delete(id)\n}\n\nexport function isWorldRegistered(id: number): boolean {\n return worldRegistry.has(id)\n}\n\nfunction resolveOptions(opts: WorldOptions | undefined): ResolvedWorldOptions {\n const o = opts ?? {}\n const indexBits = o.indexBits ?? DEFAULT_OPTIONS.indexBits\n const generationBits = o.generationBits ?? DEFAULT_OPTIONS.generationBits\n const maxComponents = DEFAULT_MAX_COMPONENTS\n if (indexBits < 1 || indexBits > 24) {\n throw new EcsError('aiecsjs: indexBits must be in [1, 24]')\n }\n if (generationBits < 0 || generationBits > 16) {\n throw new EcsError('aiecsjs: generationBits must be in [0, 16]')\n }\n if (indexBits + generationBits > 32) {\n throw new EcsError(\n `aiecsjs: indexBits (${indexBits}) + generationBits (${generationBits}) must be <= 32`,\n )\n }\n const maxByIndex = 1 << indexBits\n const initialCapacity = Math.max(\n 1,\n Math.min(o.initialCapacity ?? DEFAULT_OPTIONS.initialCapacity, maxByIndex),\n )\n const maxEntities = Math.max(\n initialCapacity,\n Math.min(o.maxEntities ?? DEFAULT_OPTIONS.maxEntities, maxByIndex),\n )\n return {\n initialCapacity,\n maxEntities,\n indexBits,\n generationBits,\n indexMask: (1 << indexBits) - 1,\n generationMask: generationBits === 0 ? 0 : (1 << generationBits) - 1,\n maxComponents,\n maskWordCount: Math.ceil(maxComponents / 32),\n buffer: o.buffer ?? null,\n bufferByteOffset: o.bufferByteOffset ?? 0,\n }\n}\n\nexport function createEmptyArchetype(maskWordCount: number, maxComponents: number): ArchetypeState {\n return {\n id: 0,\n mask: createMask(maskWordCount),\n size: 0,\n capacity: 16,\n entities: new Uint32Array(16),\n entityRow: new Map<number, number>(),\n componentBits: [],\n edgeAdd: new Int32Array(maxComponents).fill(-1),\n edgeRemove: new Int32Array(maxComponents).fill(-1),\n }\n}\n\nexport function createWorld(options?: WorldOptions): World {\n const resolved = resolveOptions(options)\n const id = nextWorldId++\n\n const generationCtor = resolved.generationBits > 8 ? Uint16Array : Uint8Array\n const generations = new generationCtor(resolved.initialCapacity)\n\n const state: WorldState = {\n id,\n capacity: resolved.initialCapacity,\n version: VERSION,\n options: resolved,\n size: 0,\n nextFreshIndex: 1, // 0 reserved\n freeList: [],\n generations,\n destroyed: false,\n componentBitFor: new Map<number, number>(),\n componentInfoByBit: new Array(resolved.maxComponents).fill(null),\n componentStorageByBit: new Array(resolved.maxComponents).fill(null),\n nextComponentBit: 0,\n entityArchetype: new Uint32Array(resolved.initialCapacity),\n entityMask: new Uint32Array(resolved.initialCapacity * resolved.maskWordCount),\n archetypes: [],\n archetypeByMaskHash: new Map<string, number>(),\n queryVersion: 0,\n queries: [],\n queryMasks: new Map(),\n queryArchetypeCache: [],\n queryArchetypeStamp: [],\n bitToQueries: new Map<number, Set<number>>(),\n reactiveBuffers: new Map(),\n observers: [],\n relationStorage: new Map(),\n sab: resolved.buffer,\n readOnly: false,\n }\n\n // Seed archetype 0 (the empty mask)\n const empty = createEmptyArchetype(resolved.maskWordCount, resolved.maxComponents)\n empty.id = 0\n state.archetypes.push(empty)\n state.archetypeByMaskHash.set(maskHash(empty.mask), 0)\n\n registerWorld(state)\n return makePublicWorld(state)\n}\n\nexport function makePublicWorld(state: WorldState): World {\n return {\n id: state.id,\n get capacity() {\n return state.capacity\n },\n version: state.version,\n } as World\n}\n\nexport function destroyWorld(world: World): void {\n const state = worldRegistry.get(world.id)\n if (!state || state.destroyed) return\n state.destroyed = true\n // Clear large buffers to help GC. Post-dispose ops already throw via\n // getWorldState (state.destroyed), so releasing internal state can't regress\n // live behaviour; the capacity getter closure in makePublicWorld is the only\n // thing pinning `state`, so we must drop the big per-entity arrays here or\n // they survive as long as the (typically retained) public world handle.\n state.archetypes = []\n state.archetypeByMaskHash.clear()\n state.componentInfoByBit = []\n state.componentStorageByBit = []\n state.queries = []\n state.queryMasks.clear()\n state.queryArchetypeCache = []\n state.observers = []\n state.relationStorage.clear()\n state.reactiveBuffers.clear()\n // Release the remaining large per-entity arrays / indices that the original\n // \"clear large buffers\" pass left allocated (these dominate memory for big\n // worlds). Swap to length-0 instances rather than mutating in place.\n state.entityMask = new Uint32Array(0)\n state.entityArchetype = new Uint32Array(0)\n state.generations = new Uint8Array(0)\n state.freeList = []\n state.componentBitFor.clear()\n state.bitToQueries.clear()\n state.queryArchetypeStamp = []\n state.sab = null\n unregisterWorld(world.id)\n}\n\nexport function resetWorld(world: World): void {\n const state = getWorldState(world)\n // Keep capacity and registered components; clear entities and per-entity state.\n state.size = 0\n state.nextFreshIndex = 1\n state.freeList = []\n state.generations.fill(0)\n state.entityArchetype.fill(0)\n state.entityMask.fill(0)\n // Wipe archetype memberships but keep archetype graph for stability.\n for (const arch of state.archetypes) {\n arch.size = 0\n arch.entityRow.clear()\n }\n // Clear SoA columns and AoS instances; storage allocation is preserved.\n for (const storage of state.componentStorageByBit) {\n if (!storage) continue\n if (storage.kind === 'soa' && storage.soa) {\n for (const k of Object.keys(storage.soa)) {\n storage.soa[k]?.fill(0)\n }\n } else if (storage.kind === 'aos' && storage.aos) {\n storage.aos.fill(undefined as unknown as never)\n }\n }\n state.queryVersion++\n for (const buf of state.reactiveBuffers.values()) {\n buf.entered.length = 0\n buf.exited.length = 0\n }\n}\n\nexport function getWorldSize(world: World): number {\n return getWorldState(world).size\n}\n\nexport function getWorldCapacity(world: World): number {\n return getWorldState(world).capacity\n}\n\n// --- Capacity growth ---\n\nexport function ensureCapacity(state: WorldState, needed: number): void {\n if (needed <= state.capacity) return\n if (needed > state.options.maxEntities) {\n throw new EcsError(\n `aiecsjs: requested capacity ${needed} exceeds maxEntities ${state.options.maxEntities}`,\n )\n }\n let newCap = state.capacity\n while (newCap < needed) newCap = Math.min(newCap * 2, state.options.maxEntities)\n growEntityArrays(state, newCap)\n}\n\nfunction growEntityArrays(state: WorldState, newCap: number): void {\n // generations\n const genCtor = state.generations.constructor as new (len: number) => Uint8Array | Uint16Array\n const newGen = new genCtor(newCap)\n ;(newGen as Uint8Array).set(state.generations as Uint8Array)\n state.generations = newGen\n\n // entityArchetype\n const newArch = new Uint32Array(newCap)\n newArch.set(state.entityArchetype)\n state.entityArchetype = newArch\n\n // entityMask\n const wordCount = state.options.maskWordCount\n const newMask = new Uint32Array(newCap * wordCount)\n newMask.set(state.entityMask)\n state.entityMask = newMask\n\n // Component storages (SoA columns + AoS arrays)\n for (const storage of state.componentStorageByBit) {\n if (!storage) continue\n if (storage.kind === 'soa' && storage.soa) {\n const info = state.componentInfoByBit[storage.bit]\n if (info) growSoAColumns(storage.soa, info.fields, newCap)\n } else if (storage.kind === 'aos' && storage.aos) {\n storage.aos.length = newCap\n }\n }\n\n state.capacity = newCap\n}\n\nfunction growSoAColumns(soa: SoAColumns, fields: FieldInfo[], newCap: number): void {\n for (const f of fields) {\n const old = soa[f.name]\n if (!old) continue\n const newLen = newCap * f.vectorLen\n if (old.length >= newLen) continue\n const next = new f.ctor(newLen)\n next.set(old)\n soa[f.name] = next\n }\n}\n\n// --- Archetype management ---\n\nexport function findOrCreateArchetype(\n state: WorldState,\n mask: Uint32Array,\n): { archId: number; created: boolean } {\n const key = maskHash(mask)\n const existing = state.archetypeByMaskHash.get(key)\n if (existing !== undefined) return { archId: existing, created: false }\n\n const id = state.archetypes.length\n const arch: ArchetypeState = {\n id,\n mask: cloneMask(mask),\n size: 0,\n capacity: 16,\n entities: new Uint32Array(16),\n entityRow: new Map<number, number>(),\n componentBits: collectBits(mask),\n edgeAdd: new Int32Array(state.options.maxComponents).fill(-1),\n edgeRemove: new Int32Array(state.options.maxComponents).fill(-1),\n }\n state.archetypes.push(arch)\n state.archetypeByMaskHash.set(key, id)\n state.queryVersion++\n return { archId: id, created: true }\n}\n\nexport function ensureArchetypeCapacity(arch: ArchetypeState, needed: number): void {\n if (needed <= arch.capacity) return\n let newCap = arch.capacity\n while (newCap < needed) newCap *= 2\n const next = new Uint32Array(newCap)\n next.set(arch.entities)\n arch.entities = next\n arch.capacity = newCap\n}\n\nfunction collectBits(mask: Uint32Array): number[] {\n const bits: number[] = []\n for (let w = 0; w < mask.length; w++) {\n let word = mask[w] ?? 0\n while (word !== 0) {\n const lsb = word & -word\n const bit = (w << 5) + (31 - Math.clz32(lsb))\n bits.push(bit)\n word &= word - 1\n }\n }\n return bits\n}\n\n// --- Component registration in a world ---\n\nexport function getOrRegisterComponentBit(state: WorldState, info: ComponentInfo): number {\n const existing = state.componentBitFor.get(info.id)\n if (existing !== undefined) return existing\n\n if (state.nextComponentBit >= state.options.maxComponents) {\n throw new EcsError(`aiecsjs: world reached maxComponents=${state.options.maxComponents}`)\n }\n const bit = state.nextComponentBit++\n state.componentBitFor.set(info.id, bit)\n state.componentInfoByBit[bit] = info\n\n // Create storage\n let storage: WorldComponentStorage\n if (info.kind === 'soa') {\n const soa: SoAColumns = {}\n for (const f of info.fields) {\n soa[f.name] = new f.ctor(state.capacity * f.vectorLen)\n }\n storage = { kind: 'soa', componentId: info.id, bit, soa }\n } else if (info.kind === 'aos') {\n storage = { kind: 'aos', componentId: info.id, bit, aos: new Array(state.capacity) }\n } else {\n storage = { kind: 'tag', componentId: info.id, bit }\n }\n state.componentStorageByBit[bit] = storage\n return bit\n}\n\n// Read a bitmask out of state.entityMask[] into a fresh Uint32Array.\nexport function readEntityMask(state: WorldState, eid: number): Uint32Array {\n const w = state.options.maskWordCount\n const out = new Uint32Array(w)\n const idx = eid & state.options.indexMask\n const base = idx * w\n for (let i = 0; i < w; i++) out[i] = state.entityMask[base + i] ?? 0\n return out\n}\n\nexport function writeEntityMask(state: WorldState, eid: number, mask: Uint32Array): void {\n const w = state.options.maskWordCount\n const idx = eid & state.options.indexMask\n const base = idx * w\n for (let i = 0; i < w; i++) state.entityMask[base + i] = mask[i] ?? 0\n}\n\n// Get the bit of a component within a world without registering.\nexport function tryGetComponentBit(state: WorldState, info: ComponentInfo): number | undefined {\n return state.componentBitFor.get(info.id)\n}\n\nexport function isWorld(x: unknown): x is World {\n if (!x || typeof x !== 'object') return false\n const obj = x as { id?: unknown; version?: unknown }\n if (typeof obj.id !== 'number') return false\n if (typeof obj.version !== 'string') return false\n return worldRegistry.has(obj.id)\n}\n","import { clearBit, cloneMask, forEachSetBit, setBit, testBit } from './bitmask.js'\nimport { isAliveInternal } from './entity.js'\nimport type {\n AoSComponent,\n ComponentInfo,\n ComponentInit,\n ComponentLike,\n EntityId,\n FieldInfo,\n SoAColumns,\n SoAComponent,\n SoAFieldDecl,\n SoAFieldType,\n SoASchema,\n TagComponent,\n TypedArrayConstructor,\n World,\n WorldComponentStorage,\n WorldState,\n} from './types.js'\nimport {\n ensureArchetypeCapacity,\n findOrCreateArchetype,\n getOrRegisterComponentBit,\n getWorldState,\n readEntityMask,\n tryGetComponentBit,\n writeEntityMask,\n} from './world.js'\n\n// --- Component factories ---\n\nlet nextComponentId = 1\n\nconst TYPE_CTOR: Record<string, TypedArrayConstructor> = {\n i8: Int8Array,\n u8: Uint8Array,\n i16: Int16Array,\n u16: Uint16Array,\n i32: Int32Array,\n u32: Uint32Array,\n f32: Float32Array,\n f64: Float64Array,\n eid: Uint32Array,\n bool: Uint8Array,\n}\n\nconst componentInfoById = new Map<number, ComponentInfo>()\n\nexport function defineComponent<S extends SoASchema>(schema: S): SoAComponent<S> {\n const fields: FieldInfo[] = []\n for (const [name, decl] of Object.entries(schema) as [string, SoAFieldDecl][]) {\n let type: SoAFieldType\n let vectorLen = 1\n if (typeof decl === 'string') {\n type = decl\n } else if (Array.isArray(decl)) {\n const [t, len] = decl\n type = t\n vectorLen = len\n } else {\n throw new TypeError(`aiecsjs: invalid field declaration for \"${name}\"`)\n }\n const ctor = TYPE_CTOR[type]\n if (!ctor) throw new TypeError(`aiecsjs: unknown field type \"${type}\" for field \"${name}\"`)\n fields.push({\n name,\n type,\n vectorLen,\n ctor,\n bytesPerElement: ctor.BYTES_PER_ELEMENT,\n })\n }\n const id = nextComponentId++\n const info: ComponentInfo = { id, kind: 'soa', schema, fields, factory: null }\n componentInfoById.set(id, info)\n const handle: SoAComponent<S> = {\n __kind: 'soa',\n __id: id,\n __schema: schema,\n }\n return handle\n}\n\nexport function defineTag(): TagComponent {\n const id = nextComponentId++\n const info: ComponentInfo = { id, kind: 'tag', schema: null, fields: [], factory: null }\n componentInfoById.set(id, info)\n return { __kind: 'tag', __id: id }\n}\n\nexport function defineObjectComponent<T>(factory?: () => T): AoSComponent<T> {\n const id = nextComponentId++\n const fac = factory ?? (() => ({}) as T)\n const info: ComponentInfo = {\n id,\n kind: 'aos',\n schema: null,\n fields: [],\n factory: fac as () => unknown,\n }\n componentInfoById.set(id, info)\n return { __kind: 'aos', __id: id, __factory: fac }\n}\n\nexport function getComponentInfo(component: ComponentLike): ComponentInfo {\n const info = componentInfoById.get(component.__id)\n if (!info)\n throw new Error(\n 'aiecsjs: component is not registered (call defineComponent/defineTag/defineObjectComponent)',\n )\n return info\n}\n\n// --- Component ops on entities ---\n\nexport function addComponent<C extends ComponentLike>(\n world: World,\n eid: EntityId,\n component: C,\n initial?: ComponentInit<C>,\n): void {\n const state = getWorldState(world)\n if (state.readOnly) throw new Error('aiecsjs: cannot mutate a read-only world')\n if (!isAliveInternal(state, eid)) {\n throw new Error(`aiecsjs: addComponent on dead entity ${eid}`)\n }\n const info = getComponentInfo(component)\n const bit = getOrRegisterComponentBit(state, info)\n\n const prevMask = readEntityMask(state, eid)\n if (testBit(prevMask, bit)) {\n if (initial !== undefined) writeInitial(state, eid as number, component, initial)\n return\n }\n const newMask = cloneMask(prevMask)\n setBit(newMask, bit)\n migrateEntity(state, eid as number, newMask)\n\n writeInitial(state, eid as number, component, initial)\n\n fireAddObservers(state, eid, bit)\n notifyMaskChange(state, eid, bit, prevMask, newMask)\n}\n\nexport function removeComponent<C extends ComponentLike>(\n world: World,\n eid: EntityId,\n component: C,\n): void {\n const state = getWorldState(world)\n if (state.readOnly) throw new Error('aiecsjs: cannot mutate a read-only world')\n if (!isAliveInternal(state, eid)) return\n const info = getComponentInfo(component)\n const bit = tryGetComponentBit(state, info)\n if (bit === undefined) return\n const prevMask = readEntityMask(state, eid)\n if (!testBit(prevMask, bit)) return\n\n // Write the new mask BEFORE firing observers so query-targeted observers\n // reading `state.entityMask` see the post-removal state (and thus correctly\n // detect \"entity left this query\"). Without this reorder, a query that\n // requires the removed component would still match during dispatch and the\n // remove observer would never fire. Component-targeted observers receive the\n // bit directly and don't depend on mask timing. addComponent already follows\n // this \"mutate then fire\" order; keeping removeComponent consistent.\n const newMask = cloneMask(prevMask)\n clearBit(newMask, bit)\n migrateEntity(state, eid as number, newMask)\n\n fireRemoveObservers(state, eid, bit)\n\n const idx = (eid as number) & state.options.indexMask\n const storage = state.componentStorageByBit[bit]\n if (storage?.kind === 'soa' && storage.soa) {\n clearSoAEntity(storage.soa, info.fields, idx)\n } else if (storage?.kind === 'aos' && storage.aos) {\n storage.aos[idx] = undefined\n }\n\n notifyMaskChange(state, eid, bit, prevMask, newMask)\n}\n\nexport function hasComponent<C extends ComponentLike>(\n world: World,\n eid: EntityId,\n component: C,\n): boolean {\n const state = getWorldState(world)\n if (!isAliveInternal(state, eid)) return false\n const info = getComponentInfo(component)\n const bit = tryGetComponentBit(state, info)\n if (bit === undefined) return false\n const mask = readEntityMask(state, eid)\n return testBit(mask, bit)\n}\n\nexport function getComponent<C extends ComponentLike>(\n world: World,\n eid: EntityId,\n component: C,\n): unknown {\n const state = getWorldState(world)\n if (!isAliveInternal(state, eid)) return undefined\n const info = getComponentInfo(component)\n const bit = tryGetComponentBit(state, info)\n if (bit === undefined) return undefined\n const mask = readEntityMask(state, eid)\n if (!testBit(mask, bit)) return undefined\n const storage = state.componentStorageByBit[bit]\n if (!storage) return undefined\n if (storage.kind === 'soa') return storage.soa\n if (storage.kind === 'aos') {\n const idx = (eid as number) & state.options.indexMask\n return storage.aos?.[idx]\n }\n return true // tag\n}\n\nexport function setComponent<C extends ComponentLike, V>(\n world: World,\n eid: EntityId,\n component: C,\n value: V,\n): void {\n const state = getWorldState(world)\n if (state.readOnly) throw new Error('aiecsjs: cannot mutate a read-only world')\n if (!isAliveInternal(state, eid)) throw new Error(`aiecsjs: setComponent on dead entity ${eid}`)\n const info = getComponentInfo(component)\n const bit = tryGetComponentBit(state, info)\n if (bit === undefined) {\n // Adding via set\n addComponent(world, eid, component, value as ComponentInit<C>)\n return\n }\n const mask = readEntityMask(state, eid)\n if (!testBit(mask, bit)) {\n addComponent(world, eid, component, value as ComponentInit<C>)\n return\n }\n writeInitial(state, eid as number, component, value)\n fireSetObservers(state, eid, bit, value)\n}\n\n// --- Internals ---\n\nfunction writeInitial(\n state: WorldState,\n packedEid: number,\n component: ComponentLike,\n initial: unknown,\n): void {\n const info = getComponentInfo(component)\n const bit = state.componentBitFor.get(info.id)\n if (bit === undefined) return\n const storage = state.componentStorageByBit[bit]\n if (!storage) return\n // Unpack to raw index for storage access\n const idx = packedEid & state.options.indexMask\n if (info.kind === 'soa' && storage.soa) {\n if (initial == null) return\n const obj = initial as Record<string, unknown>\n for (const f of info.fields) {\n if (!(f.name in obj)) continue\n const col = storage.soa[f.name]\n if (!col) continue\n const val = obj[f.name]\n if (f.vectorLen === 1) {\n col[idx] = typeof val === 'boolean' ? (val ? 1 : 0) : Number(val)\n } else if (Array.isArray(val) || ArrayBuffer.isView(val)) {\n const base = idx * f.vectorLen\n const arr = val as ArrayLike<number>\n for (let i = 0; i < f.vectorLen; i++) col[base + i] = Number(arr[i] ?? 0)\n }\n }\n } else if (info.kind === 'aos' && storage.aos) {\n const factory = info.factory ?? (() => ({}))\n let inst = storage.aos[idx]\n if (inst === undefined) {\n inst = factory()\n storage.aos[idx] = inst\n }\n if (initial && typeof initial === 'object') {\n // SECURITY: do NOT use `Object.assign(inst, initial)` here. When `initial`\n // comes from `JSON.parse(untrustedBytes)` — e.g. via `fromJSON`,\n // `deserializeWorld`, or app code piping a bridge payload — the parsed\n // object can carry an OWN `__proto__` property, and `Object.assign` uses\n // [[Set]] semantics which would trigger the proto setter and clobber the\n // instance's prototype chain. Explicit own-key copy with a deny-list\n // closes the prototype-pollution path.\n const src = initial as Record<string, unknown>\n const target = inst as Record<string, unknown>\n for (const key of Object.keys(src)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue\n target[key] = src[key]\n }\n }\n }\n // tag: nothing\n}\n\nfunction clearSoAEntity(soa: SoAColumns, fields: FieldInfo[], eid: number): void {\n for (const f of fields) {\n const col = soa[f.name]\n if (!col) continue\n if (f.vectorLen === 1) {\n col[eid] = 0\n } else {\n const base = eid * f.vectorLen\n for (let i = 0; i < f.vectorLen; i++) col[base + i] = 0\n }\n }\n}\n\n// Clear every component-storage slot that the entity currently owns.\n// Walks the entity's mask; for each set bit, zeroes the SoA columns or\n// undefines the AoS slot at the entity index. Tag storages are bit-only.\n// Caller (e.g. destroyEntity) is expected to clear the mask separately.\nexport function clearAllEntityStorages(state: WorldState, eid: EntityId): void {\n const wordCount = state.options.maskWordCount\n const idx = (eid as number) & state.options.indexMask\n const base = idx * wordCount\n forEachSetBit(state.entityMask, base, wordCount, (bit) => {\n const storage = state.componentStorageByBit[bit]\n const info = state.componentInfoByBit[bit]\n if (storage?.kind === 'soa' && storage.soa && info) {\n clearSoAEntity(storage.soa, info.fields, idx)\n } else if (storage?.kind === 'aos' && storage.aos) {\n storage.aos[idx] = undefined\n }\n })\n}\n\nfunction migrateEntity(state: WorldState, packedEid: number, newMask: Uint32Array): void {\n // Unpack to raw index for sparse-array lookups\n const idx = packedEid & state.options.indexMask\n const srcArchId = state.entityArchetype[idx] ?? 0\n const srcArch = state.archetypes[srcArchId]\n if (!srcArch) return\n\n const found = findOrCreateArchetype(state, newMask)\n const destArchId = found.archId\n const destArch = state.archetypes[destArchId]\n if (!destArch) return\n\n if (destArchId !== srcArchId) {\n // Swap-pop from src (arch.entities / entityRow use packed eid as key)\n const row = srcArch.entityRow.get(packedEid)\n if (row !== undefined) {\n const lastRow = srcArch.size - 1\n if (row !== lastRow) {\n const moved = srcArch.entities[lastRow] ?? 0\n srcArch.entities[row] = moved\n srcArch.entityRow.set(moved, row)\n }\n srcArch.entities[lastRow] = 0\n srcArch.entityRow.delete(packedEid)\n srcArch.size--\n }\n\n // Append to dest (store packed eid)\n ensureArchetypeCapacity(destArch, destArch.size + 1)\n const newRow = destArch.size\n destArch.entities[newRow] = packedEid\n destArch.entityRow.set(packedEid, newRow)\n destArch.size++\n\n state.entityArchetype[idx] = destArchId\n }\n\n writeEntityMask(state, packedEid, newMask)\n}\n\n// --- Observer dispatch (lazy-bound) ---\n\ninterface ObserversDispatchAPI {\n fireAdd(state: WorldState, eid: EntityId, bit: number): void\n fireRemove(state: WorldState, eid: EntityId, bit: number): void\n fireSet(state: WorldState, eid: EntityId, bit: number, value: unknown): void\n}\nlet _dispatch: ObserversDispatchAPI = {\n fireAdd: () => {},\n fireRemove: () => {},\n fireSet: () => {},\n}\n\ntype MaskChangeFn = (\n state: WorldState,\n eid: EntityId,\n bit: number,\n prev: Uint32Array,\n next: Uint32Array,\n) => void\nlet _maskChange: MaskChangeFn = () => {}\nexport function registerMaskChangeDispatch(fn: MaskChangeFn): void {\n _maskChange = fn\n}\nfunction notifyMaskChange(\n state: WorldState,\n eid: number,\n bit: number,\n prev: Uint32Array,\n next: Uint32Array,\n): void {\n _maskChange(state, eid as EntityId, bit, prev, next)\n}\n\n// Fire the reactive enter/exit mask-change notification for an entity being\n// destroyed. destroyEntity clears the entity's mask wholesale rather than\n// removing components one-by-one, so it never reaches removeComponent's\n// `notifyMaskChange` call — leaving exitQuery buffers empty on destroy while a\n// component-by-component teardown would have populated them (asymmetric with\n// observe(q,'remove')). We replay the removals here.\n//\n// CORRECTNESS: transition ONE bit at a time through evolving masks, exactly as a\n// sequence of removeComponent() calls would. Passing a single (prevMask, empty)\n// pair once per set bit double-counts — a query matching on several of the\n// entity's components would see wasMatch=true,isMatch=false on every bit and push\n// the same exit N times. Clearing bits incrementally flips wasMatch=false after\n// the first component that breaks each query's match, so every query records\n// exactly one exit.\n//\n// SNAPSHOT DISCIPLINE: `prevMask` is captured at destroy entry (a private copy,\n// same discipline as dispatchDestroyObservers' preMask) so reentrant handlers\n// run earlier in destroy cannot mutate live state and suppress the exit. We\n// iterate that snapshot and mutate only our own clones.\nexport function dispatchDestroyMaskChange(\n state: WorldState,\n eid: EntityId,\n prevMask: Uint32Array,\n): void {\n const w = state.options.maskWordCount\n const before = cloneMask(prevMask) // current bit still set\n const after = cloneMask(prevMask) // current bit cleared\n forEachSetBit(prevMask, 0, w, (bit) => {\n clearBit(after, bit)\n notifyMaskChange(state, eid as number, bit, before, after)\n clearBit(before, bit)\n })\n}\nexport function registerObserverDispatch(api: ObserversDispatchAPI): void {\n _dispatch = api\n}\nfunction fireAddObservers(state: WorldState, eid: number, bit: number): void {\n _dispatch.fireAdd(state, eid as EntityId, bit)\n}\nfunction fireRemoveObservers(state: WorldState, eid: number, bit: number): void {\n _dispatch.fireRemove(state, eid as EntityId, bit)\n}\nfunction fireSetObservers(state: WorldState, eid: number, bit: number, value: unknown): void {\n _dispatch.fireSet(state, eid as EntityId, bit, value)\n}\n\n// --- Helper for serialize/worker ---\n\nexport function getComponentByInternalId(id: number): ComponentInfo | undefined {\n return componentInfoById.get(id)\n}\n\nexport function listAllComponents(): ComponentInfo[] {\n return Array.from(componentInfoById.values())\n}\n\nexport function _resetComponentRegistry_FOR_TESTS_ONLY(): void {\n componentInfoById.clear()\n nextComponentId = 1\n}\n","import { clearAllEntityStorages, dispatchDestroyMaskChange } from './component.js'\nimport type { EntityId, ResolvedWorldOptions, World, WorldState } from './types.js'\nimport { ensureArchetypeCapacity, ensureCapacity, getWorldState, readEntityMask } from './world.js'\n\n// --- Default bit layout constants (used by public getEntityIndex / getEntityGeneration / packEntity) ---\n// These use the default 24/8 split. See §4.4 limitation: callers using non-default\n// createWorld({ indexBits, generationBits }) should not rely on these functions for unpacking.\nexport const DEFAULT_INDEX_BITS = 24\nexport const DEFAULT_GENERATION_BITS = 8\nexport const DEFAULT_INDEX_MASK = (1 << DEFAULT_INDEX_BITS) - 1\nexport const DEFAULT_GENERATION_MASK = (1 << DEFAULT_GENERATION_BITS) - 1\n\n// --- Internal pack/unpack helpers (world-options-aware) ---\n\nexport function packEid(idx: number, gen: number, opts: ResolvedWorldOptions): EntityId {\n // `>>> 0` normalises to unsigned: for generation ≥ 128 (default 8-bit gen) the\n // signed `<<`/`|` would yield a negative number that diverges from the unsigned\n // value stored in `arch.entities` (Uint32Array), breaking entityRow lookups for\n // query-iterated high-generation entities. Keep EntityId a non-negative int32.\n return ((((gen & opts.generationMask) << opts.indexBits) | (idx & opts.indexMask)) >>>\n 0) as EntityId\n}\n\nexport function unpackIdx(eid: number, opts: ResolvedWorldOptions): number {\n return eid & opts.indexMask\n}\n\nexport function unpackGen(eid: number, opts: ResolvedWorldOptions): number {\n return (eid >>> opts.indexBits) & opts.generationMask\n}\n\nexport function createEntity(world: World): EntityId {\n const state = getWorldState(world)\n if (state.readOnly) {\n throw new Error('aiecsjs: cannot createEntity on a read-only world (worker-attached)')\n }\n\n let idx: number\n if (state.freeList.length > 0) {\n idx = state.freeList.pop()!\n } else {\n if (state.nextFreshIndex >= state.options.maxEntities) {\n throw new Error(`aiecsjs: reached maxEntities ${state.options.maxEntities}`)\n }\n if (state.nextFreshIndex >= state.capacity) {\n ensureCapacity(state, state.nextFreshIndex + 1)\n }\n idx = state.nextFreshIndex++\n }\n\n const gen = state.generations[idx] ?? 0\n const eid = packEid(idx, gen, state.options)\n\n // Move into the empty archetype (0)\n const arch = state.archetypes[0]\n if (!arch) throw new Error('aiecsjs: missing empty archetype')\n ensureArchetypeCapacity(arch, arch.size + 1)\n const row = arch.size\n arch.entities[row] = eid\n arch.entityRow.set(eid, row)\n arch.size++\n\n state.entityArchetype[idx] = 0\n // Reset entityMask row for this idx\n const w = state.options.maskWordCount\n const base = idx * w\n for (let i = 0; i < w; i++) state.entityMask[base + i] = 0\n\n state.size++\n return eid\n}\n\n// Ensure a LIVE entity occupies slot `idx`, returning its packed EntityId.\n// Used by delta apply() to materialise a replica entity at the SAME slot the\n// source used (the wire stores raw slot indices), so a source eid keeps\n// addressing the replica by slot. Mirrors createEntity's placement but targets\n// a specific slot:\n// - slot already live -> reuse it (return its current packed id)\n// - slot in the freeList -> reclaim it\n// - slot beyond the frontier -> advance nextFreshIndex, pushing the skipped\n// slots onto the freeList so they remain\n// allocatable (mirrors holes in the source)\n// The slot's CURRENT generation is used (never gen=0), so a replica whose\n// generation has advanced is handled without a dead-entity throw.\nexport function ensureEntityAtSlot(state: WorldState, idx: number): EntityId {\n if (state.readOnly) {\n /* v8 ignore next — defensive: apply() only writes to writable worlds */\n throw new Error('aiecsjs: cannot create entities on a read-only world (worker-attached)')\n }\n if (idx <= 0 || idx >= state.options.maxEntities) {\n /* v8 ignore next — defensive: apply() pre-guards the eid range */\n throw new Error(`aiecsjs: slot index ${idx} out of range`)\n }\n if (idx >= state.capacity) ensureCapacity(state, idx + 1)\n\n const gen = state.generations[idx] ?? 0\n const eid = packEid(idx, gen, state.options)\n if (isAliveInternal(state, eid)) return eid // already live — reuse\n\n // Reclaim the free slot.\n if (idx >= state.nextFreshIndex) {\n // Free the slots we skip over so they can still be allocated later.\n for (let s = state.nextFreshIndex; s < idx; s++) state.freeList.push(s)\n state.nextFreshIndex = idx + 1\n } else {\n // Below the frontier, so the slot must be in the freeList — remove it.\n const pos = state.freeList.lastIndexOf(idx)\n if (pos !== -1) {\n const last = state.freeList.length - 1\n state.freeList[pos] = state.freeList[last]!\n state.freeList.pop()\n }\n }\n\n // Place into the empty archetype (0) — identical to createEntity's tail.\n const arch = state.archetypes[0]\n if (!arch) throw new Error('aiecsjs: missing empty archetype')\n ensureArchetypeCapacity(arch, arch.size + 1)\n const row = arch.size\n arch.entities[row] = eid\n arch.entityRow.set(eid, row)\n arch.size++\n\n state.entityArchetype[idx] = 0\n const w = state.options.maskWordCount\n const base = idx * w\n for (let i = 0; i < w; i++) state.entityMask[base + i] = 0\n\n state.size++\n return eid\n}\n\nexport function destroyEntity(world: World, eid: EntityId): void {\n const state = getWorldState(world)\n if (state.readOnly) {\n throw new Error('aiecsjs: cannot destroyEntity on a read-only world')\n }\n if (!isAliveInternal(state, eid)) return\n\n const idx = eid & state.options.indexMask\n\n // Snapshot the pre-destroy mask BEFORE any teardown runs. dispatchDestroyObservers\n // (and relation cleanup) may reentrantly mutate live state.entityMask; capturing\n // here lets the reactive exit notification below fire against the state at destroy\n // entry — same snapshot discipline dispatchDestroyObservers uses for its preMask.\n const prevMask = readEntityMask(state, eid)\n\n // Fire onRemove for every component the entity has, plus reactive exit\n // (Late-bound to avoid circular imports — done via observers module.)\n const { dispatchDestroyObservers } = lazyObservers()\n dispatchDestroyObservers(state, eid)\n\n // Clean up relations referring to this entity\n cleanupRelationsOnDestroy(state, eid)\n\n // Zero the SoA columns / undefine the AoS slots the entity owned, before\n // the mask is cleared. Without this, destroyed entities leave stale data\n // visible to snapshots and serialisation.\n clearAllEntityStorages(state, eid)\n\n // Swap-pop from its archetype\n const archId = state.entityArchetype[idx] ?? 0\n const arch = state.archetypes[archId]\n if (arch) {\n const row = arch.entityRow.get(eid)\n if (row !== undefined) {\n const lastRow = arch.size - 1\n if (row !== lastRow) {\n const moved = arch.entities[lastRow] ?? 0\n arch.entities[row] = moved\n arch.entityRow.set(moved, row)\n }\n arch.entities[lastRow] = 0\n arch.entityRow.delete(eid)\n arch.size--\n }\n }\n\n // Notify the REACTIVE enter/exit surface that the entity is leaving every\n // query it was matching. destroyEntity clears the mask wholesale rather than\n // routing through removeComponent, so without this exitQuery buffers stay\n // empty on destroy (asymmetric with observe(q,'remove')). We pass the entry\n // snapshot so reentrant teardown handlers above cannot suppress the exit; the\n // helper computes post-state = empty mask (component absent).\n dispatchDestroyMaskChange(state, eid, prevMask)\n\n // Wipe state\n state.entityArchetype[idx] = 0\n const w = state.options.maskWordCount\n const base = idx * w\n for (let i = 0; i < w; i++) state.entityMask[base + i] = 0\n // Bump generation — use generationMask so non-default generationBits wraps correctly\n state.generations[idx] = ((state.generations[idx] ?? 0) + 1) & state.options.generationMask\n\n // freeList stores raw idx (not packed); createEntity packs on re-use\n state.freeList.push(idx)\n state.size--\n}\n\nexport function entityExists(world: World, eid: EntityId): boolean {\n const state = getWorldState(world)\n return isAliveInternal(state, eid)\n}\n\nexport function isAliveInternal(state: WorldState, eid: number): boolean {\n const idx = eid & state.options.indexMask\n if (idx <= 0) return false\n if (idx >= state.capacity) return false\n const archId = state.entityArchetype[idx] ?? 0\n const arch = state.archetypes[archId]\n if (!arch) return false\n if (!arch.entityRow.has(eid)) return false\n // Generation comparison: packed eid must match stored generation\n const storedGen = state.generations[idx] ?? 0\n const refGen = (eid >>> state.options.indexBits) & state.options.generationMask\n return storedGen === refGen\n}\n\n/**\n * Extract the index portion of a packed entity ID.\n *\n * Uses the default 24-bit index layout. If you created the world with a\n * non-default `indexBits`, use `EntityRef` + `deref` instead.\n */\nexport function getEntityIndex(eid: EntityId): number {\n return (eid as number) & DEFAULT_INDEX_MASK\n}\n\n/**\n * Extract the generation portion of a packed entity ID.\n *\n * Uses the default 8-bit generation layout. If you created the world with a\n * non-default `generationBits`, use `EntityRef` + `deref` instead.\n */\nexport function getEntityGeneration(eid: EntityId): number {\n return ((eid as number) >>> DEFAULT_INDEX_BITS) & DEFAULT_GENERATION_MASK\n}\n\n/**\n * Pack an index and generation into an EntityId using the default 24/8 bit layout.\n *\n * Uses the default `indexBits=24, generationBits=8`. If you created the world\n * with non-default bit sizes, this will produce values with incorrect layout.\n * Use `EntityRef` and `deref` for portable cross-world identity matching.\n */\nexport function packEntity(index: number, generation: number): EntityId {\n // `>>> 0` normalises to unsigned — see packEid. Keeps EntityId a non-negative int32.\n return ((((generation & DEFAULT_GENERATION_MASK) << DEFAULT_INDEX_BITS) |\n (index & DEFAULT_INDEX_MASK)) >>>\n 0) as EntityId\n}\n\nexport function isEntity(world: World, x: unknown): x is EntityId {\n if (typeof x !== 'number') return false\n return entityExists(world, x as EntityId)\n}\n\n// --- Lazy loaders to break import cycles ---\n\ninterface ObserversAPI {\n dispatchDestroyObservers(state: WorldState, eid: EntityId): void\n}\nlet _observersAPI: ObserversAPI | null = null\nexport function registerObserversAPI(api: ObserversAPI): void {\n _observersAPI = api\n}\nfunction lazyObservers(): ObserversAPI {\n if (!_observersAPI) {\n return { dispatchDestroyObservers: () => {} }\n }\n return _observersAPI\n}\n\nlet _relationsCleanup: ((state: WorldState, eid: EntityId) => void) | null = null\nexport function registerRelationsCleanup(fn: (state: WorldState, eid: EntityId) => void): void {\n _relationsCleanup = fn\n}\nfunction cleanupRelationsOnDestroy(state: WorldState, eid: EntityId): void {\n if (_relationsCleanup) _relationsCleanup(state, eid)\n}\n"]}