aiecsjs 0.3.0 → 0.4.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.
- package/CHANGELOG.md +45 -2
- package/README.md +24 -17
- package/README_ZHTW.md +24 -17
- package/STABILITY.md +11 -8
- package/STABILITY_ZHTW.md +12 -9
- package/api.json +42 -17
- package/dist/chunk-B777DQR7.cjs +2 -0
- package/dist/chunk-B777DQR7.cjs.map +1 -0
- package/dist/chunk-CTESP3XL.js +2 -0
- package/dist/chunk-CTESP3XL.js.map +1 -0
- package/dist/chunk-F7KNZ27O.js +2 -0
- package/dist/chunk-F7KNZ27O.js.map +1 -0
- package/dist/chunk-RHH5JA74.cjs +2 -0
- package/dist/chunk-RHH5JA74.cjs.map +1 -0
- package/dist/chunk-SJDWI3OZ.cjs +2 -0
- package/dist/chunk-SJDWI3OZ.cjs.map +1 -0
- package/dist/chunk-SQWZUC2Q.js +2 -0
- package/dist/chunk-SQWZUC2Q.js.map +1 -0
- package/dist/commands.cjs +1 -1
- package/dist/commands.cjs.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/commands.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/observers.cjs +1 -1
- package/dist/observers.cjs.map +1 -1
- package/dist/observers.js +1 -1
- package/dist/observers.js.map +1 -1
- package/dist/relations.cjs +1 -1
- package/dist/relations.cjs.map +1 -1
- package/dist/relations.d.cts +20 -1
- package/dist/relations.d.ts +20 -1
- package/dist/relations.js +1 -1
- package/dist/relations.js.map +1 -1
- package/dist/serialize.cjs +1 -1
- package/dist/serialize.cjs.map +1 -1
- package/dist/serialize.js +1 -1
- package/dist/serialize.js.map +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/llms-full.txt +80 -27
- package/package.json +11 -5
package/llms-full.txt
CHANGED
|
@@ -22,7 +22,7 @@ The short index lives at `llms.txt` (see https://llmstxt.org/).
|
|
|
22
22
|
|
|
23
23
|
Part of the [ai\*js micro-runtime ecosystem](https://github.com/yshengliao) — see also [aifsmjs](https://github.com/yshengliao/aifsmjs) (FSM) and [aibridgejs](https://github.com/yshengliao/aibridgejs) (cross-context RPC).
|
|
24
24
|
|
|
25
|
-
aiecsjs uses **archetype tables with TypedArray columns** and **bitmask queries** — the same architecture that powers piecs and wolf-ecs at the top of public benchmarks. Its API is **functional and tree-shakable**, composed with `pipe()`. Components support both Structure-of-Arrays (SoA) and Array-of-Structures (AoS) layouts.
|
|
25
|
+
aiecsjs uses **archetype tables with TypedArray columns** and **bitmask queries** — the same architecture that powers piecs and wolf-ecs at the top of public benchmarks. Its API is **functional and tree-shakable**, composed with `pipe()`. Components support both Structure-of-Arrays (SoA) and Array-of-Structures (AoS) layouts. Since 0.3, `EntityId` packs index + generation into a single 32-bit number; the ABA-safe `EntityRef` API shipped in 0.3.0.
|
|
26
26
|
|
|
27
27
|
```ts
|
|
28
28
|
import { createWorld, createEntity, defineComponent, defineQuery, pipe, forEachEntity, Types } from 'aiecsjs'
|
|
@@ -341,21 +341,22 @@ forEachEntity(world, q, (e) => { cb.remove(e, SomeTag) })
|
|
|
341
341
|
flush(cb)
|
|
342
342
|
```
|
|
343
343
|
|
|
344
|
-
### Relations and hierarchies
|
|
344
|
+
### Relations and hierarchies
|
|
345
345
|
|
|
346
|
-
>
|
|
346
|
+
> The Relations API is **stable since 0.4.0**. The graph API (`defineRelation` / `addRelation` / `removeRelation` / `getRelationTargets` / `getRelationData`) and the built-in `ChildOf` relation are frozen for the 1.x track.
|
|
347
347
|
|
|
348
348
|
```ts
|
|
349
|
-
import { defineRelation, addRelation, ChildOf, getRelationTargets } from 'aiecsjs/relations'
|
|
349
|
+
import { defineRelation, addRelation, ChildOf, getRelationTargets, getRelationData } from 'aiecsjs/relations'
|
|
350
350
|
|
|
351
|
-
const Likes = defineRelation()
|
|
352
|
-
addRelation(world, alice, Likes, bob)
|
|
351
|
+
const Likes = defineRelation<{ since: number }>()
|
|
352
|
+
addRelation(world, alice, Likes, bob, { since: 2020 })
|
|
353
353
|
addRelation(world, alice, ChildOf, parent)
|
|
354
354
|
|
|
355
355
|
const parentOfAlice = getRelationTargets(world, alice, ChildOf)
|
|
356
|
+
const likedSince = getRelationData(world, alice, Likes, bob) // { since: 2020 }
|
|
356
357
|
```
|
|
357
358
|
|
|
358
|
-
|
|
359
|
+
Exclusive relations (one target only) and the `getRelationData` reader are stable as of 0.4.0. Wildcard relation queries and serialisation of relation graphs remain future work and are not part of the frozen surface.
|
|
359
360
|
|
|
360
361
|
## API Reference
|
|
361
362
|
|
|
@@ -392,8 +393,13 @@ type WorldOptions = {
|
|
|
392
393
|
| `destroyEntity` | `(world: World, eid: EntityId) => void` | stable |
|
|
393
394
|
| `entityExists` | `(world: World, eid: EntityId) => boolean` | stable |
|
|
394
395
|
| `getEntityIndex` | `(eid: EntityId) => number` | stable |
|
|
395
|
-
| `getEntityGeneration` | `(eid: EntityId) => number` |
|
|
396
|
-
| `packEntity` | `(index: number, generation: number) => EntityId` |
|
|
396
|
+
| `getEntityGeneration` | `(eid: EntityId) => number` | stable (since 0.3.0) — returns the 8-bit generation field; uses default 24/8 layout |
|
|
397
|
+
| `packEntity` | `(index: number, generation: number) => EntityId` | stable (since 0.3.0) — packs index + generation using default 24/8 layout |
|
|
398
|
+
| `refOf` | `<T>(world: World, eid: EntityId) => EntityRef<T>` | stable (since 0.3.0) — creates ABA-safe ref; throws `EntityNotAliveError` if entity is dead |
|
|
399
|
+
| `deref` | `<T>(world: World, ref: EntityRef<T>) => EntityId \| null` | stable (since 0.3.0) — returns live `EntityId` or `null` if stale/cross-world; never throws |
|
|
400
|
+
| `aliveRef` | `<T>(world: World, ref: EntityRef<T>) => boolean` | stable (since 0.3.0) — boolean guard form of `deref`; never throws |
|
|
401
|
+
| `EntityRef` | `interface EntityRef<T> { id: EntityId; worldId: number }` | stable (since 0.3.0) — opaque ABA-safe reference; in-memory only |
|
|
402
|
+
| `EntityNotAliveError` | `class EntityNotAliveError extends Error { eid: number }` | stable (since 0.3.0) — thrown by `refOf` when entity is not alive |
|
|
397
403
|
|
|
398
404
|
### Component — `aiecsjs`
|
|
399
405
|
|
|
@@ -474,15 +480,16 @@ const Types = { i8, u8, i16, u16, i32, u32, f32, f64, eid, bool } as const
|
|
|
474
480
|
| `attachWorld` | `(buffer, opts?) => World` | experimental |
|
|
475
481
|
| `detachWorld` | `(world) => void` | experimental |
|
|
476
482
|
|
|
477
|
-
### Relations — `aiecsjs/relations`
|
|
483
|
+
### Relations — `aiecsjs/relations`
|
|
478
484
|
|
|
479
485
|
| Function | Signature | Stability |
|
|
480
486
|
|---|---|---|
|
|
481
|
-
| `defineRelation` | `<T>(opts?) => Relation<T>` |
|
|
482
|
-
| `addRelation` | `(world, src, rel, tgt, data?) => void` |
|
|
483
|
-
| `removeRelation` | `(world, src, rel, tgt) => void` |
|
|
484
|
-
| `getRelationTargets` | `(world, src, rel) => readonly EntityId[]` |
|
|
485
|
-
| `
|
|
487
|
+
| `defineRelation` | `<T>(opts?) => Relation<T>` | stable |
|
|
488
|
+
| `addRelation` | `(world, src, rel, tgt, data?) => void` | stable |
|
|
489
|
+
| `removeRelation` | `(world, src, rel, tgt) => void` | stable |
|
|
490
|
+
| `getRelationTargets` | `(world, src, rel) => readonly EntityId[]` | stable |
|
|
491
|
+
| `getRelationData` | `<T>(world, src, rel, tgt) => T \| undefined` | stable (since 0.4.0) |
|
|
492
|
+
| `ChildOf` (constant) | `Relation` | stable |
|
|
486
493
|
|
|
487
494
|
### Utility — `aiecsjs`
|
|
488
495
|
|
|
@@ -859,7 +866,7 @@ if (VERSION.startsWith('0.')) {
|
|
|
859
866
|
|
|
860
867
|
### Stability contract
|
|
861
868
|
|
|
862
|
-
See [`STABILITY.md`](./STABILITY.md). In short: imports from `aiecsjs` (root) are **stable** within 0.x minors.
|
|
869
|
+
See [`STABILITY.md`](./STABILITY.md). In short: imports from `aiecsjs` (root) are **stable** within 0.x minors. `aiecsjs/relations` is **stable** since 0.4.0; `aiecsjs/worker` is **experimental**. Anything in `aiecsjs/internal` is **internal** — do not import.
|
|
863
870
|
|
|
864
871
|
### Telemetry / privacy
|
|
865
872
|
|
|
@@ -904,7 +911,7 @@ A: It will be on first stable publish. Until then, the docs are the contract.
|
|
|
904
911
|
|
|
905
912
|
- **Max entity count** is capped by `indexBits` × `generationBits`. Default 24 + 8 = 16M entities × 256 recycles.
|
|
906
913
|
- **No automatic system scheduler / parallel execution** in 0.1. Systems run in `pipe()` order on one thread (you can launch additional workers manually).
|
|
907
|
-
- **Relations API is
|
|
914
|
+
- **Relations API (`aiecsjs/relations`) is stable since 0.4.0.** Wildcard relation queries and relation-graph serialisation remain future work.
|
|
908
915
|
- **AoS components** not SAB-shareable across workers.
|
|
909
916
|
- **Network delta serializer** wire format is experimental in 0.1; may change.
|
|
910
917
|
- **WebGPU integration is one-way** (CPU → GPU). No compute-shader system generation.
|
|
@@ -934,18 +941,61 @@ All notable changes to `aiecsjs` are recorded in this file.
|
|
|
934
941
|
|
|
935
942
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
936
943
|
|
|
944
|
+
## [0.4.0] - 2026-05-29
|
|
945
|
+
|
|
946
|
+
### Added
|
|
947
|
+
|
|
948
|
+
- **`getRelationData(world, source, rel, target)`**: new stable export on `aiecsjs/relations`. Returns the `data` payload attached via `addRelation`, or `undefined` when no such edge exists or no data was stored. Closes the write-only-data asymmetry present since 0.1: `addRelation` accepted a data argument but there was no corresponding public read path.
|
|
949
|
+
|
|
950
|
+
### Changed
|
|
951
|
+
|
|
952
|
+
- **`aiecsjs/relations` graduated from experimental to stable.** The graph API (`defineRelation`, `addRelation`, `removeRelation`, `getRelationTargets`, `getRelationData`) and the built-in `ChildOf` relation are now frozen for the 1.x track. See [`STABILITY.md`](./STABILITY.md) for the full stability contract, including the raw slot-keying ABA semantic.
|
|
953
|
+
- **`aiecsjs/worker` remains experimental.** True SAB shared-memory column aliasing is deferred; the worker sub-path continues on snapshot-copy semantics.
|
|
954
|
+
|
|
955
|
+
### Build & Tooling
|
|
956
|
+
|
|
957
|
+
- **size-limit → `scripts/check-size.mjs`**: replaced the `size-limit` + `@size-limit/file` dev dependencies with a zero-dependency script that measures transitive chunk-closure gzip size per ESM entry. Required because `tsup splitting: true` (introduced in 0.3.1) makes each entry a thin re-export shell; the vanilla single-file measurement reported ~899 B for index when the true closure is ~7295 B. The new script resolves chunk imports recursively via BFS, sums per-file gzip, and enforces per-entry budgets.
|
|
958
|
+
- **npm → pnpm**: migrated from `package-lock.json` to `pnpm-lock.yaml`. Added `"packageManager": "pnpm@9.12.3"` and `"publishConfig": { "access": "public" }`. CI and publish workflows updated to use `pnpm/action-setup@v6` + `pnpm install --frozen-lockfile`. `npm publish --provenance --access public` in the publish workflow is intentionally preserved (OIDC trusted publishing requires npm CLI, not pnpm publish).
|
|
959
|
+
- **Coverage tests added + unreachable gaps documented**: new tests cover previously-unreachable paths in `serialize.ts`, `component.ts`, `query.ts`, and `loop.ts`. Thresholds updated to the honestly-achieved floor (statements 95 / branches 81 / functions 98 / lines 99). Unreachable-by-design gaps are now documented in `vitest.config.ts` with Chesterton rationale.
|
|
960
|
+
|
|
961
|
+
## [0.3.1] - 2026-05-29
|
|
962
|
+
|
|
963
|
+
### Fixed
|
|
964
|
+
|
|
965
|
+
- **Packed EntityId signed-overflow for generation ≥ 128**: `createEntity` returned a negative number diverging from the unsigned value stored in archetype row arrays (`Uint32Array`), so query iteration (`runQuery`/`iterQuery`/`forEachEntity`) yielded an eid that failed `entityRow` lookups; `refOf`/`entityExists`/`deref` on a query-iterated high-generation entity misbehaved (`refOf` threw on a live entity). `packEid`/`packEntity` now normalise with `>>> 0`. No public-bundle behaviour change beyond the corrected eid representation (EntityId is opaque + in-memory-only).
|
|
966
|
+
- **`toJSON` silently dropped high-generation entities** (gen ≥ 128 with default 8-bit generation): `toJSON` contained its own inline pack expression that produced a signed (negative) result, diverging from the unsigned key stored in `arch.entityRow`. The affected entity passed the archetype check but failed `entityRow.has()`, so it was omitted from every snapshot and `serializeWorld` call. Fixed by replacing the inline expression with the canonical `packEid` (which applies `>>> 0`). SPOT principle: one pack source of truth.
|
|
967
|
+
- **Cross-subpath registry isolation** (`tsup splitting: false` → `splitting: true`): each compiled entry point (`dist/index.js`, `dist/serialize.js`, etc.) previously bundled its own private copy of `internal/world.ts`, including the module-scope `worldRegistry`. A world created via the core subpath was invisible to `serializeWorld`/`getRelationTargets`/`transferableSnapshot` imported from their respective subpaths, causing `world N is destroyed or unknown` at runtime. With `splitting: true`, esbuild extracts a shared chunk used by all entries; ESM and CJS are both verified by the new `scripts/check-dist-subpaths.mjs` smoke script.
|
|
968
|
+
- **`getRelationTargets` returned raw index as `EntityId`** (gen always 0): `addRelation` stores the target as a raw slot index (`& indexMask`). The previous return path cast this raw index directly to `EntityId`, which is equivalent to a packed id with generation 0. For any target that had been recycled (gen > 0), callers received a stale id that failed `entityExists`, `entityRow` lookups, and component access. Fixed by re-packing each raw index against the current generation via `packEid` before returning.
|
|
969
|
+
- **`resolveOptions` did not validate `indexBits + generationBits ≤ 32`**: the individual range checks (`indexBits ∈ [1, 24]`, `generationBits ∈ [0, 16]`) allowed combinations such as `indexBits=24, generationBits=16` (40 bits), where `gen << 24` silently overflowed and high-generation bits were lost. A sum check is now enforced with a clear error message. The `[Unreleased]` example corrected accordingly (`indexBits: 16, generationBits: 16` = 32 bits).
|
|
970
|
+
|
|
971
|
+
### Known Limitations
|
|
972
|
+
|
|
973
|
+
- **`createDeltaSerializer.apply` with a recycled target world**: `apply` uses the raw entity index from the delta snapshot as the `EntityId` directly. When the target world has already recycled any of those slots (generation > 0), component operations silently act on the wrong packed id. This is a known limitation of the experimental delta API; the common usage (delta → a fresh gen-0 render-mirror world) is unaffected. A proper raw-index-to-packed-id mapping is planned for 0.4. Avoid `apply` against a world that has previously destroyed entities.
|
|
974
|
+
|
|
975
|
+
### Documentation
|
|
976
|
+
|
|
977
|
+
- README / README_ZHTW updated to reflect the shipped 0.3.0 `EntityRef` API: the previous README still described EntityRef as "targeted for 0.3+" and `getEntityGeneration`/`packEntity` as experimental. Both files now correctly state EntityId has been packed since 0.3, and `EntityRef` / `refOf` / `deref` / `aliveRef` / `EntityNotAliveError` are all stable since 0.3.0. API table entries for these symbols added.
|
|
978
|
+
|
|
979
|
+
### Build & Tooling
|
|
980
|
+
|
|
981
|
+
- Coverage gate: `@vitest/coverage-v8` installed and wired into `prepublishOnly` (replaces `npm run test`) and CI. Thresholds: statements 95 / branches 80 / functions 97 / lines 98 — the achievable bar on pristine source. The branch figure honours the `?? 0` / `noUncheckedIndexedAccess` idiom on TypedArray reads (nullish-fallback branches unreachable by design); thresholds are raised only by adding tests, never by stripping defensive guards or scattering `/* v8 ignore */`.
|
|
982
|
+
- `fast-check` property tests (`tests/properties.test.ts`): pack/unpack round-trip invariant (asserts `e >= 0` to guard the P0 regression) and ABA-deref always-null invariant.
|
|
983
|
+
- Dispose three-cycle tests, error-path tests, and observer handler-throw behaviour documented in `tests/world.test.ts` / `tests/observers.test.ts`.
|
|
984
|
+
- `scripts/check-dist-subpaths.mjs` (`npm run verify:dist`): post-build smoke test that imports `createWorld`+`createEntity` from the core subpath and calls `serializeWorld`, `addRelation`/`getRelationTargets`, and `transferableSnapshot` from their respective subpaths for both ESM (`dist/*.js`) and CJS (`dist/*.cjs`). Wired into `prepublishOnly` (after `build`) and CI.
|
|
985
|
+
|
|
937
986
|
## [Unreleased]
|
|
938
987
|
|
|
939
988
|
### Planned for 0.4+
|
|
940
989
|
|
|
941
990
|
- Add `pipeAsync` for async system composition.
|
|
942
991
|
- Doc-test harness so README code blocks are mechanically verified.
|
|
943
|
-
- Promote `aiecsjs/
|
|
992
|
+
- Promote `aiecsjs/worker` to `stable` once true SAB shared-memory column aliasing is implemented.
|
|
944
993
|
- Document the 8-bit generation wrap caveat in [STABILITY.md](./STABILITY.md): with the
|
|
945
994
|
default `generationBits=8`, a single slot recycled 256 times wraps back to its
|
|
946
995
|
starting generation, briefly re-opening the ABA window. Safe for v0.5 shmup
|
|
947
996
|
workloads (~5000 frame to wrap a single slot at 60 fps × ~1k destroys); high-churn
|
|
948
|
-
pools should set `createWorld({ generationBits: 16 })
|
|
997
|
+
pools should set `createWorld({ indexBits: 16, generationBits: 16 })` (16 + 16 = 32 bits;
|
|
998
|
+
65 536 entities × 65 536 generations). See test
|
|
949
999
|
[tests/ref.test.ts](./tests/ref.test.ts) `generation wrap` describe block.
|
|
950
1000
|
|
|
951
1001
|
## [0.3.0] - 2026-05-29
|
|
@@ -1295,17 +1345,20 @@ The entire subpath is **experimental** in 0.x. **In 0.x the implementation is a
|
|
|
1295
1345
|
| `attachWorld` | experimental | 0.1.0 | |
|
|
1296
1346
|
| `detachWorld` | experimental | 0.1.0 | |
|
|
1297
1347
|
|
|
1298
|
-
### `aiecsjs/relations` (
|
|
1348
|
+
### `aiecsjs/relations` (stable sub-path since 0.4.0)
|
|
1349
|
+
|
|
1350
|
+
The relations sub-path is **stable** as of 0.4.0. The graph API (`defineRelation`, `addRelation`, `removeRelation`, `getRelationTargets`, `getRelationData`) and the built-in `ChildOf` relation are frozen for the 1.x track.
|
|
1299
1351
|
|
|
1300
|
-
|
|
1352
|
+
**Raw slot-keying ABA semantic:** relation storage keys edges by raw entity slot index (`entityId & indexMask`), not by the full packed EntityId (which includes a generation counter). If entity A is destroyed and a different entity B is later created occupying the same slot, B will inherit A's outgoing and incoming edges unless the destroy cleanup hook ran. The cleanup hook fires automatically when `destroyEntity` is called, so normal usage is safe. Callers holding cached EntityId values across destroy/recreate cycles should validate liveness with `entityExists` before reading relation data if ABA is a concern.
|
|
1301
1353
|
|
|
1302
1354
|
| Export | Stability | Since | Notes |
|
|
1303
1355
|
|---|---|---|---|
|
|
1304
|
-
| `defineRelation` |
|
|
1305
|
-
| `addRelation` |
|
|
1306
|
-
| `removeRelation` |
|
|
1307
|
-
| `getRelationTargets` |
|
|
1308
|
-
| `ChildOf` (constant) |
|
|
1356
|
+
| `defineRelation` | stable | 0.1.0 | |
|
|
1357
|
+
| `addRelation` | stable | 0.1.0 | |
|
|
1358
|
+
| `removeRelation` | stable | 0.1.0 | |
|
|
1359
|
+
| `getRelationTargets` | stable | 0.1.0 | |
|
|
1360
|
+
| `ChildOf` (constant) | stable | 0.1.0 | Built-in exclusive relation. |
|
|
1361
|
+
| `getRelationData` | stable | 0.4.0 | Returns the data payload attached via `addRelation`, or `undefined` if no such edge or no data was stored. Subject to the raw slot-keying ABA semantic described above. |
|
|
1309
1362
|
|
|
1310
1363
|
### `aiecsjs/internal/*`
|
|
1311
1364
|
|
|
@@ -1318,7 +1371,7 @@ Everything under this prefix is **internal**. It exists for the implementation's
|
|
|
1318
1371
|
| 0.1.x | Core surface (world, entity, component, query, system, loop, commands, observers, serialize) | Initial publish; all marked experimental at the package level but per-export stable where listed. |
|
|
1319
1372
|
| 0.2.0 | Safety + alignment | Prototype-pollution hardening, observer `{ signal? }`, `disposeWorld` alias, `getEntityGeneration` / `packEntity` re-labelled experimental, `verify:llms` gate. See [CHANGELOG.md](./CHANGELOG.md#020---2026-05-28). |
|
|
1320
1373
|
| 0.3.x | EntityRef + generation packing | ABA-safe; `getEntityGeneration` / `packEntity` → stable. |
|
|
1321
|
-
| 0.4
|
|
1374
|
+
| 0.4.0 | Relations stabilisation | `aiecsjs/relations` graduated to stable; `getRelationData` added. `aiecsjs/worker` remains experimental (true SAB shared-memory columns deferred). |
|
|
1322
1375
|
| 0.6+ | Multi-World snapshot diff transport (placeholder) | experimental — design TBD. |
|
|
1323
1376
|
| 1.0.0 | API freeze | All `stable` exports frozen for 1.x. |
|
|
1324
1377
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiecsjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "TypeScript-first archetype ECS with TypedArray SoA, SAB-ready snapshot transport, and AI-readable docs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -84,18 +84,24 @@
|
|
|
84
84
|
"lint": "biome check src tests",
|
|
85
85
|
"format": "biome format --write src tests",
|
|
86
86
|
"verify:exports": "node scripts/verify-exports.mjs",
|
|
87
|
+
"verify:dist": "node scripts/check-dist-subpaths.mjs",
|
|
87
88
|
"build:llms": "node scripts/build-llms-full.mjs",
|
|
88
89
|
"verify:llms": "node scripts/build-llms-full.mjs --check",
|
|
89
|
-
"size": "size
|
|
90
|
-
"
|
|
90
|
+
"check:size": "node scripts/check-size.mjs",
|
|
91
|
+
"coverage": "vitest run --coverage",
|
|
92
|
+
"prepublishOnly": "pnpm typecheck && pnpm lint && pnpm coverage && pnpm build && pnpm verify:dist && pnpm verify:exports && pnpm verify:llms && pnpm check:size"
|
|
91
93
|
},
|
|
92
94
|
"devDependencies": {
|
|
93
95
|
"@biomejs/biome": "^1.9.4",
|
|
94
|
-
"@
|
|
95
|
-
"
|
|
96
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
97
|
+
"fast-check": "^4.8.0",
|
|
96
98
|
"tsup": "^8.0.0",
|
|
97
99
|
"typescript": "^5.5.0",
|
|
98
100
|
"vite": "^8.0.14",
|
|
99
101
|
"vitest": "^4.1.7"
|
|
102
|
+
},
|
|
103
|
+
"packageManager": "pnpm@9.12.3",
|
|
104
|
+
"publishConfig": {
|
|
105
|
+
"access": "public"
|
|
100
106
|
}
|
|
101
107
|
}
|