@adobe/data 0.8.5 → 0.9.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/dist/blob/download-handle.d.ts +4 -0
- package/dist/blob/download-handle.js +2 -0
- package/dist/blob/download-handle.js.map +1 -0
- package/dist/blob/upload-handle.d.ts +4 -0
- package/dist/blob/upload-handle.js +2 -0
- package/dist/blob/upload-handle.js.map +1 -0
- package/dist/ecs/database/calculate-system-order.d.ts +18 -0
- package/dist/ecs/database/calculate-system-order.js +113 -0
- package/dist/ecs/database/calculate-system-order.js.map +1 -0
- package/dist/ecs/database/calculate-system-order.test.d.ts +1 -0
- package/dist/ecs/database/calculate-system-order.test.js +168 -0
- package/dist/ecs/database/calculate-system-order.test.js.map +1 -0
- package/dist/ecs/database/create-database.d.ts +6 -6
- package/dist/ecs/database/create-database.js +38 -10
- package/dist/ecs/database/create-database.js.map +1 -1
- package/dist/ecs/database/create-database.test.js +55 -11
- package/dist/ecs/database/create-database.test.js.map +1 -1
- package/dist/ecs/database/create-plugin.d.ts +67 -0
- package/dist/ecs/database/create-plugin.js +47 -0
- package/dist/ecs/database/create-plugin.js.map +1 -0
- package/dist/ecs/database/create-plugin.test.d.ts +1 -0
- package/dist/ecs/database/create-plugin.test.js +435 -0
- package/dist/ecs/database/create-plugin.test.js.map +1 -0
- package/dist/ecs/database/database-schema/create-database-schema.d.ts +3 -3
- package/dist/ecs/database/database-schema/create-database-schema.js +7 -3
- package/dist/ecs/database/database-schema/create-database-schema.js.map +1 -1
- package/dist/ecs/database/database-schema/database-schema.d.ts +4 -3
- package/dist/ecs/database/database.d.ts +60 -18
- package/dist/ecs/database/database.js +47 -1
- package/dist/ecs/database/database.js.map +1 -1
- package/dist/ecs/database/database.test.d.ts +1 -0
- package/dist/ecs/database/database.test.js +200 -0
- package/dist/ecs/database/database.test.js.map +1 -0
- package/dist/ecs/database/index.d.ts +1 -1
- package/dist/ecs/database/index.js +1 -1
- package/dist/ecs/database/index.js.map +1 -1
- package/dist/ecs/database/observe-dependent-value.test.js +8 -16
- package/dist/ecs/database/observe-dependent-value.test.js.map +1 -1
- package/dist/ecs/database/observe-select-entities.performance.test.js +21 -17
- package/dist/ecs/database/observe-select-entities.performance.test.js.map +1 -1
- package/dist/ecs/database/observe-select-entities.test.js +24 -20
- package/dist/ecs/database/observe-select-entities.test.js.map +1 -1
- package/dist/ecs/database/observed/create-observed-database.js +6 -1
- package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
- package/dist/ecs/database/observed/create-observed-database.test.js +119 -59
- package/dist/ecs/database/observed/create-observed-database.test.js.map +1 -1
- package/dist/ecs/database/observed/observed-database.d.ts +3 -0
- package/dist/ecs/database/public/create-database-from-schema.test.d.ts +1 -0
- package/dist/ecs/database/public/create-database-from-schema.test.js +153 -0
- package/dist/ecs/database/public/create-database-from-schema.test.js.map +1 -0
- package/dist/ecs/database/public/create-database.d.ts +22 -0
- package/dist/ecs/database/public/create-database.js +336 -0
- package/dist/ecs/database/public/create-database.js.map +1 -0
- package/dist/ecs/database/public/create-database.test.d.ts +1 -0
- package/dist/ecs/database/public/create-database.test.js +993 -0
- package/dist/ecs/database/public/create-database.test.js.map +1 -0
- package/dist/ecs/database/public/index.d.ts +1 -0
- package/dist/ecs/database/public/index.js +22 -0
- package/dist/ecs/database/public/index.js.map +1 -0
- package/dist/ecs/database/reconciling/create-reconciling-database.d.ts +2 -9
- package/dist/ecs/database/reconciling/create-reconciling-database.js +87 -118
- package/dist/ecs/database/reconciling/create-reconciling-database.js.map +1 -1
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js +94 -167
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js.map +1 -1
- package/dist/ecs/database/reconciling/reconciling-database.d.ts +5 -2
- package/dist/ecs/database/reconciling/reconciling-entry.d.ts +0 -11
- package/dist/ecs/database/reconciling/reconciling-entry.js +0 -34
- package/dist/ecs/database/reconciling/reconciling-entry.js.map +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.d.ts +16 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.js +140 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.d.ts +1 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js +433 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -0
- package/dist/ecs/database/transactional-store/create-transactional-store.js +18 -2
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js +98 -22
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/entity-id-preservation.test.d.ts +1 -0
- package/dist/ecs/database/transactional-store/entity-id-preservation.test.js +106 -0
- package/dist/ecs/database/transactional-store/entity-id-preservation.test.js.map +1 -0
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +2 -0
- package/dist/ecs/database/type-inference-example.d.ts +1 -0
- package/dist/ecs/database/type-inference-example.js +2 -0
- package/dist/ecs/database/type-inference-example.js.map +1 -0
- package/dist/ecs/entity/entity.d.ts +8 -0
- package/dist/ecs/entity/entity.js +3 -0
- package/dist/ecs/entity/entity.js.map +1 -0
- package/dist/ecs/entity/u32.d.ts +8 -0
- package/dist/ecs/entity/u32.js +24 -0
- package/dist/ecs/entity/u32.js.map +1 -0
- package/dist/ecs/plugins/index.d.ts +1 -0
- package/dist/ecs/plugins/index.js +23 -0
- package/dist/ecs/plugins/index.js.map +1 -0
- package/dist/ecs/plugins/scheduler/index.d.ts +1 -0
- package/dist/ecs/plugins/scheduler/index.js +23 -0
- package/dist/ecs/plugins/scheduler/index.js.map +1 -0
- package/dist/ecs/plugins/scheduler/scheduler.d.ts +8 -0
- package/dist/ecs/plugins/scheduler/scheduler.js +52 -0
- package/dist/ecs/plugins/scheduler/scheduler.js.map +1 -0
- package/dist/ecs/store/action-functions.d.ts +21 -0
- package/dist/ecs/store/action-functions.js +2 -0
- package/dist/ecs/store/action-functions.js.map +1 -0
- package/dist/ecs/store/constants/functions.d.ts +14 -0
- package/dist/ecs/store/constants/functions.js +31 -0
- package/dist/ecs/store/constants/functions.js.map +1 -0
- package/dist/ecs/store/constants/index.d.ts +2 -0
- package/dist/ecs/store/constants/index.js +24 -0
- package/dist/ecs/store/constants/index.js.map +1 -0
- package/dist/ecs/store/constants/types.d.ts +18 -0
- package/dist/ecs/store/constants/types.js +23 -0
- package/dist/ecs/store/constants/types.js.map +1 -0
- package/dist/ecs/store/create-store-schema-test.js +70 -8
- package/dist/ecs/store/create-store-schema-test.js.map +1 -1
- package/dist/ecs/store/create-store.d.ts +1 -1
- package/dist/ecs/store/create-store.js +74 -24
- package/dist/ecs/store/create-store.js.map +1 -1
- package/dist/ecs/store/create-store.test.js +171 -171
- package/dist/ecs/store/create-store.test.js.map +1 -1
- package/dist/ecs/store/index.d.ts +0 -1
- package/dist/ecs/store/index.js +0 -1
- package/dist/ecs/store/index.js.map +1 -1
- package/dist/ecs/store/public/create-from-schema.d.ts +6 -0
- package/dist/ecs/store/public/create-from-schema.js +26 -0
- package/dist/ecs/store/public/create-from-schema.js.map +1 -0
- package/dist/ecs/store/public/create-store.d.ts +8 -0
- package/dist/ecs/store/public/create-store.js +127 -0
- package/dist/ecs/store/public/create-store.js.map +1 -0
- package/dist/ecs/store/public/create-store.test.d.ts +1 -0
- package/dist/ecs/store/public/create-store.test.js +730 -0
- package/dist/ecs/store/public/create-store.test.js.map +1 -0
- package/dist/ecs/store/public/index.d.ts +3 -0
- package/dist/ecs/store/public/index.js +25 -0
- package/dist/ecs/store/public/index.js.map +1 -0
- package/dist/ecs/store/public/readonly.d.ts +19 -0
- package/dist/ecs/store/public/readonly.js +2 -0
- package/dist/ecs/store/public/readonly.js.map +1 -0
- package/dist/ecs/store/public/schema/create-from-schema.d.ts +6 -0
- package/dist/ecs/store/public/schema/create-from-schema.js +26 -0
- package/dist/ecs/store/public/schema/create-from-schema.js.map +1 -0
- package/dist/ecs/store/public/schema/create.d.ts +10 -0
- package/dist/ecs/store/public/schema/create.js +25 -0
- package/dist/ecs/store/public/schema/create.js.map +1 -0
- package/dist/ecs/store/public/schema/createFromSchema.d.ts +6 -0
- package/dist/ecs/store/public/schema/createFromSchema.js +5 -0
- package/dist/ecs/store/public/schema/createFromSchema.js.map +1 -0
- package/dist/ecs/store/public/schema/public.d.ts +1 -0
- package/dist/ecs/store/public/schema/public.js +23 -0
- package/dist/ecs/store/public/schema/public.js.map +1 -0
- package/dist/ecs/store/public/schema/schema.d.ts +11 -0
- package/dist/ecs/store/public/schema/schema.js +23 -0
- package/dist/ecs/store/public/schema/schema.js.map +1 -0
- package/dist/ecs/store/public/types.d.ts +11 -0
- package/dist/ecs/store/public/types.js +23 -0
- package/dist/ecs/store/public/types.js.map +1 -0
- package/dist/ecs/store/store-schema/create-store-schema-test.d.ts +1 -0
- package/dist/ecs/store/store-schema/create-store-schema-test.js +33 -0
- package/dist/ecs/store/store-schema/create-store-schema-test.js.map +1 -0
- package/dist/ecs/store/store-schema/create-store-schema.d.ts +1 -0
- package/dist/ecs/store/store-schema/create-store-schema.js +45 -0
- package/dist/ecs/store/store-schema/create-store-schema.js.map +1 -0
- package/dist/ecs/store/store-schema/index.d.ts +1 -0
- package/dist/ecs/store/store-schema/index.js +21 -0
- package/dist/ecs/store/store-schema/index.js.map +1 -0
- package/dist/ecs/store/store-schema/store-schema.d.ts +1 -0
- package/dist/ecs/store/store-schema/store-schema.js +57 -0
- package/dist/ecs/store/store-schema/store-schema.js.map +1 -0
- package/dist/ecs/store/store.d.ts +48 -13
- package/dist/ecs/store/store.js +37 -8
- package/dist/ecs/store/store.js.map +1 -1
- package/dist/ecs/store/store.test.d.ts +1 -0
- package/dist/ecs/store/store.test.js +211 -0
- package/dist/ecs/store/store.test.js.map +1 -0
- package/dist/ecs/undo-redo-service/create-undo-redo-service.js +1 -1
- package/dist/ecs/undo-redo-service/create-undo-redo-service.js.map +1 -1
- package/dist/ecs/undo-redo-service/create-undo-redo-service.test.js +10 -6
- package/dist/ecs/undo-redo-service/create-undo-redo-service.test.js.map +1 -1
- package/dist/ecs/world/create-world.d.ts +7 -0
- package/dist/ecs/world/create-world.js +113 -0
- package/dist/ecs/world/create-world.js.map +1 -0
- package/dist/ecs/world/create-world.test.d.ts +1 -0
- package/dist/ecs/world/create-world.test.js +499 -0
- package/dist/ecs/world/create-world.test.js.map +1 -0
- package/dist/ecs/world/index.d.ts +5 -0
- package/dist/ecs/world/index.js +27 -0
- package/dist/ecs/world/index.js.map +1 -0
- package/dist/ecs/world/system-phase.d.ts +5 -0
- package/dist/ecs/world/system-phase.js +14 -0
- package/dist/ecs/world/system-phase.js.map +1 -0
- package/dist/ecs/world/system.d.ts +25 -0
- package/dist/ecs/world/system.js +2 -0
- package/dist/ecs/world/system.js.map +1 -0
- package/dist/ecs/world/world-schema/create-world-schema-test.d.ts +1 -0
- package/dist/ecs/world/world-schema/create-world-schema-test.js +55 -0
- package/dist/ecs/world/world-schema/create-world-schema-test.js.map +1 -0
- package/dist/ecs/world/world-schema/create-world-schema.d.ts +19 -0
- package/dist/ecs/world/world-schema/create-world-schema.js +33 -0
- package/dist/ecs/world/world-schema/create-world-schema.js.map +1 -0
- package/dist/ecs/world/world-schema/index.d.ts +2 -0
- package/dist/ecs/world/world-schema/index.js +24 -0
- package/dist/ecs/world/world-schema/index.js.map +1 -0
- package/dist/ecs/world/world-schema/world-schema.d.ts +18 -0
- package/dist/ecs/world/world-schema/world-schema.js +23 -0
- package/dist/ecs/world/world-schema/world-schema.js.map +1 -0
- package/dist/ecs/world/world.d.ts +11 -0
- package/dist/ecs/world/world.js +2 -0
- package/dist/ecs/world/world.js.map +1 -0
- package/dist/graphics/camera/camera.d.ts +62 -0
- package/dist/graphics/camera/camera.js +17 -0
- package/dist/graphics/camera/camera.js.map +1 -0
- package/dist/graphics/camera/index.d.ts +4 -0
- package/dist/graphics/camera/index.js +5 -0
- package/dist/graphics/camera/index.js.map +1 -0
- package/dist/graphics/camera/screen-to-world-ray.d.ts +12 -0
- package/dist/graphics/camera/screen-to-world-ray.js +49 -0
- package/dist/graphics/camera/screen-to-world-ray.js.map +1 -0
- package/dist/graphics/camera/screen-to-world-ray.test.d.ts +1 -0
- package/dist/graphics/camera/screen-to-world-ray.test.js +171 -0
- package/dist/graphics/camera/screen-to-world-ray.test.js.map +1 -0
- package/dist/graphics/camera/to-view-projection.d.ts +3 -0
- package/dist/graphics/camera/to-view-projection.js +8 -0
- package/dist/graphics/camera/to-view-projection.js.map +1 -0
- package/dist/graphics/camera/world-to-screen.d.ts +12 -0
- package/dist/graphics/camera/world-to-screen.js +38 -0
- package/dist/graphics/camera/world-to-screen.js.map +1 -0
- package/dist/graphics/camera/world-to-screen.test.d.ts +1 -0
- package/dist/graphics/camera/world-to-screen.test.js +124 -0
- package/dist/graphics/camera/world-to-screen.test.js.map +1 -0
- package/dist/graphics/create-struct-gpu-buffer.d.ts +7 -0
- package/dist/graphics/create-struct-gpu-buffer.js +17 -0
- package/dist/graphics/create-struct-gpu-buffer.js.map +1 -0
- package/dist/graphics/extract-wgsl-bindings.d.ts +5 -0
- package/dist/graphics/extract-wgsl-bindings.js +10 -0
- package/dist/graphics/extract-wgsl-bindings.js.map +1 -0
- package/dist/graphics/frame.d.ts +1 -0
- package/dist/graphics/frame.js +15 -0
- package/dist/graphics/frame.js.map +1 -0
- package/dist/graphics/get-web-gpu-device-and-context.d.ts +1 -0
- package/dist/graphics/get-web-gpu-device-and-context.js +24 -0
- package/dist/graphics/get-web-gpu-device-and-context.js.map +1 -0
- package/dist/graphics/graphics-context.d.ts +1 -0
- package/dist/graphics/graphics-context.js +7 -0
- package/dist/graphics/graphics-context.js.map +1 -0
- package/dist/graphics/index.d.ts +5 -0
- package/dist/graphics/index.js +5 -0
- package/dist/graphics/index.js.map +1 -0
- package/dist/graphics/to-gpu-buffer.d.ts +2 -0
- package/dist/graphics/to-gpu-buffer.js +14 -0
- package/dist/graphics/to-gpu-buffer.js.map +1 -0
- package/dist/internal/array-buffer-like/grow.d.ts +1 -0
- package/dist/internal/array-buffer-like/grow.js +9 -0
- package/dist/internal/array-buffer-like/grow.js.map +1 -0
- package/dist/lit/hooks/use-drag-transaction.d.ts +1 -1
- package/dist/math/aabb/aabb.d.ts +3 -52
- package/dist/math/aabb/aabb.js +2 -97
- package/dist/math/aabb/aabb.js.map +1 -1
- package/dist/math/aabb/constants/functions.d.ts +15 -0
- package/dist/math/aabb/constants/functions.js +76 -0
- package/dist/math/aabb/constants/functions.js.map +1 -0
- package/dist/math/aabb/constants/index.d.ts +3 -0
- package/dist/math/aabb/constants/index.js +25 -0
- package/dist/math/aabb/constants/index.js.map +1 -0
- package/dist/math/aabb/constants/layout.d.ts +1 -0
- package/dist/math/aabb/constants/layout.js +25 -0
- package/dist/math/aabb/constants/layout.js.map +1 -0
- package/dist/math/aabb/constants/schema.d.ts +33 -0
- package/dist/math/aabb/constants/schema.js +37 -0
- package/dist/math/aabb/constants/schema.js.map +1 -0
- package/dist/math/aabb/functions.d.ts +1 -0
- package/dist/math/aabb/functions.js +23 -0
- package/dist/math/aabb/functions.js.map +1 -0
- package/dist/math/aabb/lineIntersection.d.ts +10 -0
- package/dist/math/aabb/lineIntersection.js +42 -0
- package/dist/math/aabb/lineIntersection.js.map +1 -0
- package/dist/math/aabb-face/aabb-face.d.ts +3 -53
- package/dist/math/aabb-face/aabb-face.js +1 -135
- package/dist/math/aabb-face/aabb-face.js.map +1 -1
- package/dist/math/aabb-face/aabb-face.test.js +1 -1
- package/dist/math/aabb-face/aabb-face.test.js.map +1 -1
- package/dist/math/aabb-face/constants/functions.d.ts +47 -0
- package/dist/math/aabb-face/constants/functions.js +148 -0
- package/dist/math/aabb-face/constants/functions.js.map +1 -0
- package/dist/math/aabb-face/constants/index.d.ts +2 -0
- package/dist/math/aabb-face/constants/index.js +24 -0
- package/dist/math/aabb-face/constants/index.js.map +1 -0
- package/dist/math/aabb-face/constants/schema.d.ts +5 -0
- package/dist/math/aabb-face/constants/schema.js +27 -0
- package/dist/math/aabb-face/constants/schema.js.map +1 -0
- package/dist/math/aabb-face/face.d.ts +51 -0
- package/dist/math/aabb-face/face.js +110 -0
- package/dist/math/aabb-face/face.js.map +1 -0
- package/dist/math/aabb-face/face.test.d.ts +1 -0
- package/dist/math/aabb-face/face.test.js +94 -0
- package/dist/math/aabb-face/face.test.js.map +1 -0
- package/dist/math/aabb-face/functions.d.ts +47 -0
- package/dist/math/aabb-face/functions.js +148 -0
- package/dist/math/aabb-face/functions.js.map +1 -0
- package/dist/math/aabb-face/index.d.ts +4 -0
- package/dist/math/aabb-face/index.js +23 -0
- package/dist/math/aabb-face/index.js.map +1 -0
- package/dist/math/aabb-face/public.d.ts +2 -0
- package/dist/math/aabb-face/public.js +24 -0
- package/dist/math/aabb-face/public.js.map +1 -0
- package/dist/math/aabb-face/schema.d.ts +5 -0
- package/dist/math/aabb-face/schema.js +27 -0
- package/dist/math/aabb-face/schema.js.map +1 -0
- package/dist/math/box/box.d.ts +50 -0
- package/dist/math/box/box.js +23 -0
- package/dist/math/box/box.js.map +1 -0
- package/dist/math/f32/constants/index.d.ts +1 -0
- package/dist/math/f32/constants/index.js +23 -0
- package/dist/math/f32/constants/index.js.map +1 -0
- package/dist/math/f32/constants/schema.d.ts +5 -0
- package/dist/math/f32/constants/schema.js +24 -0
- package/dist/math/f32/constants/schema.js.map +1 -0
- package/dist/math/f32/f32.d.ts +3 -8
- package/dist/math/f32/f32.js +1 -6
- package/dist/math/f32/f32.js.map +1 -1
- package/dist/math/face/face.d.ts +51 -0
- package/dist/math/face/face.js +110 -0
- package/dist/math/face/face.js.map +1 -0
- package/dist/math/face/face.test.d.ts +1 -0
- package/dist/math/face/face.test.js +94 -0
- package/dist/math/face/face.test.js.map +1 -0
- package/dist/math/i32/constants/index.d.ts +1 -0
- package/dist/math/i32/constants/index.js +23 -0
- package/dist/math/i32/constants/index.js.map +1 -0
- package/dist/math/i32/constants/schema.d.ts +6 -0
- package/dist/math/i32/constants/schema.js +24 -0
- package/dist/math/i32/constants/schema.js.map +1 -0
- package/dist/math/i32/i32.d.ts +3 -9
- package/dist/math/i32/i32.js +1 -6
- package/dist/math/i32/i32.js.map +1 -1
- package/dist/math/line2/constants/functions.d.ts +5 -0
- package/dist/math/line2/constants/functions.js +61 -0
- package/dist/math/line2/constants/functions.js.map +1 -0
- package/dist/math/line2/constants/index.d.ts +3 -0
- package/dist/math/line2/constants/index.js +25 -0
- package/dist/math/line2/constants/index.js.map +1 -0
- package/dist/math/line2/constants/layout.d.ts +1 -0
- package/dist/math/line2/constants/layout.js +25 -0
- package/dist/math/line2/constants/layout.js.map +1 -0
- package/dist/math/line2/constants/schema.d.ts +33 -0
- package/dist/math/line2/constants/schema.js +37 -0
- package/dist/math/line2/constants/schema.js.map +1 -0
- package/dist/math/line2/line2.d.ts +3 -41
- package/dist/math/line2/line2.js +1 -60
- package/dist/math/line2/line2.js.map +1 -1
- package/dist/math/line3/constants/functions.d.ts +17 -0
- package/dist/math/line3/constants/functions.js +70 -0
- package/dist/math/line3/constants/functions.js.map +1 -0
- package/dist/math/line3/constants/index.d.ts +3 -0
- package/dist/math/line3/constants/index.js +25 -0
- package/dist/math/line3/constants/index.js.map +1 -0
- package/dist/math/line3/constants/layout.d.ts +1 -0
- package/dist/math/line3/constants/layout.js +25 -0
- package/dist/math/line3/constants/layout.js.map +1 -0
- package/dist/math/line3/constants/schema.d.ts +33 -0
- package/dist/math/line3/constants/schema.js +37 -0
- package/dist/math/line3/constants/schema.js.map +1 -0
- package/dist/math/line3/line3.d.ts +3 -53
- package/dist/math/line3/line3.js +1 -68
- package/dist/math/line3/line3.js.map +1 -1
- package/dist/math/mat4x4/constants/functions.d.ts +23 -0
- package/dist/math/mat4x4/constants/functions.js +236 -0
- package/dist/math/mat4x4/constants/functions.js.map +1 -0
- package/dist/math/mat4x4/constants/index.d.ts +3 -0
- package/dist/math/mat4x4/constants/index.js +25 -0
- package/dist/math/mat4x4/constants/index.js.map +1 -0
- package/dist/math/mat4x4/constants/layout.d.ts +1 -0
- package/dist/math/mat4x4/constants/layout.js +25 -0
- package/dist/math/mat4x4/constants/layout.js.map +1 -0
- package/dist/math/mat4x4/constants/schema.d.ts +11 -0
- package/dist/math/mat4x4/constants/schema.js +30 -0
- package/dist/math/mat4x4/constants/schema.js.map +1 -0
- package/dist/math/mat4x4/mat4x4.d.ts +3 -36
- package/dist/math/mat4x4/mat4x4.js +1 -228
- package/dist/math/mat4x4/mat4x4.js.map +1 -1
- package/dist/math/picking/face.d.ts +1 -0
- package/dist/math/picking/face.js +2 -0
- package/dist/math/picking/face.js.map +1 -0
- package/dist/math/picking/get-closest-entity-to-line.d.ts +4 -0
- package/dist/math/picking/get-closest-entity-to-line.js +30 -0
- package/dist/math/picking/get-closest-entity-to-line.js.map +1 -0
- package/dist/math/picking/get-closest-entity-to-point.d.ts +4 -0
- package/dist/math/picking/get-closest-entity-to-point.js +27 -0
- package/dist/math/picking/get-closest-entity-to-point.js.map +1 -0
- package/dist/math/picking/get-intersecting-entities.d.ts +12 -0
- package/dist/math/picking/get-intersecting-entities.js +15 -0
- package/dist/math/picking/get-intersecting-entities.js.map +1 -0
- package/dist/math/picking/getClosestEntityToLine.d.ts +4 -0
- package/dist/math/picking/getClosestEntityToLine.js +29 -0
- package/dist/math/picking/getClosestEntityToLine.js.map +1 -0
- package/dist/math/picking/getClosestEntityToPoint.d.ts +4 -0
- package/dist/math/picking/getClosestEntityToPoint.js +27 -0
- package/dist/math/picking/getClosestEntityToPoint.js.map +1 -0
- package/dist/math/picking/getIntersectingEntities.d.ts +12 -0
- package/dist/math/picking/getIntersectingEntities.js +15 -0
- package/dist/math/picking/getIntersectingEntities.js.map +1 -0
- package/dist/math/picking/index.d.ts +5 -0
- package/dist/math/picking/index.js +27 -0
- package/dist/math/picking/index.js.map +1 -0
- package/dist/math/picking/pick-from-tables.d.ts +19 -0
- package/dist/math/picking/pick-from-tables.js +63 -0
- package/dist/math/picking/pick-from-tables.js.map +1 -0
- package/dist/math/picking/pick-result.d.ts +12 -0
- package/dist/math/picking/pick-result.js +23 -0
- package/dist/math/picking/pick-result.js.map +1 -0
- package/dist/math/plane/constants/functions.d.ts +16 -0
- package/dist/math/plane/constants/functions.js +54 -0
- package/dist/math/plane/constants/functions.js.map +1 -0
- package/dist/math/plane/constants/index.d.ts +3 -0
- package/dist/math/plane/constants/index.js +25 -0
- package/dist/math/plane/constants/index.js.map +1 -0
- package/dist/math/plane/constants/layout.d.ts +1 -0
- package/dist/math/plane/constants/layout.js +25 -0
- package/dist/math/plane/constants/layout.js.map +1 -0
- package/dist/math/plane/constants/schema.d.ts +24 -0
- package/dist/{schema/type.js → math/plane/constants/schema.js} +7 -7
- package/dist/math/plane/constants/schema.js.map +1 -0
- package/dist/math/plane/plane.d.ts +3 -42
- package/dist/math/plane/plane.js +1 -49
- package/dist/math/plane/plane.js.map +1 -1
- package/dist/math/quat/constants/index.d.ts +3 -0
- package/dist/math/quat/constants/index.js +25 -0
- package/dist/math/quat/constants/index.js.map +1 -0
- package/dist/math/quat/constants/layout.d.ts +1 -0
- package/dist/math/quat/constants/layout.js +25 -0
- package/dist/math/quat/constants/layout.js.map +1 -0
- package/dist/math/quat/constants/schema.d.ts +11 -0
- package/dist/math/quat/constants/schema.js +30 -0
- package/dist/math/quat/constants/schema.js.map +1 -0
- package/dist/math/quat/quat.d.ts +3 -56
- package/dist/math/quat/quat.js +1 -250
- package/dist/math/quat/quat.js.map +1 -1
- package/dist/math/transform/debug-inverse.d.ts +1 -0
- package/dist/math/transform/debug-inverse.js +28 -0
- package/dist/math/transform/debug-inverse.js.map +1 -0
- package/dist/math/transform/debug-quat.d.ts +1 -0
- package/dist/math/transform/debug-quat.js +23 -0
- package/dist/math/transform/debug-quat.js.map +1 -0
- package/dist/math/transform/debug-test.d.ts +1 -0
- package/dist/math/transform/debug-test.js +34 -0
- package/dist/math/transform/debug-test.js.map +1 -0
- package/dist/math/transform/transform.d.ts +58 -0
- package/dist/math/transform/transform.js +101 -0
- package/dist/math/transform/transform.js.map +1 -0
- package/dist/math/transform/transform.test.d.ts +1 -0
- package/dist/math/transform/transform.test.js +309 -0
- package/dist/math/transform/transform.test.js.map +1 -0
- package/dist/math/u32/constants/index.d.ts +1 -0
- package/dist/math/u32/constants/index.js +23 -0
- package/dist/math/u32/constants/index.js.map +1 -0
- package/dist/math/u32/constants/schema.d.ts +6 -0
- package/dist/math/u32/constants/schema.js +24 -0
- package/dist/math/u32/constants/schema.js.map +1 -0
- package/dist/math/u32/u32.d.ts +3 -9
- package/dist/math/u32/u32.js +1 -6
- package/dist/math/u32/u32.js.map +1 -1
- package/dist/math/vec2/constants/functions.d.ts +48 -0
- package/dist/math/vec2/constants/functions.js +104 -0
- package/dist/math/vec2/constants/functions.js.map +1 -0
- package/dist/math/vec2/constants/index.d.ts +3 -0
- package/dist/math/vec2/constants/index.js +25 -0
- package/dist/math/vec2/constants/index.js.map +1 -0
- package/dist/math/vec2/constants/layout.d.ts +1 -0
- package/dist/math/vec2/constants/layout.js +25 -0
- package/dist/math/vec2/constants/layout.js.map +1 -0
- package/dist/math/vec2/constants/schema.d.ts +11 -0
- package/dist/math/vec2/constants/schema.js +30 -0
- package/dist/math/vec2/constants/schema.js.map +1 -0
- package/dist/math/vec2/functions/abs.d.ts +2 -0
- package/dist/math/vec2/functions/abs.js +23 -0
- package/dist/math/vec2/functions/abs.js.map +1 -0
- package/dist/math/vec2/functions/acos.d.ts +2 -0
- package/dist/math/vec2/functions/acos.js +23 -0
- package/dist/math/vec2/functions/acos.js.map +1 -0
- package/dist/math/vec2/functions/acosh.d.ts +2 -0
- package/dist/math/vec2/functions/acosh.js +23 -0
- package/dist/math/vec2/functions/acosh.js.map +1 -0
- package/dist/math/vec2/functions/add.d.ts +2 -0
- package/dist/math/vec2/functions/add.js +23 -0
- package/dist/math/vec2/functions/add.js.map +1 -0
- package/dist/math/vec2/functions/asin.d.ts +2 -0
- package/dist/math/vec2/functions/asin.js +23 -0
- package/dist/math/vec2/functions/asin.js.map +1 -0
- package/dist/math/vec2/functions/asinh.d.ts +2 -0
- package/dist/math/vec2/functions/asinh.js +23 -0
- package/dist/math/vec2/functions/asinh.js.map +1 -0
- package/dist/math/vec2/functions/atan.d.ts +2 -0
- package/dist/math/vec2/functions/atan.js +23 -0
- package/dist/math/vec2/functions/atan.js.map +1 -0
- package/dist/math/vec2/functions/atanh.d.ts +2 -0
- package/dist/math/vec2/functions/atanh.js +23 -0
- package/dist/math/vec2/functions/atanh.js.map +1 -0
- package/dist/math/vec2/functions/ceil.d.ts +2 -0
- package/dist/math/vec2/functions/ceil.js +23 -0
- package/dist/math/vec2/functions/ceil.js.map +1 -0
- package/dist/math/vec2/functions/clamp.d.ts +2 -0
- package/dist/math/vec2/functions/clamp.js +25 -0
- package/dist/math/vec2/functions/clamp.js.map +1 -0
- package/dist/math/vec2/functions/cos.d.ts +2 -0
- package/dist/math/vec2/functions/cos.js +23 -0
- package/dist/math/vec2/functions/cos.js.map +1 -0
- package/dist/math/vec2/functions/cosh.d.ts +2 -0
- package/dist/math/vec2/functions/cosh.js +23 -0
- package/dist/math/vec2/functions/cosh.js.map +1 -0
- package/dist/math/vec2/functions/distance.d.ts +2 -0
- package/dist/math/vec2/functions/distance.js +25 -0
- package/dist/math/vec2/functions/distance.js.map +1 -0
- package/dist/math/vec2/functions/dot.d.ts +2 -0
- package/dist/math/vec2/functions/dot.js +23 -0
- package/dist/math/vec2/functions/dot.js.map +1 -0
- package/dist/math/vec2/functions/exp-2.d.ts +2 -0
- package/dist/math/vec2/functions/exp-2.js +23 -0
- package/dist/math/vec2/functions/exp-2.js.map +1 -0
- package/dist/math/vec2/functions/exp.d.ts +2 -0
- package/dist/math/vec2/functions/exp.js +23 -0
- package/dist/math/vec2/functions/exp.js.map +1 -0
- package/dist/math/vec2/functions/face-forward.d.ts +2 -0
- package/dist/math/vec2/functions/face-forward.js +25 -0
- package/dist/math/vec2/functions/face-forward.js.map +1 -0
- package/dist/math/vec2/functions/floor.d.ts +2 -0
- package/dist/math/vec2/functions/floor.js +23 -0
- package/dist/math/vec2/functions/floor.js.map +1 -0
- package/dist/math/vec2/functions/fract.d.ts +2 -0
- package/dist/math/vec2/functions/fract.js +23 -0
- package/dist/math/vec2/functions/fract.js.map +1 -0
- package/dist/math/vec2/functions/functions.d.ts +48 -0
- package/dist/math/vec2/functions/functions.js +104 -0
- package/dist/math/vec2/functions/functions.js.map +1 -0
- package/dist/math/vec2/functions/index.d.ts +3 -0
- package/dist/math/vec2/functions/index.js +25 -0
- package/dist/math/vec2/functions/index.js.map +1 -0
- package/dist/math/vec2/functions/layout.d.ts +1 -0
- package/dist/math/vec2/functions/layout.js +25 -0
- package/dist/math/vec2/functions/layout.js.map +1 -0
- package/dist/math/vec2/functions/length.d.ts +2 -0
- package/dist/math/vec2/functions/length.js +23 -0
- package/dist/math/vec2/functions/length.js.map +1 -0
- package/dist/math/vec2/functions/log-2.d.ts +2 -0
- package/dist/math/vec2/functions/log-2.js +23 -0
- package/dist/math/vec2/functions/log-2.js.map +1 -0
- package/dist/math/vec2/functions/log.d.ts +2 -0
- package/dist/math/vec2/functions/log.js +23 -0
- package/dist/math/vec2/functions/log.js.map +1 -0
- package/dist/math/vec2/functions/max.d.ts +2 -0
- package/dist/math/vec2/functions/max.js +23 -0
- package/dist/math/vec2/functions/max.js.map +1 -0
- package/dist/math/vec2/functions/min.d.ts +2 -0
- package/dist/math/vec2/functions/min.js +23 -0
- package/dist/math/vec2/functions/min.js.map +1 -0
- package/dist/math/vec2/functions/mix.d.ts +2 -0
- package/dist/math/vec2/functions/mix.js +26 -0
- package/dist/math/vec2/functions/mix.js.map +1 -0
- package/dist/math/vec2/functions/mod.d.ts +2 -0
- package/dist/math/vec2/functions/mod.js +26 -0
- package/dist/math/vec2/functions/mod.js.map +1 -0
- package/dist/math/vec2/functions/modf.d.ts +5 -0
- package/dist/math/vec2/functions/modf.js +26 -0
- package/dist/math/vec2/functions/modf.js.map +1 -0
- package/dist/math/vec2/functions/negate.d.ts +2 -0
- package/dist/math/vec2/functions/negate.js +23 -0
- package/dist/math/vec2/functions/negate.js.map +1 -0
- package/dist/math/vec2/functions/normalize.d.ts +2 -0
- package/dist/math/vec2/functions/normalize.js +28 -0
- package/dist/math/vec2/functions/normalize.js.map +1 -0
- package/dist/math/vec2/functions/pow.d.ts +2 -0
- package/dist/math/vec2/functions/pow.js +26 -0
- package/dist/math/vec2/functions/pow.js.map +1 -0
- package/dist/math/vec2/functions/reflect.d.ts +2 -0
- package/dist/math/vec2/functions/reflect.js +29 -0
- package/dist/math/vec2/functions/reflect.js.map +1 -0
- package/dist/math/vec2/functions/refract.d.ts +2 -0
- package/dist/math/vec2/functions/refract.js +34 -0
- package/dist/math/vec2/functions/refract.js.map +1 -0
- package/dist/math/vec2/functions/round.d.ts +2 -0
- package/dist/math/vec2/functions/round.js +23 -0
- package/dist/math/vec2/functions/round.js.map +1 -0
- package/dist/math/vec2/functions/scale.d.ts +2 -0
- package/dist/math/vec2/functions/scale.js +23 -0
- package/dist/math/vec2/functions/scale.js.map +1 -0
- package/dist/math/vec2/functions/schema.d.ts +11 -0
- package/dist/math/vec2/functions/schema.js +30 -0
- package/dist/math/vec2/functions/schema.js.map +1 -0
- package/dist/math/vec2/functions/sign.d.ts +2 -0
- package/dist/math/vec2/functions/sign.js +23 -0
- package/dist/math/vec2/functions/sign.js.map +1 -0
- package/dist/math/vec2/functions/sin.d.ts +2 -0
- package/dist/math/vec2/functions/sin.js +23 -0
- package/dist/math/vec2/functions/sin.js.map +1 -0
- package/dist/math/vec2/functions/sinh.d.ts +2 -0
- package/dist/math/vec2/functions/sinh.js +23 -0
- package/dist/math/vec2/functions/sinh.js.map +1 -0
- package/dist/math/vec2/functions/smooth-step.d.ts +2 -0
- package/dist/math/vec2/functions/smooth-step.js +27 -0
- package/dist/math/vec2/functions/smooth-step.js.map +1 -0
- package/dist/math/vec2/functions/sqrt.d.ts +2 -0
- package/dist/math/vec2/functions/sqrt.js +23 -0
- package/dist/math/vec2/functions/sqrt.js.map +1 -0
- package/dist/math/vec2/functions/step.d.ts +2 -0
- package/dist/math/vec2/functions/step.js +26 -0
- package/dist/math/vec2/functions/step.js.map +1 -0
- package/dist/math/vec2/functions/subtract.d.ts +2 -0
- package/dist/math/vec2/functions/subtract.js +23 -0
- package/dist/math/vec2/functions/subtract.js.map +1 -0
- package/dist/math/vec2/functions/tan.d.ts +2 -0
- package/dist/math/vec2/functions/tan.js +23 -0
- package/dist/math/vec2/functions/tan.js.map +1 -0
- package/dist/math/vec2/functions/tanh.d.ts +2 -0
- package/dist/math/vec2/functions/tanh.js +23 -0
- package/dist/math/vec2/functions/tanh.js.map +1 -0
- package/dist/math/vec2/functions/trunc.d.ts +2 -0
- package/dist/math/vec2/functions/trunc.js +23 -0
- package/dist/math/vec2/functions/trunc.js.map +1 -0
- package/dist/math/vec2/vec2.d.ts +3 -62
- package/dist/math/vec2/vec2.js +1 -96
- package/dist/math/vec2/vec2.js.map +1 -1
- package/dist/math/vec3/constants/functions.d.ts +59 -0
- package/dist/math/vec3/constants/functions.js +159 -0
- package/dist/math/vec3/constants/functions.js.map +1 -0
- package/dist/math/vec3/constants/index.d.ts +3 -0
- package/dist/math/vec3/constants/index.js +25 -0
- package/dist/math/vec3/constants/index.js.map +1 -0
- package/dist/math/vec3/constants/layout.d.ts +1 -0
- package/dist/math/vec3/constants/layout.js +25 -0
- package/dist/math/vec3/constants/layout.js.map +1 -0
- package/dist/math/vec3/constants/schema.d.ts +11 -0
- package/dist/math/vec3/constants/schema.js +30 -0
- package/dist/math/vec3/constants/schema.js.map +1 -0
- package/dist/math/vec3/functions/abs.d.ts +2 -0
- package/dist/math/vec3/functions/abs.js +23 -0
- package/dist/math/vec3/functions/abs.js.map +1 -0
- package/dist/math/vec3/functions/acos.d.ts +2 -0
- package/dist/math/vec3/functions/acos.js +23 -0
- package/dist/math/vec3/functions/acos.js.map +1 -0
- package/dist/math/vec3/functions/acosh.d.ts +2 -0
- package/dist/math/vec3/functions/acosh.js +23 -0
- package/dist/math/vec3/functions/acosh.js.map +1 -0
- package/dist/math/vec3/functions/add.d.ts +2 -0
- package/dist/math/vec3/functions/add.js +27 -0
- package/dist/math/vec3/functions/add.js.map +1 -0
- package/dist/math/vec3/functions/asin.d.ts +2 -0
- package/dist/math/vec3/functions/asin.js +23 -0
- package/dist/math/vec3/functions/asin.js.map +1 -0
- package/dist/math/vec3/functions/asinh.d.ts +2 -0
- package/dist/math/vec3/functions/asinh.js +23 -0
- package/dist/math/vec3/functions/asinh.js.map +1 -0
- package/dist/math/vec3/functions/atan.d.ts +2 -0
- package/dist/math/vec3/functions/atan.js +23 -0
- package/dist/math/vec3/functions/atan.js.map +1 -0
- package/dist/math/vec3/functions/atanh.d.ts +2 -0
- package/dist/math/vec3/functions/atanh.js +23 -0
- package/dist/math/vec3/functions/atanh.js.map +1 -0
- package/dist/math/vec3/functions/ceil.d.ts +2 -0
- package/dist/math/vec3/functions/ceil.js +23 -0
- package/dist/math/vec3/functions/ceil.js.map +1 -0
- package/dist/math/vec3/functions/clamp.d.ts +2 -0
- package/dist/math/vec3/functions/clamp.js +25 -0
- package/dist/math/vec3/functions/clamp.js.map +1 -0
- package/dist/math/vec3/functions/cos.d.ts +2 -0
- package/dist/math/vec3/functions/cos.js +23 -0
- package/dist/math/vec3/functions/cos.js.map +1 -0
- package/dist/math/vec3/functions/cosh.d.ts +2 -0
- package/dist/math/vec3/functions/cosh.js +23 -0
- package/dist/math/vec3/functions/cosh.js.map +1 -0
- package/dist/math/vec3/functions/cross.d.ts +2 -0
- package/dist/math/vec3/functions/cross.js +27 -0
- package/dist/math/vec3/functions/cross.js.map +1 -0
- package/dist/math/vec3/functions/distance-squared.d.ts +2 -0
- package/dist/math/vec3/functions/distance-squared.js +28 -0
- package/dist/math/vec3/functions/distance-squared.js.map +1 -0
- package/dist/math/vec3/functions/distance.d.ts +2 -0
- package/dist/math/vec3/functions/distance.js +25 -0
- package/dist/math/vec3/functions/distance.js.map +1 -0
- package/dist/math/vec3/functions/dot.d.ts +2 -0
- package/dist/math/vec3/functions/dot.js +23 -0
- package/dist/math/vec3/functions/dot.js.map +1 -0
- package/dist/math/vec3/functions/equals.d.ts +2 -0
- package/dist/math/vec3/functions/equals.js +23 -0
- package/dist/math/vec3/functions/equals.js.map +1 -0
- package/dist/math/vec3/functions/exp-2.d.ts +2 -0
- package/dist/math/vec3/functions/exp-2.js +23 -0
- package/dist/math/vec3/functions/exp-2.js.map +1 -0
- package/dist/math/vec3/functions/exp.d.ts +2 -0
- package/dist/math/vec3/functions/exp.js +23 -0
- package/dist/math/vec3/functions/exp.js.map +1 -0
- package/dist/math/vec3/functions/face-forward.d.ts +2 -0
- package/dist/math/vec3/functions/face-forward.js +25 -0
- package/dist/math/vec3/functions/face-forward.js.map +1 -0
- package/dist/math/vec3/functions/floor.d.ts +2 -0
- package/dist/math/vec3/functions/floor.js +23 -0
- package/dist/math/vec3/functions/floor.js.map +1 -0
- package/dist/math/vec3/functions/fract.d.ts +2 -0
- package/dist/math/vec3/functions/fract.js +27 -0
- package/dist/math/vec3/functions/fract.js.map +1 -0
- package/dist/math/vec3/functions/index.d.ts +54 -0
- package/dist/math/vec3/functions/index.js +76 -0
- package/dist/math/vec3/functions/index.js.map +1 -0
- package/dist/math/vec3/functions/layout.d.ts +1 -0
- package/dist/math/vec3/functions/layout.js +25 -0
- package/dist/math/vec3/functions/layout.js.map +1 -0
- package/dist/math/vec3/functions/length-squared.d.ts +2 -0
- package/dist/math/vec3/functions/length-squared.js +23 -0
- package/dist/math/vec3/functions/length-squared.js.map +1 -0
- package/dist/math/vec3/functions/length.d.ts +2 -0
- package/dist/math/vec3/functions/length.js +23 -0
- package/dist/math/vec3/functions/length.js.map +1 -0
- package/dist/math/vec3/functions/log-2.d.ts +2 -0
- package/dist/math/vec3/functions/log-2.js +23 -0
- package/dist/math/vec3/functions/log-2.js.map +1 -0
- package/dist/math/vec3/functions/log.d.ts +2 -0
- package/dist/math/vec3/functions/log.js +23 -0
- package/dist/math/vec3/functions/log.js.map +1 -0
- package/dist/math/vec3/functions/max.d.ts +2 -0
- package/dist/math/vec3/functions/max.js +27 -0
- package/dist/math/vec3/functions/max.js.map +1 -0
- package/dist/math/vec3/functions/min.d.ts +2 -0
- package/dist/math/vec3/functions/min.js +27 -0
- package/dist/math/vec3/functions/min.js.map +1 -0
- package/dist/math/vec3/functions/mix.d.ts +2 -0
- package/dist/math/vec3/functions/mix.js +27 -0
- package/dist/math/vec3/functions/mix.js.map +1 -0
- package/dist/math/vec3/functions/mod.d.ts +2 -0
- package/dist/math/vec3/functions/mod.js +27 -0
- package/dist/math/vec3/functions/mod.js.map +1 -0
- package/dist/math/vec3/functions/modf.d.ts +5 -0
- package/dist/math/vec3/functions/modf.js +26 -0
- package/dist/math/vec3/functions/modf.js.map +1 -0
- package/dist/math/vec3/functions/multiply.d.ts +5 -0
- package/dist/math/vec3/functions/multiply.js +30 -0
- package/dist/math/vec3/functions/multiply.js.map +1 -0
- package/dist/math/vec3/functions/negate.d.ts +2 -0
- package/dist/math/vec3/functions/negate.js +23 -0
- package/dist/math/vec3/functions/negate.js.map +1 -0
- package/dist/math/vec3/functions/normalize.d.ts +2 -0
- package/dist/math/vec3/functions/normalize.js +28 -0
- package/dist/math/vec3/functions/normalize.js.map +1 -0
- package/dist/math/vec3/functions/one.d.ts +2 -0
- package/dist/math/vec3/functions/one.js +23 -0
- package/dist/math/vec3/functions/one.js.map +1 -0
- package/dist/math/vec3/functions/pow.d.ts +2 -0
- package/dist/math/vec3/functions/pow.js +27 -0
- package/dist/math/vec3/functions/pow.js.map +1 -0
- package/dist/math/vec3/functions/random.d.ts +2 -0
- package/dist/math/vec3/functions/random.js +25 -0
- package/dist/math/vec3/functions/random.js.map +1 -0
- package/dist/math/vec3/functions/reflect.d.ts +2 -0
- package/dist/math/vec3/functions/reflect.js +29 -0
- package/dist/math/vec3/functions/reflect.js.map +1 -0
- package/dist/math/vec3/functions/refract.d.ts +2 -0
- package/dist/math/vec3/functions/refract.js +34 -0
- package/dist/math/vec3/functions/refract.js.map +1 -0
- package/dist/math/vec3/functions/round.d.ts +2 -0
- package/dist/math/vec3/functions/round.js +23 -0
- package/dist/math/vec3/functions/round.js.map +1 -0
- package/dist/math/vec3/functions/scale.d.ts +2 -0
- package/dist/math/vec3/functions/scale.js +23 -0
- package/dist/math/vec3/functions/scale.js.map +1 -0
- package/dist/math/vec3/functions/schema.d.ts +11 -0
- package/dist/math/vec3/functions/schema.js +30 -0
- package/dist/math/vec3/functions/schema.js.map +1 -0
- package/dist/math/vec3/functions/sign.d.ts +2 -0
- package/dist/math/vec3/functions/sign.js +23 -0
- package/dist/math/vec3/functions/sign.js.map +1 -0
- package/dist/math/vec3/functions/sin.d.ts +2 -0
- package/dist/math/vec3/functions/sin.js +23 -0
- package/dist/math/vec3/functions/sin.js.map +1 -0
- package/dist/math/vec3/functions/sinh.d.ts +2 -0
- package/dist/math/vec3/functions/sinh.js +23 -0
- package/dist/math/vec3/functions/sinh.js.map +1 -0
- package/dist/math/vec3/functions/smooth-step.d.ts +2 -0
- package/dist/math/vec3/functions/smooth-step.js +32 -0
- package/dist/math/vec3/functions/smooth-step.js.map +1 -0
- package/dist/math/vec3/functions/sqrt.d.ts +2 -0
- package/dist/math/vec3/functions/sqrt.js +23 -0
- package/dist/math/vec3/functions/sqrt.js.map +1 -0
- package/dist/math/vec3/functions/step.d.ts +2 -0
- package/dist/math/vec3/functions/step.js +27 -0
- package/dist/math/vec3/functions/step.js.map +1 -0
- package/dist/math/vec3/functions/subtract.d.ts +2 -0
- package/dist/math/vec3/functions/subtract.js +27 -0
- package/dist/math/vec3/functions/subtract.js.map +1 -0
- package/dist/math/vec3/functions/tan.d.ts +2 -0
- package/dist/math/vec3/functions/tan.js +23 -0
- package/dist/math/vec3/functions/tan.js.map +1 -0
- package/dist/math/vec3/functions/tanh.d.ts +2 -0
- package/dist/math/vec3/functions/tanh.js +23 -0
- package/dist/math/vec3/functions/tanh.js.map +1 -0
- package/dist/math/vec3/functions/trunc.d.ts +2 -0
- package/dist/math/vec3/functions/trunc.js +23 -0
- package/dist/math/vec3/functions/trunc.js.map +1 -0
- package/dist/math/vec3/functions/zero.d.ts +2 -0
- package/dist/math/vec3/functions/zero.js +23 -0
- package/dist/math/vec3/functions/zero.js.map +1 -0
- package/dist/math/vec3/vec3.d.ts +3 -73
- package/dist/math/vec3/vec3.js +1 -151
- package/dist/math/vec3/vec3.js.map +1 -1
- package/dist/math/vec4/constants/functions.d.ts +49 -0
- package/dist/math/vec4/constants/functions.js +150 -0
- package/dist/math/vec4/constants/functions.js.map +1 -0
- package/dist/math/vec4/constants/index.d.ts +3 -0
- package/dist/math/vec4/constants/index.js +25 -0
- package/dist/math/vec4/constants/index.js.map +1 -0
- package/dist/math/vec4/constants/layout.d.ts +1 -0
- package/dist/math/vec4/constants/layout.js +25 -0
- package/dist/math/vec4/constants/layout.js.map +1 -0
- package/dist/math/vec4/constants/schema.d.ts +11 -0
- package/dist/math/vec4/constants/schema.js +30 -0
- package/dist/math/vec4/constants/schema.js.map +1 -0
- package/dist/math/vec4/functions/abs.d.ts +2 -0
- package/dist/math/vec4/functions/abs.js +23 -0
- package/dist/math/vec4/functions/abs.js.map +1 -0
- package/dist/math/vec4/functions/ceil.d.ts +2 -0
- package/dist/math/vec4/functions/ceil.js +23 -0
- package/dist/math/vec4/functions/ceil.js.map +1 -0
- package/dist/math/vec4/functions/clamp.d.ts +2 -0
- package/dist/math/vec4/functions/clamp.js +25 -0
- package/dist/math/vec4/functions/clamp.js.map +1 -0
- package/dist/math/vec4/functions/floor.d.ts +2 -0
- package/dist/math/vec4/functions/floor.js +23 -0
- package/dist/math/vec4/functions/floor.js.map +1 -0
- package/dist/math/vec4/functions/layout.d.ts +1 -0
- package/dist/math/vec4/functions/layout.js +25 -0
- package/dist/math/vec4/functions/layout.js.map +1 -0
- package/dist/math/vec4/functions/max.d.ts +2 -0
- package/dist/math/vec4/functions/max.js +28 -0
- package/dist/math/vec4/functions/max.js.map +1 -0
- package/dist/math/vec4/functions/min.d.ts +2 -0
- package/dist/math/vec4/functions/min.js +28 -0
- package/dist/math/vec4/functions/min.js.map +1 -0
- package/dist/math/vec4/functions/round.d.ts +2 -0
- package/dist/math/vec4/functions/round.js +23 -0
- package/dist/math/vec4/functions/round.js.map +1 -0
- package/dist/math/vec4/functions/schema.d.ts +11 -0
- package/dist/math/vec4/functions/schema.js +30 -0
- package/dist/math/vec4/functions/schema.js.map +1 -0
- package/dist/math/vec4/functions/trunc.d.ts +2 -0
- package/dist/math/vec4/functions/trunc.js +23 -0
- package/dist/math/vec4/functions/trunc.js.map +1 -0
- package/dist/math/vec4/vec4.d.ts +3 -63
- package/dist/math/vec4/vec4.js +1 -142
- package/dist/math/vec4/vec4.js.map +1 -1
- package/dist/observe/create-observable-event.d.ts +1 -1
- package/dist/observe/create-observable-event.js +1 -1
- package/dist/observe/create-observable-event.js.map +1 -1
- package/dist/observe/create-observable-state.d.ts +1 -1
- package/dist/observe/create-observable-state.js +1 -1
- package/dist/observe/create-observable-state.js.map +1 -1
- package/dist/old-ecs/ecs/ecs.test.js +0 -1
- package/dist/old-ecs/ecs/ecs.test.js.map +1 -1
- package/dist/old-ecs/privacy/helper-functions.d.ts +43 -0
- package/dist/old-ecs/privacy/helper-functions.js +76 -0
- package/dist/old-ecs/privacy/helper-functions.js.map +1 -0
- package/dist/old-ecs/privacy/helper-functions.test.d.ts +1 -0
- package/dist/old-ecs/privacy/helper-functions.test.js +173 -0
- package/dist/old-ecs/privacy/helper-functions.test.js.map +1 -0
- package/dist/samples/todo/services/main-service/todo-main-service.d.ts +1 -1
- package/dist/samples/todo/services/state-service/create-todo-database.d.ts +5 -4
- package/dist/samples/todo/services/state-service/create-todo-database.js +3 -3
- package/dist/samples/todo/services/state-service/create-todo-database.js.map +1 -1
- package/dist/samples/todo/services/state-service/create-todo-store.d.ts +3 -2
- package/dist/samples/todo/services/state-service/create-todo-store.js +15 -17
- package/dist/samples/todo/services/state-service/create-todo-store.js.map +1 -1
- package/dist/samples/todo/services/state-service/transactions/toggle-complete.js +1 -1
- package/dist/samples/todo/services/state-service/transactions/toggle-complete.js.map +1 -1
- package/dist/schema/f32.d.ts +1 -1
- package/dist/schema/f32.js +1 -1
- package/dist/schema/f32.js.map +1 -1
- package/dist/schema/i32.d.ts +1 -1
- package/dist/schema/i32.js +1 -1
- package/dist/schema/i32.js.map +1 -1
- package/dist/schema/schema/index.d.ts +2 -0
- package/dist/schema/schema/index.js +23 -0
- package/dist/schema/schema/index.js.map +1 -0
- package/dist/schema/schema/nullable.d.ts +6 -0
- package/dist/schema/schema/nullable.js +6 -0
- package/dist/schema/schema/nullable.js.map +1 -0
- package/dist/schema/schema/public.d.ts +3 -0
- package/dist/schema/schema/public.js +25 -0
- package/dist/schema/schema/public.js.map +1 -0
- package/dist/schema/schema/to-vertex-buffer-layout.d.ts +56 -0
- package/dist/schema/schema/to-vertex-buffer-layout.js +143 -0
- package/dist/schema/schema/to-vertex-buffer-layout.js.map +1 -0
- package/dist/schema/{schema copy.d.ts → schema/types.d.ts} +7 -4
- package/dist/schema/{schema copy.js → schema/types.js} +1 -1
- package/dist/schema/schema/types.js.map +1 -0
- package/dist/schema/u32.d.ts +1 -1
- package/dist/schema/u32.js +1 -1
- package/dist/schema/u32.js.map +1 -1
- package/dist/table/constants/functions.d.ts +3 -0
- package/dist/table/constants/functions.js +34 -0
- package/dist/table/constants/functions.js.map +1 -0
- package/dist/table/constants/index.d.ts +1 -0
- package/dist/table/constants/index.js +23 -0
- package/dist/table/constants/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/schema/FromSchemas.d.ts +0 -4
- package/dist/schema/FromSchemas.js +0 -2
- package/dist/schema/FromSchemas.js.map +0 -1
- package/dist/schema/schema copy.js.map +0 -1
- package/dist/schema/type.d.ts +0 -76
- package/dist/schema/type.js.map +0 -1
|
@@ -0,0 +1,993 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { describe, it, expect, vi } from "vitest";
|
|
23
|
+
import { Database } from "../database.js";
|
|
24
|
+
import { createReconcilingDatabase } from "../reconciling/create-reconciling-database.js";
|
|
25
|
+
import { Store } from "../../store/index.js";
|
|
26
|
+
import { F32 } from "../../../math/f32/index.js";
|
|
27
|
+
import { toPromise } from "../../../observe/to-promise.js";
|
|
28
|
+
import { createUndoRedoService } from "../../undo-redo-service/create-undo-redo-service.js";
|
|
29
|
+
import { applyOperations } from "../transactional-store/apply-operations.js";
|
|
30
|
+
// Test schemas
|
|
31
|
+
const positionSchema = {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {
|
|
34
|
+
x: F32.schema,
|
|
35
|
+
y: F32.schema,
|
|
36
|
+
z: F32.schema,
|
|
37
|
+
},
|
|
38
|
+
required: ["x", "y", "z"],
|
|
39
|
+
additionalProperties: false,
|
|
40
|
+
};
|
|
41
|
+
const healthSchema = {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
current: F32.schema,
|
|
45
|
+
max: F32.schema,
|
|
46
|
+
},
|
|
47
|
+
required: ["current", "max"],
|
|
48
|
+
additionalProperties: false,
|
|
49
|
+
};
|
|
50
|
+
const nameSchema = {
|
|
51
|
+
type: "string",
|
|
52
|
+
maxLength: 50,
|
|
53
|
+
};
|
|
54
|
+
const createStoreConfig = () => {
|
|
55
|
+
const baseStore = Store.create({
|
|
56
|
+
components: { position: positionSchema, health: healthSchema, name: nameSchema },
|
|
57
|
+
resources: {
|
|
58
|
+
time: { default: { delta: 0.016, elapsed: 0 } },
|
|
59
|
+
generating: { type: "boolean", default: false }
|
|
60
|
+
},
|
|
61
|
+
archetypes: {
|
|
62
|
+
Position: ["position"],
|
|
63
|
+
Health: ["health"],
|
|
64
|
+
PositionHealth: ["position", "health"],
|
|
65
|
+
PositionName: ["position", "name"],
|
|
66
|
+
Full: ["position", "health", "name"],
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const actions = {
|
|
70
|
+
createPositionEntity(t, args) {
|
|
71
|
+
return t.archetypes.Position.insert(args);
|
|
72
|
+
},
|
|
73
|
+
createPositionHealthEntity(t, args) {
|
|
74
|
+
return t.archetypes.PositionHealth.insert(args);
|
|
75
|
+
},
|
|
76
|
+
createPositionNameEntity(t, args) {
|
|
77
|
+
return t.archetypes.PositionName.insert(args);
|
|
78
|
+
},
|
|
79
|
+
createFullEntity(t, args) {
|
|
80
|
+
return t.archetypes.Full.insert(args);
|
|
81
|
+
},
|
|
82
|
+
createEntityAndReturn(t, args) {
|
|
83
|
+
return t.archetypes.PositionName.insert(args);
|
|
84
|
+
},
|
|
85
|
+
updateEntity(t, args) {
|
|
86
|
+
t.update(args.entity, args.values);
|
|
87
|
+
},
|
|
88
|
+
deleteEntity(t, args) {
|
|
89
|
+
t.delete(args.entity);
|
|
90
|
+
},
|
|
91
|
+
updateTime(t, args) {
|
|
92
|
+
t.resources.time = args;
|
|
93
|
+
},
|
|
94
|
+
createFailingPositionEntity(t, args) {
|
|
95
|
+
const entity = t.archetypes.Position.insert(args);
|
|
96
|
+
throw new Error("Simulated failure");
|
|
97
|
+
},
|
|
98
|
+
startGenerating(t, args) {
|
|
99
|
+
if (args.progress < 1.0) {
|
|
100
|
+
t.resources.generating = true;
|
|
101
|
+
}
|
|
102
|
+
return -1;
|
|
103
|
+
},
|
|
104
|
+
deletePositionEntities(t) {
|
|
105
|
+
for (const entity of t.select(["position"])) {
|
|
106
|
+
t.delete(entity);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return { baseStore, actions };
|
|
111
|
+
};
|
|
112
|
+
function createTestDatabase() {
|
|
113
|
+
const { baseStore, actions } = createStoreConfig();
|
|
114
|
+
return Database.create(baseStore, actions);
|
|
115
|
+
}
|
|
116
|
+
describe("createDatabase", () => {
|
|
117
|
+
it("should apply committed entries in arrival order, ignoring commit time", () => {
|
|
118
|
+
const { baseStore, actions } = createStoreConfig();
|
|
119
|
+
const reconciling = createReconcilingDatabase(baseStore, actions);
|
|
120
|
+
reconciling.apply({
|
|
121
|
+
id: 1,
|
|
122
|
+
name: "createPositionNameEntity",
|
|
123
|
+
args: { position: { x: 10, y: 20, z: 30 }, name: "LateCommit" },
|
|
124
|
+
time: 5,
|
|
125
|
+
});
|
|
126
|
+
reconciling.apply({
|
|
127
|
+
id: 2,
|
|
128
|
+
name: "createPositionNameEntity",
|
|
129
|
+
args: { position: { x: 40, y: 50, z: 60 }, name: "EarlyCommit" },
|
|
130
|
+
time: 1,
|
|
131
|
+
});
|
|
132
|
+
const entities = reconciling.select(["name"]);
|
|
133
|
+
const namesById = entities
|
|
134
|
+
.map(entity => reconciling.read(entity)?.name)
|
|
135
|
+
.filter((name) => !!name);
|
|
136
|
+
expect(namesById).toHaveLength(2);
|
|
137
|
+
expect(namesById).toEqual(["LateCommit", "EarlyCommit"]);
|
|
138
|
+
});
|
|
139
|
+
it("should support deleting entities", () => {
|
|
140
|
+
const store = createTestDatabase();
|
|
141
|
+
const entity = store.transactions.createPositionEntity({ position: { x: 1, y: 2, z: 3 } });
|
|
142
|
+
store.transactions.deletePositionEntities();
|
|
143
|
+
expect(store.locate(entity)).toBeNull();
|
|
144
|
+
});
|
|
145
|
+
it("should roll back state when a transaction throws synchronously", () => {
|
|
146
|
+
const store = createTestDatabase();
|
|
147
|
+
expect(() => store.transactions.createFailingPositionEntity({
|
|
148
|
+
position: { x: 1, y: 2, z: 3 },
|
|
149
|
+
})).toThrow("Simulated failure");
|
|
150
|
+
const entities = store.select(["position"]);
|
|
151
|
+
expect(entities).toHaveLength(0);
|
|
152
|
+
});
|
|
153
|
+
it("should support transaction functions that return an Entity", () => {
|
|
154
|
+
const store = createTestDatabase();
|
|
155
|
+
// Execute a transaction that returns an Entity
|
|
156
|
+
const returnedEntity = store.transactions.createEntityAndReturn({
|
|
157
|
+
position: { x: 10, y: 20, z: 30 },
|
|
158
|
+
name: "ReturnedEntity"
|
|
159
|
+
});
|
|
160
|
+
// Verify that an Entity was returned
|
|
161
|
+
expect(returnedEntity).toBeDefined();
|
|
162
|
+
expect(typeof returnedEntity).toBe("number");
|
|
163
|
+
// Verify the entity exists in the store
|
|
164
|
+
const entityValues = store.read(returnedEntity);
|
|
165
|
+
expect(entityValues).toBeDefined();
|
|
166
|
+
expect(entityValues?.position).toEqual({ x: 10, y: 20, z: 30 });
|
|
167
|
+
expect(entityValues?.name).toBe("ReturnedEntity");
|
|
168
|
+
// Verify the entity can be found in the store using select
|
|
169
|
+
const selectedEntities = store.select(["position", "name"]);
|
|
170
|
+
expect(selectedEntities).toContain(returnedEntity);
|
|
171
|
+
});
|
|
172
|
+
describe("AsyncArgs Support", () => {
|
|
173
|
+
it("should handle Promise-based async arguments", async () => {
|
|
174
|
+
const store = createTestDatabase();
|
|
175
|
+
const observer = vi.fn();
|
|
176
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
177
|
+
// Create a promise that resolves to entity data
|
|
178
|
+
const entityDataPromise = Promise.resolve({
|
|
179
|
+
position: { x: 100, y: 200, z: 300 },
|
|
180
|
+
name: "AsyncEntity"
|
|
181
|
+
});
|
|
182
|
+
// Execute transaction with promise argument wrapped in function
|
|
183
|
+
store.transactions.createPositionNameEntity(() => entityDataPromise);
|
|
184
|
+
// Wait for the promise to resolve
|
|
185
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
186
|
+
// Verify the entity was created with the resolved data
|
|
187
|
+
const entities = store.select(["position", "name"]);
|
|
188
|
+
const createdEntity = entities.find(entityId => {
|
|
189
|
+
const values = store.read(entityId);
|
|
190
|
+
return values?.name === "AsyncEntity";
|
|
191
|
+
});
|
|
192
|
+
expect(createdEntity).toBeDefined();
|
|
193
|
+
const entityValues = store.read(createdEntity);
|
|
194
|
+
expect(entityValues?.position).toEqual({ x: 100, y: 200, z: 300 });
|
|
195
|
+
expect(entityValues?.name).toBe("AsyncEntity");
|
|
196
|
+
// Verify observer was notified
|
|
197
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
198
|
+
unsubscribe();
|
|
199
|
+
});
|
|
200
|
+
it("should handle AsyncGenerator streaming arguments", async () => {
|
|
201
|
+
const store = createTestDatabase();
|
|
202
|
+
const observer = vi.fn();
|
|
203
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
204
|
+
// Create an async generator that yields multiple entity data
|
|
205
|
+
async function* entityDataStream() {
|
|
206
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "Stream1" };
|
|
207
|
+
yield { position: { x: 2, y: 2, z: 2 }, name: "Stream2" };
|
|
208
|
+
yield { position: { x: 3, y: 3, z: 3 }, name: "Stream3" };
|
|
209
|
+
}
|
|
210
|
+
// Execute transaction with async generator wrapped in function
|
|
211
|
+
store.transactions.createPositionNameEntity(() => entityDataStream());
|
|
212
|
+
// Wait for all entities to be processed
|
|
213
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
214
|
+
// Verify only the final entity was created (each yield replaces the previous)
|
|
215
|
+
// Now that rollback is working correctly and observably, we should see only the final entity
|
|
216
|
+
const entities = store.select(["position", "name"]);
|
|
217
|
+
const streamEntities = entities.filter(entityId => {
|
|
218
|
+
const values = store.read(entityId);
|
|
219
|
+
return values?.name?.startsWith("Stream");
|
|
220
|
+
});
|
|
221
|
+
// Now that rollback is observable, we may have additional entities during processing
|
|
222
|
+
// The key is that the final entity has the correct data and rollback is working
|
|
223
|
+
const finalEntity = streamEntities.find(entityId => {
|
|
224
|
+
const values = store.read(entityId);
|
|
225
|
+
return values?.name === "Stream3";
|
|
226
|
+
});
|
|
227
|
+
expect(finalEntity).toBeDefined();
|
|
228
|
+
const finalEntityValues = store.read(finalEntity);
|
|
229
|
+
expect(finalEntityValues?.position).toEqual({ x: 3, y: 3, z: 3 });
|
|
230
|
+
expect(finalEntityValues?.name).toBe("Stream3");
|
|
231
|
+
// Verify rollback is working: intermediate entities should not exist
|
|
232
|
+
const intermediateEntities = streamEntities.filter(entityId => {
|
|
233
|
+
const values = store.read(entityId);
|
|
234
|
+
return values?.name === "Stream1" || values?.name === "Stream2";
|
|
235
|
+
});
|
|
236
|
+
// CRITICAL: Should have NO intermediate entities (rollback worked)
|
|
237
|
+
expect(intermediateEntities).toHaveLength(0);
|
|
238
|
+
// Verify observer was notified for each entity creation and rollback
|
|
239
|
+
// Now that rollback is observable, we should see more notifications
|
|
240
|
+
// The exact count isn't as important as ensuring rollback operations are observable
|
|
241
|
+
expect(observer.mock.calls.length >= 3);
|
|
242
|
+
unsubscribe();
|
|
243
|
+
});
|
|
244
|
+
it("should handle AsyncGenerator with delays", async () => {
|
|
245
|
+
const store = createTestDatabase();
|
|
246
|
+
const observer = vi.fn();
|
|
247
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
248
|
+
// Create an async generator with delays
|
|
249
|
+
async function* delayedEntityStream() {
|
|
250
|
+
yield { position: { x: 10, y: 10, z: 10 }, name: "Delayed1" };
|
|
251
|
+
await new Promise(resolve => setTimeout(resolve, 5));
|
|
252
|
+
yield { position: { x: 20, y: 20, z: 20 }, name: "Delayed2" };
|
|
253
|
+
await new Promise(resolve => setTimeout(resolve, 5));
|
|
254
|
+
yield { position: { x: 30, y: 30, z: 30 }, name: "Delayed3" };
|
|
255
|
+
}
|
|
256
|
+
// Execute transaction with delayed async generator wrapped in function
|
|
257
|
+
store.transactions.createPositionNameEntity(() => delayedEntityStream());
|
|
258
|
+
// Wait for all entities to be processed
|
|
259
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
260
|
+
// Verify all entities were created
|
|
261
|
+
const entities = store.select(["position", "name"]);
|
|
262
|
+
const delayedEntities = entities.filter(entityId => {
|
|
263
|
+
const values = store.read(entityId);
|
|
264
|
+
return values?.name?.startsWith("Delayed");
|
|
265
|
+
});
|
|
266
|
+
expect(delayedEntities.length >= 3);
|
|
267
|
+
expect(observer.mock.calls.length >= 3);
|
|
268
|
+
unsubscribe();
|
|
269
|
+
});
|
|
270
|
+
it("should handle mixed sync and async arguments in the same transaction", async () => {
|
|
271
|
+
const store = createTestDatabase();
|
|
272
|
+
const observer = vi.fn();
|
|
273
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
274
|
+
// Create entities with different argument types
|
|
275
|
+
store.transactions.createPositionNameEntity({
|
|
276
|
+
position: { x: 1, y: 1, z: 1 },
|
|
277
|
+
name: "SyncEntity"
|
|
278
|
+
});
|
|
279
|
+
store.transactions.createPositionNameEntity(() => Promise.resolve({
|
|
280
|
+
position: { x: 2, y: 2, z: 2 },
|
|
281
|
+
name: "PromiseEntity"
|
|
282
|
+
}));
|
|
283
|
+
async function* streamEntityGenerator() {
|
|
284
|
+
yield { position: { x: 3, y: 3, z: 3 }, name: "StreamEntity" };
|
|
285
|
+
}
|
|
286
|
+
store.transactions.createPositionNameEntity(() => streamEntityGenerator());
|
|
287
|
+
// Wait for async operations
|
|
288
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
289
|
+
// Verify all entities were created
|
|
290
|
+
const entities = store.select(["position", "name"]);
|
|
291
|
+
const testEntities = entities.filter(entityId => {
|
|
292
|
+
const values = store.read(entityId);
|
|
293
|
+
return values?.name?.endsWith("Entity");
|
|
294
|
+
});
|
|
295
|
+
expect(testEntities.length >= 3);
|
|
296
|
+
const syncEntity = store.read(testEntities.find(e => store.read(e)?.name === "SyncEntity"));
|
|
297
|
+
const promiseEntity = store.read(testEntities.find(e => store.read(e)?.name === "PromiseEntity"));
|
|
298
|
+
const streamEntity = store.read(testEntities.find(e => store.read(e)?.name === "StreamEntity"));
|
|
299
|
+
expect(syncEntity?.position).toEqual({ x: 1, y: 1, z: 1 });
|
|
300
|
+
expect(promiseEntity?.position).toEqual({ x: 2, y: 2, z: 2 });
|
|
301
|
+
expect(streamEntity?.position).toEqual({ x: 3, y: 3, z: 3 });
|
|
302
|
+
expect(observer.mock.calls.length >= 3);
|
|
303
|
+
unsubscribe();
|
|
304
|
+
});
|
|
305
|
+
it("should handle AsyncGenerator that yields no values", async () => {
|
|
306
|
+
const store = createTestDatabase();
|
|
307
|
+
const observer = vi.fn();
|
|
308
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
309
|
+
// Create an empty async generator
|
|
310
|
+
async function* emptyStream() {
|
|
311
|
+
// Yields nothing
|
|
312
|
+
}
|
|
313
|
+
// Execute transaction with empty async generator wrapped in function
|
|
314
|
+
store.transactions.createPositionNameEntity(() => emptyStream());
|
|
315
|
+
// Wait for processing
|
|
316
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
317
|
+
// Verify no entities were created
|
|
318
|
+
const entities = store.select(["position", "name"]);
|
|
319
|
+
expect(entities).toHaveLength(0);
|
|
320
|
+
expect(observer).toHaveBeenCalledTimes(0);
|
|
321
|
+
unsubscribe();
|
|
322
|
+
});
|
|
323
|
+
it("should handle AsyncGenerator with error handling", async () => {
|
|
324
|
+
const store = createTestDatabase();
|
|
325
|
+
const observer = vi.fn();
|
|
326
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
327
|
+
// Create an async generator that throws an error
|
|
328
|
+
async function* errorStream() {
|
|
329
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "BeforeError" };
|
|
330
|
+
throw new Error("Test error");
|
|
331
|
+
}
|
|
332
|
+
// Execute transaction with error-throwing async generator wrapped in function
|
|
333
|
+
// Now that async executions return promises, we need to await and catch the error
|
|
334
|
+
let error;
|
|
335
|
+
try {
|
|
336
|
+
await store.transactions.createPositionNameEntity(() => errorStream());
|
|
337
|
+
}
|
|
338
|
+
catch (e) {
|
|
339
|
+
error = e;
|
|
340
|
+
}
|
|
341
|
+
expect(error).toBeDefined();
|
|
342
|
+
expect(error.message).toBe("Test error");
|
|
343
|
+
// Wait for processing to complete
|
|
344
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
345
|
+
// Verify the transient entity was rolled back after the error
|
|
346
|
+
const entities = store.select(["position", "name"]);
|
|
347
|
+
const beforeErrorEntities = entities.filter(entityId => {
|
|
348
|
+
const values = store.read(entityId);
|
|
349
|
+
return values?.name === "BeforeError";
|
|
350
|
+
});
|
|
351
|
+
expect(beforeErrorEntities).toHaveLength(0);
|
|
352
|
+
expect(observer).toHaveBeenCalled();
|
|
353
|
+
unsubscribe();
|
|
354
|
+
});
|
|
355
|
+
it("should remove transient entries from reconciling queue when AsyncGenerator throws", async () => {
|
|
356
|
+
const store = createTestDatabase();
|
|
357
|
+
// Create an async generator that yields multiple times then throws
|
|
358
|
+
async function* multiYieldErrorStream() {
|
|
359
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "Yield1" };
|
|
360
|
+
await new Promise(resolve => setTimeout(resolve, 1));
|
|
361
|
+
yield { position: { x: 2, y: 2, z: 2 }, name: "Yield2" };
|
|
362
|
+
await new Promise(resolve => setTimeout(resolve, 1));
|
|
363
|
+
yield { position: { x: 3, y: 3, z: 3 }, name: "Yield3" };
|
|
364
|
+
throw new Error("Sequential transaction failed");
|
|
365
|
+
}
|
|
366
|
+
// Start the transaction
|
|
367
|
+
const transactionPromise = store.transactions.createPositionNameEntity(() => multiYieldErrorStream());
|
|
368
|
+
// Wait a bit to let some yields process
|
|
369
|
+
await new Promise(resolve => setTimeout(resolve, 5));
|
|
370
|
+
// Take a snapshot during processing; persistence should not expose
|
|
371
|
+
// internal reconciling metadata, but this must not throw.
|
|
372
|
+
const serializedDuring = store.toData();
|
|
373
|
+
expect(serializedDuring).toBeTruthy();
|
|
374
|
+
// Wait for the error
|
|
375
|
+
let error;
|
|
376
|
+
try {
|
|
377
|
+
await transactionPromise;
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
error = e;
|
|
381
|
+
}
|
|
382
|
+
expect(error).toBeDefined();
|
|
383
|
+
expect(error.message).toBe("Sequential transaction failed");
|
|
384
|
+
// Wait for cleanup to complete
|
|
385
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
386
|
+
// Verify no persisted metadata is exposed and no error is thrown
|
|
387
|
+
const serializedAfter = store.toData();
|
|
388
|
+
expect(serializedAfter).toBeTruthy();
|
|
389
|
+
// Verify all entities are rolled back
|
|
390
|
+
const entities = store.select(["position", "name"]);
|
|
391
|
+
const yieldEntities = entities.filter(entityId => {
|
|
392
|
+
const values = store.read(entityId);
|
|
393
|
+
return values?.name?.startsWith("Yield");
|
|
394
|
+
});
|
|
395
|
+
expect(yieldEntities).toHaveLength(0);
|
|
396
|
+
});
|
|
397
|
+
it("should handle complex AsyncGenerator with conditional yielding", async () => {
|
|
398
|
+
const store = createTestDatabase();
|
|
399
|
+
const observer = vi.fn();
|
|
400
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
401
|
+
// Create a complex async generator with conditional logic
|
|
402
|
+
async function* conditionalStream() {
|
|
403
|
+
for (let i = 0; i < 5; i++) {
|
|
404
|
+
if (i % 2 === 0) {
|
|
405
|
+
yield {
|
|
406
|
+
position: { x: i, y: i * 2, z: i * 3 },
|
|
407
|
+
name: `Even${i}`
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
await new Promise(resolve => setTimeout(resolve, 1));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Execute transaction with conditional async generator wrapped in function
|
|
414
|
+
store.transactions.createPositionNameEntity(() => conditionalStream());
|
|
415
|
+
// Wait for processing
|
|
416
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
417
|
+
// Verify only the final entity was created (each yield replaces the previous)
|
|
418
|
+
// Now that rollback is working correctly and observably, we should see only the final entity
|
|
419
|
+
const entities = store.select(["position", "name"]);
|
|
420
|
+
const evenEntities = entities.filter(entityId => {
|
|
421
|
+
const values = store.read(entityId);
|
|
422
|
+
return values?.name?.startsWith("Even");
|
|
423
|
+
});
|
|
424
|
+
// Now that rollback is observable, we may have additional entities during processing
|
|
425
|
+
// The key is that the final entity has the correct data
|
|
426
|
+
const finalEntity = evenEntities.find(entityId => {
|
|
427
|
+
const values = store.read(entityId);
|
|
428
|
+
return values?.name === "Even4";
|
|
429
|
+
});
|
|
430
|
+
expect(finalEntity).toBeDefined();
|
|
431
|
+
const finalEntityValues = store.read(finalEntity);
|
|
432
|
+
expect(finalEntityValues?.position).toEqual({ x: 4, y: 8, z: 12 });
|
|
433
|
+
expect(finalEntityValues?.name).toBe("Even4");
|
|
434
|
+
// Verify observer was notified for each entity creation and rollback
|
|
435
|
+
// Now that rollback is observable, we should see more notifications
|
|
436
|
+
// The exact count isn't as important as ensuring rollback operations are observable
|
|
437
|
+
expect(observer.mock.calls.length >= 3);
|
|
438
|
+
unsubscribe();
|
|
439
|
+
});
|
|
440
|
+
it("should handle AsyncGenerator with yield then return", async () => {
|
|
441
|
+
const store = createTestDatabase();
|
|
442
|
+
const observer = vi.fn();
|
|
443
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
444
|
+
// Create an async generator that yields then returns
|
|
445
|
+
async function* yieldThenReturn() {
|
|
446
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "Yielded" };
|
|
447
|
+
return { position: { x: 2, y: 2, z: 2 }, name: "Returned" };
|
|
448
|
+
}
|
|
449
|
+
// Execute transaction with async generator
|
|
450
|
+
store.transactions.createPositionNameEntity(() => yieldThenReturn());
|
|
451
|
+
// Wait for processing
|
|
452
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
453
|
+
// Verify the return value was used (not the yield value)
|
|
454
|
+
const entities = store.select(["position", "name"]);
|
|
455
|
+
const returnedEntity = entities.find(entityId => {
|
|
456
|
+
const values = store.read(entityId);
|
|
457
|
+
return values?.name === "Returned";
|
|
458
|
+
});
|
|
459
|
+
expect(returnedEntity).toBeDefined();
|
|
460
|
+
const entityValues = store.read(returnedEntity);
|
|
461
|
+
expect(entityValues?.position).toEqual({ x: 2, y: 2, z: 2 });
|
|
462
|
+
expect(entityValues?.name).toBe("Returned");
|
|
463
|
+
// Verify observer was notified for both the yield and return operations
|
|
464
|
+
// Now that rollback is observable, we may get additional notifications
|
|
465
|
+
// The key is that we receive at least the minimum expected notifications
|
|
466
|
+
expect(observer).toHaveBeenCalledTimes(3); // 1 for yield + 1 for rollback + 1 for return
|
|
467
|
+
unsubscribe();
|
|
468
|
+
});
|
|
469
|
+
it("should handle AsyncGenerator with multiple yields vs yield then return", async () => {
|
|
470
|
+
const store = createTestDatabase();
|
|
471
|
+
const observer = vi.fn();
|
|
472
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
473
|
+
// Test multiple yields
|
|
474
|
+
async function* multipleYields() {
|
|
475
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "First" };
|
|
476
|
+
yield { position: { x: 2, y: 2, z: 2 }, name: "Second" };
|
|
477
|
+
yield { position: { x: 3, y: 3, z: 3 }, name: "Third" };
|
|
478
|
+
}
|
|
479
|
+
// Test yield then return
|
|
480
|
+
async function* yieldThenReturn() {
|
|
481
|
+
yield { position: { x: 10, y: 10, z: 10 }, name: "Yielded" };
|
|
482
|
+
return { position: { x: 20, y: 20, z: 20 }, name: "Returned" };
|
|
483
|
+
}
|
|
484
|
+
// Execute both actions
|
|
485
|
+
store.transactions.createPositionNameEntity(() => multipleYields());
|
|
486
|
+
store.transactions.createPositionNameEntity(() => yieldThenReturn());
|
|
487
|
+
// Wait for processing
|
|
488
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
489
|
+
// Verify both patterns work correctly
|
|
490
|
+
const entities = store.select(["position", "name"]);
|
|
491
|
+
const multipleYieldsEntity = entities.find(entityId => {
|
|
492
|
+
const values = store.read(entityId);
|
|
493
|
+
return values?.name === "Third";
|
|
494
|
+
});
|
|
495
|
+
const returnEntity = entities.find(entityId => {
|
|
496
|
+
const values = store.read(entityId);
|
|
497
|
+
return values?.name === "Returned";
|
|
498
|
+
});
|
|
499
|
+
expect(multipleYieldsEntity).toBeDefined();
|
|
500
|
+
expect(returnEntity).toBeDefined();
|
|
501
|
+
// Verify the correct final values for each pattern
|
|
502
|
+
const multipleYieldsValues = store.read(multipleYieldsEntity);
|
|
503
|
+
const returnValues = store.read(returnEntity);
|
|
504
|
+
expect(multipleYieldsValues?.position).toEqual({ x: 3, y: 3, z: 3 });
|
|
505
|
+
expect(multipleYieldsValues?.name).toBe("Third");
|
|
506
|
+
expect(returnValues?.position).toEqual({ x: 20, y: 20, z: 20 });
|
|
507
|
+
expect(returnValues?.name).toBe("Returned");
|
|
508
|
+
unsubscribe();
|
|
509
|
+
});
|
|
510
|
+
it("should handle AsyncGenerator with return only (no yields)", async () => {
|
|
511
|
+
const store = createTestDatabase();
|
|
512
|
+
const observer = vi.fn();
|
|
513
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
514
|
+
// Create an async generator that only returns
|
|
515
|
+
async function* returnOnly() {
|
|
516
|
+
// This generator yields nothing but returns a value
|
|
517
|
+
return { position: { x: 100, y: 200, z: 300 }, name: "ReturnOnly" };
|
|
518
|
+
}
|
|
519
|
+
// Execute transaction with async generator
|
|
520
|
+
store.transactions.createPositionNameEntity(() => returnOnly());
|
|
521
|
+
// Wait for processing
|
|
522
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
523
|
+
// Verify the return value was used
|
|
524
|
+
const entities = store.select(["position", "name"]);
|
|
525
|
+
const returnedEntity = entities.find(entityId => {
|
|
526
|
+
const values = store.read(entityId);
|
|
527
|
+
return values?.name === "ReturnOnly";
|
|
528
|
+
});
|
|
529
|
+
expect(returnedEntity).toBeDefined();
|
|
530
|
+
const entityValues = store.read(returnedEntity);
|
|
531
|
+
expect(entityValues?.position).toEqual({ x: 100, y: 200, z: 300 });
|
|
532
|
+
expect(entityValues?.name).toBe("ReturnOnly");
|
|
533
|
+
// Verify observer was notified only once (no intermediate yields)
|
|
534
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
535
|
+
unsubscribe();
|
|
536
|
+
});
|
|
537
|
+
it("should handle AsyncGenerator with yield, return, yield (unreachable code)", async () => {
|
|
538
|
+
const store = createTestDatabase();
|
|
539
|
+
const observer = vi.fn();
|
|
540
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
541
|
+
// Create an async generator with unreachable code after return
|
|
542
|
+
async function* yieldReturnYield() {
|
|
543
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "Yielded" };
|
|
544
|
+
return { position: { x: 2, y: 2, z: 2 }, name: "Returned" };
|
|
545
|
+
}
|
|
546
|
+
// Execute transaction with async generator
|
|
547
|
+
store.transactions.createPositionNameEntity(() => yieldReturnYield());
|
|
548
|
+
// Wait for processing
|
|
549
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
550
|
+
// Verify the return value was used (not the unreachable yield)
|
|
551
|
+
const entities = store.select(["position", "name"]);
|
|
552
|
+
const returnedEntity = entities.find(entityId => {
|
|
553
|
+
const values = store.read(entityId);
|
|
554
|
+
return values?.name === "Returned";
|
|
555
|
+
});
|
|
556
|
+
expect(returnedEntity).toBeDefined();
|
|
557
|
+
const entityValues = store.read(returnedEntity);
|
|
558
|
+
expect(entityValues?.position).toEqual({ x: 2, y: 2, z: 2 });
|
|
559
|
+
expect(entityValues?.name).toBe("Returned");
|
|
560
|
+
// Verify observer was notified for both the yield and return operations
|
|
561
|
+
// Now that rollback is observable, we may get additional notifications
|
|
562
|
+
// The key is that we receive at least the minimum expected notifications
|
|
563
|
+
expect(observer).toHaveBeenCalledTimes(3); // 1 for yield + 1 for rollback + 1 for return
|
|
564
|
+
unsubscribe();
|
|
565
|
+
});
|
|
566
|
+
it("should verify rollback behavior works correctly for each async generator pattern independently", async () => {
|
|
567
|
+
// Define the three test patterns
|
|
568
|
+
const testPatterns = [
|
|
569
|
+
{
|
|
570
|
+
name: "yield-yield-yield (exhaustion)",
|
|
571
|
+
generator: async function* yieldYieldPattern() {
|
|
572
|
+
yield { position: { x: 1, y: 1, z: 1 }, name: "Step1" };
|
|
573
|
+
yield { position: { x: 2, y: 2, z: 2 }, name: "Step2" };
|
|
574
|
+
yield { position: { x: 3, y: 3, z: 3 }, name: "Step3" };
|
|
575
|
+
},
|
|
576
|
+
expectedFinalName: "Step3",
|
|
577
|
+
expectedFinalPosition: { x: 3, y: 3, z: 3 }
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
name: "yield-then-return",
|
|
581
|
+
generator: async function* yieldThenReturn() {
|
|
582
|
+
yield { position: { x: 10, y: 10, z: 10 }, name: "StepA" };
|
|
583
|
+
return { position: { x: 20, y: 20, z: 20 }, name: "StepB" };
|
|
584
|
+
},
|
|
585
|
+
expectedFinalName: "StepB",
|
|
586
|
+
expectedFinalPosition: { x: 20, y: 20, z: 20 }
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
name: "return-only (no yields)",
|
|
590
|
+
generator: async function* returnOnly() {
|
|
591
|
+
// This generator yields nothing but returns a value
|
|
592
|
+
return { position: { x: 100, y: 200, z: 300 }, name: "ReturnOnly" };
|
|
593
|
+
},
|
|
594
|
+
expectedFinalName: "ReturnOnly",
|
|
595
|
+
expectedFinalPosition: { x: 100, y: 200, z: 300 }
|
|
596
|
+
}
|
|
597
|
+
];
|
|
598
|
+
// Test each pattern independently
|
|
599
|
+
for (const pattern of testPatterns) {
|
|
600
|
+
const store = createTestDatabase();
|
|
601
|
+
const transactionObserver = vi.fn();
|
|
602
|
+
const unsubscribe = store.observe.transactions(transactionObserver);
|
|
603
|
+
const entitiesBefore = store.select(["position", "name"]);
|
|
604
|
+
expect(entitiesBefore.length).toBe(0);
|
|
605
|
+
// Await completion this specific pattern
|
|
606
|
+
await store.transactions.createPositionNameEntity(() => pattern.generator());
|
|
607
|
+
// Verify that exactly ONE entity was created for this pattern
|
|
608
|
+
const entitiesAfter = store.select(["position", "name"]);
|
|
609
|
+
expect(entitiesAfter.length).toBe(1);
|
|
610
|
+
// Verify the final entity has the correct values
|
|
611
|
+
const finalEntity = entitiesAfter[0];
|
|
612
|
+
const finalEntityValues = store.read(finalEntity);
|
|
613
|
+
expect(finalEntityValues).toBeDefined();
|
|
614
|
+
expect(finalEntityValues?.position).toEqual(pattern.expectedFinalPosition);
|
|
615
|
+
expect(finalEntityValues?.name).toBe(pattern.expectedFinalName);
|
|
616
|
+
// Verify that NO intermediate entities exist for this pattern
|
|
617
|
+
const intermediateEntities = entitiesAfter.filter(entityId => {
|
|
618
|
+
const values = store.read(entityId);
|
|
619
|
+
// Check for any entities that might be intermediate steps
|
|
620
|
+
if (pattern.name.includes("yield-yield-yield")) {
|
|
621
|
+
return values?.name === "Step1" || values?.name === "Step2";
|
|
622
|
+
}
|
|
623
|
+
else if (pattern.name.includes("yield-then-return")) {
|
|
624
|
+
return values?.name === "StepA";
|
|
625
|
+
}
|
|
626
|
+
// return-only pattern has no intermediate entities
|
|
627
|
+
return false;
|
|
628
|
+
});
|
|
629
|
+
// CRITICAL: Should have NO intermediate entities (rollback worked)
|
|
630
|
+
expect(intermediateEntities).toHaveLength(0);
|
|
631
|
+
// Verify transaction observer was called appropriately
|
|
632
|
+
// Each pattern should have at least the minimum expected calls
|
|
633
|
+
const minExpectedCalls = pattern.name.includes("yield-yield-yield") ? 7 :
|
|
634
|
+
pattern.name.includes("yield-then-return") ? 3 : 1;
|
|
635
|
+
expect(transactionObserver).toHaveBeenCalledTimes(minExpectedCalls);
|
|
636
|
+
// Pattern verification complete
|
|
637
|
+
unsubscribe();
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
});
|
|
641
|
+
describe("toData/fromData functionality", () => {
|
|
642
|
+
it("should serialize and deserialize database state correctly", () => {
|
|
643
|
+
const store = createTestDatabase();
|
|
644
|
+
// Create some entities and update resources
|
|
645
|
+
const entity1 = store.transactions.createPositionEntity({
|
|
646
|
+
position: { x: 1, y: 2, z: 3 }
|
|
647
|
+
});
|
|
648
|
+
const entity2 = store.transactions.createFullEntity({
|
|
649
|
+
position: { x: 4, y: 5, z: 6 },
|
|
650
|
+
health: { current: 100, max: 100 },
|
|
651
|
+
name: "TestEntity"
|
|
652
|
+
});
|
|
653
|
+
store.transactions.updateTime({ delta: 0.033, elapsed: 1.5 });
|
|
654
|
+
// Serialize the database
|
|
655
|
+
const serializedData = store.toData();
|
|
656
|
+
// Create a new database and restore from serialized data
|
|
657
|
+
const newStore = createTestDatabase();
|
|
658
|
+
newStore.fromData(serializedData);
|
|
659
|
+
// Verify entities are restored
|
|
660
|
+
const restoredEntities = newStore.select(["position"]);
|
|
661
|
+
expect(restoredEntities).toHaveLength(2);
|
|
662
|
+
// Verify entity data is correct
|
|
663
|
+
const restoredData1 = newStore.read(restoredEntities[0]);
|
|
664
|
+
const restoredData2 = newStore.read(restoredEntities[1]);
|
|
665
|
+
expect(restoredData1).toEqual({
|
|
666
|
+
id: restoredEntities[0],
|
|
667
|
+
position: { x: 1, y: 2, z: 3 }
|
|
668
|
+
});
|
|
669
|
+
expect(restoredData2).toEqual({
|
|
670
|
+
id: restoredEntities[1],
|
|
671
|
+
position: { x: 4, y: 5, z: 6 },
|
|
672
|
+
health: { current: 100, max: 100 },
|
|
673
|
+
name: "TestEntity"
|
|
674
|
+
});
|
|
675
|
+
// Verify resources are restored
|
|
676
|
+
expect(newStore.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
677
|
+
});
|
|
678
|
+
it("should restore applied entry ordering after serialization", () => {
|
|
679
|
+
const store = createTestDatabase();
|
|
680
|
+
store.transactions.createPositionNameEntity({
|
|
681
|
+
position: { x: 10, y: 20, z: 30 },
|
|
682
|
+
name: "LateCommit",
|
|
683
|
+
});
|
|
684
|
+
store.transactions.createPositionNameEntity({
|
|
685
|
+
position: { x: 40, y: 50, z: 60 },
|
|
686
|
+
name: "EarlyCommit",
|
|
687
|
+
});
|
|
688
|
+
const serializedData = store.toData();
|
|
689
|
+
const newStore = createTestDatabase();
|
|
690
|
+
newStore.fromData(serializedData);
|
|
691
|
+
newStore.transactions.createPositionNameEntity({
|
|
692
|
+
position: { x: 70, y: 80, z: 90 },
|
|
693
|
+
name: "EarliestCommit",
|
|
694
|
+
});
|
|
695
|
+
const entities = newStore.select(["name"]);
|
|
696
|
+
const names = entities
|
|
697
|
+
.map(entityId => newStore.read(entityId)?.name)
|
|
698
|
+
.filter((name) => Boolean(name));
|
|
699
|
+
expect(new Set(names)).toEqual(new Set(["EarliestCommit", "LateCommit", "EarlyCommit"]));
|
|
700
|
+
});
|
|
701
|
+
it("should preserve transaction functionality after restoration", () => {
|
|
702
|
+
const store = createTestDatabase();
|
|
703
|
+
// Create initial state
|
|
704
|
+
store.transactions.updateTime({ delta: 0.016, elapsed: 0 });
|
|
705
|
+
// Serialize the database
|
|
706
|
+
const serializedData = store.toData();
|
|
707
|
+
// Create a new database and restore
|
|
708
|
+
const newStore = createTestDatabase();
|
|
709
|
+
newStore.fromData(serializedData);
|
|
710
|
+
// Verify transactions still work
|
|
711
|
+
const entity = newStore.transactions.createPositionEntity({
|
|
712
|
+
position: { x: 1, y: 2, z: 3 }
|
|
713
|
+
});
|
|
714
|
+
expect(entity).toBeDefined();
|
|
715
|
+
expect(typeof entity).toBe("number");
|
|
716
|
+
const entityData = newStore.read(entity);
|
|
717
|
+
expect(entityData).toEqual({
|
|
718
|
+
id: entity,
|
|
719
|
+
position: { x: 1, y: 2, z: 3 }
|
|
720
|
+
});
|
|
721
|
+
// Verify resource transactions work
|
|
722
|
+
newStore.transactions.updateTime({ delta: 0.033, elapsed: 1.5 });
|
|
723
|
+
expect(newStore.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
724
|
+
});
|
|
725
|
+
it("all transient operations should be rolled back", async () => {
|
|
726
|
+
const store = createTestDatabase();
|
|
727
|
+
const promise = store.transactions.startGenerating(async function* () {
|
|
728
|
+
yield { progress: 0 };
|
|
729
|
+
yield { progress: 1 };
|
|
730
|
+
});
|
|
731
|
+
// Check that the result is a promise
|
|
732
|
+
expect(promise).toBeInstanceOf(Promise);
|
|
733
|
+
const result = await promise;
|
|
734
|
+
expect(result).toBe(-1);
|
|
735
|
+
const generating = await toPromise(store.observe.resources.generating);
|
|
736
|
+
expect(generating).toBe(false);
|
|
737
|
+
});
|
|
738
|
+
});
|
|
739
|
+
describe("No-op transaction prevention", () => {
|
|
740
|
+
it("should not emit a transaction that makes no changes", () => {
|
|
741
|
+
const store = createTestDatabase();
|
|
742
|
+
// Track how many times the observer is called
|
|
743
|
+
const observer = vi.fn();
|
|
744
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
745
|
+
// Clear any initial calls
|
|
746
|
+
observer.mockClear();
|
|
747
|
+
// Create a no-op transaction (doesn't modify anything)
|
|
748
|
+
const { baseStore, actions } = createStoreConfig();
|
|
749
|
+
const database = Database.create(baseStore, {
|
|
750
|
+
...actions,
|
|
751
|
+
noOpTransaction(t, _args) {
|
|
752
|
+
// This transaction does nothing
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
const positionObserver = vi.fn();
|
|
756
|
+
const unsub = database.observe.components.position(positionObserver);
|
|
757
|
+
positionObserver.mockClear();
|
|
758
|
+
// Execute the no-op transaction
|
|
759
|
+
database.transactions.noOpTransaction({});
|
|
760
|
+
// Verify no notification was sent
|
|
761
|
+
expect(positionObserver).not.toHaveBeenCalled();
|
|
762
|
+
unsub();
|
|
763
|
+
});
|
|
764
|
+
it("should not add no-op actions to the undo stack", async () => {
|
|
765
|
+
const store = createTestDatabase();
|
|
766
|
+
// Create database with undo-redo service
|
|
767
|
+
const { baseStore, actions } = createStoreConfig();
|
|
768
|
+
const database = Database.create(baseStore, {
|
|
769
|
+
...actions,
|
|
770
|
+
noOpTransaction(t, _args) {
|
|
771
|
+
t.undoable = { coalesce: false };
|
|
772
|
+
// This transaction does nothing
|
|
773
|
+
},
|
|
774
|
+
applyOperations(t, operations) {
|
|
775
|
+
applyOperations(t, operations);
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
|
+
const undoRedo = createUndoRedoService(database);
|
|
779
|
+
// Execute the no-op transaction
|
|
780
|
+
database.transactions.noOpTransaction({});
|
|
781
|
+
// Verify the undo stack is empty (need to await the observable)
|
|
782
|
+
const undoStack = await toPromise(undoRedo.undoStack);
|
|
783
|
+
expect(undoStack).toHaveLength(0);
|
|
784
|
+
});
|
|
785
|
+
it("should emit a transaction that makes changes", () => {
|
|
786
|
+
const store = createTestDatabase();
|
|
787
|
+
const observer = vi.fn();
|
|
788
|
+
const unsubscribe = store.observe.components.position(observer);
|
|
789
|
+
observer.mockClear();
|
|
790
|
+
// Create an entity (makes changes)
|
|
791
|
+
store.transactions.createPositionEntity({ position: { x: 1, y: 2, z: 3 } });
|
|
792
|
+
// Verify notification was sent
|
|
793
|
+
expect(observer).toHaveBeenCalled();
|
|
794
|
+
unsubscribe();
|
|
795
|
+
});
|
|
796
|
+
it("should detect true no-op when transaction reads but doesn't modify", async () => {
|
|
797
|
+
const { baseStore, actions } = createStoreConfig();
|
|
798
|
+
const database = Database.create(baseStore, {
|
|
799
|
+
...actions,
|
|
800
|
+
readOnlyTransaction(t, args) {
|
|
801
|
+
t.undoable = { coalesce: false };
|
|
802
|
+
// Just read the entity but don't modify it
|
|
803
|
+
const current = t.read(args.entity);
|
|
804
|
+
// Do nothing with the data - this is a true no-op
|
|
805
|
+
},
|
|
806
|
+
applyOperations(t, operations) {
|
|
807
|
+
applyOperations(t, operations);
|
|
808
|
+
}
|
|
809
|
+
});
|
|
810
|
+
// Create an entity
|
|
811
|
+
const entity = database.transactions.createPositionEntity({ position: { x: 1, y: 2, z: 3 } });
|
|
812
|
+
const undoRedo = createUndoRedoService(database);
|
|
813
|
+
const initialStackLength = (await toPromise(undoRedo.undoStack)).length;
|
|
814
|
+
// Execute read-only transaction (true no-op)
|
|
815
|
+
database.transactions.readOnlyTransaction({ entity });
|
|
816
|
+
// Verify no new undo entry was added
|
|
817
|
+
const finalStackLength = (await toPromise(undoRedo.undoStack)).length;
|
|
818
|
+
expect(finalStackLength).toBe(initialStackLength);
|
|
819
|
+
});
|
|
820
|
+
});
|
|
821
|
+
it("should return the same instance when extended", () => {
|
|
822
|
+
const database = createTestDatabase();
|
|
823
|
+
const extended = database.extend({ components: {}, resources: {}, archetypes: {}, transactions: {} });
|
|
824
|
+
expect(extended).toBe(database);
|
|
825
|
+
});
|
|
826
|
+
describe("database.store.actions (unwrapped actions)", () => {
|
|
827
|
+
it("should expose unwrapped actions on store that execute directly", () => {
|
|
828
|
+
const database = createTestDatabase();
|
|
829
|
+
// Execute using unwrapped action
|
|
830
|
+
const entity = database.store.actions.createPositionEntity({
|
|
831
|
+
position: { x: 1, y: 2, z: 3 },
|
|
832
|
+
});
|
|
833
|
+
// Verify entity was created
|
|
834
|
+
expect(entity).toBeDefined();
|
|
835
|
+
const location = database.locate(entity);
|
|
836
|
+
expect(location).not.toBeNull();
|
|
837
|
+
expect(location?.archetype).toBe(database.archetypes.Position);
|
|
838
|
+
});
|
|
839
|
+
it("should not trigger observable notifications when using store.actions", async () => {
|
|
840
|
+
const database = createTestDatabase();
|
|
841
|
+
const transactionObserver = vi.fn();
|
|
842
|
+
const componentObserver = vi.fn();
|
|
843
|
+
// Subscribe to observables
|
|
844
|
+
const unsubscribeTransaction = database.observe.transactions(transactionObserver);
|
|
845
|
+
const unsubscribeComponent = database.observe.components.position(componentObserver);
|
|
846
|
+
// Execute using unwrapped action (should NOT notify)
|
|
847
|
+
database.store.actions.createPositionEntity({
|
|
848
|
+
position: { x: 1, y: 2, z: 3 },
|
|
849
|
+
});
|
|
850
|
+
// Wait for any potential async notifications
|
|
851
|
+
await Promise.resolve();
|
|
852
|
+
// Verify NO notifications were sent
|
|
853
|
+
expect(transactionObserver).not.toHaveBeenCalled();
|
|
854
|
+
expect(componentObserver).not.toHaveBeenCalled();
|
|
855
|
+
// Now use wrapped transaction to verify observers work
|
|
856
|
+
database.transactions.createPositionEntity({
|
|
857
|
+
position: { x: 4, y: 5, z: 6 },
|
|
858
|
+
});
|
|
859
|
+
await Promise.resolve();
|
|
860
|
+
// Verify notifications WERE sent for wrapped transaction
|
|
861
|
+
expect(transactionObserver).toHaveBeenCalledTimes(1);
|
|
862
|
+
expect(componentObserver).toHaveBeenCalledTimes(1);
|
|
863
|
+
unsubscribeTransaction();
|
|
864
|
+
unsubscribeComponent();
|
|
865
|
+
});
|
|
866
|
+
it("should not create undo entries when using store.actions", async () => {
|
|
867
|
+
const database = createTestDatabase();
|
|
868
|
+
// Track transaction notifications to verify behavior
|
|
869
|
+
const transactionObserver = vi.fn();
|
|
870
|
+
const unsubscribe = database.observe.transactions(transactionObserver);
|
|
871
|
+
// Execute using unwrapped action
|
|
872
|
+
database.store.actions.createPositionEntity({
|
|
873
|
+
position: { x: 1, y: 2, z: 3 },
|
|
874
|
+
});
|
|
875
|
+
await Promise.resolve();
|
|
876
|
+
// Verify NO transaction notification (meaning no undo entry would be created)
|
|
877
|
+
expect(transactionObserver).not.toHaveBeenCalled();
|
|
878
|
+
// Execute using wrapped transaction
|
|
879
|
+
database.transactions.createPositionEntity({
|
|
880
|
+
position: { x: 4, y: 5, z: 6 },
|
|
881
|
+
});
|
|
882
|
+
await Promise.resolve();
|
|
883
|
+
// Verify transaction notification WAS sent (meaning undo entry would be created)
|
|
884
|
+
expect(transactionObserver).toHaveBeenCalledTimes(1);
|
|
885
|
+
unsubscribe();
|
|
886
|
+
});
|
|
887
|
+
it("should support all transaction types on store.actions", () => {
|
|
888
|
+
const database = createTestDatabase();
|
|
889
|
+
// Test entity creation
|
|
890
|
+
const entity = database.store.actions.createPositionEntity({
|
|
891
|
+
position: { x: 1, y: 2, z: 3 },
|
|
892
|
+
});
|
|
893
|
+
expect(entity).toBeDefined();
|
|
894
|
+
expect(database.locate(entity)).not.toBeNull();
|
|
895
|
+
// Test entity update
|
|
896
|
+
database.store.actions.updateEntity({
|
|
897
|
+
entity,
|
|
898
|
+
values: { position: { x: 10, y: 20, z: 30 } },
|
|
899
|
+
});
|
|
900
|
+
expect(database.locate(entity)).not.toBeNull();
|
|
901
|
+
// Test resource update
|
|
902
|
+
database.store.actions.updateTime({ delta: 0.033, elapsed: 1.5 });
|
|
903
|
+
expect(database.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
904
|
+
// Test entity deletion
|
|
905
|
+
database.store.actions.deleteEntity({ entity });
|
|
906
|
+
expect(database.locate(entity)).toBeNull();
|
|
907
|
+
});
|
|
908
|
+
it("should add new actions to store.actions when database is extended", () => {
|
|
909
|
+
const database = createTestDatabase();
|
|
910
|
+
// Verify original action exists
|
|
911
|
+
expect(database.store.actions.createPositionEntity).toBeDefined();
|
|
912
|
+
// Define extension with new transaction
|
|
913
|
+
const extensionSchema = {
|
|
914
|
+
components: {
|
|
915
|
+
velocity: {
|
|
916
|
+
type: "object",
|
|
917
|
+
properties: {
|
|
918
|
+
x: { type: "number", precision: 1, default: 0 },
|
|
919
|
+
y: { type: "number", precision: 1, default: 0 },
|
|
920
|
+
z: { type: "number", precision: 1, default: 0 },
|
|
921
|
+
},
|
|
922
|
+
required: ["x", "y", "z"],
|
|
923
|
+
additionalProperties: false,
|
|
924
|
+
},
|
|
925
|
+
},
|
|
926
|
+
resources: {},
|
|
927
|
+
archetypes: {
|
|
928
|
+
Moving: ["position", "velocity"],
|
|
929
|
+
},
|
|
930
|
+
transactions: {
|
|
931
|
+
createMovingEntity(t, args) {
|
|
932
|
+
return t.archetypes.Moving.insert({
|
|
933
|
+
position: args.position,
|
|
934
|
+
velocity: args.velocity,
|
|
935
|
+
});
|
|
936
|
+
},
|
|
937
|
+
},
|
|
938
|
+
};
|
|
939
|
+
// Extend database
|
|
940
|
+
const extendedDatabase = database.extend(extensionSchema);
|
|
941
|
+
// Verify new action exists on store.actions
|
|
942
|
+
expect(extendedDatabase.store.actions.createMovingEntity).toBeDefined();
|
|
943
|
+
expect(typeof extendedDatabase.store.actions.createMovingEntity).toBe("function");
|
|
944
|
+
// Verify new action exists on transactions
|
|
945
|
+
expect(extendedDatabase.transactions.createMovingEntity).toBeDefined();
|
|
946
|
+
expect(typeof extendedDatabase.transactions.createMovingEntity).toBe("function");
|
|
947
|
+
// Test that the new unwrapped action works
|
|
948
|
+
const entity = extendedDatabase.store.actions.createMovingEntity({
|
|
949
|
+
position: { x: 1, y: 2, z: 3 },
|
|
950
|
+
velocity: { x: 0.1, y: 0.2, z: 0.3 },
|
|
951
|
+
});
|
|
952
|
+
expect(entity).toBeDefined();
|
|
953
|
+
const location = extendedDatabase.locate(entity);
|
|
954
|
+
expect(location).not.toBeNull();
|
|
955
|
+
// Verify entity was created successfully
|
|
956
|
+
expect(typeof entity).toBe("number");
|
|
957
|
+
});
|
|
958
|
+
it("should execute store.actions synchronously and return values immediately", () => {
|
|
959
|
+
const database = createTestDatabase();
|
|
960
|
+
// Unwrapped action should return immediately (no promise)
|
|
961
|
+
const entity = database.store.actions.createPositionEntity({
|
|
962
|
+
position: { x: 1, y: 2, z: 3 },
|
|
963
|
+
});
|
|
964
|
+
// Should be a number, not a promise
|
|
965
|
+
expect(typeof entity).toBe("number");
|
|
966
|
+
expect(entity).toBeGreaterThan(0);
|
|
967
|
+
// Verify entity exists immediately
|
|
968
|
+
const location = database.locate(entity);
|
|
969
|
+
expect(location).not.toBeNull();
|
|
970
|
+
});
|
|
971
|
+
it("should have store.actions work independently from transactions", async () => {
|
|
972
|
+
const database = createTestDatabase();
|
|
973
|
+
const observer = vi.fn();
|
|
974
|
+
const unsubscribe = database.observe.transactions(observer);
|
|
975
|
+
// Create entity using store.actions (no notification)
|
|
976
|
+
const entity1 = database.store.actions.createPositionEntity({
|
|
977
|
+
position: { x: 1, y: 2, z: 3 },
|
|
978
|
+
});
|
|
979
|
+
// Create entity using transactions (with notification)
|
|
980
|
+
const entity2 = database.transactions.createPositionEntity({
|
|
981
|
+
position: { x: 4, y: 5, z: 6 },
|
|
982
|
+
});
|
|
983
|
+
await Promise.resolve();
|
|
984
|
+
// Only one notification (from transactions, not store.actions)
|
|
985
|
+
expect(observer).toHaveBeenCalledTimes(1);
|
|
986
|
+
// Both entities should exist
|
|
987
|
+
expect(database.locate(entity1)).not.toBeNull();
|
|
988
|
+
expect(database.locate(entity2)).not.toBeNull();
|
|
989
|
+
unsubscribe();
|
|
990
|
+
});
|
|
991
|
+
});
|
|
992
|
+
});
|
|
993
|
+
//# sourceMappingURL=create-database.test.js.map
|