diff --git a/.claude/settings.json b/.claude/settings.json
new file mode 100644
index 00000000..969b3c02
--- /dev/null
+++ b/.claude/settings.json
@@ -0,0 +1,8 @@
+{
+ "enabledPlugins": {
+ "claude-md-management@claude-plugins-official": true,
+ "code-review@claude-plugins-official": true,
+ "ralph-loop@claude-plugins-official": true,
+ "typescript-lsp@claude-plugins-official": true
+ }
+}
diff --git a/.oxfmtrc.json b/.oxfmtrc.json
new file mode 100644
index 00000000..bac22f3a
--- /dev/null
+++ b/.oxfmtrc.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
+ "experimentalSortPackageJson": true,
+ "experimentalSortImports": {
+ "groups": [
+ ["type-import", "value-builtin", "value-external"],
+ ["type-internal", "value-internal"],
+ ["type-parent", "type-sibling", "type-index"],
+ ["value-parent", "value-sibling", "value-index"],
+ "unknown"
+ ],
+ "sortSideEffects": false,
+ "partitionByNewline": false,
+ "newlinesBetween": false
+ },
+ "tabWidth": 4,
+ "bracketSpacing": false,
+ "trailingComma": "all",
+ "printWidth": 100,
+ "ignorePatterns": ["pkg", "gen2d", "gen3d", "docs", "target", "dist", "wasm", "crates"]
+}
diff --git a/.oxlintrc.json b/.oxlintrc.json
new file mode 100644
index 00000000..4c9a6b5d
--- /dev/null
+++ b/.oxlintrc.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
+ "plugins": [],
+ "categories": {
+ "correctness": "off",
+ "suspicious": "off"
+ },
+ "rules": {
+ "no-unused-vars": "error"
+ },
+ "settings": {},
+ "env": {
+ "builtin": true
+ },
+ "globals": {},
+ "ignorePatterns": []
+}
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 24ed3cdd..00000000
--- a/.prettierignore
+++ /dev/null
@@ -1,7 +0,0 @@
-pkg
-gen2d
-gen3d
-docs
-target
-**/CHANGELOG.md
-**/README.md
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index 5a3e1430..00000000
--- a/.prettierrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "tabWidth": 4,
- "bracketSpacing": false,
- "trailingComma": "all"
-}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 60770265..ee74de7a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,4 +1,3 @@
{
- "javascript.format.enable": false,
- "typescript.format.enable": false
+ "editor.defaultFormatter": "oxc.oxc-vscode"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 413325bf..05b6b0dd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -168,24 +168,23 @@ See [parry#336](https://github.com/dimforge/parry/pull/336) for additional infor
- Update to Rapier 0.24.
- Package tree shaking has been disabled to avoid a crash on certain build configuration (#289).
- Multiple packages with different feature sets are now released, and their build process has been automated (#309)
- - Released packages are:
- - rapier2d
- - rapier2d-compat
- - rapier2d-simd
- - rapier2d-simd-compat
- - rapier2d-deterministic
- - rapier2d-deterministic-compat
- - rapier3d
- - rapier3d-compat
- - rapier2d
- - rapier2d-compat
- - rapier3d-simd
- - rapier3d-simd-compat
- - rapier3d-deterministic
- - rapier3d-deterministic-compat
- - :warning: To this occasion, existing packages `rapier2d` and `rapier3d` are now built without `enhanced-determinism` feature enabled,
- so if you rely on that feature, you should migrate to the new `-deterministic` flavor.
-
+ - Released packages are:
+ - rapier2d
+ - rapier2d-compat
+ - rapier2d-simd
+ - rapier2d-simd-compat
+ - rapier2d-deterministic
+ - rapier2d-deterministic-compat
+ - rapier3d
+ - rapier3d-compat
+ - rapier2d
+ - rapier2d-compat
+ - rapier3d-simd
+ - rapier3d-simd-compat
+ - rapier3d-deterministic
+ - rapier3d-deterministic-compat
+ - :warning: To this occasion, existing packages `rapier2d` and `rapier3d` are now built without `enhanced-determinism` feature enabled,
+ so if you rely on that feature, you should migrate to the new `-deterministic` flavor.
### 0.14.0 (20 July 2024)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 00000000..a99acb84
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,219 @@
+# CLAUDE.md - AI Assistant Context for rapier.js
+
+## Project Overview
+
+This is a **fork** of rapier.js - TypeScript bindings for the Rapier physics engine (Rust → WASM).
+
+## Prerequisites
+
+- Node.js 24+
+- pnpm (`npm install -g pnpm`)
+- Rust toolchain (`rustup`)
+- wasm-pack (`cargo install wasm-pack`)
+
+- **Package scope**: `@alexandernanberg/rapier-{2d,3d}`
+- **Monorepo**: pnpm workspaces
+- **Stack**: Rust + wasm-bindgen → WASM, TypeScript bindings
+
+### Performance Goals
+
+1. Minimize JS↔WASM boundary crossings
+2. Avoid temporary object allocations in hot paths
+3. Prefer getters over methods for simple computed values
+
+## Repository Structure
+
+```
+crates/
+ rapier-wasm-2d/ # WASM crate for 2D (uses shared src/)
+ rapier-wasm-3d/ # WASM crate for 3D (uses shared src/)
+
+packages/
+ rapier-2d/ # TypeScript bindings for 2D physics
+ rapier-3d/ # TypeScript bindings for 3D physics
+ testbed2d/ # 2D demo application
+ testbed3d/ # 3D demo application
+```
+
+## Package Variants
+
+Each package (`rapier-2d`, `rapier-3d`) ships 4 variants:
+
+| Import Path | WASM Loading | SIMD |
+| ---------------------------- | -------------------- | ---- |
+| `@.../rapier-2d` | `fetch()` at runtime | No |
+| `@.../rapier-2d/simd` | `fetch()` at runtime | Yes |
+| `@.../rapier-2d/compat` | Embedded base64 | No |
+| `@.../rapier-2d/compat-simd` | Embedded base64 | Yes |
+
+**Usage**:
+
+- Default/SIMD: Best for web apps (smaller bundle, parallel loading)
+- Compat variants: For environments without `fetch()` (SSR, workers, tests)
+
+## Build Commands
+
+```bash
+pnpm build # Full build (WASM + TypeScript)
+pnpm build:wasm # All WASM variants
+pnpm build:ts # TypeScript packages only
+pnpm build:2d # 2D only (WASM + TS)
+pnpm build:3d # 3D only (WASM + TS)
+pnpm typecheck # Type check all packages
+pnpm fmt # Format code with oxfmt
+pnpm dev:testbed2d # Run 2D demo
+pnpm dev:testbed3d # Run 3D demo
+```
+
+## Benchmarks
+
+Run performance benchmarks to measure physics engine performance:
+
+```bash
+pnpm bench # Full 3D benchmark
+pnpm bench:2d # Full 2D benchmark
+pnpm bench:quick # Quick mode (fewer iterations)
+```
+
+**Benchmark categories:**
+
+- **Simulation**: `world.step()` performance with stacked bodies
+- **Lifecycle**: Body creation/destruction throughput
+- **Queries**: Ray casting and point projection performance
+- **Getters**: Property access with/without allocation
+
+Results are saved to `packages/benchmarks/results/` as timestamped JSON files.
+
+## Critical Memory Management Patterns
+
+### Rule 1: Always `init()` Before API Use
+
+```typescript
+import RAPIER from "@alexandernanberg/rapier-2d";
+
+await RAPIER.init(); // REQUIRED before any API calls
+const world = new RAPIER.World({x: 0, y: -9.81});
+```
+
+### Rule 2: Free Raw Objects After `intoRaw()` Calls
+
+When passing data to WASM, temporary raw objects must be freed:
+
+```typescript
+// CORRECT - free raw objects after use
+let rawOrig = VectorOps.intoRaw(ray.origin);
+let rawDir = VectorOps.intoRaw(ray.dir);
+
+let result = this.raw.castRay(rawOrig, rawDir, maxToi);
+
+rawOrig.free(); // REQUIRED
+rawDir.free(); // REQUIRED
+
+return result;
+```
+
+```typescript
+// WRONG - memory leak
+let rawOrig = VectorOps.intoRaw(ray.origin);
+let rawDir = VectorOps.intoRaw(ray.dir);
+return this.raw.castRay(rawOrig, rawDir, maxToi);
+// rawOrig and rawDir are never freed!
+```
+
+### Rule 3: `fromRaw()` Auto-Frees, `intoRaw()` Does Not
+
+- `fromRaw(raw)`: Consumes and frees the raw object automatically
+- `intoRaw()`: Returns raw object that YOU must free
+
+### Rule 4: Free World/Controller Resources
+
+Classes with `raw` property need explicit cleanup:
+
+```typescript
+class KinematicCharacterController {
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined;
+ }
+}
+```
+
+## Zero-Allocation Getters
+
+For hot paths, use the optional `target` parameter to avoid allocations:
+
+```typescript
+// Allocating (creates new object each call)
+const pos = body.translation();
+
+// Zero-allocation (reuses existing object)
+const _pos = {x: 0, y: 0, z: 0};
+body.translation(_pos); // writes into _pos
+```
+
+Supported methods: `translation()`, `rotation()`, `linvel()`, `angvel()`,
+`nextTranslation()`, `nextRotation()`, `localCom()`, `worldCom()` on RigidBody,
+and `translation()`, `rotation()` on Collider.
+
+## 2D vs 3D Differences
+
+| Concept | 2D | 3D |
+| -------- | ------------------------------------------ | ---------------------------------- |
+| Rotation | `number` (radians) | `Quaternion` `{x,y,z,w}` |
+| Vector | `{x, y}` | `{x, y, z}` |
+| Shapes | Ball, Cuboid, Capsule, ConvexPolygon, etc. | + ConvexPolyhedron, Cylinder, Cone |
+
+## Common Pitfalls
+
+1. **Memory leaks**: Missing `.free()` after `intoRaw()` calls
+2. **Uninitialized WASM**: Calling API before `await init()`
+3. **Wrong rotation type**: Using quaternion in 2D or number in 3D
+4. **Stale handles**: Using `RigidBodyHandle` after body removed from world
+
+## Key Type Patterns
+
+### Handles vs Objects
+
+```typescript
+// Handle = lightweight reference (number)
+type RigidBodyHandle = number;
+type ColliderHandle = number;
+
+// Get actual object from set using handle
+const body = world.getRigidBody(handle);
+```
+
+### Descriptor Pattern
+
+```typescript
+// Use descriptors to configure before creation
+const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0, 5);
+
+const body = world.createRigidBody(bodyDesc);
+```
+
+## File Navigation Hints
+
+| Looking for... | Check |
+| -------------------- | ------------------------------------------------------------- |
+| Shape definitions | `packages/rapier-{2d,3d}/src/geometry/shape.ts` |
+| Rigid body API | `packages/rapier-{2d,3d}/src/dynamics/rigid_body.ts` |
+| World/simulation | `packages/rapier-{2d,3d}/src/pipeline/world.ts` |
+| Collision detection | `packages/rapier-{2d,3d}/src/geometry/narrow_phase.ts` |
+| Ray/shape casting | `packages/rapier-{2d,3d}/src/geometry/broad_phase.ts` |
+| Character controller | `packages/rapier-{2d,3d}/src/control/character_controller.ts` |
+| WASM init logic | `packages/rapier-{2d,3d}/src/init.ts`, `init-compat.ts` |
+| Math utilities | `packages/rapier-{2d,3d}/src/math.ts` |
+
+## Testing
+
+Testbeds serve as integration tests:
+
+```bash
+pnpm dev:testbed2d # http://localhost:5173
+pnpm dev:testbed3d # http://localhost:5173
+```
+
+Demo files in `packages/testbed{2d,3d}/src/demos/` show usage patterns.
diff --git a/Cargo.lock b/Cargo.lock
index 0d2a5111..28e60291 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,86 +2,12 @@
# It is not intended for manual editing.
version = 4
-[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
-[[package]]
-name = "android-tzdata"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-
-[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "anstream"
-version = "0.6.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
-dependencies = [
- "windows-sys",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
-dependencies = [
- "anstyle",
- "once_cell_polyfill",
- "windows-sys",
-]
-
[[package]]
name = "approx"
version = "0.5.1"
@@ -126,37 +52,18 @@ dependencies = [
[[package]]
name = "bitflags"
-version = "2.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
+version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "bstr"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4"
-dependencies = [
- "memchr",
- "serde",
+ "serde_core",
]
[[package]]
name = "bumpalo"
-version = "3.19.0"
+version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]]
name = "by_address"
@@ -166,9 +73,9 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06"
[[package]]
name = "bytemuck"
-version = "1.24.0"
+version = "1.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
+checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
[[package]]
name = "byteorder"
@@ -176,249 +83,11 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-[[package]]
-name = "cc"
-version = "1.2.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7"
-dependencies = [
- "shlex",
-]
-
[[package]]
name = "cfg-if"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
-
-[[package]]
-name = "chrono"
-version = "0.4.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
-dependencies = [
- "android-tzdata",
- "iana-time-zone",
- "num-traits",
- "windows-link",
-]
-
-[[package]]
-name = "chrono-tz"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb"
-dependencies = [
- "chrono",
- "chrono-tz-build",
- "phf",
-]
-
-[[package]]
-name = "chrono-tz-build"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1"
-dependencies = [
- "parse-zoneinfo",
- "phf",
- "phf_codegen",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
-dependencies = [
- "clap_builder",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.5.41"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
-
-[[package]]
-name = "colorchoice"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
-
-[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "deunicode"
-version = "1.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04"
-
-[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
-name = "dimforge_rapier2d"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier2d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "dimforge_rapier2d-deterministic"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier2d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "dimforge_rapier2d-simd"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier2d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "dimforge_rapier3d"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier3d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "dimforge_rapier3d-deterministic"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier3d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "dimforge_rapier3d-simd"
-version = "0.19.2"
-dependencies = [
- "bincode",
- "js-sys",
- "nalgebra",
- "palette",
- "rapier3d",
- "ref-cast",
- "serde",
- "wasm-bindgen",
-]
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "downcast-rs"
@@ -465,27 +134,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi",
-]
-
[[package]]
name = "glam"
version = "0.14.0"
@@ -578,32 +226,27 @@ checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee"
[[package]]
name = "glam"
-version = "0.30.8"
+version = "0.30.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e12d847aeb25f41be4c0ec9587d624e9cd631bc007a8fd7ce3f5851e064c6460"
-
-[[package]]
-name = "globset"
-version = "0.4.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5"
+checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9"
dependencies = [
- "aho-corasick",
- "bstr",
- "log",
- "regex-automata",
- "regex-syntax",
+ "approx",
+ "libm",
+ "serde_core",
]
[[package]]
-name = "globwalk"
-version = "0.9.1"
+name = "glamx"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
+checksum = "375b4fa374a343fef990a18a6e0413d54bd990c6d7b8c7ada2d3c884275edea3"
dependencies = [
- "bitflags",
- "ignore",
- "walkdir",
+ "approx",
+ "glam 0.30.10",
+ "nalgebra",
+ "num-traits",
+ "serde",
+ "simba",
]
[[package]]
@@ -628,12 +271,13 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.16.0"
+version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
dependencies = [
"foldhash 0.2.0",
"serde",
+ "serde_core",
]
[[package]]
@@ -646,117 +290,39 @@ dependencies = [
"stable_deref_trait",
]
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "humansize"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
-dependencies = [
- "libm",
-]
-
-[[package]]
-name = "iana-time-zone"
-version = "0.1.63"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
-dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "log",
- "wasm-bindgen",
- "windows-core",
-]
-
-[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "ignore"
-version = "0.4.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
-dependencies = [
- "crossbeam-deque",
- "globset",
- "log",
- "memchr",
- "regex-automata",
- "same-file",
- "walkdir",
- "winapi-util",
-]
-
[[package]]
name = "indexmap"
-version = "2.11.1"
+version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921"
+checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
- "hashbrown 0.15.5",
+ "hashbrown 0.16.1",
"serde",
+ "serde_core",
]
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
-
-[[package]]
-name = "itoa"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
-
[[package]]
name = "js-sys"
-version = "0.3.77"
+version = "0.3.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
dependencies = [
"once_cell",
"wasm-bindgen",
]
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
-name = "libc"
-version = "0.2.174"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
-
[[package]]
name = "libm"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
+checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "log"
-version = "0.4.27"
+version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "matrixmultiply"
@@ -768,12 +334,6 @@ dependencies = [
"rawpointer",
]
-[[package]]
-name = "memchr"
-version = "2.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
-
[[package]]
name = "nalgebra"
version = "0.34.1"
@@ -796,7 +356,7 @@ dependencies = [
"glam 0.27.0",
"glam 0.28.0",
"glam 0.29.3",
- "glam 0.30.8",
+ "glam 0.30.10",
"matrixmultiply",
"nalgebra-macros",
"num-complex",
@@ -885,12 +445,6 @@ version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
-
[[package]]
name = "ordered-float"
version = "5.1.0"
@@ -926,9 +480,9 @@ dependencies = [
[[package]]
name = "parry2d"
-version = "0.25.2"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92ea16e5cdf52dd91b2a98ef781a2121f48dfb0880a92ae1ec6bc9e78097fceb"
+checksum = "e7b05ce9599a62eec9f6b761cf32647ab1dee43477b5c00ff9221a4b7cb80c4b"
dependencies = [
"approx",
"arrayvec",
@@ -937,10 +491,10 @@ dependencies = [
"either",
"ena",
"foldhash 0.2.0",
- "hashbrown 0.16.0",
+ "glamx",
+ "hashbrown 0.16.1",
"indexmap",
"log",
- "nalgebra",
"num-derive",
"num-traits",
"ordered-float",
@@ -955,9 +509,9 @@ dependencies = [
[[package]]
name = "parry3d"
-version = "0.25.2"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2b4291e3c8fcba5f514ed627228c92fa4c94c38bb202c35be7b3b021090193"
+checksum = "2e04d21bda5249438b5695e7f08f1655524a6025bcdb186c324b7a66562f2d61"
dependencies = [
"approx",
"arrayvec",
@@ -966,11 +520,10 @@ dependencies = [
"either",
"ena",
"foldhash 0.2.0",
- "glam 0.30.8",
- "hashbrown 0.16.0",
+ "glamx",
+ "hashbrown 0.16.1",
"indexmap",
"log",
- "nalgebra",
"num-derive",
"num-traits",
"ordered-float",
@@ -985,71 +538,12 @@ dependencies = [
"thiserror",
]
-[[package]]
-name = "parse-zoneinfo"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
-dependencies = [
- "regex",
-]
-
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "pest"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
-dependencies = [
- "memchr",
- "thiserror",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5"
-dependencies = [
- "pest",
- "sha2",
-]
-
[[package]]
name = "phf"
version = "0.11.3"
@@ -1060,16 +554,6 @@ dependencies = [
"phf_shared",
]
-[[package]]
-name = "phf_codegen"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
-dependencies = [
- "phf_generator",
- "phf_shared",
-]
-
[[package]]
name = "phf_generator"
version = "0.11.3"
@@ -1094,37 +578,19 @@ dependencies = [
]
[[package]]
-name = "phf_shared"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.21"
+name = "phf_shared"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
-
-[[package]]
-name = "prepare_builds"
-version = "0.1.0"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
- "clap",
- "clap_derive",
- "tera",
+ "siphasher",
]
[[package]]
name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
@@ -1150,9 +616,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.40"
+version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
dependencies = [
"proc-macro2",
]
@@ -1163,41 +629,55 @@ version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
- "libc",
- "rand_chacha",
"rand_core",
]
[[package]]
-name = "rand_chacha"
-version = "0.3.1"
+name = "rand_core"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+
+[[package]]
+name = "rapier-wasm-2d"
+version = "0.19.3"
dependencies = [
- "ppv-lite86",
- "rand_core",
+ "bincode",
+ "bitflags",
+ "js-sys",
+ "palette",
+ "rapier2d",
+ "serde",
+ "serde-wasm-bindgen",
+ "wasm-bindgen",
]
[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+name = "rapier-wasm-3d"
+version = "0.19.3"
dependencies = [
- "getrandom",
+ "bincode",
+ "bitflags",
+ "js-sys",
+ "palette",
+ "rapier3d",
+ "serde",
+ "serde-wasm-bindgen",
+ "wasm-bindgen",
]
[[package]]
name = "rapier2d"
-version = "0.30.1"
+version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eab12a465faea032e025eb97a3b0763422391c3edb98200ed5efd516307df550"
+checksum = "73edcbebd2c2a9eb0041e40b046b5136da32990fcd2ac76b9414ebff45908e18"
dependencies = [
"approx",
"arrayvec",
"bit-vec",
"bitflags",
"downcast-rs",
+ "glamx",
"log",
"nalgebra",
"num-derive",
@@ -1211,21 +691,21 @@ dependencies = [
"static_assertions",
"thiserror",
"vec_map",
- "web-time",
"wide",
]
[[package]]
name = "rapier3d"
-version = "0.30.1"
+version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bd27b8eb36d0833fa0f2aea40164fabfad0fc34b9932286ae9e84f3452f5364"
+checksum = "a576251c9dc2d6aff08470b7433096a04019c8b7bea9bbb7087f092c180feaea"
dependencies = [
"approx",
"arrayvec",
"bit-vec",
"bitflags",
"downcast-rs",
+ "glamx",
"log",
"nalgebra",
"num-derive",
@@ -1239,7 +719,6 @@ dependencies = [
"static_assertions",
"thiserror",
"vec_map",
- "web-time",
"wide",
]
@@ -1249,55 +728,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
-[[package]]
-name = "ref-cast"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "regex"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-
[[package]]
name = "robust"
version = "1.2.0"
@@ -1323,15 +753,9 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
[[package]]
name = "rustversion"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
-
-[[package]]
-name = "ryu"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "safe_arch"
@@ -1343,21 +767,24 @@ dependencies = [
]
[[package]]
-name = "same-file"
-version = "1.0.6"
+name = "serde"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
- "winapi-util",
+ "serde_core",
+ "serde_derive",
]
[[package]]
-name = "serde"
-version = "1.0.219"
+name = "serde-wasm-bindgen"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
dependencies = [
- "serde_derive",
+ "js-sys",
+ "serde",
+ "wasm-bindgen",
]
[[package]]
@@ -1370,45 +797,25 @@ dependencies = [
]
[[package]]
-name = "serde_derive"
-version = "1.0.219"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.141"
+name = "serde_core"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
+ "serde_derive",
]
[[package]]
-name = "sha2"
-version = "0.10.9"
+name = "serde_derive"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
+ "proc-macro2",
+ "quote",
+ "syn",
]
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
[[package]]
name = "simba"
version = "0.9.1"
@@ -1425,9 +832,9 @@ dependencies = [
[[package]]
name = "siphasher"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
[[package]]
name = "slab"
@@ -1435,16 +842,6 @@ version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
-[[package]]
-name = "slug"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724"
-dependencies = [
- "deunicode",
- "wasm-bindgen",
-]
-
[[package]]
name = "smallvec"
version = "1.15.1"
@@ -1476,59 +873,31 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
[[package]]
name = "syn"
-version = "2.0.104"
+version = "2.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
+checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
-[[package]]
-name = "tera"
-version = "1.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee"
-dependencies = [
- "chrono",
- "chrono-tz",
- "globwalk",
- "humansize",
- "lazy_static",
- "percent-encoding",
- "pest",
- "pest_derive",
- "rand",
- "regex",
- "serde",
- "serde_json",
- "slug",
- "unic-segment",
-]
-
[[package]]
name = "thiserror"
-version = "2.0.12"
+version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.12"
+version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
@@ -1537,137 +906,43 @@ dependencies = [
[[package]]
name = "typenum"
-version = "1.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
-
-[[package]]
-name = "ucd-trie"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
-
-[[package]]
-name = "unic-char-property"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
-dependencies = [
- "unic-char-range",
-]
-
-[[package]]
-name = "unic-char-range"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
-
-[[package]]
-name = "unic-common"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
-
-[[package]]
-name = "unic-segment"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23"
-dependencies = [
- "unic-ucd-segment",
-]
-
-[[package]]
-name = "unic-ucd-segment"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700"
-dependencies = [
- "unic-char-property",
- "unic-char-range",
- "unic-ucd-version",
-]
-
-[[package]]
-name = "unic-ucd-version"
-version = "0.9.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
-dependencies = [
- "unic-common",
-]
+checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
[[package]]
name = "unicode-ident"
-version = "1.0.18"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
-
-[[package]]
-name = "version_check"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
-
-[[package]]
-name = "walkdir"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
- "same-file",
- "winapi-util",
+ "serde",
]
-[[package]]
-name = "wasi"
-version = "0.11.1+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
-
[[package]]
name = "wasm-bindgen"
-version = "0.2.100"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
-dependencies = [
- "bumpalo",
- "log",
- "proc-macro2",
- "quote",
- "syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.100"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1675,36 +950,26 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.100"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
dependencies = [
+ "bumpalo",
"proc-macro2",
"quote",
"syn",
- "wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.100"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
dependencies = [
"unicode-ident",
]
-[[package]]
-name = "web-time"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
[[package]]
name = "wide"
version = "0.7.33"
@@ -1714,164 +979,3 @@ dependencies = [
"bytemuck",
"safe_arch",
]
-
-[[package]]
-name = "winapi-util"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
-dependencies = [
- "windows-sys",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
-dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
-
-[[package]]
-name = "windows-result"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
-[[package]]
-name = "zerocopy"
-version = "0.8.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.8.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
diff --git a/Cargo.toml b/Cargo.toml
index 6691d264..73a43933 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,11 +1,11 @@
[workspace]
-members = ["builds/*"]
+members = ["crates/*"]
resolver = "2"
[profile.release]
debug = false
codegen-units = 1
-#lto = true
+lto = true
strip = true # Workaround for https://github.com/bevyengine/bevy/issues/16030 (the bug only happens in 2D)
[patch.crates-io]
diff --git a/README.md b/README.md
index d04cc4bf..b8a1bc47 100644
--- a/README.md
+++ b/README.md
@@ -5,18 +5,13 @@
-
-
-
- Website | Documentation |
- 2D examples (sources) |
- 3D examples (sources)
+ Website | Documentation
@@ -24,59 +19,160 @@
2D and 3D physics engines
-for the JavaScript programming language (official bindings).
+for the JavaScript programming language.
---
-## Building packages manually
+## Fork Differences
+
+This is a fork of [@dimforge/rapier.js](https://github.com/dimforge/rapier.js) with performance improvements and modernized tooling.
+
+### Why This Fork?
+
+1. **Latest Rapier**: Rapier 0.32 (official npm is on 0.29)
+2. **Zero-allocation getters**: Optional `target` parameter avoids object creation in hot paths
+3. **Optimized WASM boundary**: Ray casting passes primitives directly instead of temporary WASM objects
+4. **Modern build**: pnpm monorepo, tsdown bundler, smaller bundles
+
+### Benchmarks vs Official
+
+Comparison against `@dimforge/rapier3d-compat@0.19.3` (3D, 1000 bodies):
+
+| Benchmark | Fork | Official | Improvement |
+| -------------------- | -------- | -------- | ----------- |
+| world.step() | 1.37ms | 1.40ms | ~same |
+| create 1000 bodies | 3.8ms | 4.1ms | **7%** |
+| castRay | 2.6µs | 4.0µs | **35%** |
+| body.translation() | 73µs | 210µs | **2.9x** |
+| body.rotation() | 70µs | 223µs | **3.2x** |
+
+### What Makes It Faster
+
+**Zero-allocation getters (3x faster)**
+
+The official package allocates a new object every call:
+
+```typescript
+// Official: allocates {x, y, z} every call
+for (const body of bodies) {
+ const pos = body.translation(); // new object
+}
+```
+
+This fork accepts an optional target to reuse:
+
+```typescript
+// Fork: zero allocations
+const pos = {x: 0, y: 0, z: 0};
+for (const body of bodies) {
+ body.translation(pos); // writes into existing object
+}
+```
+
+Supported: `translation()`, `rotation()`, `linvel()`, `angvel()`, `nextTranslation()`, `nextRotation()`, `localCom()`, `worldCom()`
+
+**Optimized ray casting (35% faster)**
+
+Ray origin/direction passed as primitives directly to WASM, avoiding temporary `RawVector` allocations.
+
+Run `pnpm bench --official` to compare on your machine.
+
+---
+
+## Installation
+
+```bash
+# 2D physics
+npm install @alexandernanberg/rapier-2d
+
+# 3D physics
+npm install @alexandernanberg/rapier-3d
+```
+
+## Usage
+
+```typescript
+import RAPIER from "@alexandernanberg/rapier-2d";
+
+await RAPIER.init();
+
+const gravity = {x: 0.0, y: -9.81};
+const world = new RAPIER.World(gravity);
-From the root of the repository, run:
+// Create a dynamic rigid body
+const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0.0, 10.0);
+const body = world.createRigidBody(bodyDesc);
-```shell
-./builds/prepare_builds/prepare_all_projects.sh
-./builds/prepare_builds/build_all_projects.sh
+// Create a collider attached to the body
+const colliderDesc = RAPIER.ColliderDesc.ball(0.5);
+world.createCollider(colliderDesc, body);
+
+// Run the simulation
+world.step();
+console.log(body.translation()); // { x: 0, y: ~9.99 }
```
-Note that `prepare_all_projects.sh` only needs to be run once. It needs to be re-run if any file from the
-`builds/prepare_builds` directory (and subdirectories) are modified.
-
-The built packages will be in `builds/rapier2d/pkg`, `builds/rapier3d/pkg`, etc. To build the `-compat` variant of the
-packages, run `npm run build` in the `rapier-compat` directory. Note that this will only work if you already ran
-`prepare_all_projects.sh`. The compat packages are then generated in, e.g., `rapier-compat/builds/3d/pkg`.
-
-## Feature selection
-
-Multiple NPM packages exist for Rapier, depending on your needs:
-- [`@dimforge/rapier2d`](https://www.npmjs.com/package/@dimforge/rapier2d) or
- [`@dimforge/rapier3d`](https://www.npmjs.com/package/@dimforge/rapier3d):
- The main build of the Rapier physics engine for 2D or 3D physics simulation. This should have wide browser
- support while offering great performances. This does **not** guarantee cross-platform determinism of the physics
- simulation (but it is still locally deterministic, on the same machine).
-- [`@dimforge/rapier2d-simd`](https://www.npmjs.com/package/@dimforge/rapier2d-simd) or
- [`@dimforge/rapier3d-simd`](https://www.npmjs.com/package/@dimforge/rapier3d-simd):
- A build with internal SIMD optimizations enabled. More limited browser support (requires support for [simd128](https://caniuse.com/?search=simd)).
-- [`@dimforge/rapier2d-deterministic`](https://www.npmjs.com/package/@dimforge/rapier2d-deterministic) or
- [`@dimforge/rapier3d-deterministic`](https://www.npmjs.com/package/@dimforge/rapier3d-deterministic):
- A less optimized build but with a guarantee of a cross-platform deterministic execution of the physics simulation.
-
-## Bundler support
-
-Some bundlers will struggle with the `.wasm` file package into the builds above. Alternative `-compat` versions exist
-which embed the `.wasm` file into the `.js` sources encoded with base64. This results in a bigger package size, but
-much wider bundler support.
-
-Just append `-compat` to the build you are interested in:
-[`rapier2d-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-compat),
-[`rapier2d-simd-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-simd-compat),
-[`rapier2d-deterministic-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-deterministic-compat),
-[`rapier3d-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-compat),
-[`rapier3d-simd-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-simd-compat),
-[`rapier3d-deterministic-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-deterministic-compat).
-
-## Nightly builds
-
-Each time a new Pull Request is merged to the `main` branch of the [`rapier.js` repository](https://github.com/dimforge/rapier.js),
-an automatic _canary_ build is triggered. Builds published to npmjs under the _canary_ tag does not come with any
-stability guarantee and does not follow semver versioning. But it can be a useful solution to try out the latest
-features until a proper release is cut.
\ No newline at end of file
+## Package Variants
+
+Each package ships 4 variants via subpath exports:
+
+| Import Path | WASM Loading | SIMD |
+| ----------------------------------------- | -------------------- | ---- |
+| `@alexandernanberg/rapier-2d` | `fetch()` at runtime | No |
+| `@alexandernanberg/rapier-2d/simd` | `fetch()` at runtime | Yes |
+| `@alexandernanberg/rapier-2d/compat` | Embedded base64 | No |
+| `@alexandernanberg/rapier-2d/compat-simd` | Embedded base64 | Yes |
+
+**When to use which:**
+
+- **Default/SIMD**: Best for web apps (smaller bundle, parallel loading)
+- **Compat variants**: For environments without `fetch()` (SSR, workers, tests)
+- **SIMD variants**: Better performance, requires [simd128 support](https://caniuse.com/?search=simd)
+
+## Building from Source
+
+### Prerequisites
+
+- Node.js 24+
+- pnpm (`npm install -g pnpm`)
+- Rust toolchain (`rustup`)
+- wasm-pack (`cargo install wasm-pack`)
+
+### Build Commands
+
+```bash
+pnpm install # Install dependencies
+pnpm build # Full build (WASM + TypeScript)
+pnpm build:wasm # WASM only (all variants)
+pnpm build:ts # TypeScript only
+pnpm build:2d # 2D package only
+pnpm build:3d # 3D package only
+```
+
+### Running Testbeds
+
+```bash
+pnpm dev:testbed2d # http://localhost:5173
+pnpm dev:testbed3d # http://localhost:5173
+```
+
+### Benchmarks
+
+```bash
+pnpm bench # Run and compare against baseline
+pnpm bench --save-baseline # Save current results as new baseline
+pnpm bench --no-compare # Run without baseline comparison
+pnpm bench:2d # Full 2D benchmark
+pnpm bench --quick # Quick mode (fewer iterations)
+```
+
+**Baseline comparison:**
+
+- Results are compared against `packages/benchmarks/baseline.json`
+- Thresholds: >15% = warning, >30% = regression
+- Exit code 1 on regression (useful for CI)
+
+## License
+
+Apache 2.0
diff --git a/builds/prepare_builds/Cargo.toml b/builds/prepare_builds/Cargo.toml
deleted file mode 100644
index 905de28f..00000000
--- a/builds/prepare_builds/Cargo.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[package]
-name = "prepare_builds"
-version = "0.1.0"
-edition = "2021"
-
-[dependencies]
-clap = { version = "4.5" }
-clap_derive = { version = "4.5" }
-tera = "1.20"
diff --git a/builds/prepare_builds/README.md b/builds/prepare_builds/README.md
deleted file mode 100644
index 4d05a2fa..00000000
--- a/builds/prepare_builds/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Prepare builds
-
-This project helps with making specific package: it takes a few parameter to create a (1) folder ready to compile.
-
-It uses clap so you can pass `-h` to get more info about its parameters.
-
-## usage
-
-At workspace root: `cargo run -p prepare_builds -- -d dim2 -f simd`.
-
-Or use provided scripts: `./builds/prepare_builds/prepare_all_projects.sh && ./builds/prepare_builds/build_all_projects.sh`
-
-## Technical considerations
-
-Askama/rinja was not chosen because compiled templates make it difficult to iterate on a folder and parse all templates.
-
-This folder is in `builds/` only for the workspace member glob to not complain if `builds/` is inexistent or empty.
diff --git a/builds/prepare_builds/build_all_projects.sh b/builds/prepare_builds/build_all_projects.sh
deleted file mode 100755
index a8ed7840..00000000
--- a/builds/prepare_builds/build_all_projects.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-for entry in builds/*
-do
- if [[ "$(basename "$entry")" == $(basename $(dirname "${BASH_SOURCE[0]}")) ]]; then
- echo "skipping directory: $entry"
- continue;
- fi
- (
- cd $entry
- echo "building $entry"
- # FIXME: ideally we'd use `npm ci`
- # but we'd need to have generated the `package-lock` beforehand and committed them in the repository.
- # I'm not sure yet how to store those `package-lock`s yet though.
- # They should proably be similar to all packages, but I'm not sure.
- npm i;
- npm run build;
- )
-done
diff --git a/builds/prepare_builds/prepare_all_projects.sh b/builds/prepare_builds/prepare_all_projects.sh
deleted file mode 100755
index bed9c147..00000000
--- a/builds/prepare_builds/prepare_all_projects.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-features=(non-deterministic deterministic simd)
-dims=(dim2 dim3)
-
-for feature in ${features[@]}; do
- for dim in ${dims[@]}; do
- echo "preparing dimension $dim with feature $feature"
- cargo run -p prepare_builds -- -d ${dim} -f ${feature}
- done
-done
diff --git a/builds/prepare_builds/src/main.rs b/builds/prepare_builds/src/main.rs
deleted file mode 100644
index 56675e8e..00000000
--- a/builds/prepare_builds/src/main.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-use std::{
- error::Error,
- fs::{self, File},
- io::Write,
- path::{Path, PathBuf},
-};
-
-use clap::Parser;
-use clap_derive::{Parser, ValueEnum};
-use tera::{Context, Tera};
-
-/// Simple program to greet a person
-#[derive(Parser, Debug)]
-#[command(version, about, long_about = None)]
-pub struct Args {
- /// Dimension to use
- #[arg(short, long)]
- dim: Dimension,
-
- /// Features to enable
- #[arg(short, long)]
- feature_set: FeatureSet,
-}
-
-#[derive(ValueEnum, Debug, Clone, Copy)]
-pub enum Dimension {
- Dim2,
- Dim3,
-}
-
-#[derive(ValueEnum, Default, Debug, Clone, Copy)]
-pub enum FeatureSet {
- #[default]
- NonDeterministic,
- Deterministic,
- Simd,
-}
-
-/// Values to use when creating the new build folder.
-pub struct BuildValues {
- /// Only the number of dimensions, as sometimes it will be prefixed by "dim" and sometimes post-fixed by "d".
- pub dim: String,
- /// real name of the additional features to enable in the project
- pub feature_set: Vec,
- pub target_dir: PathBuf,
- pub template_dir: PathBuf,
- pub additional_rust_flags: String,
- pub additional_wasm_opt_flags: Vec,
- pub js_package_name: String,
-}
-
-impl BuildValues {
- pub fn new(args: Args) -> Self {
- let dim = match args.dim {
- Dimension::Dim2 => "2",
- Dimension::Dim3 => "3",
- };
- let feature_set = match args.feature_set {
- FeatureSet::NonDeterministic => vec![],
- FeatureSet::Deterministic => vec!["enhanced-determinism"],
- FeatureSet::Simd => vec!["simd-stable"],
- };
- let js_package_name = match args.feature_set {
- FeatureSet::NonDeterministic => format!("rapier{dim}d"),
- FeatureSet::Deterministic => format!("rapier{dim}d-deterministic"),
- FeatureSet::Simd => format!("rapier{dim}d-simd"),
- };
-
- let root: PathBuf = env!("CARGO_MANIFEST_DIR").into();
-
- Self {
- dim: dim.to_string(),
- feature_set: feature_set.iter().map(|f| f.to_string()).collect(),
- template_dir: root.join("templates/").clone(),
- target_dir: root.parent().unwrap().join(&js_package_name).into(),
- additional_rust_flags: match args.feature_set {
- FeatureSet::Simd => "RUSTFLAGS='-C target-feature=+simd128'".to_string(),
- _ => "".to_string(),
- },
- additional_wasm_opt_flags: match args.feature_set {
- FeatureSet::Simd => vec!["--enable-simd".to_string()],
- _ => vec![],
- },
- js_package_name,
- }
- }
-}
-
-fn main() {
- let args = Args::parse();
- dbg!(&args);
-
- let build_values = BuildValues::new(args);
- copy_top_level_files_in_directory(&build_values.template_dir, &build_values.target_dir)
- .expect("Failed to copy directory");
- process_templates(&build_values).expect("Failed to process templates");
-}
-
-fn copy_top_level_files_in_directory(
- src: impl AsRef,
- dest: impl AsRef,
-) -> std::io::Result<()> {
- let src = src.as_ref();
- let dest = Path::new(&dest);
- if dest.exists() {
- fs::remove_dir_all(&dest)?;
- }
- fs::create_dir_all(&dest)?;
-
- for entry in fs::read_dir(src)? {
- let entry = entry?;
- let path = entry.path();
- let dest_path = dest.join(path.file_name().unwrap());
-
- if !path.is_dir() {
- fs::copy(&path, &dest_path)?;
- }
- }
- Ok(())
-}
-
-/// Process all tera templates in the target directory:
-/// - Remove the extension
-/// - Render the templates to
-///
-fn process_templates(build_values: &BuildValues) -> std::io::Result<()> {
- let target_dir = build_values.target_dir.clone();
-
- let mut context = Context::new();
- context.insert("dimension", &build_values.dim);
- context.insert("additional_features", &build_values.feature_set);
- context.insert("additional_rust_flags", &build_values.additional_rust_flags);
- context.insert(
- "additional_wasm_opt_flags",
- &build_values.additional_wasm_opt_flags,
- );
- context.insert("js_package_name", &build_values.js_package_name);
-
- let tera = match Tera::new(target_dir.join("**/*.tera").to_str().unwrap()) {
- Ok(t) => t,
- Err(e) => {
- eprintln!("Parsing error(s): {}", e);
- ::std::process::exit(1);
- }
- };
- dbg!(tera.templates.keys(), &context);
-
- for entry in fs::read_dir(target_dir)? {
- let entry = entry?;
- let path = entry.path();
- // For tera templates, remove extension.
- if path.extension() == Some(std::ffi::OsStr::new("tera")) {
- let mut i = path.iter();
-
- // Get path from target directory
- for _ in i
- .by_ref()
- .take_while(|c| *c != build_values.target_dir.file_name().unwrap())
- {}
- let path_template = i.as_path();
- match tera.render(path_template.to_str().unwrap(), &context) {
- Ok(s) => {
- let old_path = path.clone();
- let new_path = path.with_extension("");
- let mut file = File::create(path.join(new_path))?;
- file.write_all(s.as_bytes())?;
- std::fs::remove_file(old_path)?;
- }
- Err(e) => {
- eprintln!("Error: {}", e);
- let mut cause = e.source();
- while let Some(e) = cause {
- eprintln!("Reason: {}", e);
- cause = e.source();
- }
- }
- };
- }
- }
-
- Ok(())
-}
diff --git a/builds/prepare_builds/templates/Cargo.toml.tera b/builds/prepare_builds/templates/Cargo.toml.tera
deleted file mode 100644
index af9756d1..00000000
--- a/builds/prepare_builds/templates/Cargo.toml.tera
+++ /dev/null
@@ -1,60 +0,0 @@
-[package]
-name = "dimforge_{{ js_package_name }}" # Can't be named rapier{{ dimension }}d which conflicts with the dependency.
-version = "0.19.3"
-authors = ["Sébastien Crozet "]
-description = "{{ dimension }}-dimensional physics engine in Rust - official JS bindings."
-documentation = "https://rapier.rs/rustdoc/rapier{{ dimension }}d/index.html"
-homepage = "https://rapier.rs"
-repository = "https://github.com/dimforge/rapier.js"
-readme = "README.md"
-keywords = ["physics", "dynamics", "rigid", "real-time", "joints"]
-license = "Apache-2.0"
-edition = "2018"
-
-[features]
-default = ["dim{{ dimension }}"]
-dim{{ dimension }} = []
-
-[lib]
-name = "rapier_wasm{{ dimension }}d"
-path = "../../src/lib.rs"
-crate-type = ["cdylib", "rlib"]
-required-features = ["dim{{ dimension }}"]
-
-[lints]
-rust.unexpected_cfgs = { level = "warn", check-cfg = [
- 'cfg(feature, values("dim{% if dimension == "2" %}3{% else %}2{% endif %}"))',
-] }
-
-[dependencies]
-rapier{{ dimension }}d = { version = "0.30.1", features = [
- "serde-serialize",
- "debug-render",
- "profiler",
- {%- for feature in additional_features %}
- "{{ feature }}",
- {%- endfor %}
-] }
-# The explicit dependency to parry only needed to pin the patch version.
-parry{{ dimension }}d = { version = "^0.25.3" }
-ref-cast = "1"
-wasm-bindgen = "0.2.100"
-js-sys = "0.3"
-nalgebra = "0.34"
-serde = { version = "1", features = ["derive", "rc"] }
-bincode = "1"
-palette = "0.7"
-
-[package.metadata.wasm-pack.profile.release]
-# add -g to keep debug symbols
-wasm-opt = [
- '-O4',
- '--dce',
- # The two options below are needed because of: https://github.com/rustwasm/wasm-pack/issues/1501
- '--enable-bulk-memory',
- '--enable-nontrapping-float-to-int',
- {%- for flag in additional_wasm_opt_flags %}
- '{{ flag }}',
- {%- endfor %}
-]
-#wasm-opt = ['-g']
diff --git a/builds/prepare_builds/templates/LICENSE b/builds/prepare_builds/templates/LICENSE
deleted file mode 100644
index e579674d..00000000
--- a/builds/prepare_builds/templates/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 2020 Dimforge EURL
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/builds/prepare_builds/templates/README.md.tera b/builds/prepare_builds/templates/README.md.tera
deleted file mode 100644
index 3455eab2..00000000
--- a/builds/prepare_builds/templates/README.md.tera
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Website | Documentation
-
-
-
----
-
-
-{{ dimension }}D physics engine
-for the JavaScript programming language (official bindings).
-
-
----
-
-## Feature selection
-
-Multiple NPM packages exist for Rapier, depending on your needs:
-- [`@dimforge/rapier2d`](https://www.npmjs.com/package/@dimforge/rapier2d) or
- [`@dimforge/rapier3d`](https://www.npmjs.com/package/@dimforge/rapier3d):
- The main build of the Rapier physics engine for 2D or 3D physics simulation. This should have wide browser
- support while offering great performances. This does **not** guarantee cross-platform determinism of the physics
- simulation (but it is still locally deterministic, on the same machine).
-- [`@dimforge/rapier2d-simd`](https://www.npmjs.com/package/@dimforge/rapier2d-simd) or
- [`@dimforge/rapier3d-simd`](https://www.npmjs.com/package/@dimforge/rapier3d-simd):
- A build with internal SIMD optimizations enabled. More limited browser support (requires support for [simd128](https://caniuse.com/?search=simd)).
-- [`@dimforge/rapier2d-deterministic`](https://www.npmjs.com/package/@dimforge/rapier2d-deterministic) or
- [`@dimforge/rapier3d-deterministic`](https://www.npmjs.com/package/@dimforge/rapier3d-deterministic):
- A less optimized build but with a guarantee of a cross-platform deterministic execution of the physics simulation.
-
-## Bundler support
-
-Some bundlers will struggle with the `.wasm` file package into the builds above. Alternative `-compat` versions exist
-which embed the `.wasm` file into the `.js` sources encoded with base64. This results in a bigger package size, but
-much wider bundler support.
-
-Just append `-compat` to the build you are interested in:
-[`rapier2d-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-compat),
-[`rapier2d-simd-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-simd-compat),
-[`rapier2d-deterministic-compat`](https://www.npmjs.com/package/@dimforge/rapier2d-deterministic-compat),
-[`rapier3d-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-compat),
-[`rapier3d-simd-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-simd-compat),
-[`rapier3d-deterministic-compat`](https://www.npmjs.com/package/@dimforge/rapier3d-deterministic-compat).
-
-## Nightly builds
-
-Each time a new Pull Request is merged to the `main` branch of the [`rapier.js` repository](https://github.com/dimforge/rapier.js),
-an automatic _canary_ build is triggered. Builds published to npmjs under the _canary_ tag does not come with any
-stability guarantee and does not follow semver versioning. But it can be a useful solution to try out the latest
-features until a proper release is cut.
\ No newline at end of file
diff --git a/builds/prepare_builds/templates/build_rust.sh.tera b/builds/prepare_builds/templates/build_rust.sh.tera
deleted file mode 100755
index 6fd6ae82..00000000
--- a/builds/prepare_builds/templates/build_rust.sh.tera
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-# Cleaning rust because changing rust flags may lead to different build results.
-cargo clean
-
-{{ additional_rust_flags }} npx wasm-pack build
-sed -i.bak 's#dimforge_rapier#@dimforge/rapier#g' pkg/package.json
-sed -i.bak 's/"rapier_wasm{{ dimension }}d_bg.wasm"/"*"/g' pkg/package.json
-(
- cd pkg
- npm pkg delete sideEffects
- npm pkg set 'sideEffects[0]'="./*.js"
-)
-rm pkg/*.bak
-rm pkg/.gitignore
diff --git a/builds/prepare_builds/templates/build_typescript.sh.tera b/builds/prepare_builds/templates/build_typescript.sh.tera
deleted file mode 100755
index 8fcce98b..00000000
--- a/builds/prepare_builds/templates/build_typescript.sh.tera
+++ /dev/null
@@ -1,13 +0,0 @@
-#! /bin/sh
-
-mkdir -p ./pkg/src
-cp -r ../../src.ts/* pkg/src/.
-rm -f ./pkg/raw.ts
-echo 'export * from "./rapier_wasm{{ dimension }}d"' > pkg/src/raw.ts
-# See https://serverfault.com/a/137848
-find pkg/ -type f -print0 | LC_ALL=C xargs -0 sed -i.bak '\:#if DIM{% if dimension == "2" %}3{% else %}2{% endif %}:,\:#endif:d'
-npx tsc
-# NOTE: we keep the typescripts files into the NPM package for source mapping: see #3
-sed -i.bak 's/"module": "rapier_wasm{{ dimension }}d.js"/"module": "rapier.js"/g' pkg/package.json
-sed -i.bak 's/"types": "rapier_wasm{{ dimension }}d.d.ts"/"types": "rapier.d.ts"/g' pkg/package.json
-find pkg/ -type f -name '*.bak' | xargs rm
diff --git a/builds/prepare_builds/templates/package.json.tera b/builds/prepare_builds/templates/package.json.tera
deleted file mode 100644
index 95cc5f79..00000000
--- a/builds/prepare_builds/templates/package.json.tera
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "@dimforge/{{ js_package_name }}",
- "description": "",
- "private": true,
- "exports": "./pkg",
- "types": "./pkg/rapier.d.ts",
- "scripts": {
- "build": "npm run clean && npm run build:wasm && npm run build:ts && npm run build:doc",
- "build:doc": "typedoc --tsconfig tsconfig_typedoc.json",
- "build:wasm": "sh ./build_rust.sh",
- "build:ts": "sh ./build_typescript.sh",
- "clean": "rimraf pkg"
- },
- "//": "Better keep rimraf version in sync with wasm-pack, see https://github.com/rustwasm/wasm-pack/issues/1444",
- "devDependencies": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13"
- },
- "dependencies": {
- "wasm-pack": "^0.12.1"
- },
- "sideEffects": [
- "./*.js"
- ]
-}
\ No newline at end of file
diff --git a/builds/prepare_builds/templates/tsconfig.json b/builds/prepare_builds/templates/tsconfig.json
deleted file mode 100644
index ecdfc4ce..00000000
--- a/builds/prepare_builds/templates/tsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "compilerOptions": {
- "outDir": "./pkg",
- "module": "ES6",
- "target": "es6",
- "lib": ["es6"],
- "moduleResolution": "node",
- "sourceMap": true,
- "declaration": true,
- "rootDirs": ["./pkg", "./pkg/src"]
- },
- "files": ["./pkg/src/rapier.ts"]
-}
diff --git a/builds/prepare_builds/templates/tsconfig_typedoc.json b/builds/prepare_builds/templates/tsconfig_typedoc.json
deleted file mode 100644
index eea45699..00000000
--- a/builds/prepare_builds/templates/tsconfig_typedoc.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "compilerOptions": {
- "outDir": "./pkg",
- "moduleResolution": "node",
- "sourceMap": true,
- "declaration": true,
- "lib": ["es6"]
- },
- "files": ["./pkg/rapier.d.ts"]
-}
diff --git a/builds/prepare_builds/templates/typedoc.json.tera b/builds/prepare_builds/templates/typedoc.json.tera
deleted file mode 100644
index d96bb7a6..00000000
--- a/builds/prepare_builds/templates/typedoc.json.tera
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "$schema": "https://typedoc.org/schema.json",
- "entryPoints": [
- "./pkg/rapier.d.ts"
- ],
- "out": "./docs",
- "readme": "none",
- "excludeExternals": true,
- "excludeNotDocumented": false,
- "intentionallyNotExported": [
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawBroadPhase",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawCCDSolver",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawColliderSet",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawEventQueue",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawImpulseJointSet",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawMultibodyJointSet",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawIntegrationParameters",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawIslandManager",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawNarrowPhase",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawPhysicsPipeline",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawRigidBodySet",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawSerializationPipeline",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawContactManifold",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawShape",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawGenericJoint",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawJointAxis",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawRotation",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawVector",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawPointColliderProjection",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawPointProjection",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawRayColliderIntersection",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawRayColliderHit",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawRayIntersection",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawColliderShapeCastHit",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawShapeContact",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawShapeCastHit",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawQueryPipeline",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawDeserializedWorld",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawDebugRenderPipeline",
- "pkg/rapier_wasm{{ dimension }}d.d.ts:RawContactForceEvent"
- ]
-}
\ No newline at end of file
diff --git a/crates/rapier-wasm-2d/Cargo.toml b/crates/rapier-wasm-2d/Cargo.toml
new file mode 100644
index 00000000..7f899037
--- /dev/null
+++ b/crates/rapier-wasm-2d/Cargo.toml
@@ -0,0 +1,37 @@
+[package]
+name = "rapier-wasm-2d"
+version = "0.19.3"
+edition = "2021"
+license = "Apache-2.0"
+description = "2-dimensional physics engine - official WASM bindings"
+
+[lib]
+crate-type = ["cdylib"]
+path = "../../src/lib.rs"
+
+[features]
+default = ["dim2"]
+dim2 = []
+simd = ["rapier2d/simd-stable"]
+deterministic = ["rapier2d/enhanced-determinism"]
+
+[dependencies]
+rapier2d = { version = "0.32", features = ["debug-render", "serde-serialize"] }
+wasm-bindgen = "0.2"
+js-sys = "0.3"
+serde = { version = "1", features = ["derive"] }
+serde-wasm-bindgen = "0.6"
+bitflags = "2"
+palette = "0.7"
+bincode = "1"
+
+[lints.rust]
+unexpected_cfgs = { level = "warn", check-cfg = [
+ 'cfg(feature, values("dim2", "dim3"))',
+] }
+
+[package.metadata.wasm-pack.profile.release]
+wasm-opt = ["-O4", "--all-features"]
+
+[package.metadata.wasm-pack.profile.dev]
+wasm-opt = false
diff --git a/crates/rapier-wasm-3d/Cargo.toml b/crates/rapier-wasm-3d/Cargo.toml
new file mode 100644
index 00000000..4c262aee
--- /dev/null
+++ b/crates/rapier-wasm-3d/Cargo.toml
@@ -0,0 +1,37 @@
+[package]
+name = "rapier-wasm-3d"
+version = "0.19.3"
+edition = "2021"
+license = "Apache-2.0"
+description = "3-dimensional physics engine - official WASM bindings"
+
+[lib]
+crate-type = ["cdylib"]
+path = "../../src/lib.rs"
+
+[features]
+default = ["dim3"]
+dim3 = []
+simd = ["rapier3d/simd-stable"]
+deterministic = ["rapier3d/enhanced-determinism"]
+
+[dependencies]
+rapier3d = { version = "0.32", features = ["debug-render", "serde-serialize"] }
+wasm-bindgen = "0.2"
+js-sys = "0.3"
+serde = { version = "1", features = ["derive"] }
+serde-wasm-bindgen = "0.6"
+bitflags = "2"
+palette = "0.7"
+bincode = "1"
+
+[lints.rust]
+unexpected_cfgs = { level = "warn", check-cfg = [
+ 'cfg(feature, values("dim2", "dim3"))',
+] }
+
+[package.metadata.wasm-pack.profile.release]
+wasm-opt = ["-O4", "--all-features"]
+
+[package.metadata.wasm-pack.profile.dev]
+wasm-opt = false
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index f82e399b..00000000
--- a/package-lock.json
+++ /dev/null
@@ -1,506 +0,0 @@
-{
- "name": "rapier.js",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "devDependencies": {
- "prettier": "2.7.1",
- "typedoc": "0.23.19",
- "typescript": "4.8.4",
- "wasm-opt": "1.4.0",
- "wasm-pack": "0.12.1"
- }
- },
- "node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.14.8"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/binary-install": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.1.0.tgz",
- "integrity": "sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "axios": "^0.26.1",
- "rimraf": "^3.0.2",
- "tar": "^6.1.11"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/jsonc-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
- "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lunr": {
- "version": "2.3.9",
- "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
- "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/marked": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
- "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/shiki": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz",
- "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsonc-parser": "^3.0.0",
- "vscode-oniguruma": "^1.6.1",
- "vscode-textmate": "^6.0.0"
- }
- },
- "node_modules/tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/typedoc": {
- "version": "0.23.19",
- "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.19.tgz",
- "integrity": "sha512-70jPL0GQnSJtgQqI7ifOWxpTXrB3sxc4SWPPRn3K0wdx3txI6ZIT/ZYMF39dNg2Gjmql45cO+cAKXJp0TpqOVA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "lunr": "^2.3.9",
- "marked": "^4.0.19",
- "minimatch": "^5.1.0",
- "shiki": "^0.11.1"
- },
- "bin": {
- "typedoc": "bin/typedoc"
- },
- "engines": {
- "node": ">= 14.14"
- },
- "peerDependencies": {
- "typescript": "4.6.x || 4.7.x || 4.8.x"
- }
- },
- "node_modules/typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/vscode-oniguruma": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
- "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/vscode-textmate": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz",
- "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/wasm-opt": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/wasm-opt/-/wasm-opt-1.4.0.tgz",
- "integrity": "sha512-wIsxxp0/FOSphokH4VOONy1zPkVREQfALN+/JTvJPK8gFSKbsmrcfECu2hT7OowqPfb4WEMSMceHgNL0ipFRyw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "node-fetch": "^2.6.9",
- "tar": "^6.1.13"
- },
- "bin": {
- "wasm-opt": "bin/wasm-opt.js"
- }
- },
- "node_modules/wasm-pack": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.12.1.tgz",
- "integrity": "sha512-dIyKWUumPFsGohdndZjDXRFaokUT/kQS+SavbbiXVAvA/eN4riX5QNdB6AhXQx37zNxluxQkuixZUgJ8adKjOg==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT OR Apache-2.0",
- "dependencies": {
- "binary-install": "^1.0.1"
- },
- "bin": {
- "wasm-pack": "run.js"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "license": "ISC"
- }
- }
-}
diff --git a/package.json b/package.json
index ce0eec04..dc112abc 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,39 @@
{
"scripts": {
- "fmt": "prettier ."
+ "fmt": "oxfmt .",
+ "lint": "oxlint",
+ "lint:fix": "oxlint --fix",
+ "build": "pnpm build:wasm && pnpm build:ts",
+ "build:ts": "pnpm -r --filter './packages/rapier-*' build",
+ "build:ts:2d": "pnpm --filter @alexandernanberg/rapier-2d build",
+ "build:ts:3d": "pnpm --filter @alexandernanberg/rapier-3d build",
+ "build:2d": "pnpm build:wasm:2d && pnpm build:wasm:2d:simd && pnpm build:ts:2d",
+ "build:3d": "pnpm build:wasm:3d && pnpm build:wasm:3d:simd && pnpm build:ts:3d",
+ "build:wasm": "pnpm build:wasm:2d && pnpm build:wasm:2d:simd && pnpm build:wasm:3d && pnpm build:wasm:3d:simd",
+ "build:wasm:2d": "wasm-pack build crates/rapier-wasm-2d --target web --out-dir ../../packages/rapier-2d/wasm/release",
+ "build:wasm:2d:simd": "RUSTFLAGS='-C target-feature=+simd128' wasm-pack build crates/rapier-wasm-2d --target web --out-dir ../../packages/rapier-2d/wasm/release-simd -- --features simd",
+ "build:wasm:2d:debug": "wasm-pack build crates/rapier-wasm-2d --dev --target web --out-dir ../../packages/rapier-2d/wasm/debug",
+ "build:wasm:3d": "wasm-pack build crates/rapier-wasm-3d --target web --out-dir ../../packages/rapier-3d/wasm/release",
+ "build:wasm:3d:simd": "RUSTFLAGS='-C target-feature=+simd128' wasm-pack build crates/rapier-wasm-3d --target web --out-dir ../../packages/rapier-3d/wasm/release-simd -- --features simd",
+ "build:wasm:3d:debug": "wasm-pack build crates/rapier-wasm-3d --dev --target web --out-dir ../../packages/rapier-3d/wasm/debug",
+ "typecheck": "pnpm -r --filter './packages/rapier-*' typecheck",
+ "dev:testbed2d": "pnpm --filter rapier-testbed2d dev",
+ "dev:testbed3d": "pnpm --filter rapier-testbed3d dev",
+ "bench": "pnpm --filter rapier-benchmarks bench",
+ "bench:2d": "pnpm --filter rapier-benchmarks bench:2d",
+ "bench:3d": "pnpm --filter rapier-benchmarks bench:3d",
+ "bench:quick": "pnpm --filter rapier-benchmarks bench:quick"
},
"devDependencies": {
- "prettier": "2.7.1",
- "typedoc": "0.23.19",
- "typescript": "4.8.4",
- "wasm-opt": "1.4.0",
- "wasm-pack": "0.12.1"
+ "oxfmt": "0.27.0",
+ "oxlint": "1.42.0",
+ "typedoc": "0.28.16",
+ "typescript": "5.7.3",
+ "wasm-pack": "0.14.0"
+ },
+ "pnpm": {
+ "onlyBuiltDependencies": [
+ "wasm-pack"
+ ]
}
}
diff --git a/packages/benchmarks/.gitignore b/packages/benchmarks/.gitignore
new file mode 100644
index 00000000..ffb0b623
--- /dev/null
+++ b/packages/benchmarks/.gitignore
@@ -0,0 +1,2 @@
+# Benchmark results (kept locally, not committed)
+results/*.json
diff --git a/packages/benchmarks/baseline.json b/packages/benchmarks/baseline.json
new file mode 100644
index 00000000..6e944cb1
--- /dev/null
+++ b/packages/benchmarks/baseline.json
@@ -0,0 +1,105 @@
+{
+ "version": 1,
+ "created": "2026-02-01T06:17:15.413Z",
+ "thresholds": {
+ "warning": 0.15,
+ "regression": 0.3
+ },
+ "2d": {
+ "world.step() [200 bodies]": {
+ "mean": 0.1876775099999989
+ },
+ "create 1000 bodies+colliders": {
+ "mean": 2.366777049999996
+ },
+ "spawn+despawn 100 bodies": {
+ "mean": 0.3505709499999995
+ },
+ "castRay (100 bodies)": {
+ "mean": 0.002138975000000869
+ },
+ "castRayAndGetNormal": {
+ "mean": 0.003557924999999784
+ },
+ "intersectionsWithRay": {
+ "mean": 0.008877730000000384
+ },
+ "projectPoint": {
+ "mean": 0.002038750000000107
+ },
+ "intersectionsWithPoint": {
+ "mean": 0.0008520750000005251
+ },
+ "body.translation() [alloc]": {
+ "mean": 0.06057476000000435
+ },
+ "body.translation() [reuse]": {
+ "mean": 0.058471040000003145
+ },
+ "body.rotation() [alloc]": {
+ "mean": 0.05259673499999877
+ },
+ "body.linvel() [alloc]": {
+ "mean": 0.05967851499999796
+ },
+ "body.linvel() [reuse]": {
+ "mean": 0.05824997999999937
+ },
+ "collider.translation() [alloc]": {
+ "mean": 0.059001835000002244
+ },
+ "collider.translation() [reuse]": {
+ "mean": 0.05813357499999853
+ }
+ },
+ "3d": {
+ "world.step() [3000 bodies]": {
+ "mean": 1.3654188766666686
+ },
+ "create 1000 bodies+colliders": {
+ "mean": 3.834613380000012
+ },
+ "spawn+despawn 100 bodies": {
+ "mean": 0.5087609000000112
+ },
+ "castRay (2000 bodies)": {
+ "mean": 0.0026443299999964437
+ },
+ "castRayAndGetNormal": {
+ "mean": 0.002499390000000403
+ },
+ "intersectionsWithRay": {
+ "mean": 0.003971961999995756
+ },
+ "projectPoint": {
+ "mean": 0.004458305999998175
+ },
+ "intersectionsWithPoint": {
+ "mean": 0.0013663500000000112
+ },
+ "body.translation() [alloc]": {
+ "mean": 0.07256511899999828
+ },
+ "body.translation() [reuse]": {
+ "mean": 0.06424841400000286
+ },
+ "body.rotation() [alloc]": {
+ "mean": 0.06953922599999987
+ },
+ "body.rotation() [reuse]": {
+ "mean": 0.07181327700000384
+ },
+ "body.linvel() [alloc]": {
+ "mean": 0.06906284799999934
+ },
+ "body.linvel() [reuse]": {
+ "mean": 0.09025221000001375
+ },
+ "collider.translation() [alloc]": {
+ "mean": 0.07162367899999618
+ },
+ "collider.translation() [reuse]": {
+ "mean": 0.06758227600000145
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/benchmarks/package.json b/packages/benchmarks/package.json
new file mode 100644
index 00000000..3877f5e4
--- /dev/null
+++ b/packages/benchmarks/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "rapier-benchmarks",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "bench": "tsx src/index.ts",
+ "bench:2d": "tsx src/index.ts --dim=2d",
+ "bench:3d": "tsx src/index.ts --dim=3d",
+ "bench:quick": "tsx src/index.ts --quick"
+ },
+ "dependencies": {
+ "@alexandernanberg/rapier-2d": "workspace:*",
+ "@alexandernanberg/rapier-3d": "workspace:*",
+ "@dimforge/rapier2d-compat": "^0.19.3",
+ "@dimforge/rapier2d-simd-compat": "^0.19.3",
+ "@dimforge/rapier3d-compat": "^0.19.3",
+ "@dimforge/rapier3d-simd-compat": "^0.19.3"
+ },
+ "devDependencies": {
+ "@types/node": "^22.19.7",
+ "tsx": "^4.21.0"
+ }
+}
diff --git a/packages/benchmarks/results/.gitkeep b/packages/benchmarks/results/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/benchmarks/src/baseline.ts b/packages/benchmarks/src/baseline.ts
new file mode 100644
index 00000000..b2dbc6f0
--- /dev/null
+++ b/packages/benchmarks/src/baseline.ts
@@ -0,0 +1,159 @@
+import * as fs from "node:fs";
+import * as path from "node:path";
+import type {BenchResult} from "./runner.js";
+
+export interface BaselineEntry {
+ mean: number;
+ tolerance?: number;
+}
+
+export interface BaselineData {
+ version: number;
+ created: string;
+ thresholds: {
+ warning: number;
+ regression: number;
+ };
+ "2d": Record;
+ "3d": Record;
+}
+
+export type ComparisonStatus = "pass" | "warning" | "regression" | "new";
+
+export interface ComparisonResult {
+ name: string;
+ mean: number;
+ baseline: number | null;
+ percentChange: number | null;
+ status: ComparisonStatus;
+}
+
+const DEFAULT_THRESHOLDS = {
+ warning: 0.15,
+ regression: 0.3,
+};
+
+function getBaselinePath(): string {
+ return path.join(new URL("..", import.meta.url).pathname, "baseline.json");
+}
+
+export function loadBaseline(): BaselineData | null {
+ const baselinePath = getBaselinePath();
+
+ if (!fs.existsSync(baselinePath)) {
+ return null;
+ }
+
+ try {
+ const content = fs.readFileSync(baselinePath, "utf-8");
+ return JSON.parse(content) as BaselineData;
+ } catch (err) {
+ console.warn(`Warning: Could not load baseline file: ${err}`);
+ return null;
+ }
+}
+
+export function saveBaseline(dim: "2d" | "3d", results: BenchResult[]): void {
+ const baselinePath = getBaselinePath();
+ let baseline: BaselineData;
+
+ // Load existing baseline or create new one
+ if (fs.existsSync(baselinePath)) {
+ try {
+ baseline = JSON.parse(fs.readFileSync(baselinePath, "utf-8"));
+ } catch {
+ baseline = createEmptyBaseline();
+ }
+ } else {
+ baseline = createEmptyBaseline();
+ }
+
+ // Update the dimension's results
+ baseline[dim] = {};
+ for (const result of results) {
+ baseline[dim][result.name] = {
+ mean: result.mean,
+ };
+ }
+
+ // Update timestamp
+ baseline.created = new Date().toISOString();
+
+ fs.writeFileSync(baselinePath, JSON.stringify(baseline, null, 2));
+ console.log(`\nBaseline saved to ${baselinePath}`);
+}
+
+function createEmptyBaseline(): BaselineData {
+ return {
+ version: 1,
+ created: new Date().toISOString(),
+ thresholds: DEFAULT_THRESHOLDS,
+ "2d": {},
+ "3d": {},
+ };
+}
+
+export function compareToBaseline(
+ dim: "2d" | "3d",
+ results: BenchResult[],
+ baseline: BaselineData,
+): ComparisonResult[] {
+ const baselineEntries = baseline[dim];
+ const thresholds = baseline.thresholds ?? DEFAULT_THRESHOLDS;
+
+ return results.map((result) => {
+ const entry = baselineEntries[result.name];
+
+ if (!entry) {
+ return {
+ name: result.name,
+ mean: result.mean,
+ baseline: null,
+ percentChange: null,
+ status: "new" as ComparisonStatus,
+ };
+ }
+
+ const percentChange = (result.mean - entry.mean) / entry.mean;
+ const tolerance = entry.tolerance ?? thresholds.regression;
+
+ let status: ComparisonStatus;
+ if (percentChange > tolerance) {
+ status = "regression";
+ } else if (percentChange > thresholds.warning) {
+ status = "warning";
+ } else {
+ status = "pass";
+ }
+
+ return {
+ name: result.name,
+ mean: result.mean,
+ baseline: entry.mean,
+ percentChange,
+ status,
+ };
+ });
+}
+
+export function hasRegression(comparisons: ComparisonResult[]): boolean {
+ return comparisons.some((c) => c.status === "regression");
+}
+
+export function summarizeComparison(comparisons: ComparisonResult[]): {
+ warnings: number;
+ regressions: number;
+ newBenchmarks: number;
+} {
+ let warnings = 0;
+ let regressions = 0;
+ let newBenchmarks = 0;
+
+ for (const c of comparisons) {
+ if (c.status === "warning") warnings++;
+ else if (c.status === "regression") regressions++;
+ else if (c.status === "new") newBenchmarks++;
+ }
+
+ return {warnings, regressions, newBenchmarks};
+}
diff --git a/packages/benchmarks/src/index.ts b/packages/benchmarks/src/index.ts
new file mode 100644
index 00000000..48dd06b5
--- /dev/null
+++ b/packages/benchmarks/src/index.ts
@@ -0,0 +1,182 @@
+import type {BenchResult} from "./runner.js";
+import {
+ loadBaseline,
+ saveBaseline,
+ compareToBaseline,
+ hasRegression,
+ summarizeComparison,
+} from "./baseline.js";
+import {printTable, printComparisonTable, saveResults} from "./results.js";
+import {benchGetters} from "./scenarios/getters.js";
+import {benchLifecycle} from "./scenarios/lifecycle.js";
+import {benchQueries} from "./scenarios/queries.js";
+import {benchSimulation} from "./scenarios/simulation.js";
+
+async function importRapier(dim: "2d" | "3d", simd: boolean, official: boolean) {
+ if (official) {
+ if (dim === "2d") {
+ return simd
+ ? await import("@dimforge/rapier2d-simd-compat")
+ : await import("@dimforge/rapier2d-compat");
+ } else {
+ return simd
+ ? await import("@dimforge/rapier3d-simd-compat")
+ : await import("@dimforge/rapier3d-compat");
+ }
+ }
+ // Our fork
+ if (dim === "2d") {
+ return simd
+ ? await import("@alexandernanberg/rapier-2d/compat-simd")
+ : await import("@alexandernanberg/rapier-2d/compat");
+ } else {
+ return simd
+ ? await import("@alexandernanberg/rapier-3d/compat-simd")
+ : await import("@alexandernanberg/rapier-3d/compat");
+ }
+}
+
+const args = process.argv.slice(2);
+
+function parseArgs() {
+ let dim: "2d" | "3d" = "3d";
+ let quick = false;
+ let saveBaselineFlag = false;
+ let noCompare = false;
+ let simd = false;
+ let official = false;
+
+ for (const arg of args) {
+ if (arg === "--dim=2d") dim = "2d";
+ else if (arg === "--dim=3d") dim = "3d";
+ else if (arg === "--quick") quick = true;
+ else if (arg === "--save-baseline") saveBaselineFlag = true;
+ else if (arg === "--no-compare") noCompare = true;
+ else if (arg === "--simd") simd = true;
+ else if (arg === "--official") official = true;
+ else if (arg === "--help" || arg === "-h") {
+ console.log(`
+Rapier.js Benchmark Suite
+
+Usage: pnpm bench [options]
+
+Options:
+ --dim=2d Run 2D benchmarks
+ --dim=3d Run 3D benchmarks (default)
+ --simd Use SIMD variant (requires simd128 support)
+ --official Use official @dimforge/rapier packages instead of fork
+ --quick Run with fewer iterations (faster, less accurate)
+ --save-baseline Save current results as new baseline
+ --no-compare Run without baseline comparison
+ --help, -h Show this help message
+
+Examples:
+ pnpm bench # Run fork and compare against baseline
+ pnpm bench --simd # Run fork with SIMD and compare
+ pnpm bench --official # Run with official @dimforge packages
+ pnpm bench --save-baseline # Save current results as new baseline
+ pnpm bench --no-compare # Run without baseline comparison
+ pnpm bench:2d # Full 2D benchmark
+ pnpm bench --quick # Quick 3D benchmark
+`);
+ process.exit(0);
+ }
+ }
+
+ return {dim, quick, saveBaselineFlag, noCompare, simd, official};
+}
+
+async function main() {
+ const {dim, quick, saveBaselineFlag, noCompare, simd, official} = parseArgs();
+ const is3D = dim === "3d";
+
+ const modifiers = [
+ quick ? "quick mode" : null,
+ simd ? "SIMD" : null,
+ official ? "official @dimforge" : null,
+ ].filter(Boolean);
+ const modifierStr = modifiers.length > 0 ? ` (${modifiers.join(", ")})` : "";
+
+ console.log(`\nRapier ${dim.toUpperCase()} Benchmarks${modifierStr}\n`);
+
+ // Import the appropriate package
+ const RAPIER = await importRapier(dim, simd, official);
+
+ await RAPIER.init();
+
+ const results: BenchResult[] = [];
+
+ console.log("Running simulation benchmarks...");
+ results.push(...(await benchSimulation(RAPIER, is3D, quick)));
+
+ console.log("Running lifecycle benchmarks...");
+ results.push(...(await benchLifecycle(RAPIER, is3D, quick)));
+
+ console.log("Running query benchmarks...");
+ results.push(...(await benchQueries(RAPIER, is3D, quick)));
+
+ console.log("Running getter benchmarks...");
+ results.push(...(await benchGetters(RAPIER, is3D, quick)));
+
+ console.log("");
+
+ // Handle baseline operations
+ if (saveBaselineFlag) {
+ printTable(results);
+ saveBaseline(dim, results);
+ } else if (noCompare) {
+ printTable(results);
+ } else {
+ // Try to compare against baseline
+ const baseline = loadBaseline();
+
+ if (baseline && Object.keys(baseline[dim]).length > 0) {
+ const comparisons = compareToBaseline(dim, results, baseline);
+ printComparisonTable(comparisons);
+
+ const summary = summarizeComparison(comparisons);
+ const parts: string[] = [];
+
+ if (summary.newBenchmarks > 0) {
+ parts.push(`${summary.newBenchmarks} new`);
+ }
+ if (summary.warnings > 0) {
+ parts.push(
+ `\u26a0\ufe0f ${summary.warnings} warning${summary.warnings > 1 ? "s" : ""}`,
+ );
+ }
+ if (summary.regressions > 0) {
+ parts.push(
+ `\u274c ${summary.regressions} regression${summary.regressions > 1 ? "s" : ""}`,
+ );
+ }
+
+ if (parts.length > 0) {
+ console.log(`\n${parts.join(", ")}`);
+ } else {
+ console.log("\n\u2713 All benchmarks within tolerance");
+ }
+
+ // Exit with error code if regression detected
+ if (hasRegression(comparisons)) {
+ const timestamp = Date.now();
+ const resultsDir = new URL("../results", import.meta.url).pathname;
+ saveResults(results, `${resultsDir}/${dim}-${timestamp}.json`);
+ process.exit(1);
+ }
+ } else {
+ // No baseline exists, just print results
+ printTable(results);
+ console.log("\nNo baseline found. Run with --save-baseline to create one.");
+ }
+ }
+
+ const timestamp = Date.now();
+ const resultsDir = new URL("../results", import.meta.url).pathname;
+ saveResults(results, `${resultsDir}/${dim}-${timestamp}.json`);
+}
+
+main().catch((err) => {
+ console.error("Benchmark failed:", err);
+ process.exit(1);
+});
diff --git a/packages/benchmarks/src/results.ts b/packages/benchmarks/src/results.ts
new file mode 100644
index 00000000..df7d6475
--- /dev/null
+++ b/packages/benchmarks/src/results.ts
@@ -0,0 +1,81 @@
+import * as fs from "node:fs";
+import * as path from "node:path";
+import type {ComparisonResult, ComparisonStatus} from "./baseline.js";
+import type {BenchResult} from "./runner.js";
+
+export function printTable(results: BenchResult[]): void {
+ console.log("┌─────────────────────────────────┬──────────┬──────────┬──────────┐");
+ console.log("│ Benchmark │ Mean │ Min │ Max │");
+ console.log("├─────────────────────────────────┼──────────┼──────────┼──────────┤");
+ for (const r of results) {
+ const name = r.name.slice(0, 31).padEnd(31);
+ const mean = formatTime(r.mean).padStart(8);
+ const min = formatTime(r.min).padStart(8);
+ const max = formatTime(r.max).padStart(8);
+ console.log(`│ ${name} │ ${mean} │ ${min} │ ${max} │`);
+ }
+ console.log("└─────────────────────────────────┴──────────┴──────────┴──────────┘");
+}
+
+export function printComparisonTable(comparisons: ComparisonResult[]): void {
+ console.log("┌─────────────────────────────────┬──────────┬──────────┬────────────┐");
+ console.log("│ Benchmark │ Mean │ Baseline │ Status │");
+ console.log("├─────────────────────────────────┼──────────┼──────────┼────────────┤");
+ for (const c of comparisons) {
+ const name = c.name.slice(0, 31).padEnd(31);
+ const mean = formatTime(c.mean).padStart(8);
+ const baseline = c.baseline !== null ? formatTime(c.baseline).padStart(8) : " N/A";
+ const status = formatStatus(c.percentChange, c.status).padEnd(10);
+ console.log(`│ ${name} │ ${mean} │ ${baseline} │ ${status} │`);
+ }
+ console.log("└─────────────────────────────────┴──────────┴──────────┴────────────┘");
+}
+
+function formatStatus(percentChange: number | null, status: ComparisonStatus): string {
+ if (status === "new") {
+ return "NEW";
+ }
+
+ if (percentChange === null) {
+ return "N/A";
+ }
+
+ const sign = percentChange >= 0 ? "+" : "";
+ const pct = `${sign}${(percentChange * 100).toFixed(0)}%`;
+
+ switch (status) {
+ case "pass":
+ return `${pct} \u2713`;
+ case "warning":
+ return `${pct} \u26a0\ufe0f`;
+ case "regression":
+ return `${pct} \u274c`;
+ default:
+ return pct;
+ }
+}
+
+function formatTime(ms: number): string {
+ if (ms < 0.001) {
+ return `${(ms * 1000000).toFixed(0)}ns`;
+ } else if (ms < 1) {
+ return `${(ms * 1000).toFixed(1)}µs`;
+ } else {
+ return `${ms.toFixed(3)}ms`;
+ }
+}
+
+export function saveResults(results: BenchResult[], filePath: string): void {
+ const data = {
+ timestamp: new Date().toISOString(),
+ node: process.version,
+ platform: process.platform,
+ arch: process.arch,
+ results,
+ };
+
+ const dir = path.dirname(filePath);
+ fs.mkdirSync(dir, {recursive: true});
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
+ console.log(`\nResults saved to ${filePath}`);
+}
diff --git a/packages/benchmarks/src/runner.ts b/packages/benchmarks/src/runner.ts
new file mode 100644
index 00000000..363b07c9
--- /dev/null
+++ b/packages/benchmarks/src/runner.ts
@@ -0,0 +1,74 @@
+export interface BenchResult {
+ name: string;
+ category: string;
+ mean: number;
+ min: number;
+ max: number;
+ stdDev: number;
+ samples: number;
+}
+
+export interface BenchOptions {
+ warmup: number;
+ iterations: number;
+}
+
+const defaultOptions: BenchOptions = {
+ warmup: 100,
+ iterations: 1000,
+};
+
+export function bench(name: string, fn: () => void, opts: Partial = {}): BenchResult {
+ const {warmup, iterations} = {...defaultOptions, ...opts};
+
+ // Warmup
+ for (let i = 0; i < warmup; i++) fn();
+
+ // Collect samples
+ const times: number[] = [];
+ for (let i = 0; i < iterations; i++) {
+ const start = performance.now();
+ fn();
+ times.push(performance.now() - start);
+ }
+
+ const mean = times.reduce((a, b) => a + b, 0) / times.length;
+ const variance = times.reduce((sum, t) => sum + (t - mean) ** 2, 0) / times.length;
+
+ return {
+ name,
+ category: "",
+ mean,
+ min: Math.min(...times),
+ max: Math.max(...times),
+ stdDev: Math.sqrt(variance),
+ samples: times.length,
+ };
+}
+
+export function statsFrom(name: string, times: number[]): BenchResult {
+ if (times.length === 0) {
+ return {
+ name,
+ category: "",
+ mean: 0,
+ min: 0,
+ max: 0,
+ stdDev: 0,
+ samples: 0,
+ };
+ }
+
+ const mean = times.reduce((a, b) => a + b, 0) / times.length;
+ const variance = times.reduce((sum, t) => sum + (t - mean) ** 2, 0) / times.length;
+
+ return {
+ name,
+ category: "",
+ mean,
+ min: Math.min(...times),
+ max: Math.max(...times),
+ stdDev: Math.sqrt(variance),
+ samples: times.length,
+ };
+}
diff --git a/packages/benchmarks/src/scenarios/getters.ts b/packages/benchmarks/src/scenarios/getters.ts
new file mode 100644
index 00000000..f91b7e1c
--- /dev/null
+++ b/packages/benchmarks/src/scenarios/getters.ts
@@ -0,0 +1,155 @@
+import type {BenchResult} from "../runner.js";
+import {bench} from "../runner.js";
+
+export async function benchGetters(
+ RAPIER: any,
+ is3D: boolean,
+ quick: boolean,
+): Promise {
+ const results: BenchResult[] = [];
+ const bodyCount = 1000;
+ const opts = quick ? {warmup: 50, iterations: 200} : {warmup: 100, iterations: 1000};
+
+ const gravity = is3D ? {x: 0, y: -9.81, z: 0} : {x: 0, y: -9.81};
+ const world = new RAPIER.World(gravity);
+
+ const bodies: any[] = [];
+ const colliders: any[] = [];
+
+ for (let i = 0; i < bodyCount; i++) {
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic();
+ if (is3D) {
+ bodyDesc.setTranslation(
+ Math.random() * 100 - 50,
+ Math.random() * 100,
+ Math.random() * 100 - 50,
+ );
+ } else {
+ bodyDesc.setTranslation(Math.random() * 100 - 50, Math.random() * 100);
+ }
+ const body = world.createRigidBody(bodyDesc);
+ const collider = world.createCollider(RAPIER.ColliderDesc.ball(0.5), body);
+ bodies.push(body);
+ colliders.push(collider);
+ }
+
+ // Step once to initialize velocities
+ world.step();
+
+ // RigidBody getters - allocating pattern
+ results.push(
+ bench(
+ `body.translation() [alloc]`,
+ () => {
+ for (const b of bodies) b.translation();
+ },
+ opts,
+ ),
+ );
+
+ // Check if zero-alloc pattern is supported (our fork only)
+ const sampleBody = bodies[0];
+ const supportsTargetParam = (() => {
+ try {
+ const target = is3D ? {x: 0, y: 0, z: 0} : {x: 0, y: 0};
+ sampleBody.translation(target);
+ // If it returns the target object mutated, it's supported
+ return target.x !== undefined;
+ } catch {
+ return false;
+ }
+ })();
+
+ // RigidBody getters - zero-alloc pattern with target (fork only)
+ if (supportsTargetParam) {
+ const translationTarget = is3D ? {x: 0, y: 0, z: 0} : {x: 0, y: 0};
+ results.push(
+ bench(
+ `body.translation() [reuse]`,
+ () => {
+ for (const b of bodies) b.translation(translationTarget);
+ },
+ opts,
+ ),
+ );
+ }
+
+ // Rotation - allocating
+ results.push(
+ bench(
+ `body.rotation() [alloc]`,
+ () => {
+ for (const b of bodies) b.rotation();
+ },
+ opts,
+ ),
+ );
+
+ // Rotation - zero-alloc (fork only, 3D only)
+ if (supportsTargetParam && is3D) {
+ const rotationTarget = {x: 0, y: 0, z: 0, w: 1};
+ results.push(
+ bench(
+ `body.rotation() [reuse]`,
+ () => {
+ for (const b of bodies) b.rotation(rotationTarget);
+ },
+ opts,
+ ),
+ );
+ }
+
+ // Linear velocity - allocating
+ results.push(
+ bench(
+ `body.linvel() [alloc]`,
+ () => {
+ for (const b of bodies) b.linvel();
+ },
+ opts,
+ ),
+ );
+
+ // Linear velocity - zero-alloc (fork only)
+ if (supportsTargetParam) {
+ const linvelTarget = is3D ? {x: 0, y: 0, z: 0} : {x: 0, y: 0};
+ results.push(
+ bench(
+ `body.linvel() [reuse]`,
+ () => {
+ for (const b of bodies) b.linvel(linvelTarget);
+ },
+ opts,
+ ),
+ );
+ }
+
+ // Collider getters
+ results.push(
+ bench(
+ `collider.translation() [alloc]`,
+ () => {
+ for (const c of colliders) c.translation();
+ },
+ opts,
+ ),
+ );
+
+ // Collider translation - zero-alloc (fork only)
+ if (supportsTargetParam) {
+ const colliderTransTarget = is3D ? {x: 0, y: 0, z: 0} : {x: 0, y: 0};
+ results.push(
+ bench(
+ `collider.translation() [reuse]`,
+ () => {
+ for (const c of colliders) c.translation(colliderTransTarget);
+ },
+ opts,
+ ),
+ );
+ }
+
+ world.free();
+
+ return results;
+}
diff --git a/packages/benchmarks/src/scenarios/lifecycle.ts b/packages/benchmarks/src/scenarios/lifecycle.ts
new file mode 100644
index 00000000..228481b5
--- /dev/null
+++ b/packages/benchmarks/src/scenarios/lifecycle.ts
@@ -0,0 +1,81 @@
+import type {BenchResult} from "../runner.js";
+import {bench} from "../runner.js";
+
+export async function benchLifecycle(
+ RAPIER: any,
+ is3D: boolean,
+ quick: boolean,
+): Promise {
+ const results: BenchResult[] = [];
+ const opts = quick ? {warmup: 5, iterations: 20} : {warmup: 10, iterations: 100};
+
+ const gravity = is3D ? {x: 0, y: -9.81, z: 0} : {x: 0, y: -9.81};
+
+ // Batch creation of bodies with colliders
+ results.push(
+ bench(
+ "create 1000 bodies+colliders",
+ () => {
+ const world = new RAPIER.World(gravity);
+ for (let i = 0; i < 1000; i++) {
+ const body = world.createRigidBody(RAPIER.RigidBodyDesc.dynamic());
+ world.createCollider(RAPIER.ColliderDesc.ball(0.5), body);
+ }
+ world.free();
+ },
+ opts,
+ ),
+ );
+
+ // Create world for spawn/despawn test
+ const world = new RAPIER.World(gravity);
+
+ // Pre-create some bodies to have a realistic scenario
+ const staticBodies = [];
+ for (let i = 0; i < 100; i++) {
+ const body = world.createRigidBody(RAPIER.RigidBodyDesc.fixed());
+ if (is3D) {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(1, 1, 1), body);
+ } else {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(1, 1), body);
+ }
+ staticBodies.push(body);
+ }
+
+ // Spawn/despawn churn (fountain pattern)
+ results.push(
+ bench(
+ "spawn+despawn 100 bodies",
+ () => {
+ const bodies = [];
+
+ // Spawn 100 bodies
+ for (let i = 0; i < 100; i++) {
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic();
+ if (is3D) {
+ bodyDesc.setTranslation(
+ Math.random() * 10 - 5,
+ Math.random() * 10,
+ Math.random() * 10 - 5,
+ );
+ } else {
+ bodyDesc.setTranslation(Math.random() * 10 - 5, Math.random() * 10);
+ }
+ const body = world.createRigidBody(bodyDesc);
+ world.createCollider(RAPIER.ColliderDesc.ball(0.3), body);
+ bodies.push(body);
+ }
+
+ // Despawn all
+ for (const body of bodies) {
+ world.removeRigidBody(body);
+ }
+ },
+ opts,
+ ),
+ );
+
+ world.free();
+
+ return results;
+}
diff --git a/packages/benchmarks/src/scenarios/queries.ts b/packages/benchmarks/src/scenarios/queries.ts
new file mode 100644
index 00000000..9d135255
--- /dev/null
+++ b/packages/benchmarks/src/scenarios/queries.ts
@@ -0,0 +1,86 @@
+import type {BenchResult} from "../runner.js";
+import {bench} from "../runner.js";
+import {createSparseWorld} from "../worlds/sparse.js";
+
+export async function benchQueries(
+ RAPIER: any,
+ is3D: boolean,
+ quick: boolean,
+): Promise {
+ const results: BenchResult[] = [];
+ const bodyCount = quick ? 500 : 2000;
+ const opts = quick ? {warmup: 50, iterations: 200} : {warmup: 100, iterations: 1000};
+
+ const world = createSparseWorld(RAPIER, is3D, bodyCount);
+
+ // Let bodies settle
+ for (let i = 0; i < 60; i++) world.step();
+
+ const origin = is3D ? {x: 0, y: 50, z: 0} : {x: 0, y: 50};
+ const dir = is3D ? {x: 0, y: -1, z: 0} : {x: 0, y: -1};
+ const ray = new RAPIER.Ray(origin, dir);
+
+ // Single ray cast
+ results.push(
+ bench(
+ `castRay (${bodyCount} bodies)`,
+ () => {
+ world.castRay(ray, 100, true);
+ },
+ opts,
+ ),
+ );
+
+ // Ray cast with normal
+ results.push(
+ bench(
+ `castRayAndGetNormal`,
+ () => {
+ world.castRayAndGetNormal(ray, 100, true);
+ },
+ opts,
+ ),
+ );
+
+ // All intersections with ray
+ let _hitCount = 0;
+ results.push(
+ bench(
+ `intersectionsWithRay`,
+ () => {
+ world.intersectionsWithRay(ray, 100, true, () => {
+ _hitCount++;
+ return true;
+ });
+ },
+ opts,
+ ),
+ );
+
+ // Point projection
+ const point: any = is3D ? {x: 0, y: 5, z: 0} : {x: 0, y: 5};
+ results.push(
+ bench(
+ `projectPoint`,
+ () => {
+ world.projectPoint(point, true);
+ },
+ opts,
+ ),
+ );
+
+ // Intersections with point
+ results.push(
+ bench(
+ `intersectionsWithPoint`,
+ () => {
+ world.intersectionsWithPoint(point, () => true);
+ },
+ opts,
+ ),
+ );
+
+ world.free();
+
+ return results;
+}
diff --git a/packages/benchmarks/src/scenarios/simulation.ts b/packages/benchmarks/src/scenarios/simulation.ts
new file mode 100644
index 00000000..208ded32
--- /dev/null
+++ b/packages/benchmarks/src/scenarios/simulation.ts
@@ -0,0 +1,66 @@
+import type {BenchResult} from "../runner.js";
+import {statsFrom} from "../runner.js";
+import {createPyramidWorld} from "../worlds/pyramid.js";
+
+export async function benchSimulation(
+ RAPIER: any,
+ is3D: boolean,
+ quick: boolean,
+): Promise {
+ const results: BenchResult[] = [];
+ const bodyCount = quick ? 500 : 3000;
+
+ // Create pyramid world
+ const world = createPyramidWorld(RAPIER, is3D, bodyCount);
+
+ // Warmup - let simulation settle
+ for (let i = 0; i < 60; i++) world.step();
+
+ // Measure step time using performance.now()
+ const steps = quick ? 100 : 300;
+ const stepTimes: number[] = [];
+
+ for (let i = 0; i < steps; i++) {
+ const start = performance.now();
+ world.step();
+ stepTimes.push(performance.now() - start);
+ }
+
+ results.push(statsFrom(`world.step() [${bodyCount} bodies]`, stepTimes));
+
+ // Try built-in profiler if available (our fork only)
+ const hasProfiler = typeof world.timingCollisionDetection === "function";
+
+ if (hasProfiler) {
+ world.profilerEnabled = true;
+
+ // Collect built-in timing data if profiler works
+ const timings = {
+ collisionDetection: [] as number[],
+ broad: [] as number[],
+ narrow: [] as number[],
+ solver: [] as number[],
+ };
+
+ for (let i = 0; i < steps; i++) {
+ world.step();
+ timings.collisionDetection.push(world.timingCollisionDetection());
+ timings.broad.push(world.timingBroadPhase());
+ timings.narrow.push(world.timingNarrowPhase());
+ timings.solver.push(world.timingSolver());
+ }
+
+ // Only add sub-timings if the profiler is actually working
+ const hasProfilerData = timings.collisionDetection.some((t) => t > 0);
+ if (hasProfilerData) {
+ results.push(statsFrom("├─ collisionDetection", timings.collisionDetection));
+ results.push(statsFrom("│ ├─ broadPhase", timings.broad));
+ results.push(statsFrom("│ └─ narrowPhase", timings.narrow));
+ results.push(statsFrom("└─ solver", timings.solver));
+ }
+ }
+
+ world.free();
+
+ return results;
+}
diff --git a/packages/benchmarks/src/worlds/pyramid.ts b/packages/benchmarks/src/worlds/pyramid.ts
new file mode 100644
index 00000000..c6078b58
--- /dev/null
+++ b/packages/benchmarks/src/worlds/pyramid.ts
@@ -0,0 +1,47 @@
+import type {World} from "@alexandernanberg/rapier-3d";
+
+export function createPyramidWorld(RAPIER: any, is3D: boolean, bodyCount: number): World {
+ const gravity = is3D ? {x: 0, y: -9.81, z: 0} : {x: 0, y: -9.81};
+ const world = new RAPIER.World(gravity);
+
+ // Create ground
+ const groundBody = world.createRigidBody(RAPIER.RigidBodyDesc.fixed());
+ if (is3D) {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(50, 0.1, 50), groundBody);
+ } else {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(50, 0.1), groundBody);
+ }
+
+ // Create pyramid of boxes
+ const size = 0.5;
+ const spacing = size * 2.1;
+ let created = 0;
+ let row = 0;
+
+ while (created < bodyCount) {
+ const rowWidth = Math.ceil(Math.sqrt(bodyCount - created));
+ const y = row * spacing + size + 0.2;
+
+ for (let i = 0; i < rowWidth && created < bodyCount; i++) {
+ const x = (i - rowWidth / 2) * spacing;
+
+ if (is3D) {
+ for (let j = 0; j < rowWidth && created < bodyCount; j++) {
+ const z = (j - rowWidth / 2) * spacing;
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
+ const body = world.createRigidBody(bodyDesc);
+ world.createCollider(RAPIER.ColliderDesc.cuboid(size, size, size), body);
+ created++;
+ }
+ } else {
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y);
+ const body = world.createRigidBody(bodyDesc);
+ world.createCollider(RAPIER.ColliderDesc.cuboid(size, size), body);
+ created++;
+ }
+ }
+ row++;
+ }
+
+ return world;
+}
diff --git a/packages/benchmarks/src/worlds/sparse.ts b/packages/benchmarks/src/worlds/sparse.ts
new file mode 100644
index 00000000..7814df6f
--- /dev/null
+++ b/packages/benchmarks/src/worlds/sparse.ts
@@ -0,0 +1,39 @@
+import type {World} from "@alexandernanberg/rapier-3d";
+
+export function createSparseWorld(RAPIER: any, is3D: boolean, bodyCount: number): World {
+ const gravity = is3D ? {x: 0, y: -9.81, z: 0} : {x: 0, y: -9.81};
+ const world = new RAPIER.World(gravity);
+
+ // Create ground
+ const groundBody = world.createRigidBody(RAPIER.RigidBodyDesc.fixed());
+ if (is3D) {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(100, 0.1, 100), groundBody);
+ } else {
+ world.createCollider(RAPIER.ColliderDesc.cuboid(100, 0.1), groundBody);
+ }
+
+ // Spread bodies evenly across a large area
+ const spread = 80;
+ const gridSize = Math.ceil(Math.sqrt(bodyCount));
+
+ for (let i = 0; i < bodyCount; i++) {
+ const gridX = i % gridSize;
+ const gridY = Math.floor(i / gridSize);
+
+ const x = (gridX / gridSize - 0.5) * spread;
+ const y = 1 + Math.random() * 5;
+
+ if (is3D) {
+ const z = (gridY / gridSize - 0.5) * spread;
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
+ const body = world.createRigidBody(bodyDesc);
+ world.createCollider(RAPIER.ColliderDesc.ball(0.5), body);
+ } else {
+ const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x + gridY * 0.1, y);
+ const body = world.createRigidBody(bodyDesc);
+ world.createCollider(RAPIER.ColliderDesc.ball(0.5), body);
+ }
+ }
+
+ return world;
+}
diff --git a/packages/benchmarks/tsconfig.json b/packages/benchmarks/tsconfig.json
new file mode 100644
index 00000000..6f5ce1ec
--- /dev/null
+++ b/packages/benchmarks/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "declaration": false,
+ "outDir": "dist",
+ "rootDir": "src"
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/rapier-2d/package.json b/packages/rapier-2d/package.json
new file mode 100644
index 00000000..7b441b1a
--- /dev/null
+++ b/packages/rapier-2d/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "@alexandernanberg/rapier2d",
+ "version": "0.0.1",
+ "description": "2-dimensional physics engine - official JS bindings",
+ "keywords": [
+ "2d",
+ "dynamics",
+ "joints",
+ "physics",
+ "rapier",
+ "real-time",
+ "rigid"
+ ],
+ "homepage": "https://rapier.rs",
+ "license": "Apache-2.0",
+ "author": "Sébastien Crozet ",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/dimforge/rapier.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/rapier.d.mts",
+ "default": "./dist/rapier.mjs"
+ },
+ "./compat": {
+ "types": "./dist/compat.d.mts",
+ "default": "./dist/compat.mjs"
+ },
+ "./simd": {
+ "types": "./dist/simd.d.mts",
+ "default": "./dist/simd.mjs"
+ },
+ "./compat-simd": {
+ "types": "./dist/compat-simd.d.mts",
+ "default": "./dist/compat-simd.mjs"
+ }
+ },
+ "scripts": {
+ "build": "tsdown",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "base64-js": "^1.5.1"
+ },
+ "devDependencies": {
+ "tsdown": "^0.20.1",
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/src.ts/coarena.ts b/packages/rapier-2d/src/coarena.ts
similarity index 94%
rename from src.ts/coarena.ts
rename to packages/rapier-2d/src/coarena.ts
index 9bf978a5..677c2458 100644
--- a/src.ts/coarena.ts
+++ b/packages/rapier-2d/src/coarena.ts
@@ -1,13 +1,13 @@
export class Coarena {
fconv: Float64Array;
uconv: Uint32Array;
- data: Array;
+ data: Array;
size: number;
public constructor() {
this.fconv = new Float64Array(1);
this.uconv = new Uint32Array(this.fconv.buffer);
- this.data = new Array();
+ this.data = new Array();
this.size = 0;
}
@@ -34,7 +34,7 @@ export class Coarena {
}
public clear() {
- this.data = new Array();
+ this.data = new Array();
}
public get(handle: number): T | null {
diff --git a/src.ts/control/character_controller.ts b/packages/rapier-2d/src/control/character_controller.ts
similarity index 87%
rename from src.ts/control/character_controller.ts
rename to packages/rapier-2d/src/control/character_controller.ts
index 8e536392..4278a943 100644
--- a/src.ts/control/character_controller.ts
+++ b/packages/rapier-2d/src/control/character_controller.ts
@@ -1,36 +1,35 @@
-import {RawKinematicCharacterController, RawCharacterCollision} from "../raw";
-import {Rotation, Vector, VectorOps} from "../math";
+import {IntegrationParameters, RigidBodySet} from "../dynamics";
import {
BroadPhase,
Collider,
ColliderSet,
InteractionGroups,
NarrowPhase,
- Shape,
} from "../geometry";
-import {QueryFilterFlags, World} from "../pipeline";
-import {IntegrationParameters, RigidBody, RigidBodySet} from "../dynamics";
+import {Vector, VectorOps} from "../math";
+import {QueryFilterFlags} from "../pipeline";
+import {RawKinematicCharacterController, RawCharacterCollision} from "../raw";
/**
* A collision between the character and an obstacle hit on its path.
*/
export class CharacterCollision {
/** The collider involved in the collision. Null if the collider no longer exists in the physics world. */
- public collider: Collider | null;
+ public collider: Collider | null = null;
/** The translation delta applied to the character before this collision took place. */
- public translationDeltaApplied: Vector;
+ public translationDeltaApplied!: Vector;
/** The translation delta the character would move after this collision if there is no other obstacles. */
- public translationDeltaRemaining: Vector;
+ public translationDeltaRemaining!: Vector;
/** The time-of-impact between the character and the obstacles. */
- public toi: number;
+ public toi!: number;
/** The world-space contact point on the collider when the collision happens. */
- public witness1: Vector;
+ public witness1!: Vector;
/** The local-space contact point on the character when the collision happens. */
- public witness2: Vector;
+ public witness2!: Vector;
/** The world-space outward contact normal on the collider when the collision happens. */
- public normal1: Vector;
+ public normal1!: Vector;
/** The local-space outward contact normal on the character when the collision happens. */
- public normal2: Vector;
+ public normal2!: Vector;
}
/**
@@ -75,8 +74,8 @@ export class KinematicCharacterController {
this.rawCharacterCollision.free();
}
- this.raw = undefined;
- this.rawCharacterCollision = undefined;
+ this.raw = undefined!;
+ this.rawCharacterCollision = undefined!;
}
/**
@@ -91,7 +90,7 @@ export class KinematicCharacterController {
*/
public setUp(vector: Vector) {
let rawVect = VectorOps.intoRaw(vector);
- return this.raw.setUp(rawVect);
+ this.raw.setUp(rawVect);
rawVect.free();
}
@@ -186,21 +185,21 @@ export class KinematicCharacterController {
* The maximum step height a character can automatically step over.
*/
public autostepMaxHeight(): number | null {
- return this.raw.autostepMaxHeight();
+ return this.raw.autostepMaxHeight() ?? null;
}
/**
* The minimum width of free space that must be available after stepping on a stair.
*/
public autostepMinWidth(): number | null {
- return this.raw.autostepMinWidth();
+ return this.raw.autostepMinWidth() ?? null;
}
/**
* Can the character automatically step over dynamic bodies too?
*/
public autostepIncludesDynamicBodies(): boolean | null {
- return this.raw.autostepIncludesDynamicBodies();
+ return this.raw.autostepIncludesDynamicBodies() ?? null;
}
/**
@@ -217,11 +216,7 @@ export class KinematicCharacterController {
* @param minWidth - The minimum width of free space that must be available after stepping on a stair.
* @param includeDynamicBodies - Can the character automatically step over dynamic bodies too?
*/
- public enableAutostep(
- maxHeight: number,
- minWidth: number,
- includeDynamicBodies: boolean,
- ) {
+ public enableAutostep(maxHeight: number, minWidth: number, includeDynamicBodies: boolean) {
this.raw.enableAutostep(maxHeight, minWidth, includeDynamicBodies);
}
@@ -269,7 +264,7 @@ export class KinematicCharacterController {
* the distance between the ground and its feet are smaller than the specified threshold?
*/
public snapToGroundDistance(): number | null {
- return this.raw.snapToGroundDistance();
+ return this.raw.snapToGroundDistance() ?? null;
}
/**
@@ -323,9 +318,9 @@ export class KinematicCharacterController {
rawTranslationDelta,
this._applyImpulsesToDynamicBodies,
this._characterMass,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
- this.colliders.castClosure(filterPredicate),
+ this.colliders.castClosure(filterPredicate) as unknown as Function,
);
rawTranslationDelta.free();
}
@@ -334,7 +329,7 @@ export class KinematicCharacterController {
* The movement computed by the last call to `this.computeColliderMovement`.
*/
public computedMovement(): Vector {
- return VectorOps.fromRaw(this.raw.computedMovement());
+ return VectorOps.fromRaw(this.raw.computedMovement())!;
}
/**
@@ -359,26 +354,19 @@ export class KinematicCharacterController {
* @param i - The i-th collision will be returned.
* @param out - If this argument is set, it will be filled with the collision information.
*/
- public computedCollision(
- i: number,
- out?: CharacterCollision,
- ): CharacterCollision | null {
+ public computedCollision(i: number, out?: CharacterCollision): CharacterCollision | null {
if (!this.raw.computedCollision(i, this.rawCharacterCollision)) {
return null;
} else {
let c = this.rawCharacterCollision;
out = out ?? new CharacterCollision();
- out.translationDeltaApplied = VectorOps.fromRaw(
- c.translationDeltaApplied(),
- );
- out.translationDeltaRemaining = VectorOps.fromRaw(
- c.translationDeltaRemaining(),
- );
+ out.translationDeltaApplied = VectorOps.fromRaw(c.translationDeltaApplied())!;
+ out.translationDeltaRemaining = VectorOps.fromRaw(c.translationDeltaRemaining())!;
out.toi = c.toi();
- out.witness1 = VectorOps.fromRaw(c.worldWitness1());
- out.witness2 = VectorOps.fromRaw(c.worldWitness2());
- out.normal1 = VectorOps.fromRaw(c.worldNormal1());
- out.normal2 = VectorOps.fromRaw(c.worldNormal2());
+ out.witness1 = VectorOps.fromRaw(c.worldWitness1())!;
+ out.witness2 = VectorOps.fromRaw(c.worldWitness2())!;
+ out.normal1 = VectorOps.fromRaw(c.worldNormal1())!;
+ out.normal2 = VectorOps.fromRaw(c.worldNormal2())!;
out.collider = this.colliders.get(c.handle());
return out;
}
diff --git a/packages/rapier-2d/src/control/index.ts b/packages/rapier-2d/src/control/index.ts
new file mode 100644
index 00000000..c1ce2286
--- /dev/null
+++ b/packages/rapier-2d/src/control/index.ts
@@ -0,0 +1,2 @@
+export * from "./character_controller";
+export * from "./pid_controller";
diff --git a/packages/rapier-2d/src/control/pid_controller.ts b/packages/rapier-2d/src/control/pid_controller.ts
new file mode 100644
index 00000000..f4d53f5c
--- /dev/null
+++ b/packages/rapier-2d/src/control/pid_controller.ts
@@ -0,0 +1,137 @@
+import {IntegrationParameters, RigidBody, RigidBodySet} from "../dynamics";
+import {Vector, VectorOps} from "../math";
+import {RawPidController} from "../raw";
+
+// TODO: unify with the JointAxesMask
+/**
+ * An enum representing the possible joint axes controlled by a PidController.
+ * They can be ORed together, like:
+ * PidAxesMask.LinX || PidAxesMask.LinY
+ * to get a pid controller that only constraints the translational X and Y axes.
+ *
+ * Possible axes are:
+ *
+ * - `X`: X translation axis
+ * - `Y`: Y translation axis
+ * - `Z`: Z translation axis
+ * - `AngX`: X angular rotation axis (3D only)
+ * - `AngY`: Y angular rotation axis (3D only)
+ * - `AngZ`: Z angular rotation axis
+ */
+export enum PidAxesMask {
+ None = 0,
+ LinX = 1 << 0,
+ LinY = 1 << 1,
+ LinZ = 1 << 2,
+ AngZ = 1 << 5,
+ AllLin = PidAxesMask.LinX | PidAxesMask.LinY,
+ AllAng = PidAxesMask.AngZ,
+ All = PidAxesMask.AllLin | PidAxesMask.AllAng,
+}
+
+/**
+ * A controller for controlling dynamic bodies using the
+ * Proportional-Integral-Derivative correction model.
+ */
+export class PidController {
+ private raw: RawPidController;
+
+ private params: IntegrationParameters;
+ private bodies: RigidBodySet;
+
+ constructor(
+ params: IntegrationParameters,
+ bodies: RigidBodySet,
+ kp: number,
+ ki: number,
+ kd: number,
+ axes: PidAxesMask,
+ ) {
+ this.params = params;
+ this.bodies = bodies;
+ this.raw = new RawPidController(kp, ki, kd, axes);
+ }
+
+ /** @internal */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+
+ this.raw = undefined!;
+ }
+
+ public setKp(kp: number, axes: PidAxesMask) {
+ this.raw.set_kp(kp, axes);
+ }
+
+ public setKi(ki: number, axes: PidAxesMask) {
+ this.raw.set_kp(ki, axes);
+ }
+
+ public setKd(kd: number, axes: PidAxesMask) {
+ this.raw.set_kp(kd, axes);
+ }
+
+ public setAxes(axes: PidAxesMask) {
+ this.raw.set_axes_mask(axes);
+ }
+
+ public resetIntegrals() {
+ this.raw.reset_integrals();
+ }
+
+ public applyLinearCorrection(body: RigidBody, targetPosition: Vector, targetLinvel: Vector) {
+ let rawPos = VectorOps.intoRaw(targetPosition);
+ let rawVel = VectorOps.intoRaw(targetLinvel);
+ this.raw.apply_linear_correction(
+ this.params.dt,
+ this.bodies.raw,
+ body.handle,
+ rawPos,
+ rawVel,
+ );
+ rawPos.free();
+ rawVel.free();
+ }
+
+ public applyAngularCorrection(body: RigidBody, targetRotation: number, targetAngVel: number) {
+ this.raw.apply_angular_correction(
+ this.params.dt,
+ this.bodies.raw,
+ body.handle,
+ targetRotation,
+ targetAngVel,
+ );
+ }
+
+ public linearCorrection(body: RigidBody, targetPosition: Vector, targetLinvel: Vector): Vector {
+ let rawPos = VectorOps.intoRaw(targetPosition);
+ let rawVel = VectorOps.intoRaw(targetLinvel);
+ let correction = this.raw.linear_correction(
+ this.params.dt,
+ this.bodies.raw,
+ body.handle,
+ rawPos,
+ rawVel,
+ );
+ rawPos.free();
+ rawVel.free();
+
+ return VectorOps.fromRaw(correction)!;
+ }
+
+ public angularCorrection(
+ body: RigidBody,
+ targetRotation: number,
+ targetAngVel: number,
+ ): number {
+ return this.raw.angular_correction(
+ this.params.dt,
+ this.bodies.raw,
+ body.handle,
+ targetRotation,
+ targetAngVel,
+ );
+ }
+}
diff --git a/src.ts/dynamics/ccd_solver.ts b/packages/rapier-2d/src/dynamics/ccd_solver.ts
similarity index 94%
rename from src.ts/dynamics/ccd_solver.ts
rename to packages/rapier-2d/src/dynamics/ccd_solver.ts
index 7f794222..a0de715f 100644
--- a/src.ts/dynamics/ccd_solver.ts
+++ b/packages/rapier-2d/src/dynamics/ccd_solver.ts
@@ -16,7 +16,7 @@ export class CCDSolver {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawCCDSolver) {
diff --git a/src.ts/dynamics/coefficient_combine_rule.ts b/packages/rapier-2d/src/dynamics/coefficient_combine_rule.ts
similarity index 100%
rename from src.ts/dynamics/coefficient_combine_rule.ts
rename to packages/rapier-2d/src/dynamics/coefficient_combine_rule.ts
diff --git a/packages/rapier-2d/src/dynamics/impulse_joint.ts b/packages/rapier-2d/src/dynamics/impulse_joint.ts
new file mode 100644
index 00000000..75b87de6
--- /dev/null
+++ b/packages/rapier-2d/src/dynamics/impulse_joint.ts
@@ -0,0 +1,458 @@
+import {Rotation, Vector, VectorOps, RotationOps} from "../math";
+import {
+ RawGenericJoint,
+ RawImpulseJointSet,
+ RawJointAxis,
+ RawJointType,
+ RawMotorModel,
+} from "../raw";
+import {RigidBody} from "./rigid_body";
+import {RigidBodySet} from "./rigid_body_set";
+
+/**
+ * The integer identifier of a collider added to a `ColliderSet`.
+ */
+export type ImpulseJointHandle = number;
+
+/**
+ * An enum grouping all possible types of joints:
+ *
+ * - `Revolute`: A revolute joint that removes all degrees of freedom between the affected
+ * bodies except for the rotation along one axis.
+ * - `Fixed`: A fixed joint that removes all relative degrees of freedom between the affected bodies.
+ * - `Prismatic`: A prismatic joint that removes all degrees of freedom between the affected
+ * bodies except for the translation along one axis.
+ * - `Spherical`: (3D only) A spherical joint that removes all relative linear degrees of freedom between the affected bodies.
+ * - `Generic`: (3D only) A joint with customizable degrees of freedom, allowing any of the 6 axes to be locked.
+ */
+export enum JointType {
+ Revolute,
+ Fixed,
+ Prismatic,
+ Rope,
+ Spring,
+}
+
+export enum MotorModel {
+ AccelerationBased,
+ ForceBased,
+}
+
+/**
+ * An enum representing the possible joint axes of a generic joint.
+ * They can be ORed together, like:
+ * JointAxesMask.LinX || JointAxesMask.LinY
+ * to get a joint that is only free in the X and Y translational (positional) axes.
+ *
+ * Possible free axes are:
+ *
+ * - `X`: X translation axis
+ * - `Y`: Y translation axis
+ * - `Z`: Z translation axis
+ * - `AngX`: X angular rotation axis
+ * - `AngY`: Y angular rotations axis
+ * - `AngZ`: Z angular rotation axis
+ */
+export enum JointAxesMask {
+ LinX = 1 << 0,
+ LinY = 1 << 1,
+ LinZ = 1 << 2,
+ AngX = 1 << 3,
+ AngY = 1 << 4,
+ AngZ = 1 << 5,
+}
+
+export class ImpulseJoint {
+ protected rawSet: RawImpulseJointSet; // The ImpulseJoint won't need to free this.
+ protected bodySet: RigidBodySet; // The ImpulseJoint won’t need to free this.
+ handle: ImpulseJointHandle;
+
+ constructor(rawSet: RawImpulseJointSet, bodySet: RigidBodySet, handle: ImpulseJointHandle) {
+ this.rawSet = rawSet;
+ this.bodySet = bodySet;
+ this.handle = handle;
+ }
+
+ public static newTyped(
+ rawSet: RawImpulseJointSet,
+ bodySet: RigidBodySet,
+ handle: ImpulseJointHandle,
+ ): ImpulseJoint {
+ switch (rawSet.jointType(handle)) {
+ case RawJointType.Revolute:
+ return new RevoluteImpulseJoint(rawSet, bodySet, handle);
+ case RawJointType.Prismatic:
+ return new PrismaticImpulseJoint(rawSet, bodySet, handle);
+ case RawJointType.Fixed:
+ return new FixedImpulseJoint(rawSet, bodySet, handle);
+ case RawJointType.Spring:
+ return new SpringImpulseJoint(rawSet, bodySet, handle);
+ case RawJointType.Rope:
+ return new RopeImpulseJoint(rawSet, bodySet, handle);
+ default:
+ return new ImpulseJoint(rawSet, bodySet, handle);
+ }
+ }
+
+ /** @internal */
+ public finalizeDeserialization(bodySet: RigidBodySet) {
+ this.bodySet = bodySet;
+ }
+
+ /**
+ * Checks if this joint is still valid (i.e. that it has
+ * not been deleted from the joint set yet).
+ */
+ public isValid(): boolean {
+ return this.rawSet.contains(this.handle);
+ }
+
+ /**
+ * The first rigid-body this joint it attached to.
+ */
+ public body1(): RigidBody {
+ return this.bodySet.get(this.rawSet.jointBodyHandle1(this.handle))!;
+ }
+
+ /**
+ * The second rigid-body this joint is attached to.
+ */
+ public body2(): RigidBody {
+ return this.bodySet.get(this.rawSet.jointBodyHandle2(this.handle))!;
+ }
+
+ /**
+ * The type of this joint given as a string.
+ */
+ public type(): JointType {
+ return this.rawSet.jointType(this.handle) as number as JointType;
+ }
+
+ /**
+ * The position of the first anchor of this joint.
+ *
+ * The first anchor gives the position of the application point on the
+ * local frame of the first rigid-body it is attached to.
+ */
+ public anchor1(): Vector {
+ return VectorOps.fromRaw(this.rawSet.jointAnchor1(this.handle))!;
+ }
+
+ /**
+ * The position of the second anchor of this joint.
+ *
+ * The second anchor gives the position of the application point on the
+ * local frame of the second rigid-body it is attached to.
+ */
+ public anchor2(): Vector {
+ return VectorOps.fromRaw(this.rawSet.jointAnchor2(this.handle))!;
+ }
+
+ /**
+ * Sets the position of the first anchor of this joint.
+ *
+ * The first anchor gives the position of the application point on the
+ * local frame of the first rigid-body it is attached to.
+ */
+ public setAnchor1(newPos: Vector) {
+ const rawPoint = VectorOps.intoRaw(newPos);
+ this.rawSet.jointSetAnchor1(this.handle, rawPoint);
+ rawPoint.free();
+ }
+
+ /**
+ * Sets the position of the second anchor of this joint.
+ *
+ * The second anchor gives the position of the application point on the
+ * local frame of the second rigid-body it is attached to.
+ */
+ public setAnchor2(newPos: Vector) {
+ const rawPoint = VectorOps.intoRaw(newPos);
+ this.rawSet.jointSetAnchor2(this.handle, rawPoint);
+ rawPoint.free();
+ }
+
+ /**
+ * Controls whether contacts are computed between colliders attached
+ * to the rigid-bodies linked by this joint.
+ */
+ public setContactsEnabled(enabled: boolean) {
+ this.rawSet.jointSetContactsEnabled(this.handle, enabled);
+ }
+
+ /**
+ * Indicates if contacts are enabled between colliders attached
+ * to the rigid-bodies linked by this joint.
+ */
+ public contactsEnabled(): boolean {
+ return this.rawSet.jointContactsEnabled(this.handle);
+ }
+}
+
+export class UnitImpulseJoint extends ImpulseJoint {
+ /**
+ * The axis left free by this joint.
+ */
+ protected rawAxis(): RawJointAxis {
+ throw new Error("rawAxis must be implemented by subclass");
+ }
+
+ /**
+ * Are the limits enabled for this joint?
+ */
+ public limitsEnabled(): boolean {
+ return this.rawSet.jointLimitsEnabled(this.handle, this.rawAxis());
+ }
+
+ /**
+ * The min limit of this joint.
+ */
+ public limitsMin(): number {
+ return this.rawSet.jointLimitsMin(this.handle, this.rawAxis());
+ }
+
+ /**
+ * The max limit of this joint.
+ */
+ public limitsMax(): number {
+ return this.rawSet.jointLimitsMax(this.handle, this.rawAxis());
+ }
+
+ /**
+ * Sets the limits of this joint.
+ *
+ * @param min - The minimum bound of this joint’s free coordinate.
+ * @param max - The maximum bound of this joint’s free coordinate.
+ */
+ public setLimits(min: number, max: number) {
+ this.rawSet.jointSetLimits(this.handle, this.rawAxis(), min, max);
+ }
+
+ public configureMotorModel(model: MotorModel) {
+ this.rawSet.jointConfigureMotorModel(
+ this.handle,
+ this.rawAxis(),
+ model as number as RawMotorModel,
+ );
+ }
+
+ public configureMotorVelocity(targetVel: number, factor: number) {
+ this.rawSet.jointConfigureMotorVelocity(this.handle, this.rawAxis(), targetVel, factor);
+ }
+
+ public configureMotorPosition(targetPos: number, stiffness: number, damping: number) {
+ this.rawSet.jointConfigureMotorPosition(
+ this.handle,
+ this.rawAxis(),
+ targetPos,
+ stiffness,
+ damping,
+ );
+ }
+
+ public configureMotor(
+ targetPos: number,
+ targetVel: number,
+ stiffness: number,
+ damping: number,
+ ) {
+ this.rawSet.jointConfigureMotor(
+ this.handle,
+ this.rawAxis(),
+ targetPos,
+ targetVel,
+ stiffness,
+ damping,
+ );
+ }
+}
+
+export class FixedImpulseJoint extends ImpulseJoint {}
+
+export class RopeImpulseJoint extends ImpulseJoint {}
+
+export class SpringImpulseJoint extends ImpulseJoint {}
+
+export class PrismaticImpulseJoint extends UnitImpulseJoint {
+ public rawAxis(): RawJointAxis {
+ return RawJointAxis.LinX;
+ }
+}
+
+export class RevoluteImpulseJoint extends UnitImpulseJoint {
+ public rawAxis(): RawJointAxis {
+ return RawJointAxis.AngX;
+ }
+}
+
+export class JointData {
+ anchor1!: Vector;
+ anchor2!: Vector;
+ axis!: Vector;
+ frame1!: Rotation;
+ frame2!: Rotation;
+ jointType!: JointType;
+ limitsEnabled!: boolean;
+ limits!: Array;
+ axesMask!: JointAxesMask;
+ stiffness!: number;
+ damping!: number;
+ length!: number;
+
+ private constructor() {}
+
+ /**
+ * Creates a new joint descriptor that builds a Fixed joint.
+ *
+ * A fixed joint removes all the degrees of freedom between the affected bodies, ensuring their
+ * anchor and local frames coincide in world-space.
+ *
+ * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ * @param frame1 - The reference orientation of the joint wrt. the first rigid-body.
+ * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ * @param frame2 - The reference orientation of the joint wrt. the second rigid-body.
+ */
+ public static fixed(
+ anchor1: Vector,
+ frame1: Rotation,
+ anchor2: Vector,
+ frame2: Rotation,
+ ): JointData {
+ let res = new JointData();
+ res.anchor1 = anchor1;
+ res.anchor2 = anchor2;
+ res.frame1 = frame1;
+ res.frame2 = frame2;
+ res.jointType = JointType.Fixed;
+ return res;
+ }
+
+ public static spring(
+ rest_length: number,
+ stiffness: number,
+ damping: number,
+ anchor1: Vector,
+ anchor2: Vector,
+ ): JointData {
+ let res = new JointData();
+ res.anchor1 = anchor1;
+ res.anchor2 = anchor2;
+ res.length = rest_length;
+ res.stiffness = stiffness;
+ res.damping = damping;
+ res.jointType = JointType.Spring;
+ return res;
+ }
+
+ public static rope(length: number, anchor1: Vector, anchor2: Vector): JointData {
+ let res = new JointData();
+ res.anchor1 = anchor1;
+ res.anchor2 = anchor2;
+ res.length = length;
+ res.jointType = JointType.Rope;
+ return res;
+ }
+
+ /**
+ * Create a new joint descriptor that builds revolute joints.
+ *
+ * A revolute joint allows three relative rotational degrees of freedom
+ * by preventing any relative translation between the anchors of the
+ * two attached rigid-bodies.
+ *
+ * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ */
+ public static revolute(anchor1: Vector, anchor2: Vector): JointData {
+ let res = new JointData();
+ res.anchor1 = anchor1;
+ res.anchor2 = anchor2;
+ res.jointType = JointType.Revolute;
+ return res;
+ }
+
+ /**
+ * Creates a new joint descriptor that builds a Prismatic joint.
+ *
+ * A prismatic joint removes all the degrees of freedom between the
+ * affected bodies, except for the translation along one axis.
+ *
+ * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the
+ * local-space of the rigid-body.
+ * @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.
+ */
+ public static prismatic(anchor1: Vector, anchor2: Vector, axis: Vector): JointData {
+ let res = new JointData();
+ res.anchor1 = anchor1;
+ res.anchor2 = anchor2;
+ res.axis = axis;
+ res.jointType = JointType.Prismatic;
+ return res;
+ }
+
+ public intoRaw(): RawGenericJoint {
+ let rawA1 = VectorOps.intoRaw(this.anchor1);
+ let rawA2 = VectorOps.intoRaw(this.anchor2);
+ let rawAx;
+ let result;
+ let limitsEnabled = false;
+ let limitsMin = 0.0;
+ let limitsMax = 0.0;
+
+ switch (this.jointType) {
+ case JointType.Fixed:
+ let rawFra1 = RotationOps.intoRaw(this.frame1);
+ let rawFra2 = RotationOps.intoRaw(this.frame2);
+ result = RawGenericJoint.fixed(rawA1, rawFra1, rawA2, rawFra2);
+ rawFra1.free();
+ rawFra2.free();
+ break;
+ case JointType.Spring:
+ result = RawGenericJoint.spring(
+ this.length,
+ this.stiffness,
+ this.damping,
+ rawA1,
+ rawA2,
+ );
+ break;
+ case JointType.Rope:
+ result = RawGenericJoint.rope(this.length, rawA1, rawA2);
+ break;
+ case JointType.Prismatic:
+ rawAx = VectorOps.intoRaw(this.axis);
+
+ if (!!this.limitsEnabled) {
+ limitsEnabled = true;
+ limitsMin = this.limits[0];
+ limitsMax = this.limits[1];
+ }
+
+ result = RawGenericJoint.prismatic(
+ rawA1,
+ rawA2,
+ rawAx,
+ limitsEnabled,
+ limitsMin,
+ limitsMax,
+ );
+
+ rawAx.free();
+ break;
+ case JointType.Revolute:
+ result = RawGenericJoint.revolute(rawA1, rawA2);
+ break;
+ }
+
+ rawA1.free();
+ rawA2.free();
+
+ return result!;
+ }
+}
diff --git a/src.ts/dynamics/impulse_joint_set.ts b/packages/rapier-2d/src/dynamics/impulse_joint_set.ts
similarity index 88%
rename from src.ts/dynamics/impulse_joint_set.ts
rename to packages/rapier-2d/src/dynamics/impulse_joint_set.ts
index 2d382514..6bd04dea 100644
--- a/src.ts/dynamics/impulse_joint_set.ts
+++ b/packages/rapier-2d/src/dynamics/impulse_joint_set.ts
@@ -1,21 +1,8 @@
-import {RawImpulseJointSet} from "../raw";
import {Coarena} from "../coarena";
-import {RigidBodySet} from "./rigid_body_set";
-import {
- RevoluteImpulseJoint,
- FixedImpulseJoint,
- ImpulseJoint,
- ImpulseJointHandle,
- JointData,
- JointType,
- PrismaticImpulseJoint,
- // #if DIM3
- SphericalImpulseJoint,
- // #endif
-} from "./impulse_joint";
-import {IslandManager} from "./island_manager";
+import {RawImpulseJointSet} from "../raw";
+import {ImpulseJoint, ImpulseJointHandle, JointData} from "./impulse_joint";
import {RigidBodyHandle} from "./rigid_body";
-import {Collider, ColliderHandle} from "../geometry";
+import {RigidBodySet} from "./rigid_body_set";
/**
* A set of joints.
@@ -34,12 +21,12 @@ export class ImpulseJointSet {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
if (!!this.map) {
this.map.clear();
}
- this.map = undefined;
+ this.map = undefined!;
}
constructor(raw?: RawImpulseJointSet) {
@@ -48,7 +35,7 @@ export class ImpulseJointSet {
// Initialize the map with the existing elements, if any.
if (raw) {
raw.forEachJointHandle((handle: ImpulseJointHandle) => {
- this.map.set(handle, ImpulseJoint.newTyped(raw, null, handle));
+ this.map.set(handle, ImpulseJoint.newTyped(raw, null!, handle));
});
}
}
@@ -75,12 +62,7 @@ export class ImpulseJointSet {
wakeUp: boolean,
): ImpulseJoint {
const rawParams = desc.intoRaw();
- const handle = this.raw.createJoint(
- rawParams,
- parent1,
- parent2,
- wakeUp,
- );
+ const handle = this.raw.createJoint(rawParams, parent1, parent2, wakeUp);
rawParams.free();
let joint = ImpulseJoint.newTyped(this.raw, bodies, handle);
this.map.set(handle, joint);
diff --git a/src.ts/dynamics/index.ts b/packages/rapier-2d/src/dynamics/index.ts
similarity index 100%
rename from src.ts/dynamics/index.ts
rename to packages/rapier-2d/src/dynamics/index.ts
diff --git a/src.ts/dynamics/integration_parameters.ts b/packages/rapier-2d/src/dynamics/integration_parameters.ts
similarity index 99%
rename from src.ts/dynamics/integration_parameters.ts
rename to packages/rapier-2d/src/dynamics/integration_parameters.ts
index b7253e21..5c71e8a0 100644
--- a/src.ts/dynamics/integration_parameters.ts
+++ b/packages/rapier-2d/src/dynamics/integration_parameters.ts
@@ -14,7 +14,7 @@ export class IntegrationParameters {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
/**
diff --git a/src.ts/dynamics/island_manager.ts b/packages/rapier-2d/src/dynamics/island_manager.ts
similarity index 97%
rename from src.ts/dynamics/island_manager.ts
rename to packages/rapier-2d/src/dynamics/island_manager.ts
index 65ed21dc..c48c1727 100644
--- a/src.ts/dynamics/island_manager.ts
+++ b/packages/rapier-2d/src/dynamics/island_manager.ts
@@ -17,7 +17,7 @@ export class IslandManager {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawIslandManager) {
diff --git a/packages/rapier-2d/src/dynamics/multibody_joint.ts b/packages/rapier-2d/src/dynamics/multibody_joint.ts
new file mode 100644
index 00000000..fc2ff3fb
--- /dev/null
+++ b/packages/rapier-2d/src/dynamics/multibody_joint.ts
@@ -0,0 +1,157 @@
+import {RawJointAxis, RawJointType, RawMultibodyJointSet} from "../raw";
+
+/**
+ * The integer identifier of a collider added to a `ColliderSet`.
+ */
+export type MultibodyJointHandle = number;
+
+export class MultibodyJoint {
+ protected rawSet: RawMultibodyJointSet; // The MultibodyJoint won't need to free this.
+ handle: MultibodyJointHandle;
+
+ constructor(rawSet: RawMultibodyJointSet, handle: MultibodyJointHandle) {
+ this.rawSet = rawSet;
+ this.handle = handle;
+ }
+
+ public static newTyped(
+ rawSet: RawMultibodyJointSet,
+ handle: MultibodyJointHandle,
+ ): MultibodyJoint {
+ switch (rawSet.jointType(handle)) {
+ case RawJointType.Revolute:
+ return new RevoluteMultibodyJoint(rawSet, handle);
+ case RawJointType.Prismatic:
+ return new PrismaticMultibodyJoint(rawSet, handle);
+ case RawJointType.Fixed:
+ return new FixedMultibodyJoint(rawSet, handle);
+ default:
+ return new MultibodyJoint(rawSet, handle);
+ }
+ }
+
+ /**
+ * Checks if this joint is still valid (i.e. that it has
+ * not been deleted from the joint set yet).
+ */
+ public isValid(): boolean {
+ return this.rawSet.contains(this.handle);
+ }
+
+ // /**
+ // * The unique integer identifier of the first rigid-body this joint it attached to.
+ // */
+ // public bodyHandle1(): RigidBodyHandle {
+ // return this.rawSet.jointBodyHandle1(this.handle);
+ // }
+ //
+ // /**
+ // * The unique integer identifier of the second rigid-body this joint is attached to.
+ // */
+ // public bodyHandle2(): RigidBodyHandle {
+ // return this.rawSet.jointBodyHandle2(this.handle);
+ // }
+ //
+ // /**
+ // * The type of this joint given as a string.
+ // */
+ // public type(): JointType {
+ // return this.rawSet.jointType(this.handle);
+ // }
+ //
+ //
+ //
+ // /**
+ // * The position of the first anchor of this joint.
+ // *
+ // * The first anchor gives the position of the points application point on the
+ // * local frame of the first rigid-body it is attached to.
+ // */
+ // public anchor1(): Vector {
+ // return VectorOps.fromRaw(this.rawSet.jointAnchor1(this.handle));
+ // }
+ //
+ // /**
+ // * The position of the second anchor of this joint.
+ // *
+ // * The second anchor gives the position of the points application point on the
+ // * local frame of the second rigid-body it is attached to.
+ // */
+ // public anchor2(): Vector {
+ // return VectorOps.fromRaw(this.rawSet.jointAnchor2(this.handle));
+ // }
+
+ /**
+ * Controls whether contacts are computed between colliders attached
+ * to the rigid-bodies linked by this joint.
+ */
+ public setContactsEnabled(enabled: boolean) {
+ this.rawSet.jointSetContactsEnabled(this.handle, enabled);
+ }
+
+ /**
+ * Indicates if contacts are enabled between colliders attached
+ * to the rigid-bodies linked by this joint.
+ */
+ public contactsEnabled(): boolean {
+ return this.rawSet.jointContactsEnabled(this.handle);
+ }
+}
+
+export class UnitMultibodyJoint extends MultibodyJoint {
+ /**
+ * The axis left free by this joint.
+ */
+ protected rawAxis?(): RawJointAxis;
+
+ // /**
+ // * Are the limits enabled for this joint?
+ // */
+ // public limitsEnabled(): boolean {
+ // return this.rawSet.jointLimitsEnabled(this.handle, this.rawAxis());
+ // }
+ //
+ // /**
+ // * The min limit of this joint.
+ // */
+ // public limitsMin(): number {
+ // return this.rawSet.jointLimitsMin(this.handle, this.rawAxis());
+ // }
+ //
+ // /**
+ // * The max limit of this joint.
+ // */
+ // public limitsMax(): number {
+ // return this.rawSet.jointLimitsMax(this.handle, this.rawAxis());
+ // }
+ //
+ // public configureMotorModel(model: MotorModel) {
+ // this.rawSet.jointConfigureMotorModel(this.handle, this.rawAxis(), model);
+ // }
+ //
+ // public configureMotorVelocity(targetVel: number, factor: number) {
+ // this.rawSet.jointConfigureMotorVelocity(this.handle, this.rawAxis(), targetVel, factor);
+ // }
+ //
+ // public configureMotorPosition(targetPos: number, stiffness: number, damping: number) {
+ // this.rawSet.jointConfigureMotorPosition(this.handle, this.rawAxis(), targetPos, stiffness, damping);
+ // }
+ //
+ // public configureMotor(targetPos: number, targetVel: number, stiffness: number, damping: number) {
+ // this.rawSet.jointConfigureMotor(this.handle, this.rawAxis(), targetPos, targetVel, stiffness, damping);
+ // }
+}
+
+export class FixedMultibodyJoint extends MultibodyJoint {}
+
+export class PrismaticMultibodyJoint extends UnitMultibodyJoint {
+ public rawAxis(): RawJointAxis {
+ return RawJointAxis.LinX;
+ }
+}
+
+export class RevoluteMultibodyJoint extends UnitMultibodyJoint {
+ public rawAxis(): RawJointAxis {
+ return RawJointAxis.AngX;
+ }
+}
diff --git a/src.ts/dynamics/multibody_joint_set.ts b/packages/rapier-2d/src/dynamics/multibody_joint_set.ts
similarity index 85%
rename from src.ts/dynamics/multibody_joint_set.ts
rename to packages/rapier-2d/src/dynamics/multibody_joint_set.ts
index 2fbb3403..78840397 100644
--- a/src.ts/dynamics/multibody_joint_set.ts
+++ b/packages/rapier-2d/src/dynamics/multibody_joint_set.ts
@@ -1,19 +1,7 @@
-import {RawMultibodyJointSet} from "../raw";
import {Coarena} from "../coarena";
-import {RigidBodySet} from "./rigid_body_set";
-import {
- MultibodyJoint,
- MultibodyJointHandle,
- RevoluteMultibodyJoint,
- FixedMultibodyJoint,
- PrismaticMultibodyJoint,
- // #if DIM3
- SphericalMultibodyJoint,
- // #endif
-} from "./multibody_joint";
-import {ImpulseJointHandle, JointData, JointType} from "./impulse_joint";
-import {IslandManager} from "./island_manager";
-import {ColliderHandle} from "../geometry";
+import {RawMultibodyJointSet} from "../raw";
+import {JointData} from "./impulse_joint";
+import {MultibodyJoint, MultibodyJointHandle} from "./multibody_joint";
import {RigidBodyHandle} from "./rigid_body";
/**
@@ -33,12 +21,12 @@ export class MultibodyJointSet {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
if (!!this.map) {
this.map.clear();
}
- this.map = undefined;
+ this.map = undefined!;
}
constructor(raw?: RawMultibodyJointSet) {
@@ -67,12 +55,7 @@ export class MultibodyJointSet {
wakeUp: boolean,
): MultibodyJoint {
const rawParams = desc.intoRaw();
- const handle = this.raw.createJoint(
- rawParams,
- parent1,
- parent2,
- wakeUp,
- );
+ const handle = this.raw.createJoint(rawParams, parent1, parent2, wakeUp);
rawParams.free();
let joint = MultibodyJoint.newTyped(this.raw, handle);
this.map.set(handle, joint);
diff --git a/packages/rapier-2d/src/dynamics/rigid_body.ts b/packages/rapier-2d/src/dynamics/rigid_body.ts
new file mode 100644
index 00000000..631a599b
--- /dev/null
+++ b/packages/rapier-2d/src/dynamics/rigid_body.ts
@@ -0,0 +1,1112 @@
+import {Collider, ColliderSet} from "../geometry";
+import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+import {RawRigidBodySet, RawRigidBodyType} from "../raw";
+
+/**
+ * The integer identifier of a collider added to a `ColliderSet`.
+ */
+export type RigidBodyHandle = number;
+
+/**
+ * The simulation status of a rigid-body.
+ */
+// TODO: rename this to RigidBodyType
+export enum RigidBodyType {
+ /**
+ * A `RigidBodyType::Dynamic` body can be affected by all external forces.
+ */
+ Dynamic = 0,
+ /**
+ * A `RigidBodyType::Fixed` body cannot be affected by external forces.
+ */
+ Fixed,
+ /**
+ * A `RigidBodyType::KinematicPositionBased` body cannot be affected by any external forces but can be controlled
+ * by the user at the position level while keeping realistic one-way interaction with dynamic bodies.
+ *
+ * One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body
+ * cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be
+ * modified by the user and is independent from any contact or joint it is involved in.
+ */
+ KinematicPositionBased,
+ /**
+ * A `RigidBodyType::KinematicVelocityBased` body cannot be affected by any external forces but can be controlled
+ * by the user at the velocity level while keeping realistic one-way interaction with dynamic bodies.
+ *
+ * One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body
+ * cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be
+ * modified by the user and is independent from any contact or joint it is involved in.
+ */
+ KinematicVelocityBased,
+}
+
+/**
+ * A rigid-body.
+ */
+export class RigidBody {
+ private rawSet: RawRigidBodySet; // The RigidBody won't need to free this.
+ private colliderSet: ColliderSet;
+ readonly handle: RigidBodyHandle;
+ private scratchBuffer: Float32Array;
+
+ /**
+ * An arbitrary user-defined object associated with this rigid-body.
+ */
+ public userData?: unknown;
+
+ constructor(rawSet: RawRigidBodySet, colliderSet: ColliderSet, handle: RigidBodyHandle) {
+ this.rawSet = rawSet;
+ this.colliderSet = colliderSet;
+ this.handle = handle;
+ this.scratchBuffer = new Float32Array(4);
+ }
+
+ /** @internal */
+ public finalizeDeserialization(colliderSet: ColliderSet) {
+ this.colliderSet = colliderSet;
+ }
+
+ /**
+ * Checks if this rigid-body is still valid (i.e. that it has
+ * not been deleted from the rigid-body set yet.
+ */
+ public isValid(): boolean {
+ return this.rawSet.contains(this.handle);
+ }
+
+ /**
+ * Locks or unlocks the ability of this rigid-body to translate.
+ *
+ * @param locked - If `true`, this rigid-body will no longer translate due to forces and impulses.
+ * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
+ */
+ public lockTranslations(locked: boolean, wakeUp: boolean) {
+ return this.rawSet.rbLockTranslations(this.handle, locked, wakeUp);
+ }
+
+ /**
+ * Locks or unlocks the ability of this rigid-body to rotate.
+ *
+ * @param locked - If `true`, this rigid-body will no longer rotate due to torques and impulses.
+ * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
+ */
+ public lockRotations(locked: boolean, wakeUp: boolean) {
+ return this.rawSet.rbLockRotations(this.handle, locked, wakeUp);
+ }
+
+ /**
+ * Locks or unlocks the ability of this rigid-body to translation along individual coordinate axes.
+ *
+ * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.
+ * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.
+ * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
+ */
+ public setEnabledTranslations(enableX: boolean, enableY: boolean, wakeUp: boolean) {
+ return this.rawSet.rbSetEnabledTranslations(this.handle, enableX, enableY, wakeUp);
+ }
+
+ /**
+ * Locks or unlocks the ability of this rigid-body to translation along individual coordinate axes.
+ *
+ * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.
+ * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.
+ * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
+ * @deprecated use `this.setEnabledTranslations` with the same arguments instead.
+ */
+ public restrictTranslations(enableX: boolean, enableY: boolean, wakeUp: boolean) {
+ this.setEnabledTranslations(enableX, enableX, wakeUp);
+ }
+
+ /**
+ * The dominance group, in [-127, +127] this rigid-body is part of.
+ */
+ public dominanceGroup(): number {
+ return this.rawSet.rbDominanceGroup(this.handle);
+ }
+
+ /**
+ * Sets the dominance group of this rigid-body.
+ *
+ * @param group - The dominance group of this rigid-body. Must be a signed integer in the range [-127, +127].
+ */
+ public setDominanceGroup(group: number) {
+ this.rawSet.rbSetDominanceGroup(this.handle, group);
+ }
+
+ /**
+ * The number of additional solver iterations that will be run for this
+ * rigid-body and everything that interacts with it directly or indirectly
+ * through contacts or joints.
+ */
+ public additionalSolverIterations(): number {
+ return this.rawSet.rbAdditionalSolverIterations(this.handle);
+ }
+
+ /**
+ * Sets the number of additional solver iterations that will be run for this
+ * rigid-body and everything that interacts with it directly or indirectly
+ * through contacts or joints.
+ *
+ * Compared to increasing the global `World.numSolverIteration`, setting this
+ * value lets you increase accuracy on only a subset of the scene, resulting in reduced
+ * performance loss.
+ *
+ * @param iters - The new number of additional solver iterations (default: 0).
+ */
+ public setAdditionalSolverIterations(iters: number) {
+ this.rawSet.rbSetAdditionalSolverIterations(this.handle, iters);
+ }
+
+ /**
+ * Enable or disable CCD (Continuous Collision Detection) for this rigid-body.
+ *
+ * @param enabled - If `true`, CCD will be enabled for this rigid-body.
+ */
+ public enableCcd(enabled: boolean) {
+ this.rawSet.rbEnableCcd(this.handle, enabled);
+ }
+
+ /**
+ * Sets the soft-CCD prediction distance for this rigid-body.
+ *
+ * See the documentation of `RigidBodyDesc.setSoftCcdPrediction` for
+ * additional details.
+ */
+ public setSoftCcdPrediction(distance: number) {
+ this.rawSet.rbSetSoftCcdPrediction(this.handle, distance);
+ }
+
+ /**
+ * Gets the soft-CCD prediction distance for this rigid-body.
+ *
+ * See the documentation of `RigidBodyDesc.setSoftCcdPrediction` for
+ * additional details.
+ */
+ public softCcdPrediction(): number {
+ return this.rawSet.rbSoftCcdPrediction(this.handle);
+ }
+
+ /**
+ * The world-space translation of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public translation(target?: Vector): Vector {
+ this.rawSet.rbTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The world-space orientation of this rigid-body.
+ */
+ public rotation(): Rotation {
+ this.rawSet.rbRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer);
+ }
+
+ /**
+ * The world-space next translation of this rigid-body.
+ *
+ * If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`
+ * method and is used for estimating the kinematic body velocity at the next timestep.
+ * For non-kinematic bodies, this value is currently unspecified.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public nextTranslation(target?: Vector): Vector {
+ this.rawSet.rbNextTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The world-space next orientation of this rigid-body.
+ *
+ * If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`
+ * method and is used for estimating the kinematic body velocity at the next timestep.
+ * For non-kinematic bodies, this value is currently unspecified.
+ */
+ public nextRotation(): Rotation {
+ this.rawSet.rbNextRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer);
+ }
+
+ /**
+ * Sets the translation of this rigid-body.
+ *
+ * @param tra - The world-space position of the rigid-body.
+ * @param wakeUp - Forces the rigid-body to wake-up so it is properly affected by forces if it
+ * wasn't moving before modifying its position.
+ */
+ public setTranslation(tra: Vector, wakeUp: boolean) {
+ this.rawSet.rbSetTranslation(this.handle, tra.x, tra.y, wakeUp);
+ }
+
+ /**
+ * Sets the linear velocity of this rigid-body.
+ *
+ * @param vel - The linear velocity to set.
+ * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.
+ */
+ public setLinvel(vel: Vector, wakeUp: boolean) {
+ let rawVel = VectorOps.intoRaw(vel);
+ this.rawSet.rbSetLinvel(this.handle, rawVel, wakeUp);
+ rawVel.free();
+ }
+
+ /**
+ * The scale factor applied to the gravity affecting
+ * this rigid-body.
+ */
+ public gravityScale(): number {
+ return this.rawSet.rbGravityScale(this.handle);
+ }
+
+ /**
+ * Sets the scale factor applied to the gravity affecting
+ * this rigid-body.
+ *
+ * @param factor - The scale factor to set. A value of 0.0 means
+ * that this rigid-body will on longer be affected by gravity.
+ * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.
+ */
+ public setGravityScale(factor: number, wakeUp: boolean) {
+ this.rawSet.rbSetGravityScale(this.handle, factor, wakeUp);
+ }
+
+ /**
+ * Sets the rotation angle of this rigid-body.
+ *
+ * @param angle - The rotation angle, in radians.
+ * @param wakeUp - Forces the rigid-body to wake-up so it is properly affected by forces if it
+ * wasn't moving before modifying its position.
+ */
+ public setRotation(angle: number, wakeUp: boolean) {
+ this.rawSet.rbSetRotation(this.handle, angle, wakeUp);
+ }
+
+ /**
+ * Sets the angular velocity fo this rigid-body.
+ *
+ * @param vel - The angular velocity to set.
+ * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.
+ */
+ public setAngvel(vel: number, wakeUp: boolean) {
+ this.rawSet.rbSetAngvel(this.handle, vel, wakeUp);
+ }
+
+ /**
+ * If this rigid body is kinematic, sets its future translation after the next timestep integration.
+ *
+ * This should be used instead of `rigidBody.setTranslation` to make the dynamic object
+ * interacting with this kinematic body behave as expected. Internally, Rapier will compute
+ * an artificial velocity for this rigid-body from its current position and its next kinematic
+ * position. This velocity will be used to compute forces on dynamic bodies interacting with
+ * this body.
+ *
+ * @param t - The kinematic translation to set.
+ */
+ public setNextKinematicTranslation(t: Vector) {
+ this.rawSet.rbSetNextKinematicTranslation(this.handle, t.x, t.y);
+ }
+
+ /**
+ * If this rigid body is kinematic, sets its future rotation after the next timestep integration.
+ *
+ * This should be used instead of `rigidBody.setRotation` to make the dynamic object
+ * interacting with this kinematic body behave as expected. Internally, Rapier will compute
+ * an artificial velocity for this rigid-body from its current position and its next kinematic
+ * position. This velocity will be used to compute forces on dynamic bodies interacting with
+ * this body.
+ *
+ * @param angle - The kinematic rotation angle, in radians.
+ */
+ public setNextKinematicRotation(angle: number) {
+ this.rawSet.rbSetNextKinematicRotation(this.handle, angle);
+ }
+
+ /**
+ * The linear velocity of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public linvel(target?: Vector): Vector {
+ this.rawSet.rbLinvel(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The velocity of the given world-space point on this rigid-body.
+ */
+ public velocityAtPoint(point: Vector): Vector {
+ const rawPoint = VectorOps.intoRaw(point);
+ let result = VectorOps.fromRaw(this.rawSet.rbVelocityAtPoint(this.handle, rawPoint))!;
+ rawPoint.free();
+ return result;
+ }
+
+ /**
+ * The angular velocity of this rigid-body.
+ */
+ public angvel(): number {
+ return this.rawSet.rbAngvel(this.handle);
+ }
+
+ /**
+ * The mass of this rigid-body.
+ */
+ public mass(): number {
+ return this.rawSet.rbMass(this.handle);
+ }
+
+ /**
+ * The inverse mass taking into account translation locking.
+ */
+ public effectiveInvMass(): Vector {
+ return VectorOps.fromRaw(this.rawSet.rbEffectiveInvMass(this.handle))!;
+ }
+
+ /**
+ * The inverse of the mass of a rigid-body.
+ *
+ * If this is zero, the rigid-body is assumed to have infinite mass.
+ */
+ public invMass(): number {
+ return this.rawSet.rbInvMass(this.handle);
+ }
+
+ /**
+ * The center of mass of a rigid-body expressed in its local-space.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public localCom(target?: Vector): Vector {
+ this.rawSet.rbLocalCom(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The world-space center of mass of the rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public worldCom(target?: Vector): Vector {
+ this.rawSet.rbWorldCom(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The inverse of the principal angular inertia of the rigid-body.
+ *
+ * Components set to zero are assumed to be infinite along the corresponding principal axis.
+ */
+ public invPrincipalInertia(): number {
+ return this.rawSet.rbInvPrincipalInertia(this.handle);
+ }
+
+ /**
+ * The angular inertia along the principal inertia axes of the rigid-body.
+ */
+ public principalInertia(): number {
+ return this.rawSet.rbPrincipalInertia(this.handle);
+ }
+
+ /**
+ * The world-space inverse angular inertia tensor of the rigid-body,
+ * taking into account rotation locking.
+ */
+ public effectiveWorldInvInertia(): number {
+ return this.rawSet.rbEffectiveWorldInvInertia(this.handle);
+ }
+
+ /**
+ * The effective world-space angular inertia (that takes the potential rotation locking into account) of
+ * this rigid-body.
+ */
+ public effectiveAngularInertia(): number {
+ return this.rawSet.rbEffectiveAngularInertia(this.handle);
+ }
+
+ /**
+ * Put this rigid body to sleep.
+ *
+ * A sleeping body no longer moves and is no longer simulated by the physics engine unless
+ * it is waken up. It can be woken manually with `this.wakeUp()` or automatically due to
+ * external forces like contacts.
+ */
+ public sleep() {
+ this.rawSet.rbSleep(this.handle);
+ }
+
+ /**
+ * Wakes this rigid-body up.
+ *
+ * A dynamic rigid-body that does not move during several consecutive frames will
+ * be put to sleep by the physics engine, i.e., it will stop being simulated in order
+ * to avoid useless computations.
+ * This methods forces a sleeping rigid-body to wake-up. This is useful, e.g., before modifying
+ * the position of a dynamic body so that it is properly simulated afterwards.
+ */
+ public wakeUp() {
+ this.rawSet.rbWakeUp(this.handle);
+ }
+
+ /**
+ * Is CCD enabled for this rigid-body?
+ */
+ public isCcdEnabled(): boolean {
+ return this.rawSet.rbIsCcdEnabled(this.handle);
+ }
+
+ /**
+ * The number of colliders attached to this rigid-body.
+ */
+ public numColliders(): number {
+ return this.rawSet.rbNumColliders(this.handle);
+ }
+
+ /**
+ * Retrieves the `i-th` collider attached to this rigid-body.
+ *
+ * @param i - The index of the collider to retrieve. Must be a number in `[0, this.numColliders()[`.
+ * This index is **not** the same as the unique identifier of the collider.
+ */
+ public collider(i: number): Collider {
+ return this.colliderSet.get(this.rawSet.rbCollider(this.handle, i))!;
+ }
+
+ /**
+ * Sets whether this rigid-body is enabled or not.
+ *
+ * @param enabled - Set to `false` to disable this rigid-body and all its attached colliders.
+ */
+ public setEnabled(enabled: boolean) {
+ this.rawSet.rbSetEnabled(this.handle, enabled);
+ }
+
+ /**
+ * Is this rigid-body enabled?
+ */
+ public isEnabled(): boolean {
+ return this.rawSet.rbIsEnabled(this.handle);
+ }
+
+ /**
+ * The status of this rigid-body: static, dynamic, or kinematic.
+ */
+ public bodyType(): RigidBodyType {
+ return this.rawSet.rbBodyType(this.handle) as number as RigidBodyType;
+ }
+
+ /**
+ * Set a new status for this rigid-body: static, dynamic, or kinematic.
+ */
+ public setBodyType(type: RigidBodyType, wakeUp: boolean) {
+ return this.rawSet.rbSetBodyType(this.handle, type as number as RawRigidBodyType, wakeUp);
+ }
+
+ /**
+ * Is this rigid-body sleeping?
+ */
+ public isSleeping(): boolean {
+ return this.rawSet.rbIsSleeping(this.handle);
+ }
+
+ /**
+ * Is the velocity of this rigid-body not zero?
+ */
+ public isMoving(): boolean {
+ return this.rawSet.rbIsMoving(this.handle);
+ }
+
+ /**
+ * Is this rigid-body static?
+ */
+ public isFixed(): boolean {
+ return this.rawSet.rbIsFixed(this.handle);
+ }
+
+ /**
+ * Is this rigid-body kinematic?
+ */
+ public isKinematic(): boolean {
+ return this.rawSet.rbIsKinematic(this.handle);
+ }
+
+ /**
+ * Is this rigid-body dynamic?
+ */
+ public isDynamic(): boolean {
+ return this.rawSet.rbIsDynamic(this.handle);
+ }
+
+ /**
+ * The linear damping coefficient of this rigid-body.
+ */
+ public linearDamping(): number {
+ return this.rawSet.rbLinearDamping(this.handle);
+ }
+
+ /**
+ * The angular damping coefficient of this rigid-body.
+ */
+ public angularDamping(): number {
+ return this.rawSet.rbAngularDamping(this.handle);
+ }
+
+ /**
+ * Sets the linear damping factor applied to this rigid-body.
+ *
+ * @param factor - The damping factor to set.
+ */
+ public setLinearDamping(factor: number) {
+ this.rawSet.rbSetLinearDamping(this.handle, factor);
+ }
+
+ /**
+ * Recompute the mass-properties of this rigid-bodies based on its currently attached colliders.
+ */
+ public recomputeMassPropertiesFromColliders() {
+ this.rawSet.rbRecomputeMassPropertiesFromColliders(this.handle, this.colliderSet.raw);
+ }
+
+ /**
+ * Sets the rigid-body's additional mass.
+ *
+ * The total angular inertia of the rigid-body will be scaled automatically based on this additional mass. If this
+ * scaling effect isn’t desired, use Self::additional_mass_properties instead of this method.
+ *
+ * This is only the "additional" mass because the total mass of the rigid-body is equal to the sum of this
+ * additional mass and the mass computed from the colliders (with non-zero densities) attached to this rigid-body.
+ *
+ * That total mass (which includes the attached colliders’ contributions) will be updated at the name physics step,
+ * or can be updated manually with `this.recomputeMassPropertiesFromColliders`.
+ *
+ * This will override any previous additional mass-properties set by `this.setAdditionalMass`,
+ * `this.setAdditionalMassProperties`, `RigidBodyDesc::setAdditionalMass`, or
+ * `RigidBodyDesc.setAdditionalMassfProperties` for this rigid-body.
+ *
+ * @param mass - The additional mass to set.
+ * @param wakeUp - If `true` then the rigid-body will be woken up if it was put to sleep because it did not move for a while.
+ */
+ public setAdditionalMass(mass: number, wakeUp: boolean) {
+ this.rawSet.rbSetAdditionalMass(this.handle, mass, wakeUp);
+ }
+
+ /**
+ * Sets the rigid-body's additional mass-properties.
+ *
+ * This is only the "additional" mass-properties because the total mass-properties of the rigid-body is equal to the
+ * sum of this additional mass-properties and the mass computed from the colliders (with non-zero densities) attached
+ * to this rigid-body.
+ *
+ * That total mass-properties (which include the attached colliders’ contributions) will be updated at the name
+ * physics step, or can be updated manually with `this.recomputeMassPropertiesFromColliders`.
+ *
+ * This will override any previous mass-properties set by `this.setAdditionalMass`,
+ * `this.setAdditionalMassProperties`, `RigidBodyDesc.setAdditionalMass`, or `RigidBodyDesc.setAdditionalMassProperties`
+ * for this rigid-body.
+ *
+ * If `wake_up` is true then the rigid-body will be woken up if it was put to sleep because it did not move for a while.
+ */
+ public setAdditionalMassProperties(
+ mass: number,
+ centerOfMass: Vector,
+ principalAngularInertia: number,
+ wakeUp: boolean,
+ ) {
+ let rawCom = VectorOps.intoRaw(centerOfMass);
+ this.rawSet.rbSetAdditionalMassProperties(
+ this.handle,
+ mass,
+ rawCom,
+ principalAngularInertia,
+ wakeUp,
+ );
+ rawCom.free();
+ }
+
+ /**
+ * Sets the linear damping factor applied to this rigid-body.
+ *
+ * @param factor - The damping factor to set.
+ */
+ public setAngularDamping(factor: number) {
+ this.rawSet.rbSetAngularDamping(this.handle, factor);
+ }
+
+ /**
+ * Resets to zero the user forces (but not torques) applied to this rigid-body.
+ *
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public resetForces(wakeUp: boolean) {
+ this.rawSet.rbResetForces(this.handle, wakeUp);
+ }
+
+ /**
+ * Resets to zero the user torques applied to this rigid-body.
+ *
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public resetTorques(wakeUp: boolean) {
+ this.rawSet.rbResetTorques(this.handle, wakeUp);
+ }
+
+ /**
+ * Adds a force at the center-of-mass of this rigid-body.
+ *
+ * @param force - the world-space force to add to the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public addForce(force: Vector, wakeUp: boolean) {
+ const rawForce = VectorOps.intoRaw(force);
+ this.rawSet.rbAddForce(this.handle, rawForce, wakeUp);
+ rawForce.free();
+ }
+
+ /**
+ * Applies an impulse at the center-of-mass of this rigid-body.
+ *
+ * @param impulse - the world-space impulse to apply on the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public applyImpulse(impulse: Vector, wakeUp: boolean) {
+ const rawImpulse = VectorOps.intoRaw(impulse);
+ this.rawSet.rbApplyImpulse(this.handle, rawImpulse, wakeUp);
+ rawImpulse.free();
+ }
+
+ /**
+ * Adds a torque at the center-of-mass of this rigid-body.
+ *
+ * @param torque - the torque to add to the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public addTorque(torque: number, wakeUp: boolean) {
+ this.rawSet.rbAddTorque(this.handle, torque, wakeUp);
+ }
+
+ /**
+ * Applies an impulsive torque at the center-of-mass of this rigid-body.
+ *
+ * @param torqueImpulse - the torque impulse to apply on the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public applyTorqueImpulse(torqueImpulse: number, wakeUp: boolean) {
+ this.rawSet.rbApplyTorqueImpulse(this.handle, torqueImpulse, wakeUp);
+ }
+
+ /**
+ * Adds a force at the given world-space point of this rigid-body.
+ *
+ * @param force - the world-space force to add to the rigid-body.
+ * @param point - the world-space point where the impulse is to be applied on the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public addForceAtPoint(force: Vector, point: Vector, wakeUp: boolean) {
+ const rawForce = VectorOps.intoRaw(force);
+ const rawPoint = VectorOps.intoRaw(point);
+ this.rawSet.rbAddForceAtPoint(this.handle, rawForce, rawPoint, wakeUp);
+ rawForce.free();
+ rawPoint.free();
+ }
+
+ /**
+ * Applies an impulse at the given world-space point of this rigid-body.
+ *
+ * @param impulse - the world-space impulse to apply on the rigid-body.
+ * @param point - the world-space point where the impulse is to be applied on the rigid-body.
+ * @param wakeUp - should the rigid-body be automatically woken-up?
+ */
+ public applyImpulseAtPoint(impulse: Vector, point: Vector, wakeUp: boolean) {
+ const rawImpulse = VectorOps.intoRaw(impulse);
+ const rawPoint = VectorOps.intoRaw(point);
+ this.rawSet.rbApplyImpulseAtPoint(this.handle, rawImpulse, rawPoint, wakeUp);
+ rawImpulse.free();
+ rawPoint.free();
+ }
+
+ /**
+ * Retrieves the constant force(s) the user added to this rigid-body
+ * Returns zero if the rigid-body is not dynamic.
+ */
+ public userForce(): Vector {
+ return VectorOps.fromRaw(this.rawSet.rbUserForce(this.handle))!;
+ }
+
+ /**
+ * Retrieves the constant torque(s) the user added to this rigid-body
+ * Returns zero if the rigid-body is not dynamic.
+ */
+ public userTorque(): number {
+ return this.rawSet.rbUserTorque(this.handle);
+ }
+}
+
+export class RigidBodyDesc {
+ enabled: boolean;
+ translation: Vector;
+ rotation: Rotation;
+ gravityScale: number;
+ mass: number;
+ massOnly: boolean;
+ centerOfMass: Vector;
+ translationsEnabledX: boolean;
+ translationsEnabledY: boolean;
+ linvel: Vector;
+ angvel: number;
+ principalAngularInertia: number;
+ rotationsEnabled: boolean;
+ linearDamping: number;
+ angularDamping: number;
+ status: RigidBodyType;
+ canSleep: boolean;
+ sleeping: boolean;
+ ccdEnabled: boolean;
+ softCcdPrediction: number;
+ dominanceGroup: number;
+ additionalSolverIterations: number;
+ userData?: unknown;
+
+ constructor(status: RigidBodyType) {
+ this.enabled = true;
+ this.status = status;
+ this.translation = VectorOps.zeros();
+ this.rotation = RotationOps.identity();
+ this.gravityScale = 1.0;
+ this.linvel = VectorOps.zeros();
+ this.mass = 0.0;
+ this.massOnly = false;
+ this.centerOfMass = VectorOps.zeros();
+ this.translationsEnabledX = true;
+ this.translationsEnabledY = true;
+ this.angvel = 0.0;
+ this.principalAngularInertia = 0.0;
+ this.rotationsEnabled = true;
+ this.linearDamping = 0.0;
+ this.angularDamping = 0.0;
+ this.canSleep = true;
+ this.sleeping = false;
+ this.ccdEnabled = false;
+ this.softCcdPrediction = 0.0;
+ this.dominanceGroup = 0;
+ this.additionalSolverIterations = 0;
+ }
+
+ /**
+ * A rigid-body descriptor used to build a dynamic rigid-body.
+ */
+ public static dynamic(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.Dynamic);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a position-based kinematic rigid-body.
+ */
+ public static kinematicPositionBased(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.KinematicPositionBased);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a velocity-based kinematic rigid-body.
+ */
+ public static kinematicVelocityBased(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.KinematicVelocityBased);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a fixed rigid-body.
+ */
+ public static fixed(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.Fixed);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a dynamic rigid-body.
+ *
+ * @deprecated The method has been renamed to `.dynamic()`.
+ */
+ public static newDynamic(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.Dynamic);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a position-based kinematic rigid-body.
+ *
+ * @deprecated The method has been renamed to `.kinematicPositionBased()`.
+ */
+ public static newKinematicPositionBased(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.KinematicPositionBased);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a velocity-based kinematic rigid-body.
+ *
+ * @deprecated The method has been renamed to `.kinematicVelocityBased()`.
+ */
+ public static newKinematicVelocityBased(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.KinematicVelocityBased);
+ }
+
+ /**
+ * A rigid-body descriptor used to build a fixed rigid-body.
+ *
+ * @deprecated The method has been renamed to `.fixed()`.
+ */
+ public static newStatic(): RigidBodyDesc {
+ return new RigidBodyDesc(RigidBodyType.Fixed);
+ }
+
+ public setDominanceGroup(group: number): RigidBodyDesc {
+ this.dominanceGroup = group;
+ return this;
+ }
+
+ /**
+ * Sets the number of additional solver iterations that will be run for this
+ * rigid-body and everything that interacts with it directly or indirectly
+ * through contacts or joints.
+ *
+ * Compared to increasing the global `World.numSolverIteration`, setting this
+ * value lets you increase accuracy on only a subset of the scene, resulting in reduced
+ * performance loss.
+ *
+ * @param iters - The new number of additional solver iterations (default: 0).
+ */
+ public setAdditionalSolverIterations(iters: number): RigidBodyDesc {
+ this.additionalSolverIterations = iters;
+ return this;
+ }
+
+ /**
+ * Sets whether the created rigid-body will be enabled or disabled.
+ * @param enabled − If set to `false` the rigid-body will be disabled at creation.
+ */
+ public setEnabled(enabled: boolean): RigidBodyDesc {
+ this.enabled = enabled;
+ return this;
+ }
+
+ /**
+ * Sets the initial translation of the rigid-body to create.
+ */
+ public setTranslation(x: number, y: number): RigidBodyDesc {
+ if (typeof x != "number" || typeof y != "number")
+ throw TypeError("The translation components must be numbers.");
+
+ this.translation = {x: x, y: y};
+ return this;
+ }
+
+ /**
+ * Sets the initial rotation of the rigid-body to create.
+ *
+ * @param rot - The rotation to set.
+ */
+ public setRotation(rot: Rotation): RigidBodyDesc {
+ this.rotation = rot;
+ return this;
+ }
+
+ /**
+ * Sets the scale factor applied to the gravity affecting
+ * the rigid-body being built.
+ *
+ * @param scale - The scale factor. Set this to `0.0` if the rigid-body
+ * needs to ignore gravity.
+ */
+ public setGravityScale(scale: number): RigidBodyDesc {
+ this.gravityScale = scale;
+ return this;
+ }
+
+ /**
+ * Sets the initial mass of the rigid-body being built, before adding colliders' contributions.
+ *
+ * @param mass − The initial mass of the rigid-body to create.
+ */
+ public setAdditionalMass(mass: number): RigidBodyDesc {
+ this.mass = mass;
+ this.massOnly = true;
+ return this;
+ }
+
+ /**
+ * Sets the initial linear velocity of the rigid-body to create.
+ *
+ * @param x - The linear velocity to set along the `x` axis.
+ * @param y - The linear velocity to set along the `y` axis.
+ */
+ public setLinvel(x: number, y: number): RigidBodyDesc {
+ if (typeof x != "number" || typeof y != "number")
+ throw TypeError("The linvel components must be numbers.");
+
+ this.linvel = {x: x, y: y};
+ return this;
+ }
+
+ /**
+ * Sets the initial angular velocity of the rigid-body to create.
+ *
+ * @param vel - The angular velocity to set.
+ */
+ public setAngvel(vel: number): RigidBodyDesc {
+ this.angvel = vel;
+ return this;
+ }
+
+ /**
+ * Sets the mass properties of the rigid-body being built.
+ *
+ * Note that the final mass properties of the rigid-bodies depends
+ * on the initial mass-properties of the rigid-body (set by this method)
+ * to which is added the contributions of all the colliders with non-zero density
+ * attached to this rigid-body.
+ *
+ * Therefore, if you want your provided mass properties to be the final
+ * mass properties of your rigid-body, don't attach colliders to it, or
+ * only attach colliders with densities equal to zero.
+ *
+ * @param mass − The initial mass of the rigid-body to create.
+ * @param centerOfMass − The initial center-of-mass of the rigid-body to create.
+ * @param principalAngularInertia − The initial principal angular inertia of the rigid-body to create.
+ */
+ public setAdditionalMassProperties(
+ mass: number,
+ centerOfMass: Vector,
+ principalAngularInertia: number,
+ ): RigidBodyDesc {
+ this.mass = mass;
+ VectorOps.copy(this.centerOfMass, centerOfMass);
+ this.principalAngularInertia = principalAngularInertia;
+ this.massOnly = false;
+ return this;
+ }
+
+ /**
+ * Allow translation of this rigid-body only along specific axes.
+ * @param translationsEnabledX - Are translations along the X axis enabled?
+ * @param translationsEnabledY - Are translations along the y axis enabled?
+ */
+ public enabledTranslations(
+ translationsEnabledX: boolean,
+ translationsEnabledY: boolean,
+ ): RigidBodyDesc {
+ this.translationsEnabledX = translationsEnabledX;
+ this.translationsEnabledY = translationsEnabledY;
+ return this;
+ }
+
+ /**
+ * Allow translation of this rigid-body only along specific axes.
+ * @param translationsEnabledX - Are translations along the X axis enabled?
+ * @param translationsEnabledY - Are translations along the y axis enabled?
+ * @deprecated use `this.enabledTranslations` with the same arguments instead.
+ */
+ public restrictTranslations(
+ translationsEnabledX: boolean,
+ translationsEnabledY: boolean,
+ ): RigidBodyDesc {
+ return this.enabledTranslations(translationsEnabledX, translationsEnabledY);
+ }
+
+ /**
+ * Locks all translations that would have resulted from forces on
+ * the created rigid-body.
+ */
+ public lockTranslations(): RigidBodyDesc {
+ return this.restrictTranslations(false, false);
+ }
+
+ /**
+ * Locks all rotations that would have resulted from forces on
+ * the created rigid-body.
+ */
+ public lockRotations(): RigidBodyDesc {
+ this.rotationsEnabled = false;
+ return this;
+ }
+
+ /**
+ * Sets the linear damping of the rigid-body to create.
+ *
+ * This will progressively slowdown the translational movement of the rigid-body.
+ *
+ * @param damping - The angular damping coefficient. Should be >= 0. The higher this
+ * value is, the stronger the translational slowdown will be.
+ */
+ public setLinearDamping(damping: number): RigidBodyDesc {
+ this.linearDamping = damping;
+ return this;
+ }
+
+ /**
+ * Sets the angular damping of the rigid-body to create.
+ *
+ * This will progressively slowdown the rotational movement of the rigid-body.
+ *
+ * @param damping - The angular damping coefficient. Should be >= 0. The higher this
+ * value is, the stronger the rotational slowdown will be.
+ */
+ public setAngularDamping(damping: number): RigidBodyDesc {
+ this.angularDamping = damping;
+ return this;
+ }
+
+ /**
+ * Sets whether or not the rigid-body to create can sleep.
+ *
+ * @param can - true if the rigid-body can sleep, false if it can't.
+ */
+ public setCanSleep(can: boolean): RigidBodyDesc {
+ this.canSleep = can;
+ return this;
+ }
+
+ /**
+ * Sets whether or not the rigid-body is to be created asleep.
+ *
+ * @param can - true if the rigid-body should be in sleep, default false.
+ */
+ setSleeping(sleeping: boolean): RigidBodyDesc {
+ this.sleeping = sleeping;
+ return this;
+ }
+
+ /**
+ * Sets whether Continuous Collision Detection (CCD) is enabled for this rigid-body.
+ *
+ * @param enabled - true if the rigid-body has CCD enabled.
+ */
+ public setCcdEnabled(enabled: boolean): RigidBodyDesc {
+ this.ccdEnabled = enabled;
+ return this;
+ }
+
+ /**
+ * Sets the maximum prediction distance Soft Continuous Collision-Detection.
+ *
+ * When set to 0, soft-CCD is disabled. Soft-CCD helps prevent tunneling especially of
+ * slow-but-thin to moderately fast objects. The soft CCD prediction distance indicates how
+ * far in the object’s path the CCD algorithm is allowed to inspect. Large values can impact
+ * performance badly by increasing the work needed from the broad-phase.
+ *
+ * It is a generally cheaper variant of regular CCD (that can be enabled with
+ * `RigidBodyDesc::setCcdEnabled` since it relies on predictive constraints instead of
+ * shape-cast and substeps.
+ */
+ public setSoftCcdPrediction(distance: number): RigidBodyDesc {
+ this.softCcdPrediction = distance;
+ return this;
+ }
+
+ /**
+ * Sets the user-defined object of this rigid-body.
+ *
+ * @param userData - The user-defined object to set.
+ */
+ public setUserData(data?: unknown): RigidBodyDesc {
+ this.userData = data;
+ return this;
+ }
+}
diff --git a/packages/rapier-2d/src/dynamics/rigid_body_set.ts b/packages/rapier-2d/src/dynamics/rigid_body_set.ts
new file mode 100644
index 00000000..dca422eb
--- /dev/null
+++ b/packages/rapier-2d/src/dynamics/rigid_body_set.ts
@@ -0,0 +1,191 @@
+import {Coarena} from "../coarena";
+import {ColliderSet} from "../geometry";
+import {VectorOps, RotationOps} from "../math";
+import {RawRigidBodySet, RawRigidBodyType} from "../raw";
+import {ImpulseJointSet} from "./impulse_joint_set";
+import {IslandManager} from "./island_manager";
+import {MultibodyJointSet} from "./multibody_joint_set";
+import {RigidBody, RigidBodyDesc, RigidBodyHandle} from "./rigid_body";
+
+/**
+ * A set of rigid bodies that can be handled by a physics pipeline.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `rigidBodySet.free()`
+ * once you are done using it (and all the rigid-bodies it created).
+ */
+export class RigidBodySet {
+ raw: RawRigidBodySet;
+ private map: Coarena;
+
+ /**
+ * Release the WASM memory occupied by this rigid-body set.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+
+ if (!!this.map) {
+ this.map.clear();
+ }
+ this.map = undefined!;
+ }
+
+ constructor(raw?: RawRigidBodySet) {
+ this.raw = raw || new RawRigidBodySet();
+ this.map = new Coarena();
+ // deserialize
+ if (raw) {
+ raw.forEachRigidBodyHandle((handle: RigidBodyHandle) => {
+ this.map.set(handle, new RigidBody(raw, null!, handle));
+ });
+ }
+ }
+
+ /**
+ * Internal method, do not call this explicitly.
+ */
+ public finalizeDeserialization(colliderSet: ColliderSet) {
+ this.map.forEach((rb) => rb.finalizeDeserialization(colliderSet));
+ }
+
+ /**
+ * Creates a new rigid-body and return its integer handle.
+ *
+ * @param desc - The description of the rigid-body to create.
+ */
+ public createRigidBody(colliderSet: ColliderSet, desc: RigidBodyDesc): RigidBody {
+ let rawTra = VectorOps.intoRaw(desc.translation);
+ let rawRot = RotationOps.intoRaw(desc.rotation);
+ let rawLv = VectorOps.intoRaw(desc.linvel);
+ let rawCom = VectorOps.intoRaw(desc.centerOfMass);
+
+ let handle = this.raw.createRigidBody(
+ desc.enabled,
+ rawTra,
+ rawRot,
+ desc.gravityScale,
+ desc.mass,
+ desc.massOnly,
+ rawCom,
+ rawLv,
+ desc.angvel,
+ desc.principalAngularInertia,
+ desc.translationsEnabledX,
+ desc.translationsEnabledY,
+ desc.rotationsEnabled,
+ desc.linearDamping,
+ desc.angularDamping,
+ desc.status as number as RawRigidBodyType,
+ desc.canSleep,
+ desc.sleeping,
+ desc.softCcdPrediction,
+ desc.ccdEnabled,
+ desc.dominanceGroup,
+ desc.additionalSolverIterations,
+ );
+
+ rawTra.free();
+ rawRot.free();
+ rawLv.free();
+ rawCom.free();
+
+ const body = new RigidBody(this.raw, colliderSet, handle);
+ body.userData = desc.userData;
+
+ this.map.set(handle, body);
+
+ return body;
+ }
+
+ /**
+ * Removes a rigid-body from this set.
+ *
+ * This will also remove all the colliders and joints attached to the rigid-body.
+ *
+ * @param handle - The integer handle of the rigid-body to remove.
+ * @param colliders - The set of colliders that may contain colliders attached to the removed rigid-body.
+ * @param impulseJoints - The set of impulse joints that may contain joints attached to the removed rigid-body.
+ * @param multibodyJoints - The set of multibody joints that may contain joints attached to the removed rigid-body.
+ */
+ public remove(
+ handle: RigidBodyHandle,
+ islands: IslandManager,
+ colliders: ColliderSet,
+ impulseJoints: ImpulseJointSet,
+ multibodyJoints: MultibodyJointSet,
+ ) {
+ // Unmap the entities that will be removed automatically because of the rigid-body removals.
+ for (let i = 0; i < this.raw.rbNumColliders(handle); i += 1) {
+ colliders.unmap(this.raw.rbCollider(handle, i));
+ }
+
+ impulseJoints.forEachJointHandleAttachedToRigidBody(handle, (handle) =>
+ impulseJoints.unmap(handle),
+ );
+ multibodyJoints.forEachJointHandleAttachedToRigidBody(handle, (handle) =>
+ multibodyJoints.unmap(handle),
+ );
+
+ // Remove the rigid-body.
+ this.raw.remove(handle, islands.raw, colliders.raw, impulseJoints.raw, multibodyJoints.raw);
+ this.map.delete(handle);
+ }
+
+ /**
+ * The number of rigid-bodies on this set.
+ */
+ public len(): number {
+ return this.map.len();
+ }
+
+ /**
+ * Does this set contain a rigid-body with the given handle?
+ *
+ * @param handle - The rigid-body handle to check.
+ */
+ public contains(handle: RigidBodyHandle): boolean {
+ return this.get(handle) != null;
+ }
+
+ /**
+ * Gets the rigid-body with the given handle.
+ *
+ * @param handle - The handle of the rigid-body to retrieve.
+ */
+ public get(handle: RigidBodyHandle): RigidBody | null {
+ return this.map.get(handle);
+ }
+
+ /**
+ * Applies the given closure to each rigid-body contained by this set.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEach(f: (body: RigidBody) => void) {
+ this.map.forEach(f);
+ }
+
+ /**
+ * Applies the given closure to each active rigid-bodies contained by this set.
+ *
+ * A rigid-body is active if it is not sleeping, i.e., if it moved recently.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEachActiveRigidBody(islands: IslandManager, f: (body: RigidBody) => void) {
+ islands.forEachActiveRigidBodyHandle((handle) => {
+ f(this.get(handle)!);
+ });
+ }
+
+ /**
+ * Gets all rigid-bodies in the list.
+ *
+ * @returns rigid-bodies list.
+ */
+ public getAll(): RigidBody[] {
+ return this.map.getAll();
+ }
+}
diff --git a/src.ts/exports.ts b/packages/rapier-2d/src/exports.ts
similarity index 97%
rename from src.ts/exports.ts
rename to packages/rapier-2d/src/exports.ts
index 237bd545..46ca8d90 100644
--- a/src.ts/exports.ts
+++ b/packages/rapier-2d/src/exports.ts
@@ -23,5 +23,4 @@ export * from "./math";
export * from "./dynamics";
export * from "./geometry";
export * from "./pipeline";
-export * from "./init";
export * from "./control";
diff --git a/src.ts/geometry/broad_phase.ts b/packages/rapier-2d/src/geometry/broad_phase.ts
similarity index 92%
rename from src.ts/geometry/broad_phase.ts
rename to packages/rapier-2d/src/geometry/broad_phase.ts
index addaee92..b7cb91aa 100644
--- a/src.ts/geometry/broad_phase.ts
+++ b/packages/rapier-2d/src/geometry/broad_phase.ts
@@ -1,15 +1,15 @@
-import {RawBroadPhase, RawRayColliderIntersection} from "../raw";
import {RigidBodyHandle, RigidBodySet} from "../dynamics";
+import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+import {QueryFilterFlags} from "../pipeline";
+import {RawBroadPhase, RawRayColliderIntersection} from "../raw";
+import {ColliderHandle} from "./collider";
import {ColliderSet} from "./collider_set";
-import {Ray, RayColliderHit, RayColliderIntersection} from "./ray";
import {InteractionGroups} from "./interaction_groups";
-import {ColliderHandle} from "./collider";
-import {Rotation, RotationOps, Vector, VectorOps} from "../math";
-import {Shape} from "./shape";
+import {NarrowPhase} from "./narrow_phase";
import {PointColliderProjection} from "./point";
+import {Ray, RayColliderHit, RayColliderIntersection} from "./ray";
+import {Shape} from "./shape";
import {ColliderShapeCastHit} from "./toi";
-import {QueryFilterFlags} from "../pipeline";
-import {NarrowPhase} from "./narrow_phase";
/**
* The broad-phase used for coarse collision-detection.
@@ -27,7 +27,7 @@ export class BroadPhase {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawBroadPhase) {
@@ -60,30 +60,25 @@ export class BroadPhase {
filterExcludeRigidBody?: RigidBodyHandle,
filterPredicate?: (collider: ColliderHandle) => boolean,
): RayColliderHit | null {
- let rawOrig = VectorOps.intoRaw(ray.origin);
- let rawDir = VectorOps.intoRaw(ray.dir);
- let result = RayColliderHit.fromRaw(
+ return RayColliderHit.fromRaw(
colliders,
this.raw.castRay(
narrowPhase.raw,
bodies.raw,
colliders.raw,
- rawOrig,
- rawDir,
+ ray.origin.x,
+ ray.origin.y,
+ ray.dir.x,
+ ray.dir.y,
maxToi,
solid,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
- ),
+ filterPredicate as unknown as Function,
+ )!,
);
-
- rawOrig.free();
- rawDir.free();
-
- return result;
}
/**
@@ -112,30 +107,25 @@ export class BroadPhase {
filterExcludeRigidBody?: RigidBodyHandle,
filterPredicate?: (collider: ColliderHandle) => boolean,
): RayColliderIntersection | null {
- let rawOrig = VectorOps.intoRaw(ray.origin);
- let rawDir = VectorOps.intoRaw(ray.dir);
- let result = RayColliderIntersection.fromRaw(
+ return RayColliderIntersection.fromRaw(
colliders,
this.raw.castRayAndGetNormal(
narrowPhase.raw,
bodies.raw,
colliders.raw,
- rawOrig,
- rawDir,
+ ray.origin.x,
+ ray.origin.y,
+ ray.dir.x,
+ ray.dir.y,
maxToi,
solid,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
- ),
+ filterPredicate as unknown as Function,
+ )!,
);
-
- rawOrig.free();
- rawDir.free();
-
- return result;
}
/**
@@ -166,32 +156,27 @@ export class BroadPhase {
filterExcludeRigidBody?: RigidBodyHandle,
filterPredicate?: (collider: ColliderHandle) => boolean,
) {
- let rawOrig = VectorOps.intoRaw(ray.origin);
- let rawDir = VectorOps.intoRaw(ray.dir);
let rawCallback = (rawInter: RawRayColliderIntersection) => {
- return callback(
- RayColliderIntersection.fromRaw(colliders, rawInter),
- );
+ return callback(RayColliderIntersection.fromRaw(colliders, rawInter)!);
};
this.raw.intersectionsWithRay(
narrowPhase.raw,
bodies.raw,
colliders.raw,
- rawOrig,
- rawDir,
+ ray.origin.x,
+ ray.origin.y,
+ ray.dir.x,
+ ray.dir.y,
maxToi,
solid,
rawCallback,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
+ filterPredicate as unknown as Function,
);
-
- rawOrig.free();
- rawDir.free();
}
/**
@@ -227,18 +212,18 @@ export class BroadPhase {
rawPos,
rawRot,
rawShape,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
+ filterPredicate as unknown as Function,
);
rawPos.free();
rawRot.free();
rawShape.free();
- return result;
+ return result ?? null;
}
/**
@@ -275,12 +260,12 @@ export class BroadPhase {
colliders.raw,
rawPoint,
solid,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
- ),
+ filterPredicate as unknown as Function,
+ )!,
);
rawPoint.free();
@@ -315,12 +300,12 @@ export class BroadPhase {
bodies.raw,
colliders.raw,
rawPoint,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
- ),
+ filterPredicate as unknown as Function,
+ )!,
);
rawPoint.free();
@@ -358,11 +343,11 @@ export class BroadPhase {
colliders.raw,
rawPoint,
callback,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
+ filterPredicate as unknown as Function,
);
rawPoint.free();
@@ -423,12 +408,12 @@ export class BroadPhase {
targetDistance,
maxToi,
stopAtPenetration,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
- ),
+ filterPredicate as unknown as Function,
+ )!,
);
rawPos.free();
@@ -476,11 +461,11 @@ export class BroadPhase {
rawRot,
rawShape,
callback,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
filterExcludeCollider,
filterExcludeRigidBody,
- filterPredicate,
+ filterPredicate as unknown as Function,
);
rawPos.free();
diff --git a/packages/rapier-2d/src/geometry/collider.ts b/packages/rapier-2d/src/geometry/collider.ts
new file mode 100644
index 00000000..71a27611
--- /dev/null
+++ b/packages/rapier-2d/src/geometry/collider.ts
@@ -0,0 +1,1506 @@
+import {CoefficientCombineRule, RigidBody, RigidBodySet} from "../dynamics";
+import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+import {ActiveHooks, ActiveEvents} from "../pipeline";
+import {ColliderSet} from "./collider_set";
+import {ShapeContact} from "./contact";
+import {InteractionGroups} from "./interaction_groups";
+import {PointProjection} from "./point";
+import {Ray, RayIntersection} from "./ray";
+import {
+ Shape,
+ Cuboid,
+ Ball,
+ ShapeType,
+ Capsule,
+ Voxels,
+ TriMesh,
+ Polyline,
+ Heightfield,
+ Segment,
+ Triangle,
+ RoundTriangle,
+ RoundCuboid,
+ HalfSpace,
+ TriMeshFlags,
+ ConvexPolygon,
+ RoundConvexPolygon,
+} from "./shape";
+import {ColliderShapeCastHit, ShapeCastHit} from "./toi";
+
+/**
+ * Flags affecting whether collision-detection happens between two colliders
+ * depending on the type of rigid-bodies they are attached to.
+ */
+export enum ActiveCollisionTypes {
+ /**
+ * Enable collision-detection between a collider attached to a dynamic body
+ * and another collider attached to a dynamic body.
+ */
+ DYNAMIC_DYNAMIC = 0b0000_0000_0000_0001,
+ /**
+ * Enable collision-detection between a collider attached to a dynamic body
+ * and another collider attached to a kinematic body.
+ */
+ DYNAMIC_KINEMATIC = 0b0000_0000_0000_1100,
+ /**
+ * Enable collision-detection between a collider attached to a dynamic body
+ * and another collider attached to a fixed body (or not attached to any body).
+ */
+ DYNAMIC_FIXED = 0b0000_0000_0000_0010,
+ /**
+ * Enable collision-detection between a collider attached to a kinematic body
+ * and another collider attached to a kinematic body.
+ */
+ KINEMATIC_KINEMATIC = 0b1100_1100_0000_0000,
+
+ /**
+ * Enable collision-detection between a collider attached to a kinematic body
+ * and another collider attached to a fixed body (or not attached to any body).
+ */
+ KINEMATIC_FIXED = 0b0010_0010_0000_0000,
+
+ /**
+ * Enable collision-detection between a collider attached to a fixed body (or
+ * not attached to any body) and another collider attached to a fixed body (or
+ * not attached to any body).
+ */
+ FIXED_FIXED = 0b0000_0000_0010_0000,
+ /**
+ * The default active collision types, enabling collisions between a dynamic body
+ * and another body of any type, but not enabling collisions between two non-dynamic bodies.
+ */
+ DEFAULT = DYNAMIC_KINEMATIC | DYNAMIC_DYNAMIC | DYNAMIC_FIXED,
+ /**
+ * Enable collisions between any kind of rigid-bodies (including between two non-dynamic bodies).
+ */
+ ALL = DYNAMIC_KINEMATIC |
+ DYNAMIC_DYNAMIC |
+ DYNAMIC_FIXED |
+ KINEMATIC_KINEMATIC |
+ KINEMATIC_FIXED |
+ KINEMATIC_KINEMATIC,
+}
+
+/**
+ * The integer identifier of a collider added to a `ColliderSet`.
+ */
+export type ColliderHandle = number;
+
+/**
+ * A geometric entity that can be attached to a body so it can be affected
+ * by contacts and proximity queries.
+ */
+export class Collider {
+ private colliderSet: ColliderSet; // The Collider won't need to free this.
+ readonly handle: ColliderHandle;
+ private _shape: Shape; // TODO: deprecate/remove this since it isn't a reliable way of getting the latest shape properties.
+ private _parent: RigidBody | null;
+ private scratchBuffer: Float32Array;
+
+ constructor(
+ colliderSet: ColliderSet,
+ handle: ColliderHandle,
+ parent: RigidBody | null,
+ shape?: Shape,
+ ) {
+ this.colliderSet = colliderSet;
+ this.handle = handle;
+ this._parent = parent;
+ this._shape = shape!;
+ this.scratchBuffer = new Float32Array(4);
+ }
+
+ /** @internal */
+ public finalizeDeserialization(bodies: RigidBodySet) {
+ if (this.handle != null) {
+ this._parent = bodies.get(this.colliderSet.raw.coParent(this.handle)!);
+ }
+ }
+
+ private ensureShapeIsCached() {
+ if (!this._shape) this._shape = Shape.fromRaw(this.colliderSet.raw, this.handle);
+ }
+
+ /**
+ * The shape of this collider.
+ */
+ public get shape(): Shape {
+ this.ensureShapeIsCached();
+ return this._shape;
+ }
+
+ /**
+ * Set the internal cached JS shape to null.
+ *
+ * This can be useful if you want to free some memory (assuming you are not
+ * holding any other references to the shape object), or in order to force
+ * the recalculation of the JS shape (the next time the `shape` getter is
+ * accessed) from the WASM source of truth.
+ */
+ public clearShapeCache() {
+ this._shape = null!;
+ }
+
+ /**
+ * Checks if this collider is still valid (i.e. that it has
+ * not been deleted from the collider set yet).
+ */
+ public isValid(): boolean {
+ return this.colliderSet.raw.contains(this.handle);
+ }
+
+ /**
+ * The world-space translation of this collider.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public translation(target?: Vector): Vector {
+ this.colliderSet.raw.coTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The translation of this collider relative to its parent rigid-body.
+ *
+ * Returns `null` if the collider doesn't have a parent rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
+ */
+ public translationWrtParent(target?: Vector): Vector | null {
+ const hasParent = this.colliderSet.raw.coTranslationWrtParent(
+ this.handle,
+ this.scratchBuffer,
+ );
+ if (!hasParent) return null;
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
+ }
+
+ /**
+ * The world-space orientation of this collider.
+ */
+ public rotation(): Rotation {
+ this.colliderSet.raw.coRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer);
+ }
+
+ /**
+ * The orientation of this collider relative to its parent rigid-body.
+ *
+ * Returns `null` if the collider doesn't have a parent rigid-body.
+ */
+ public rotationWrtParent(): Rotation | null {
+ const hasParent = this.colliderSet.raw.coRotationWrtParent(this.handle, this.scratchBuffer);
+ if (!hasParent) return null;
+ return RotationOps.fromBuffer(this.scratchBuffer);
+ }
+
+ /**
+ * Is this collider a sensor?
+ */
+ public isSensor(): boolean {
+ return this.colliderSet.raw.coIsSensor(this.handle);
+ }
+
+ /**
+ * Sets whether this collider is a sensor.
+ * @param isSensor - If `true`, the collider will be a sensor.
+ */
+ public setSensor(isSensor: boolean) {
+ this.colliderSet.raw.coSetSensor(this.handle, isSensor);
+ }
+
+ /**
+ * Sets the new shape of the collider.
+ * @param shape - The collider’s new shape.
+ */
+ public setShape(shape: Shape) {
+ let rawShape = shape.intoRaw();
+ this.colliderSet.raw.coSetShape(this.handle, rawShape);
+ rawShape.free();
+ this._shape = shape;
+ }
+
+ /**
+ * Sets whether this collider is enabled or not.
+ *
+ * @param enabled - Set to `false` to disable this collider (its parent rigid-body won’t be disabled automatically by this).
+ */
+ public setEnabled(enabled: boolean) {
+ this.colliderSet.raw.coSetEnabled(this.handle, enabled);
+ }
+
+ /**
+ * Is this collider enabled?
+ */
+ public isEnabled(): boolean {
+ return this.colliderSet.raw.coIsEnabled(this.handle);
+ }
+
+ /**
+ * Sets the restitution coefficient of the collider to be created.
+ *
+ * @param restitution - The restitution coefficient in `[0, 1]`. A value of 0 (the default) means no bouncing behavior
+ * while 1 means perfect bouncing (though energy may still be lost due to numerical errors of the
+ * constraints solver).
+ */
+ public setRestitution(restitution: number) {
+ this.colliderSet.raw.coSetRestitution(this.handle, restitution);
+ }
+
+ /**
+ * Sets the friction coefficient of the collider to be created.
+ *
+ * @param friction - The friction coefficient. Must be greater or equal to 0. This is generally smaller than 1. The
+ * higher the coefficient, the stronger friction forces will be for contacts with the collider
+ * being built.
+ */
+ public setFriction(friction: number) {
+ this.colliderSet.raw.coSetFriction(this.handle, friction);
+ }
+
+ /**
+ * Gets the rule used to combine the friction coefficients of two colliders
+ * colliders involved in a contact.
+ */
+ public frictionCombineRule(): CoefficientCombineRule {
+ return this.colliderSet.raw.coFrictionCombineRule(this.handle);
+ }
+
+ /**
+ * Sets the rule used to combine the friction coefficients of two colliders
+ * colliders involved in a contact.
+ *
+ * @param rule − The combine rule to apply.
+ */
+ public setFrictionCombineRule(rule: CoefficientCombineRule) {
+ this.colliderSet.raw.coSetFrictionCombineRule(this.handle, rule);
+ }
+
+ /**
+ * Gets the rule used to combine the restitution coefficients of two colliders
+ * colliders involved in a contact.
+ */
+ public restitutionCombineRule(): CoefficientCombineRule {
+ return this.colliderSet.raw.coRestitutionCombineRule(this.handle);
+ }
+
+ /**
+ * Sets the rule used to combine the restitution coefficients of two colliders
+ * colliders involved in a contact.
+ *
+ * @param rule − The combine rule to apply.
+ */
+ public setRestitutionCombineRule(rule: CoefficientCombineRule) {
+ this.colliderSet.raw.coSetRestitutionCombineRule(this.handle, rule);
+ }
+
+ /**
+ * Sets the collision groups used by this collider.
+ *
+ * Two colliders will interact iff. their collision groups are compatible.
+ * See the documentation of `InteractionGroups` for details on teh used bit pattern.
+ *
+ * @param groups - The collision groups used for the collider being built.
+ */
+ public setCollisionGroups(groups: InteractionGroups) {
+ this.colliderSet.raw.coSetCollisionGroups(this.handle, groups);
+ }
+
+ /**
+ * Sets the solver groups used by this collider.
+ *
+ * Forces between two colliders in contact will be computed iff their solver
+ * groups are compatible.
+ * See the documentation of `InteractionGroups` for details on the used bit pattern.
+ *
+ * @param groups - The solver groups used for the collider being built.
+ */
+ public setSolverGroups(groups: InteractionGroups) {
+ this.colliderSet.raw.coSetSolverGroups(this.handle, groups);
+ }
+
+ /**
+ * Sets the contact skin for this collider.
+ *
+ * See the documentation of `ColliderDesc.setContactSkin` for additional details.
+ */
+ public contactSkin(): number {
+ return this.colliderSet.raw.coContactSkin(this.handle);
+ }
+
+ /**
+ * Sets the contact skin for this collider.
+ *
+ * See the documentation of `ColliderDesc.setContactSkin` for additional details.
+ *
+ * @param thickness - The contact skin thickness.
+ */
+ public setContactSkin(thickness: number) {
+ return this.colliderSet.raw.coSetContactSkin(this.handle, thickness);
+ }
+
+ /**
+ * Get the physics hooks active for this collider.
+ */
+ public activeHooks(): ActiveHooks {
+ return this.colliderSet.raw.coActiveHooks(this.handle);
+ }
+
+ /**
+ * Set the physics hooks active for this collider.
+ *
+ * Use this to enable custom filtering rules for contact/intersecstion pairs involving this collider.
+ *
+ * @param activeHooks - The hooks active for contact/intersection pairs involving this collider.
+ */
+ public setActiveHooks(activeHooks: ActiveHooks) {
+ this.colliderSet.raw.coSetActiveHooks(this.handle, activeHooks);
+ }
+
+ /**
+ * The events active for this collider.
+ */
+ public activeEvents(): ActiveEvents {
+ return this.colliderSet.raw.coActiveEvents(this.handle);
+ }
+
+ /**
+ * Set the events active for this collider.
+ *
+ * Use this to enable contact and/or intersection event reporting for this collider.
+ *
+ * @param activeEvents - The events active for contact/intersection pairs involving this collider.
+ */
+ public setActiveEvents(activeEvents: ActiveEvents) {
+ this.colliderSet.raw.coSetActiveEvents(this.handle, activeEvents);
+ }
+
+ /**
+ * Gets the collision types active for this collider.
+ */
+ public activeCollisionTypes(): ActiveCollisionTypes {
+ return this.colliderSet.raw.coActiveCollisionTypes(this.handle);
+ }
+
+ /**
+ * Sets the total force magnitude beyond which a contact force event can be emitted.
+ *
+ * @param threshold - The new force threshold.
+ */
+ public setContactForceEventThreshold(threshold: number) {
+ return this.colliderSet.raw.coSetContactForceEventThreshold(this.handle, threshold);
+ }
+
+ /**
+ * The total force magnitude beyond which a contact force event can be emitted.
+ */
+ public contactForceEventThreshold(): number {
+ return this.colliderSet.raw.coContactForceEventThreshold(this.handle);
+ }
+
+ /**
+ * Set the collision types active for this collider.
+ *
+ * @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.
+ */
+ public setActiveCollisionTypes(activeCollisionTypes: ActiveCollisionTypes) {
+ this.colliderSet.raw.coSetActiveCollisionTypes(this.handle, activeCollisionTypes);
+ }
+
+ /**
+ * Sets the uniform density of this collider.
+ *
+ * This will override any previous mass-properties set by `this.setDensity`,
+ * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,
+ * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.
+ *
+ * The mass and angular inertia of this collider will be computed automatically based on its
+ * shape.
+ */
+ public setDensity(density: number) {
+ this.colliderSet.raw.coSetDensity(this.handle, density);
+ }
+
+ /**
+ * Sets the mass of this collider.
+ *
+ * This will override any previous mass-properties set by `this.setDensity`,
+ * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,
+ * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.
+ *
+ * The angular inertia of this collider will be computed automatically based on its shape
+ * and this mass value.
+ */
+ public setMass(mass: number) {
+ this.colliderSet.raw.coSetMass(this.handle, mass);
+ }
+
+ /**
+ * Sets the mass of this collider.
+ *
+ * This will override any previous mass-properties set by `this.setDensity`,
+ * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,
+ * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.
+ */
+ public setMassProperties(mass: number, centerOfMass: Vector, principalAngularInertia: number) {
+ let rawCom = VectorOps.intoRaw(centerOfMass);
+ this.colliderSet.raw.coSetMassProperties(
+ this.handle,
+ mass,
+ rawCom,
+ principalAngularInertia,
+ );
+ rawCom.free();
+ }
+
+ /**
+ * Sets the translation of this collider.
+ *
+ * @param tra - The world-space position of the collider.
+ */
+ public setTranslation(tra: Vector) {
+ this.colliderSet.raw.coSetTranslation(this.handle, tra.x, tra.y);
+ }
+
+ /**
+ * Sets the translation of this collider relative to its parent rigid-body.
+ *
+ * Does nothing if this collider isn't attached to a rigid-body.
+ *
+ * @param tra - The new translation of the collider relative to its parent.
+ */
+ public setTranslationWrtParent(tra: Vector) {
+ this.colliderSet.raw.coSetTranslationWrtParent(this.handle, tra.x, tra.y);
+ }
+
+ /**
+ * Sets the rotation angle of this collider.
+ *
+ * @param angle - The rotation angle, in radians.
+ */
+ public setRotation(angle: number) {
+ this.colliderSet.raw.coSetRotation(this.handle, angle);
+ }
+
+ /**
+ * Sets the rotation angle of this collider relative to its parent rigid-body.
+ *
+ * Does nothing if this collider isn't attached to a rigid-body.
+ *
+ * @param angle - The rotation angle, in radians.
+ */
+ public setRotationWrtParent(angle: number) {
+ this.colliderSet.raw.coSetRotationWrtParent(this.handle, angle);
+ }
+
+ /**
+ * The type of the shape of this collider.
+ */
+ public shapeType(): ShapeType {
+ return this.colliderSet.raw.coShapeType(this.handle) as number as ShapeType;
+ }
+
+ /**
+ * The half-extents of this collider if it is a cuboid shape.
+ */
+ public halfExtents(): Vector {
+ return VectorOps.fromRaw(this.colliderSet.raw.coHalfExtents(this.handle)!)!;
+ }
+
+ /**
+ * Sets the half-extents of this collider if it is a cuboid shape.
+ *
+ * @param newHalfExtents - desired half extents.
+ */
+ public setHalfExtents(newHalfExtents: Vector) {
+ const rawPoint = VectorOps.intoRaw(newHalfExtents);
+ this.colliderSet.raw.coSetHalfExtents(this.handle, rawPoint);
+ }
+
+ /**
+ * The radius of this collider if it is a ball, cylinder, capsule, or cone shape.
+ */
+ public radius(): number {
+ return this.colliderSet.raw.coRadius(this.handle)!;
+ }
+
+ /**
+ * Sets the radius of this collider if it is a ball, cylinder, capsule, or cone shape.
+ *
+ * @param newRadius - desired radius.
+ */
+ public setRadius(newRadius: number): void {
+ this.colliderSet.raw.coSetRadius(this.handle, newRadius);
+ }
+
+ /**
+ * The radius of the round edges of this collider if it is a round cylinder.
+ */
+ public roundRadius(): number {
+ return this.colliderSet.raw.coRoundRadius(this.handle)!;
+ }
+
+ /**
+ * Sets the radius of the round edges of this collider if it has round edges.
+ *
+ * @param newBorderRadius - desired round edge radius.
+ */
+ public setRoundRadius(newBorderRadius: number) {
+ this.colliderSet.raw.coSetRoundRadius(this.handle, newBorderRadius);
+ }
+
+ /**
+ * The half height of this collider if it is a cylinder, capsule, or cone shape.
+ */
+ public halfHeight(): number {
+ return this.colliderSet.raw.coHalfHeight(this.handle)!;
+ }
+
+ /**
+ * Sets the half height of this collider if it is a cylinder, capsule, or cone shape.
+ *
+ * @param newHalfheight - desired half height.
+ */
+ public setHalfHeight(newHalfheight: number) {
+ this.colliderSet.raw.coSetHalfHeight(this.handle, newHalfheight);
+ }
+
+ /**
+ * If this collider has a Voxels shape, this will mark the voxel at the
+ * given grid coordinates as filled or empty (depending on the `filled`
+ * argument).
+ *
+ * Each input value is assumed to be an integer.
+ *
+ * The operation is O(1), unless the provided coordinates are out of the
+ * bounds of the currently allocated internal grid in which case the grid
+ * will be grown automatically.
+ */
+ public setVoxel(ix: number, iy: number, filled: boolean) {
+ this.colliderSet.raw.coSetVoxel(this.handle, ix, iy, filled);
+ // We modified the shape, invalidate it to keep our cache
+ // up-to-date the next time the user requests the shape data.
+ // PERF: this isn't ideal for performances as this adds a
+ // hidden, non-constant, cost.
+ this._shape = null!;
+ }
+
+ /**
+ * If this and `voxels2` are voxel colliders, and a voxel from `this` was
+ * modified with `setVoxel`, this will ensure that a
+ * moving object transitioning across the boundaries of these colliders
+ * won’t suffer from the "internal edges" artifact.
+ *
+ * The indices `ix, iy, iz` indicate the integer coordinates of the voxel in
+ * the local coordinate frame of `this`.
+ *
+ * If the voxels in `voxels2` live in a different coordinate space from `this`,
+ * then the `shift_*` argument indicate the distance, in voxel units, between
+ * the origin of `this` to the origin of `voxels2`.
+ *
+ * This method is intended to be called between `this` and all the other
+ * voxels colliders with a domain intersecting `this` or sharing a domain
+ * boundary. This is an incremental maintenance of the effect of
+ * `combineVoxelStates`.
+ */
+ public propagateVoxelChange(
+ voxels2: Collider,
+ ix: number,
+ iy: number,
+ shift_x: number,
+ shift_y: number,
+ ) {
+ this.colliderSet.raw.coPropagateVoxelChange(
+ this.handle,
+ voxels2.handle,
+ ix,
+ iy,
+ shift_x,
+ shift_y,
+ );
+ // We modified the shape, invalidate it to keep our cache
+ // up-to-date the next time the user requests the shape data.
+ // PERF: this isn't ideal for performances as this adds a
+ // hidden, non-constant, cost.
+ this._shape = null!;
+ }
+
+ /**
+ * If this and `voxels2` are voxel colliders, this will ensure that a
+ * moving object transitioning across the boundaries of these colliders
+ * won’t suffer from the "internal edges" artifact.
+ *
+ * If the voxels in `voxels2` live in a different coordinate space from `this`,
+ * then the `shift_*` argument indicate the distance, in voxel units, between
+ * the origin of `this` to the origin of `voxels2`.
+ *
+ * This method is intended to be called once between all pairs of voxels
+ * colliders with intersecting domains or shared boundaries.
+ *
+ * If either voxels collider is then modified with `setVoxel`, the
+ * `propagateVoxelChange` method must be called to maintain the coupling
+ * between the voxels shapes after the modification.
+ */
+ public combineVoxelStates(voxels2: Collider, shift_x: number, shift_y: number) {
+ this.colliderSet.raw.coCombineVoxelStates(this.handle, voxels2.handle, shift_x, shift_y);
+ // We modified the shape, invalidate it to keep our cache
+ // up-to-date the next time the user requests the shape data.
+ // PERF: this isn't ideal for performances as this adds a
+ // hidden, non-constant, cost.
+ this._shape = null!;
+ }
+
+ /**
+ * If this collider has a triangle mesh, polyline, convex polygon, or convex polyhedron shape,
+ * this returns the vertex buffer of said shape.
+ */
+ public vertices(): Float32Array {
+ return this.colliderSet.raw.coVertices(this.handle)!;
+ }
+
+ /**
+ * If this collider has a triangle mesh, polyline, or convex polyhedron shape,
+ * this returns the index buffer of said shape.
+ */
+ public indices(): Uint32Array | undefined {
+ return this.colliderSet.raw.coIndices(this.handle);
+ }
+
+ /**
+ * If this collider has a heightfield shape, this returns the heights buffer of
+ * the heightfield.
+ * In 3D, the returned height matrix is provided in column-major order.
+ */
+ public heightfieldHeights(): Float32Array {
+ return this.colliderSet.raw.coHeightfieldHeights(this.handle)!;
+ }
+
+ /**
+ * If this collider has a heightfield shape, this returns the scale
+ * applied to it.
+ */
+ public heightfieldScale(): Vector {
+ let scale = this.colliderSet.raw.coHeightfieldScale(this.handle)!;
+ return VectorOps.fromRaw(scale)!;
+ }
+
+ /**
+ * The rigid-body this collider is attached to.
+ */
+ public parent(): RigidBody | null {
+ return this._parent;
+ }
+
+ /**
+ * The friction coefficient of this collider.
+ */
+ public friction(): number {
+ return this.colliderSet.raw.coFriction(this.handle);
+ }
+
+ /**
+ * The restitution coefficient of this collider.
+ */
+ public restitution(): number {
+ return this.colliderSet.raw.coRestitution(this.handle);
+ }
+
+ /**
+ * The density of this collider.
+ */
+ public density(): number {
+ return this.colliderSet.raw.coDensity(this.handle);
+ }
+
+ /**
+ * The mass of this collider.
+ */
+ public mass(): number {
+ return this.colliderSet.raw.coMass(this.handle);
+ }
+
+ /**
+ * The volume of this collider.
+ */
+ public volume(): number {
+ return this.colliderSet.raw.coVolume(this.handle);
+ }
+
+ /**
+ * The collision groups of this collider.
+ */
+ public collisionGroups(): InteractionGroups {
+ return this.colliderSet.raw.coCollisionGroups(this.handle);
+ }
+
+ /**
+ * The solver groups of this collider.
+ */
+ public solverGroups(): InteractionGroups {
+ return this.colliderSet.raw.coSolverGroups(this.handle);
+ }
+
+ /**
+ * Tests if this collider contains a point.
+ *
+ * @param point - The point to test.
+ */
+ public containsPoint(point: Vector): boolean {
+ let rawPoint = VectorOps.intoRaw(point);
+ let result = this.colliderSet.raw.coContainsPoint(this.handle, rawPoint);
+
+ rawPoint.free();
+
+ return result;
+ }
+
+ /**
+ * Find the projection of a point on this collider.
+ *
+ * @param point - The point to project.
+ * @param solid - If this is set to `true` then the collider shapes are considered to
+ * be plain (if the point is located inside of a plain shape, its projection is the point
+ * itself). If it is set to `false` the collider shapes are considered to be hollow
+ * (if the point is located inside of an hollow shape, it is projected on the shape's
+ * boundary).
+ */
+ public projectPoint(point: Vector, solid: boolean): PointProjection | null {
+ let rawPoint = VectorOps.intoRaw(point);
+ let result = PointProjection.fromRaw(
+ this.colliderSet.raw.coProjectPoint(this.handle, rawPoint, solid),
+ );
+
+ rawPoint.free();
+
+ return result;
+ }
+
+ /**
+ * Tests if this collider intersects the given ray.
+ *
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ */
+ public intersectsRay(ray: Ray, maxToi: number): boolean {
+ let rawOrig = VectorOps.intoRaw(ray.origin);
+ let rawDir = VectorOps.intoRaw(ray.dir);
+ let result = this.colliderSet.raw.coIntersectsRay(this.handle, rawOrig, rawDir, maxToi);
+
+ rawOrig.free();
+ rawDir.free();
+
+ return result;
+ }
+
+ /*
+ * Computes the smallest time between this and the given shape under translational movement are separated by a distance smaller or equal to distance.
+ *
+ * @param collider1Vel - The constant velocity of the current shape to cast (i.e. the cast direction).
+ * @param shape2 - The shape to cast against.
+ * @param shape2Pos - The position of the second shape.
+ * @param shape2Rot - The rotation of the second shape.
+ * @param shape2Vel - The constant velocity of the second shape.
+ * @param targetDistance − If the shape moves closer to this distance from a collider, a hit
+ * will be returned.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the distance traveled by the shape to `collider1Vel.norm() * maxToi`.
+ * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if
+ * the shape is penetrating another shape at its starting point **and** its trajectory is such
+ * that it’s on a path to exit that penetration state.
+ */
+ public castShape(
+ collider1Vel: Vector,
+ shape2: Shape,
+ shape2Pos: Vector,
+ shape2Rot: Rotation,
+ shape2Vel: Vector,
+ targetDistance: number,
+ maxToi: number,
+ stopAtPenetration: boolean,
+ ): ShapeCastHit | null {
+ let rawCollider1Vel = VectorOps.intoRaw(collider1Vel);
+ let rawShape2Pos = VectorOps.intoRaw(shape2Pos);
+ let rawShape2Rot = RotationOps.intoRaw(shape2Rot);
+ let rawShape2Vel = VectorOps.intoRaw(shape2Vel);
+ let rawShape2 = shape2.intoRaw();
+
+ let result = ShapeCastHit.fromRaw(
+ this.colliderSet,
+ this.colliderSet.raw.coCastShape(
+ this.handle,
+ rawCollider1Vel,
+ rawShape2,
+ rawShape2Pos,
+ rawShape2Rot,
+ rawShape2Vel,
+ targetDistance,
+ maxToi,
+ stopAtPenetration,
+ )!,
+ );
+
+ rawCollider1Vel.free();
+ rawShape2Pos.free();
+ rawShape2Rot.free();
+ rawShape2Vel.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ /*
+ * Computes the smallest time between this and the given collider under translational movement are separated by a distance smaller or equal to distance.
+ *
+ * @param collider1Vel - The constant velocity of the current collider to cast (i.e. the cast direction).
+ * @param collider2 - The collider to cast against.
+ * @param collider2Vel - The constant velocity of the second collider.
+ * @param targetDistance − If the shape moves closer to this distance from a collider, a hit
+ * will be returned.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.
+ * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if
+ * the shape is penetrating another shape at its starting point **and** its trajectory is such
+ * that it’s on a path to exit that penetration state.
+ */
+ public castCollider(
+ collider1Vel: Vector,
+ collider2: Collider,
+ collider2Vel: Vector,
+ targetDistance: number,
+ maxToi: number,
+ stopAtPenetration: boolean,
+ ): ColliderShapeCastHit | null {
+ let rawCollider1Vel = VectorOps.intoRaw(collider1Vel);
+ let rawCollider2Vel = VectorOps.intoRaw(collider2Vel);
+
+ let result = ColliderShapeCastHit.fromRaw(
+ this.colliderSet,
+ this.colliderSet.raw.coCastCollider(
+ this.handle,
+ rawCollider1Vel,
+ collider2.handle,
+ rawCollider2Vel,
+ targetDistance,
+ maxToi,
+ stopAtPenetration,
+ )!,
+ );
+
+ rawCollider1Vel.free();
+ rawCollider2Vel.free();
+
+ return result;
+ }
+
+ public intersectsShape(shape2: Shape, shapePos2: Vector, shapeRot2: Rotation): boolean {
+ let rawPos2 = VectorOps.intoRaw(shapePos2);
+ let rawRot2 = RotationOps.intoRaw(shapeRot2);
+ let rawShape2 = shape2.intoRaw();
+
+ let result = this.colliderSet.raw.coIntersectsShape(
+ this.handle,
+ rawShape2,
+ rawPos2,
+ rawRot2,
+ );
+
+ rawPos2.free();
+ rawRot2.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ /**
+ * Computes one pair of contact points between the shape owned by this collider and the given shape.
+ *
+ * @param shape2 - The second shape.
+ * @param shape2Pos - The initial position of the second shape.
+ * @param shape2Rot - The rotation of the second shape.
+ * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.
+ * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.
+ */
+ contactShape(
+ shape2: Shape,
+ shape2Pos: Vector,
+ shape2Rot: Rotation,
+ prediction: number,
+ ): ShapeContact | null {
+ let rawPos2 = VectorOps.intoRaw(shape2Pos);
+ let rawRot2 = RotationOps.intoRaw(shape2Rot);
+ let rawShape2 = shape2.intoRaw();
+
+ let result = ShapeContact.fromRaw(
+ this.colliderSet.raw.coContactShape(
+ this.handle,
+ rawShape2,
+ rawPos2,
+ rawRot2,
+ prediction,
+ )!,
+ );
+
+ rawPos2.free();
+ rawRot2.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ /**
+ * Computes one pair of contact points between the collider and the given collider.
+ *
+ * @param collider2 - The second collider.
+ * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.
+ * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.
+ */
+ contactCollider(collider2: Collider, prediction: number): ShapeContact | null {
+ let result = ShapeContact.fromRaw(
+ this.colliderSet.raw.coContactCollider(this.handle, collider2.handle, prediction)!,
+ );
+
+ return result;
+ }
+
+ /**
+ * Find the closest intersection between a ray and this collider.
+ *
+ * This also computes the normal at the hit point.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @returns The time-of-impact between this collider and the ray, or `-1` if there is no intersection.
+ */
+ public castRay(ray: Ray, maxToi: number, solid: boolean): number {
+ let rawOrig = VectorOps.intoRaw(ray.origin);
+ let rawDir = VectorOps.intoRaw(ray.dir);
+ let result = this.colliderSet.raw.coCastRay(this.handle, rawOrig, rawDir, maxToi, solid);
+
+ rawOrig.free();
+ rawDir.free();
+
+ return result;
+ }
+
+ /**
+ * Find the closest intersection between a ray and this collider.
+ *
+ * This also computes the normal at the hit point.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ */
+ public castRayAndGetNormal(ray: Ray, maxToi: number, solid: boolean): RayIntersection | null {
+ let rawOrig = VectorOps.intoRaw(ray.origin);
+ let rawDir = VectorOps.intoRaw(ray.dir);
+ let result = RayIntersection.fromRaw(
+ this.colliderSet.raw.coCastRayAndGetNormal(
+ this.handle,
+ rawOrig,
+ rawDir,
+ maxToi,
+ solid,
+ )!,
+ );
+
+ rawOrig.free();
+ rawDir.free();
+
+ return result;
+ }
+}
+
+export enum MassPropsMode {
+ Density,
+ Mass,
+ MassProps,
+}
+
+export class ColliderDesc {
+ enabled: boolean;
+ shape: Shape;
+ massPropsMode: MassPropsMode;
+ mass: number;
+ centerOfMass: Vector;
+ principalAngularInertia: number;
+ rotationsEnabled: boolean;
+ density: number;
+ friction: number;
+ restitution: number;
+ rotation: Rotation;
+ translation: Vector;
+ isSensor: boolean;
+ collisionGroups: InteractionGroups;
+ solverGroups: InteractionGroups;
+ frictionCombineRule: CoefficientCombineRule;
+ restitutionCombineRule: CoefficientCombineRule;
+ activeEvents: ActiveEvents;
+ activeHooks: ActiveHooks;
+ activeCollisionTypes: ActiveCollisionTypes;
+ contactForceEventThreshold: number;
+ contactSkin: number;
+
+ /**
+ * Initializes a collider descriptor from the collision shape.
+ *
+ * @param shape - The shape of the collider being built.
+ */
+ constructor(shape: Shape) {
+ this.enabled = true;
+ this.shape = shape;
+ this.massPropsMode = MassPropsMode.Density;
+ this.density = 1.0;
+ this.friction = 0.5;
+ this.restitution = 0.0;
+ this.rotation = RotationOps.identity();
+ this.translation = VectorOps.zeros();
+ this.isSensor = false;
+ this.collisionGroups = 0xffff_ffff;
+ this.solverGroups = 0xffff_ffff;
+ this.frictionCombineRule = CoefficientCombineRule.Average;
+ this.restitutionCombineRule = CoefficientCombineRule.Average;
+ this.activeCollisionTypes = ActiveCollisionTypes.DEFAULT;
+ this.activeEvents = ActiveEvents.NONE;
+ this.activeHooks = ActiveHooks.NONE;
+ this.mass = 0.0;
+ this.centerOfMass = VectorOps.zeros();
+ this.contactForceEventThreshold = 0.0;
+ this.contactSkin = 0.0;
+
+ this.principalAngularInertia = 0.0;
+ this.rotationsEnabled = true;
+ }
+
+ /**
+ * Create a new collider descriptor with a ball shape.
+ *
+ * @param radius - The radius of the ball.
+ */
+ public static ball(radius: number): ColliderDesc {
+ const shape = new Ball(radius);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Create a new collider descriptor with a capsule shape.
+ *
+ * @param halfHeight - The half-height of the capsule, along the `y` axis.
+ * @param radius - The radius of the capsule basis.
+ */
+ public static capsule(halfHeight: number, radius: number): ColliderDesc {
+ const shape = new Capsule(halfHeight, radius);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new segment shape.
+ *
+ * @param a - The first point of the segment.
+ * @param b - The second point of the segment.
+ */
+ public static segment(a: Vector, b: Vector): ColliderDesc {
+ const shape = new Segment(a, b);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new triangle shape.
+ *
+ * @param a - The first point of the triangle.
+ * @param b - The second point of the triangle.
+ * @param c - The third point of the triangle.
+ */
+ public static triangle(a: Vector, b: Vector, c: Vector): ColliderDesc {
+ const shape = new Triangle(a, b, c);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new triangle shape with round corners.
+ *
+ * @param a - The first point of the triangle.
+ * @param b - The second point of the triangle.
+ * @param c - The third point of the triangle.
+ * @param borderRadius - The radius of the borders of this triangle. In 3D,
+ * this is also equal to half the thickness of the triangle.
+ */
+ public static roundTriangle(
+ a: Vector,
+ b: Vector,
+ c: Vector,
+ borderRadius: number,
+ ): ColliderDesc {
+ const shape = new RoundTriangle(a, b, c, borderRadius);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a polyline shape.
+ *
+ * @param vertices - The coordinates of the polyline's vertices.
+ * @param indices - The indices of the polyline's segments. If this is `undefined` or `null`,
+ * the vertices are assumed to describe a line strip.
+ */
+ public static polyline(vertices: Float32Array, indices?: Uint32Array): ColliderDesc {
+ const shape = new Polyline(vertices, indices);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a shape made of voxels.
+ *
+ * @param data - Defines the set of voxels. If this is a `Int32Array` then
+ * each voxel is defined from its (signed) grid coordinates,
+ * with 3 (resp 2) contiguous integers per voxel in 3D (resp 2D).
+ * If this is a `Float32Array`, each voxel will be such that
+ * they contain at least one point from this array (where each
+ * point is defined from 3 (resp 2) contiguous numbers per point
+ * in 3D (resp 2D).
+ * @param voxelSize - The size of each voxel.
+ */
+ public static voxels(voxels: Float32Array | Int32Array, voxelSize: Vector): ColliderDesc {
+ const shape = new Voxels(voxels, voxelSize);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a triangle mesh shape.
+ *
+ * @param vertices - The coordinates of the triangle mesh's vertices.
+ * @param indices - The indices of the triangle mesh's triangles.
+ */
+ public static trimesh(
+ vertices: Float32Array,
+ indices: Uint32Array,
+ flags?: TriMeshFlags,
+ ): ColliderDesc {
+ const shape = new TriMesh(vertices, indices, flags);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a rectangular shape.
+ *
+ * @param hx - The half-width of the rectangle along its local `x` axis.
+ * @param hy - The half-width of the rectangle along its local `y` axis.
+ */
+ public static cuboid(hx: number, hy: number): ColliderDesc {
+ const shape = new Cuboid(hx, hy);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a rectangular shape with round borders.
+ *
+ * @param hx - The half-width of the rectangle along its local `x` axis.
+ * @param hy - The half-width of the rectangle along its local `y` axis.
+ * @param borderRadius - The radius of the cuboid's borders.
+ */
+ public static roundCuboid(hx: number, hy: number, borderRadius: number): ColliderDesc {
+ const shape = new RoundCuboid(hx, hy, borderRadius);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider description with a halfspace (infinite plane) shape.
+ *
+ * @param normal - The outward normal of the plane.
+ */
+ public static halfspace(normal: Vector): ColliderDesc {
+ const shape = new HalfSpace(normal);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor with a heightfield shape.
+ *
+ * @param heights - The heights of the heightfield, along its local `y` axis.
+ * @param scale - The scale factor applied to the heightfield.
+ */
+ public static heightfield(heights: Float32Array, scale: Vector): ColliderDesc {
+ const shape = new Heightfield(heights, scale);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Computes the convex-hull of the given points and use the resulting
+ * convex polygon as the shape for this new collider descriptor.
+ *
+ * @param points - The point that will be used to compute the convex-hull.
+ */
+ public static convexHull(points: Float32Array): ColliderDesc | null {
+ const shape = new ConvexPolygon(points, false);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor that uses the given set of points assumed
+ * to form a convex polyline (no convex-hull computation will be done).
+ *
+ * @param vertices - The vertices of the convex polyline.
+ */
+ public static convexPolyline(vertices: Float32Array): ColliderDesc | null {
+ const shape = new ConvexPolygon(vertices, true);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Computes the convex-hull of the given points and use the resulting
+ * convex polygon as the shape for this new collider descriptor. A
+ * border is added to that convex polygon to give it round corners.
+ *
+ * @param points - The point that will be used to compute the convex-hull.
+ * @param borderRadius - The radius of the round border added to the convex polygon.
+ */
+ public static roundConvexHull(points: Float32Array, borderRadius: number): ColliderDesc | null {
+ const shape = new RoundConvexPolygon(points, borderRadius, false);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Creates a new collider descriptor that uses the given set of points assumed
+ * to form a round convex polyline (no convex-hull computation will be done).
+ *
+ * @param vertices - The vertices of the convex polyline.
+ * @param borderRadius - The radius of the round border added to the convex polyline.
+ */
+ public static roundConvexPolyline(
+ vertices: Float32Array,
+ borderRadius: number,
+ ): ColliderDesc | null {
+ const shape = new RoundConvexPolygon(vertices, borderRadius, true);
+ return new ColliderDesc(shape);
+ }
+
+ /**
+ * Sets the position of the collider to be created relative to the rigid-body it is attached to.
+ */
+ public setTranslation(x: number, y: number): ColliderDesc {
+ if (typeof x != "number" || typeof y != "number")
+ throw TypeError("The translation components must be numbers.");
+
+ this.translation = {x: x, y: y};
+ return this;
+ }
+
+ /**
+ * Sets the rotation of the collider to be created relative to the rigid-body it is attached to.
+ *
+ * @param rot - The rotation of the collider to be created relative to the rigid-body it is attached to.
+ */
+ public setRotation(rot: Rotation): ColliderDesc {
+ this.rotation = rot;
+ return this;
+ }
+
+ /**
+ * Sets whether or not the collider being created is a sensor.
+ *
+ * A sensor collider does not take part of the physics simulation, but generates
+ * proximity events.
+ *
+ * @param sensor - Set to `true` of the collider built is to be a sensor.
+ */
+ public setSensor(sensor: boolean): ColliderDesc {
+ this.isSensor = sensor;
+ return this;
+ }
+
+ /**
+ * Sets whether the created collider will be enabled or disabled.
+ * @param enabled − If set to `false` the collider will be disabled at creation.
+ */
+ public setEnabled(enabled: boolean): ColliderDesc {
+ this.enabled = enabled;
+ return this;
+ }
+
+ /**
+ * Sets the contact skin of the collider.
+ *
+ * The contact skin acts as if the collider was enlarged with a skin of width `skin_thickness`
+ * around it, keeping objects further apart when colliding.
+ *
+ * A non-zero contact skin can increase performance, and in some cases, stability. However
+ * it creates a small gap between colliding object (equal to the sum of their skin). If the
+ * skin is sufficiently small, this might not be visually significant or can be hidden by the
+ * rendering assets.
+ */
+ public setContactSkin(thickness: number): ColliderDesc {
+ this.contactSkin = thickness;
+ return this;
+ }
+
+ /**
+ * Sets the density of the collider being built.
+ *
+ * The mass and angular inertia tensor will be computed automatically based on this density and the collider’s shape.
+ *
+ * @param density - The density to set, must be greater or equal to 0. A density of 0 means that this collider
+ * will not affect the mass or angular inertia of the rigid-body it is attached to.
+ */
+ public setDensity(density: number): ColliderDesc {
+ this.massPropsMode = MassPropsMode.Density;
+ this.density = density;
+ return this;
+ }
+
+ /**
+ * Sets the mass of the collider being built.
+ *
+ * The angular inertia tensor will be computed automatically based on this mass and the collider’s shape.
+ *
+ * @param mass - The mass to set, must be greater or equal to 0.
+ */
+ public setMass(mass: number): ColliderDesc {
+ this.massPropsMode = MassPropsMode.Mass;
+ this.mass = mass;
+ return this;
+ }
+
+ /**
+ * Sets the mass properties of the collider being built.
+ *
+ * This replaces the mass-properties automatically computed from the collider's density and shape.
+ * These mass-properties will be added to the mass-properties of the rigid-body this collider will be attached to.
+ *
+ * @param mass − The mass of the collider to create.
+ * @param centerOfMass − The center-of-mass of the collider to create.
+ * @param principalAngularInertia − The principal angular inertia of the collider to create.
+ */
+ public setMassProperties(
+ mass: number,
+ centerOfMass: Vector,
+ principalAngularInertia: number,
+ ): ColliderDesc {
+ this.massPropsMode = MassPropsMode.MassProps;
+ this.mass = mass;
+ VectorOps.copy(this.centerOfMass, centerOfMass);
+ this.principalAngularInertia = principalAngularInertia;
+ return this;
+ }
+
+ /**
+ * Sets the restitution coefficient of the collider to be created.
+ *
+ * @param restitution - The restitution coefficient in `[0, 1]`. A value of 0 (the default) means no bouncing behavior
+ * while 1 means perfect bouncing (though energy may still be lost due to numerical errors of the
+ * constraints solver).
+ */
+ public setRestitution(restitution: number): ColliderDesc {
+ this.restitution = restitution;
+ return this;
+ }
+
+ /**
+ * Sets the friction coefficient of the collider to be created.
+ *
+ * @param friction - The friction coefficient. Must be greater or equal to 0. This is generally smaller than 1. The
+ * higher the coefficient, the stronger friction forces will be for contacts with the collider
+ * being built.
+ */
+ public setFriction(friction: number): ColliderDesc {
+ this.friction = friction;
+ return this;
+ }
+
+ /**
+ * Sets the rule used to combine the friction coefficients of two colliders
+ * colliders involved in a contact.
+ *
+ * @param rule − The combine rule to apply.
+ */
+ public setFrictionCombineRule(rule: CoefficientCombineRule): ColliderDesc {
+ this.frictionCombineRule = rule;
+ return this;
+ }
+
+ /**
+ * Sets the rule used to combine the restitution coefficients of two colliders
+ * colliders involved in a contact.
+ *
+ * @param rule − The combine rule to apply.
+ */
+ public setRestitutionCombineRule(rule: CoefficientCombineRule): ColliderDesc {
+ this.restitutionCombineRule = rule;
+ return this;
+ }
+
+ /**
+ * Sets the collision groups used by this collider.
+ *
+ * Two colliders will interact iff. their collision groups are compatible.
+ * See the documentation of `InteractionGroups` for details on teh used bit pattern.
+ *
+ * @param groups - The collision groups used for the collider being built.
+ */
+ public setCollisionGroups(groups: InteractionGroups): ColliderDesc {
+ this.collisionGroups = groups;
+ return this;
+ }
+
+ /**
+ * Sets the solver groups used by this collider.
+ *
+ * Forces between two colliders in contact will be computed iff their solver
+ * groups are compatible.
+ * See the documentation of `InteractionGroups` for details on the used bit pattern.
+ *
+ * @param groups - The solver groups used for the collider being built.
+ */
+ public setSolverGroups(groups: InteractionGroups): ColliderDesc {
+ this.solverGroups = groups;
+ return this;
+ }
+
+ /**
+ * Set the physics hooks active for this collider.
+ *
+ * Use this to enable custom filtering rules for contact/intersecstion pairs involving this collider.
+ *
+ * @param activeHooks - The hooks active for contact/intersection pairs involving this collider.
+ */
+ public setActiveHooks(activeHooks: ActiveHooks): ColliderDesc {
+ this.activeHooks = activeHooks;
+ return this;
+ }
+
+ /**
+ * Set the events active for this collider.
+ *
+ * Use this to enable contact and/or intersection event reporting for this collider.
+ *
+ * @param activeEvents - The events active for contact/intersection pairs involving this collider.
+ */
+ public setActiveEvents(activeEvents: ActiveEvents): ColliderDesc {
+ this.activeEvents = activeEvents;
+ return this;
+ }
+
+ /**
+ * Set the collision types active for this collider.
+ *
+ * @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.
+ */
+ public setActiveCollisionTypes(activeCollisionTypes: ActiveCollisionTypes): ColliderDesc {
+ this.activeCollisionTypes = activeCollisionTypes;
+ return this;
+ }
+
+ /**
+ * Sets the total force magnitude beyond which a contact force event can be emitted.
+ *
+ * @param threshold - The force threshold to set.
+ */
+ public setContactForceEventThreshold(threshold: number): ColliderDesc {
+ this.contactForceEventThreshold = threshold;
+ return this;
+ }
+}
diff --git a/src.ts/geometry/collider_set.ts b/packages/rapier-2d/src/geometry/collider_set.ts
similarity index 83%
rename from src.ts/geometry/collider_set.ts
rename to packages/rapier-2d/src/geometry/collider_set.ts
index 832b837a..9637741f 100644
--- a/src.ts/geometry/collider_set.ts
+++ b/packages/rapier-2d/src/geometry/collider_set.ts
@@ -1,9 +1,9 @@
-import {RawColliderSet} from "../raw";
import {Coarena} from "../coarena";
-import {RotationOps, VectorOps} from "../math";
-import {Collider, ColliderDesc, ColliderHandle} from "./collider";
import {ImpulseJointHandle, IslandManager, RigidBodyHandle} from "../dynamics";
import {RigidBodySet} from "../dynamics";
+import {RotationOps, VectorOps} from "../math";
+import {RawColliderSet} from "../raw";
+import {Collider, ColliderDesc, ColliderHandle} from "./collider";
/**
* A set of rigid bodies that can be handled by a physics pipeline.
@@ -22,12 +22,12 @@ export class ColliderSet {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
if (!!this.map) {
this.map.clear();
}
- this.map = undefined;
+ this.map = undefined!;
}
constructor(raw?: RawColliderSet) {
@@ -44,21 +44,16 @@ export class ColliderSet {
/** @internal */
public castClosure(
f?: (collider: Collider) => Res,
- ): (handle: ColliderHandle) => Res | undefined {
+ ): ((handle: ColliderHandle) => Res) | undefined {
+ if (!f) return undefined;
return (handle) => {
- if (!!f) {
- return f(this.get(handle));
- } else {
- return undefined;
- }
+ return f(this.get(handle)!);
};
}
/** @internal */
public finalizeDeserialization(bodies: RigidBodySet) {
- this.map.forEach((collider) =>
- collider.finalizeDeserialization(bodies),
- );
+ this.map.forEach((collider) => collider.finalizeDeserialization(bodies));
}
/**
@@ -85,15 +80,6 @@ export class ColliderSet {
let rawRot = RotationOps.intoRaw(desc.rotation);
let rawCom = VectorOps.intoRaw(desc.centerOfMass);
- // #if DIM3
- let rawPrincipalInertia = VectorOps.intoRaw(
- desc.principalAngularInertia,
- );
- let rawInertiaFrame = RotationOps.intoRaw(
- desc.angularInertiaLocalFrame,
- );
- // #endif
-
let handle = this.raw.createCollider(
desc.enabled,
rawShape,
@@ -102,13 +88,7 @@ export class ColliderSet {
desc.massPropsMode,
desc.mass,
rawCom,
- // #if DIM2
desc.principalAngularInertia,
- // #endif
- // #if DIM3
- rawPrincipalInertia,
- rawInertiaFrame,
- // #endif
desc.density,
desc.friction,
desc.restitution,
@@ -132,14 +112,9 @@ export class ColliderSet {
rawRot.free();
rawCom.free();
- // #if DIM3
- rawPrincipalInertia.free();
- rawInertiaFrame.free();
- // #endif
-
- let parent = hasParent ? bodies.get(parentHandle) : null;
- let collider = new Collider(this, handle, parent, desc.shape);
- this.map.set(handle, collider);
+ let parent = hasParent ? bodies.get(parentHandle!) : null;
+ let collider = new Collider(this, handle!, parent, desc.shape);
+ this.map.set(handle!, collider);
return collider;
}
diff --git a/src.ts/geometry/contact.ts b/packages/rapier-2d/src/geometry/contact.ts
similarity index 74%
rename from src.ts/geometry/contact.ts
rename to packages/rapier-2d/src/geometry/contact.ts
index 802f57f4..99b345fb 100644
--- a/src.ts/geometry/contact.ts
+++ b/packages/rapier-2d/src/geometry/contact.ts
@@ -32,13 +32,7 @@ export class ShapeContact {
*/
normal2: Vector;
- constructor(
- dist: number,
- point1: Vector,
- point2: Vector,
- normal1: Vector,
- normal2: Vector,
- ) {
+ constructor(dist: number, point1: Vector, point2: Vector, normal1: Vector, normal2: Vector) {
this.distance = dist;
this.point1 = point1;
this.point2 = point2;
@@ -46,15 +40,15 @@ export class ShapeContact {
this.normal2 = normal2;
}
- public static fromRaw(raw: RawShapeContact): ShapeContact {
+ public static fromRaw(raw: RawShapeContact): ShapeContact | null {
if (!raw) return null;
const result = new ShapeContact(
raw.distance(),
- VectorOps.fromRaw(raw.point1()),
- VectorOps.fromRaw(raw.point2()),
- VectorOps.fromRaw(raw.normal1()),
- VectorOps.fromRaw(raw.normal2()),
+ VectorOps.fromRaw(raw.point1())!,
+ VectorOps.fromRaw(raw.point2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
);
raw.free();
return result;
diff --git a/packages/rapier-2d/src/geometry/feature.ts b/packages/rapier-2d/src/geometry/feature.ts
new file mode 100644
index 00000000..99bdda85
--- /dev/null
+++ b/packages/rapier-2d/src/geometry/feature.ts
@@ -0,0 +1,5 @@
+export enum FeatureType {
+ Vertex,
+ Face,
+ Unknown,
+}
diff --git a/src.ts/geometry/index.ts b/packages/rapier-2d/src/geometry/index.ts
similarity index 100%
rename from src.ts/geometry/index.ts
rename to packages/rapier-2d/src/geometry/index.ts
diff --git a/src.ts/geometry/interaction_groups.ts b/packages/rapier-2d/src/geometry/interaction_groups.ts
similarity index 100%
rename from src.ts/geometry/interaction_groups.ts
rename to packages/rapier-2d/src/geometry/interaction_groups.ts
diff --git a/packages/rapier-2d/src/geometry/narrow_phase.ts b/packages/rapier-2d/src/geometry/narrow_phase.ts
new file mode 100644
index 00000000..5e70d338
--- /dev/null
+++ b/packages/rapier-2d/src/geometry/narrow_phase.ts
@@ -0,0 +1,185 @@
+import {Vector, VectorOps} from "../math";
+import {RawNarrowPhase, RawContactManifold} from "../raw";
+import {ColliderHandle} from "./collider";
+
+/**
+ * The narrow-phase used for precise collision-detection.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `narrowPhase.free()`
+ * once you are done using it.
+ */
+export class NarrowPhase {
+ raw: RawNarrowPhase;
+ tempManifold: TempContactManifold;
+
+ /**
+ * Release the WASM memory occupied by this narrow-phase.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw?: RawNarrowPhase) {
+ this.raw = raw || new RawNarrowPhase();
+ this.tempManifold = new TempContactManifold(null!);
+ }
+
+ /**
+ * Enumerates all the colliders potentially in contact with the given collider.
+ *
+ * @param collider1 - The second collider involved in the contact.
+ * @param f - Closure that will be called on each collider that is in contact with `collider1`.
+ */
+ public contactPairsWith(collider1: ColliderHandle, f: (collider2: ColliderHandle) => void) {
+ this.raw.contact_pairs_with(collider1, f);
+ }
+
+ /**
+ * Enumerates all the colliders intersecting the given colliders, assuming one of them
+ * is a sensor.
+ */
+ public intersectionPairsWith(
+ collider1: ColliderHandle,
+ f: (collider2: ColliderHandle) => void,
+ ) {
+ this.raw.intersection_pairs_with(collider1, f);
+ }
+
+ /**
+ * Iterates through all the contact manifolds between the given pair of colliders.
+ *
+ * @param collider1 - The first collider involved in the contact.
+ * @param collider2 - The second collider involved in the contact.
+ * @param f - Closure that will be called on each contact manifold between the two colliders. If the second argument
+ * passed to this closure is `true`, then the contact manifold data is flipped, i.e., methods like `localNormal1`
+ * actually apply to the `collider2` and fields like `localNormal2` apply to the `collider1`.
+ */
+ public contactPair(
+ collider1: ColliderHandle,
+ collider2: ColliderHandle,
+ f: (manifold: TempContactManifold, flipped: boolean) => void,
+ ) {
+ const rawPair = this.raw.contact_pair(collider1, collider2);
+
+ if (!!rawPair) {
+ const flipped = rawPair.collider1() != collider1;
+
+ let i;
+ for (i = 0; i < rawPair.numContactManifolds(); ++i) {
+ this.tempManifold.raw = rawPair.contactManifold(i)!;
+ if (!!this.tempManifold.raw) {
+ f(this.tempManifold, flipped);
+ }
+
+ // SAFETY: The RawContactManifold stores a raw pointer that will be invalidated
+ // at the next timestep. So we must be sure to free the pair here
+ // to avoid unsoundness in the Rust code.
+ this.tempManifold.free();
+ }
+ rawPair.free();
+ }
+ }
+
+ /**
+ * Returns `true` if `collider1` and `collider2` intersect and at least one of them is a sensor.
+ * @param collider1 − The first collider involved in the intersection.
+ * @param collider2 − The second collider involved in the intersection.
+ */
+ public intersectionPair(collider1: ColliderHandle, collider2: ColliderHandle): boolean {
+ return this.raw.intersection_pair(collider1, collider2);
+ }
+}
+
+export class TempContactManifold {
+ raw: RawContactManifold;
+
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw: RawContactManifold) {
+ this.raw = raw;
+ }
+
+ public normal(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.normal()!, target)!;
+ }
+
+ public localNormal1(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.local_n1()!, target)!;
+ }
+
+ public localNormal2(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.local_n2()!, target)!;
+ }
+
+ public subshape1(): number {
+ return this.raw.subshape1();
+ }
+
+ public subshape2(): number {
+ return this.raw.subshape2();
+ }
+
+ public numContacts(): number {
+ return this.raw.num_contacts();
+ }
+
+ public localContactPoint1(i: number, target?: Vector): Vector | null {
+ return VectorOps.fromRaw(this.raw.contact_local_p1(i)!, target);
+ }
+
+ public localContactPoint2(i: number, target?: Vector): Vector | null {
+ return VectorOps.fromRaw(this.raw.contact_local_p2(i)!, target);
+ }
+
+ public contactDist(i: number): number {
+ return this.raw.contact_dist(i);
+ }
+
+ public contactFid1(i: number): number {
+ return this.raw.contact_fid1(i);
+ }
+
+ public contactFid2(i: number): number {
+ return this.raw.contact_fid2(i);
+ }
+
+ public contactImpulse(i: number): number {
+ return this.raw.contact_impulse(i);
+ }
+
+ public contactTangentImpulse(i: number): number {
+ return this.raw.contact_tangent_impulse(i);
+ }
+
+ public numSolverContacts(): number {
+ return this.raw.num_solver_contacts();
+ }
+
+ public solverContactPoint(i: number, target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.solver_contact_point(i)!, target)!;
+ }
+
+ public solverContactDist(i: number): number {
+ return this.raw.solver_contact_dist(i);
+ }
+
+ public solverContactFriction(i: number): number {
+ return this.raw.solver_contact_friction(i);
+ }
+
+ public solverContactRestitution(i: number): number {
+ return this.raw.solver_contact_restitution(i);
+ }
+
+ public solverContactTangentVelocity(i: number, target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.solver_contact_tangent_velocity(i)!, target)!;
+ }
+}
diff --git a/src.ts/geometry/point.ts b/packages/rapier-2d/src/geometry/point.ts
similarity index 83%
rename from src.ts/geometry/point.ts
rename to packages/rapier-2d/src/geometry/point.ts
index d272b7e8..b784eeda 100644
--- a/src.ts/geometry/point.ts
+++ b/packages/rapier-2d/src/geometry/point.ts
@@ -1,12 +1,8 @@
-import {Collider, ColliderHandle} from "./collider";
import {Vector, VectorOps} from "../math";
-import {
- RawFeatureType,
- RawPointColliderProjection,
- RawPointProjection,
-} from "../raw";
-import {FeatureType} from "./feature";
+import {RawPointColliderProjection, RawPointProjection} from "../raw";
+import {Collider} from "./collider";
import {ColliderSet} from "./collider_set";
+import {FeatureType} from "./feature";
/**
* The projection of a point on a collider.
@@ -26,13 +22,10 @@ export class PointProjection {
this.isInside = isInside;
}
- public static fromRaw(raw: RawPointProjection): PointProjection {
+ public static fromRaw(raw: RawPointProjection): PointProjection | null {
if (!raw) return null;
- const result = new PointProjection(
- VectorOps.fromRaw(raw.point()),
- raw.isInside(),
- );
+ const result = new PointProjection(VectorOps.fromRaw(raw.point())!, raw.isInside());
raw.free();
return result;
}
@@ -82,12 +75,12 @@ export class PointColliderProjection {
public static fromRaw(
colliderSet: ColliderSet,
raw: RawPointColliderProjection,
- ): PointColliderProjection {
+ ): PointColliderProjection | null {
if (!raw) return null;
const result = new PointColliderProjection(
- colliderSet.get(raw.colliderHandle()),
- VectorOps.fromRaw(raw.point()),
+ colliderSet.get(raw.colliderHandle())!,
+ VectorOps.fromRaw(raw.point())!,
raw.isInside(),
raw.featureType() as number as FeatureType,
raw.featureId(),
diff --git a/packages/rapier-2d/src/geometry/ray.ts b/packages/rapier-2d/src/geometry/ray.ts
new file mode 100644
index 00000000..4b898966
--- /dev/null
+++ b/packages/rapier-2d/src/geometry/ray.ts
@@ -0,0 +1,181 @@
+import {Vector, VectorOps} from "../math";
+import {RawRayColliderIntersection, RawRayColliderHit, RawRayIntersection} from "../raw";
+import {Collider} from "./collider";
+import {ColliderSet} from "./collider_set";
+import {FeatureType} from "./feature";
+
+/**
+ * A ray. This is a directed half-line.
+ */
+export class Ray {
+ /**
+ * The starting point of the ray.
+ */
+ public origin: Vector;
+ /**
+ * The direction of propagation of the ray.
+ */
+ public dir: Vector;
+
+ /**
+ * Builds a ray from its origin and direction.
+ *
+ * @param origin - The ray's starting point.
+ * @param dir - The ray's direction of propagation.
+ */
+ constructor(origin: Vector, dir: Vector) {
+ this.origin = origin;
+ this.dir = dir;
+ }
+
+ public pointAt(t: number): Vector {
+ return {
+ x: this.origin.x + this.dir.x * t,
+ y: this.origin.y + this.dir.y * t,
+ };
+ }
+}
+
+/**
+ * The intersection between a ray and a collider.
+ */
+export class RayIntersection {
+ /**
+ * The time-of-impact of the ray with the collider.
+ *
+ * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.
+ */
+ timeOfImpact: number;
+ /**
+ * The normal of the collider at the hit point.
+ */
+ normal: Vector;
+
+ /**
+ * The type of the geometric feature the point was projected on.
+ */
+ featureType = FeatureType.Unknown;
+
+ /**
+ * The id of the geometric feature the point was projected on.
+ */
+ featureId: number | undefined = undefined;
+
+ constructor(
+ timeOfImpact: number,
+ normal: Vector,
+ featureType?: FeatureType,
+ featureId?: number,
+ ) {
+ this.timeOfImpact = timeOfImpact;
+ this.normal = normal;
+ if (featureId !== undefined) this.featureId = featureId;
+ if (featureType !== undefined) this.featureType = featureType;
+ }
+
+ public static fromRaw(raw: RawRayIntersection): RayIntersection | null {
+ if (!raw) return null;
+
+ const result = new RayIntersection(
+ raw.time_of_impact(),
+ VectorOps.fromRaw(raw.normal())!,
+ raw.featureType() as number as FeatureType,
+ raw.featureId(),
+ );
+ raw.free();
+ return result;
+ }
+}
+
+/**
+ * The intersection between a ray and a collider (includes the collider handle).
+ */
+export class RayColliderIntersection {
+ /**
+ * The collider hit by the ray.
+ */
+ collider: Collider;
+ /**
+ * The time-of-impact of the ray with the collider.
+ *
+ * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.
+ */
+ timeOfImpact: number;
+ /**
+ * The normal of the collider at the hit point.
+ */
+ normal: Vector;
+
+ /**
+ * The type of the geometric feature the point was projected on.
+ */
+ featureType = FeatureType.Unknown;
+
+ /**
+ * The id of the geometric feature the point was projected on.
+ */
+ featureId: number | undefined = undefined;
+
+ constructor(
+ collider: Collider,
+ timeOfImpact: number,
+ normal: Vector,
+ featureType?: FeatureType,
+ featureId?: number,
+ ) {
+ this.collider = collider;
+ this.timeOfImpact = timeOfImpact;
+ this.normal = normal;
+ if (featureId !== undefined) this.featureId = featureId;
+ if (featureType !== undefined) this.featureType = featureType;
+ }
+
+ public static fromRaw(
+ colliderSet: ColliderSet,
+ raw: RawRayColliderIntersection,
+ ): RayColliderIntersection | null {
+ if (!raw) return null;
+
+ const result = new RayColliderIntersection(
+ colliderSet.get(raw.colliderHandle())!,
+ raw.time_of_impact(),
+ VectorOps.fromRaw(raw.normal())!,
+ raw.featureType() as number as FeatureType,
+ raw.featureId(),
+ );
+ raw.free();
+ return result;
+ }
+}
+
+/**
+ * The time of impact between a ray and a collider.
+ */
+export class RayColliderHit {
+ /**
+ * The handle of the collider hit by the ray.
+ */
+ collider: Collider;
+ /**
+ * The time-of-impact of the ray with the collider.
+ *
+ * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.
+ */
+ timeOfImpact: number;
+
+ constructor(collider: Collider, timeOfImpact: number) {
+ this.collider = collider;
+ this.timeOfImpact = timeOfImpact;
+ }
+
+ public static fromRaw(colliderSet: ColliderSet, raw: RawRayColliderHit): RayColliderHit | null {
+ if (!raw) return null;
+
+ const result = new RayColliderHit(
+ colliderSet.get(raw.colliderHandle())!,
+ raw.timeOfImpact(),
+ );
+ raw.free();
+ return result;
+ }
+}
diff --git a/packages/rapier-2d/src/geometry/shape.ts b/packages/rapier-2d/src/geometry/shape.ts
new file mode 100644
index 00000000..c8c045a1
--- /dev/null
+++ b/packages/rapier-2d/src/geometry/shape.ts
@@ -0,0 +1,980 @@
+import {Vector, VectorOps, Rotation, RotationOps} from "../math";
+import {RawColliderSet, RawShape, RawShapeType} from "../raw";
+import {ColliderHandle} from "./collider";
+import {ShapeContact} from "./contact";
+import {PointProjection} from "./point";
+import {Ray, RayIntersection} from "./ray";
+import {ShapeCastHit} from "./toi";
+
+export abstract class Shape {
+ public abstract intoRaw(): RawShape;
+
+ /**
+ * The concrete type of this shape.
+ */
+ public abstract get type(): ShapeType;
+
+ /**
+ * instant mode without cache
+ */
+ public static fromRaw(rawSet: RawColliderSet, handle: ColliderHandle): Shape {
+ const rawType = rawSet.coShapeType(handle);
+
+ let extents: Vector;
+ let borderRadius: number;
+ let vs: Float32Array;
+ let indices: Uint32Array;
+ let halfHeight: number;
+ let radius: number;
+ let normal: Vector;
+
+ switch (rawType) {
+ case RawShapeType.Ball:
+ return new Ball(rawSet.coRadius(handle)!);
+ case RawShapeType.Cuboid:
+ extents = rawSet.coHalfExtents(handle)!;
+ return new Cuboid(extents.x, extents.y);
+
+ case RawShapeType.RoundCuboid:
+ extents = rawSet.coHalfExtents(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
+
+ return new RoundCuboid(extents.x, extents.y, borderRadius);
+
+ case RawShapeType.Capsule:
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
+ return new Capsule(halfHeight, radius);
+ case RawShapeType.Segment:
+ vs = rawSet.coVertices(handle)!;
+
+ return new Segment(VectorOps.new(vs[0], vs[1]), VectorOps.new(vs[2], vs[3]));
+
+ case RawShapeType.Polyline:
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
+ return new Polyline(vs, indices);
+ case RawShapeType.Triangle:
+ vs = rawSet.coVertices(handle)!;
+
+ return new Triangle(
+ VectorOps.new(vs[0], vs[1]),
+ VectorOps.new(vs[2], vs[3]),
+ VectorOps.new(vs[4], vs[5]),
+ );
+
+ case RawShapeType.RoundTriangle:
+ vs = rawSet.coVertices(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
+
+ return new RoundTriangle(
+ VectorOps.new(vs[0], vs[1]),
+ VectorOps.new(vs[2], vs[3]),
+ VectorOps.new(vs[4], vs[5]),
+ borderRadius,
+ );
+
+ case RawShapeType.HalfSpace:
+ normal = VectorOps.fromRaw(rawSet.coHalfspaceNormal(handle)!)!;
+ return new HalfSpace(normal);
+
+ case RawShapeType.Voxels:
+ const vox_data = rawSet.coVoxelData(handle)!;
+ const vox_size = rawSet.coVoxelSize(handle)!;
+ return new Voxels(vox_data, vox_size);
+
+ case RawShapeType.TriMesh:
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
+ const tri_flags = rawSet.coTriMeshFlags(handle)!;
+ return new TriMesh(vs, indices, tri_flags);
+
+ case RawShapeType.HeightField:
+ const scale = rawSet.coHeightfieldScale(handle)!;
+ const heights = rawSet.coHeightfieldHeights(handle)!;
+
+ return new Heightfield(heights, scale);
+
+ case RawShapeType.ConvexPolygon:
+ vs = rawSet.coVertices(handle)!;
+ return new ConvexPolygon(vs, false);
+ case RawShapeType.RoundConvexPolygon:
+ vs = rawSet.coVertices(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
+ return new RoundConvexPolygon(vs, borderRadius, false);
+
+ default:
+ throw new Error("unknown shape type: " + rawType);
+ }
+ }
+
+ /**
+ * Computes the time of impact between two moving shapes.
+ * @param shapePos1 - The initial position of this sahpe.
+ * @param shapeRot1 - The rotation of this shape.
+ * @param shapeVel1 - The velocity of this shape.
+ * @param shape2 - The second moving shape.
+ * @param shapePos2 - The initial position of the second shape.
+ * @param shapeRot2 - The rotation of the second shape.
+ * @param shapeVel2 - The velocity of the second shape.
+ * @param targetDistance − If the shape moves closer to this distance from a collider, a hit
+ * will be returned.
+ * @param maxToi - The maximum time when the impact can happen.
+ * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if
+ * the shape is penetrating another shape at its starting point **and** its trajectory is such
+ * that it’s on a path to exit that penetration state.
+ * @returns If the two moving shapes collider at some point along their trajectories, this returns the
+ * time at which the two shape collider as well as the contact information during the impact. Returns
+ * `null`if the two shapes never collide along their paths.
+ */
+ public castShape(
+ shapePos1: Vector,
+ shapeRot1: Rotation,
+ shapeVel1: Vector,
+ shape2: Shape,
+ shapePos2: Vector,
+ shapeRot2: Rotation,
+ shapeVel2: Vector,
+ targetDistance: number,
+ maxToi: number,
+ stopAtPenetration: boolean,
+ ): ShapeCastHit | null {
+ let rawPos1 = VectorOps.intoRaw(shapePos1);
+ let rawRot1 = RotationOps.intoRaw(shapeRot1);
+ let rawVel1 = VectorOps.intoRaw(shapeVel1);
+ let rawPos2 = VectorOps.intoRaw(shapePos2);
+ let rawRot2 = RotationOps.intoRaw(shapeRot2);
+ let rawVel2 = VectorOps.intoRaw(shapeVel2);
+
+ let rawShape1 = this.intoRaw();
+ let rawShape2 = shape2.intoRaw();
+
+ let result = ShapeCastHit.fromRaw(
+ null!,
+ rawShape1.castShape(
+ rawPos1,
+ rawRot1,
+ rawVel1,
+ rawShape2,
+ rawPos2,
+ rawRot2,
+ rawVel2,
+ targetDistance,
+ maxToi,
+ stopAtPenetration,
+ )!,
+ );
+
+ rawPos1.free();
+ rawRot1.free();
+ rawVel1.free();
+ rawPos2.free();
+ rawRot2.free();
+ rawVel2.free();
+
+ rawShape1.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ /**
+ * Tests if this shape intersects another shape.
+ *
+ * @param shapePos1 - The position of this shape.
+ * @param shapeRot1 - The rotation of this shape.
+ * @param shape2 - The second shape to test.
+ * @param shapePos2 - The position of the second shape.
+ * @param shapeRot2 - The rotation of the second shape.
+ * @returns `true` if the two shapes intersect, `false` if they don’t.
+ */
+ public intersectsShape(
+ shapePos1: Vector,
+ shapeRot1: Rotation,
+ shape2: Shape,
+ shapePos2: Vector,
+ shapeRot2: Rotation,
+ ): boolean {
+ let rawPos1 = VectorOps.intoRaw(shapePos1);
+ let rawRot1 = RotationOps.intoRaw(shapeRot1);
+ let rawPos2 = VectorOps.intoRaw(shapePos2);
+ let rawRot2 = RotationOps.intoRaw(shapeRot2);
+
+ let rawShape1 = this.intoRaw();
+ let rawShape2 = shape2.intoRaw();
+
+ let result = rawShape1.intersectsShape(rawPos1, rawRot1, rawShape2, rawPos2, rawRot2);
+
+ rawPos1.free();
+ rawRot1.free();
+ rawPos2.free();
+ rawRot2.free();
+
+ rawShape1.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ /**
+ * Computes one pair of contact points between two shapes.
+ *
+ * @param shapePos1 - The initial position of this sahpe.
+ * @param shapeRot1 - The rotation of this shape.
+ * @param shape2 - The second shape.
+ * @param shapePos2 - The initial position of the second shape.
+ * @param shapeRot2 - The rotation of the second shape.
+ * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.
+ * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.
+ */
+ contactShape(
+ shapePos1: Vector,
+ shapeRot1: Rotation,
+ shape2: Shape,
+ shapePos2: Vector,
+ shapeRot2: Rotation,
+ prediction: number,
+ ): ShapeContact | null {
+ let rawPos1 = VectorOps.intoRaw(shapePos1);
+ let rawRot1 = RotationOps.intoRaw(shapeRot1);
+ let rawPos2 = VectorOps.intoRaw(shapePos2);
+ let rawRot2 = RotationOps.intoRaw(shapeRot2);
+
+ let rawShape1 = this.intoRaw();
+ let rawShape2 = shape2.intoRaw();
+
+ let result = ShapeContact.fromRaw(
+ rawShape1.contactShape(rawPos1, rawRot1, rawShape2, rawPos2, rawRot2, prediction)!,
+ );
+
+ rawPos1.free();
+ rawRot1.free();
+ rawPos2.free();
+ rawRot2.free();
+
+ rawShape1.free();
+ rawShape2.free();
+
+ return result;
+ }
+
+ containsPoint(shapePos: Vector, shapeRot: Rotation, point: Vector): boolean {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawPoint = VectorOps.intoRaw(point);
+ let rawShape = this.intoRaw();
+
+ let result = rawShape.containsPoint(rawPos, rawRot, rawPoint);
+
+ rawPos.free();
+ rawRot.free();
+ rawPoint.free();
+ rawShape.free();
+
+ return result;
+ }
+
+ projectPoint(
+ shapePos: Vector,
+ shapeRot: Rotation,
+ point: Vector,
+ solid: boolean,
+ ): PointProjection {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawPoint = VectorOps.intoRaw(point);
+ let rawShape = this.intoRaw();
+
+ let result = PointProjection.fromRaw(
+ rawShape.projectPoint(rawPos, rawRot, rawPoint, solid)!,
+ )!;
+
+ rawPos.free();
+ rawRot.free();
+ rawPoint.free();
+ rawShape.free();
+
+ return result;
+ }
+
+ intersectsRay(ray: Ray, shapePos: Vector, shapeRot: Rotation, maxToi: number): boolean {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawRayOrig = VectorOps.intoRaw(ray.origin);
+ let rawRayDir = VectorOps.intoRaw(ray.dir);
+ let rawShape = this.intoRaw();
+
+ let result = rawShape.intersectsRay(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi);
+
+ rawPos.free();
+ rawRot.free();
+ rawRayOrig.free();
+ rawRayDir.free();
+ rawShape.free();
+
+ return result;
+ }
+
+ castRay(
+ ray: Ray,
+ shapePos: Vector,
+ shapeRot: Rotation,
+ maxToi: number,
+ solid: boolean,
+ ): number {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawRayOrig = VectorOps.intoRaw(ray.origin);
+ let rawRayDir = VectorOps.intoRaw(ray.dir);
+ let rawShape = this.intoRaw();
+
+ let result = rawShape.castRay(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi, solid);
+
+ rawPos.free();
+ rawRot.free();
+ rawRayOrig.free();
+ rawRayDir.free();
+ rawShape.free();
+
+ return result;
+ }
+
+ castRayAndGetNormal(
+ ray: Ray,
+ shapePos: Vector,
+ shapeRot: Rotation,
+ maxToi: number,
+ solid: boolean,
+ ): RayIntersection {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawRayOrig = VectorOps.intoRaw(ray.origin);
+ let rawRayDir = VectorOps.intoRaw(ray.dir);
+ let rawShape = this.intoRaw();
+
+ let result = RayIntersection.fromRaw(
+ rawShape.castRayAndGetNormal(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi, solid)!,
+ )!;
+
+ rawPos.free();
+ rawRot.free();
+ rawRayOrig.free();
+ rawRayDir.free();
+ rawShape.free();
+
+ return result;
+ }
+}
+
+/**
+ * An enumeration representing the type of a shape.
+ */
+export enum ShapeType {
+ Ball = 0,
+ Cuboid = 1,
+ Capsule = 2,
+ Segment = 3,
+ Polyline = 4,
+ Triangle = 5,
+ TriMesh = 6,
+ HeightField = 7,
+ // Compound = 8,
+ ConvexPolygon = 9,
+ RoundCuboid = 10,
+ RoundTriangle = 11,
+ RoundConvexPolygon = 12,
+ HalfSpace = 13,
+ Voxels = 14,
+}
+
+// NOTE: this **must** match the TriMeshFlags on the rust side.
+/**
+ * Flags controlling the behavior of the triangle mesh creation and of some
+ * operations involving triangle meshes.
+ */
+export enum TriMeshFlags {
+ // NOTE: these two flags are not really useful in JS.
+ //
+ // /**
+ // * If set, the half-edge topology of the trimesh will be computed if possible.
+ // */
+ // HALF_EDGE_TOPOLOGY = 0b0000_0001,
+ // /** If set, the half-edge topology and connected components of the trimesh will be computed if possible.
+ // *
+ // * Because of the way it is currently implemented, connected components can only be computed on
+ // * a mesh where the half-edge topology computation succeeds. It will no longer be the case in the
+ // * future once we decouple the computations.
+ // */
+ // CONNECTED_COMPONENTS = 0b0000_0010,
+ /**
+ * If set, any triangle that results in a failing half-hedge topology computation will be deleted.
+ */
+ DELETE_BAD_TOPOLOGY_TRIANGLES = 0b0000_0100,
+ /**
+ * If set, the trimesh will be assumed to be oriented (with outward normals).
+ *
+ * The pseudo-normals of its vertices and edges will be computed.
+ */
+ ORIENTED = 0b0000_1000,
+ /**
+ * If set, the duplicate vertices of the trimesh will be merged.
+ *
+ * Two vertices with the exact same coordinates will share the same entry on the
+ * vertex buffer and the index buffer is adjusted accordingly.
+ */
+ MERGE_DUPLICATE_VERTICES = 0b0001_0000,
+ /**
+ * If set, the triangles sharing two vertices with identical index values will be removed.
+ *
+ * Because of the way it is currently implemented, this methods implies that duplicate
+ * vertices will be merged. It will no longer be the case in the future once we decouple
+ * the computations.
+ */
+ DELETE_DEGENERATE_TRIANGLES = 0b0010_0000,
+ /**
+ * If set, two triangles sharing three vertices with identical index values (in any order)
+ * will be removed.
+ *
+ * Because of the way it is currently implemented, this methods implies that duplicate
+ * vertices will be merged. It will no longer be the case in the future once we decouple
+ * the computations.
+ */
+ DELETE_DUPLICATE_TRIANGLES = 0b0100_0000,
+ /**
+ * If set, a special treatment will be applied to contact manifold calculation to eliminate
+ * or fix contacts normals that could lead to incorrect bumps in physics simulation
+ * (especially on flat surfaces).
+ *
+ * This is achieved by taking into account adjacent triangle normals when computing contact
+ * points for a given triangle.
+ *
+ * /!\ NOT SUPPORTED IN THE 2D VERSION OF RAPIER.
+ */
+ FIX_INTERNAL_EDGES = 0b1000_0000 | TriMeshFlags.MERGE_DUPLICATE_VERTICES,
+}
+
+/**
+ * A shape that is a sphere in 3D and a circle in 2D.
+ */
+export class Ball extends Shape {
+ readonly type = ShapeType.Ball;
+
+ /**
+ * The balls radius.
+ */
+ radius: number;
+
+ /**
+ * Creates a new ball with the given radius.
+ * @param radius - The balls radius.
+ */
+ constructor(radius: number) {
+ super();
+ this.radius = radius;
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.ball(this.radius);
+ }
+}
+
+export class HalfSpace extends Shape {
+ readonly type = ShapeType.HalfSpace;
+
+ /**
+ * The outward normal of the half-space.
+ */
+ normal: Vector;
+
+ /**
+ * Creates a new halfspace delimited by an infinite plane.
+ *
+ * @param normal - The outward normal of the plane.
+ */
+ constructor(normal: Vector) {
+ super();
+ this.normal = normal;
+ }
+
+ public intoRaw(): RawShape {
+ let n = VectorOps.intoRaw(this.normal);
+ let result = RawShape.halfspace(n);
+ n.free();
+ return result;
+ }
+}
+
+/**
+ * A shape that is a box in 3D and a rectangle in 2D.
+ */
+export class Cuboid extends Shape {
+ readonly type = ShapeType.Cuboid;
+
+ /**
+ * The half extent of the cuboid along each coordinate axis.
+ */
+ halfExtents: Vector;
+
+ /**
+ * Creates a new 2D rectangle.
+ * @param hx - The half width of the rectangle.
+ * @param hy - The helf height of the rectangle.
+ */
+ constructor(hx: number, hy: number) {
+ super();
+ this.halfExtents = VectorOps.new(hx, hy);
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.cuboid(this.halfExtents.x, this.halfExtents.y);
+ }
+}
+
+/**
+ * A shape that is a box in 3D and a rectangle in 2D, with round corners.
+ */
+export class RoundCuboid extends Shape {
+ readonly type = ShapeType.RoundCuboid;
+
+ /**
+ * The half extent of the cuboid along each coordinate axis.
+ */
+ halfExtents: Vector;
+
+ /**
+ * The radius of the cuboid's round border.
+ */
+ borderRadius: number;
+
+ /**
+ * Creates a new 2D rectangle.
+ * @param hx - The half width of the rectangle.
+ * @param hy - The helf height of the rectangle.
+ * @param borderRadius - The radius of the borders of this cuboid. This will
+ * effectively increase the half-extents of the cuboid by this radius.
+ */
+ constructor(hx: number, hy: number, borderRadius: number) {
+ super();
+ this.halfExtents = VectorOps.new(hx, hy);
+ this.borderRadius = borderRadius;
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.roundCuboid(this.halfExtents.x, this.halfExtents.y, this.borderRadius);
+ }
+}
+
+/**
+ * A shape that is a capsule.
+ */
+export class Capsule extends Shape {
+ readonly type = ShapeType.Capsule;
+
+ /**
+ * The radius of the capsule's basis.
+ */
+ radius: number;
+
+ /**
+ * The capsule's half height, along the `y` axis.
+ */
+ halfHeight: number;
+
+ /**
+ * Creates a new capsule with the given radius and half-height.
+ * @param halfHeight - The balls half-height along the `y` axis.
+ * @param radius - The balls radius.
+ */
+ constructor(halfHeight: number, radius: number) {
+ super();
+ this.halfHeight = halfHeight;
+ this.radius = radius;
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.capsule(this.halfHeight, this.radius);
+ }
+}
+
+/**
+ * A shape that is a segment.
+ */
+export class Segment extends Shape {
+ readonly type = ShapeType.Segment;
+
+ /**
+ * The first point of the segment.
+ */
+ a: Vector;
+
+ /**
+ * The second point of the segment.
+ */
+ b: Vector;
+
+ /**
+ * Creates a new segment shape.
+ * @param a - The first point of the segment.
+ * @param b - The second point of the segment.
+ */
+ constructor(a: Vector, b: Vector) {
+ super();
+ this.a = a;
+ this.b = b;
+ }
+
+ public intoRaw(): RawShape {
+ let ra = VectorOps.intoRaw(this.a);
+ let rb = VectorOps.intoRaw(this.b);
+ let result = RawShape.segment(ra, rb);
+ ra.free();
+ rb.free();
+ return result;
+ }
+}
+
+/**
+ * A shape that is a segment.
+ */
+export class Triangle extends Shape {
+ readonly type = ShapeType.Triangle;
+
+ /**
+ * The first point of the triangle.
+ */
+ a: Vector;
+
+ /**
+ * The second point of the triangle.
+ */
+ b: Vector;
+
+ /**
+ * The second point of the triangle.
+ */
+ c: Vector;
+
+ /**
+ * Creates a new triangle shape.
+ *
+ * @param a - The first point of the triangle.
+ * @param b - The second point of the triangle.
+ * @param c - The third point of the triangle.
+ */
+ constructor(a: Vector, b: Vector, c: Vector) {
+ super();
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ }
+
+ public intoRaw(): RawShape {
+ let ra = VectorOps.intoRaw(this.a);
+ let rb = VectorOps.intoRaw(this.b);
+ let rc = VectorOps.intoRaw(this.c);
+ let result = RawShape.triangle(ra, rb, rc);
+ ra.free();
+ rb.free();
+ rc.free();
+ return result;
+ }
+}
+
+/**
+ * A shape that is a triangle with round borders and a non-zero thickness.
+ */
+export class RoundTriangle extends Shape {
+ readonly type = ShapeType.RoundTriangle;
+
+ /**
+ * The first point of the triangle.
+ */
+ a: Vector;
+
+ /**
+ * The second point of the triangle.
+ */
+ b: Vector;
+
+ /**
+ * The second point of the triangle.
+ */
+ c: Vector;
+
+ /**
+ * The radius of the triangles's rounded edges and vertices.
+ * In 3D, this is also equal to half the thickness of the round triangle.
+ */
+ borderRadius: number;
+
+ /**
+ * Creates a new triangle shape with round corners.
+ *
+ * @param a - The first point of the triangle.
+ * @param b - The second point of the triangle.
+ * @param c - The third point of the triangle.
+ * @param borderRadius - The radius of the borders of this triangle. In 3D,
+ * this is also equal to half the thickness of the triangle.
+ */
+ constructor(a: Vector, b: Vector, c: Vector, borderRadius: number) {
+ super();
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.borderRadius = borderRadius;
+ }
+
+ public intoRaw(): RawShape {
+ let ra = VectorOps.intoRaw(this.a);
+ let rb = VectorOps.intoRaw(this.b);
+ let rc = VectorOps.intoRaw(this.c);
+ let result = RawShape.roundTriangle(ra, rb, rc, this.borderRadius);
+ ra.free();
+ rb.free();
+ rc.free();
+ return result;
+ }
+}
+
+/**
+ * A shape that is a triangle mesh.
+ */
+export class Polyline extends Shape {
+ readonly type = ShapeType.Polyline;
+
+ /**
+ * The vertices of the polyline.
+ */
+ vertices: Float32Array;
+
+ /**
+ * The indices of the segments.
+ */
+ indices: Uint32Array;
+
+ /**
+ * Creates a new polyline shape.
+ *
+ * @param vertices - The coordinates of the polyline's vertices.
+ * @param indices - The indices of the polyline's segments. If this is `null` or not provided, then
+ * the vertices are assumed to form a line strip.
+ */
+ constructor(vertices: Float32Array, indices?: Uint32Array) {
+ super();
+ this.vertices = vertices;
+ this.indices = indices ?? new Uint32Array(0);
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.polyline(this.vertices, this.indices);
+ }
+}
+
+/**
+ * A shape made of voxels.
+ */
+export class Voxels extends Shape {
+ readonly type = ShapeType.Voxels;
+
+ /**
+ * The points or grid coordinates used to initialize the voxels.
+ */
+ data: Float32Array | Int32Array;
+
+ /**
+ * The dimensions of each voxel.
+ */
+ voxelSize: Vector;
+
+ /**
+ * Creates a new shape made of voxels.
+ *
+ * @param data - Defines the set of voxels. If this is a `Int32Array` then
+ * each voxel is defined from its (signed) grid coordinates,
+ * with 3 (resp 2) contiguous integers per voxel in 3D (resp 2D).
+ * If this is a `Float32Array`, each voxel will be such that
+ * they contain at least one point from this array (where each
+ * point is defined from 3 (resp 2) contiguous numbers per point
+ * in 3D (resp 2D).
+ * @param voxelSize - The size of each voxel.
+ */
+ constructor(data: Float32Array | Int32Array, voxelSize: Vector) {
+ super();
+ this.data = data;
+ this.voxelSize = voxelSize;
+ }
+
+ public intoRaw(): RawShape {
+ let voxelSize = VectorOps.intoRaw(this.voxelSize);
+
+ let result;
+ if (this.data instanceof Int32Array) {
+ result = RawShape.voxels(voxelSize, this.data);
+ } else {
+ result = RawShape.voxelsFromPoints(voxelSize, this.data);
+ }
+
+ voxelSize.free();
+ return result;
+ }
+}
+
+/**
+ * A shape that is a triangle mesh.
+ */
+export class TriMesh extends Shape {
+ readonly type = ShapeType.TriMesh;
+
+ /**
+ * The vertices of the triangle mesh.
+ */
+ vertices: Float32Array;
+
+ /**
+ * The indices of the triangles.
+ */
+ indices: Uint32Array;
+
+ /**
+ * The triangle mesh flags.
+ */
+ flags!: TriMeshFlags;
+
+ /**
+ * Creates a new triangle mesh shape.
+ *
+ * @param vertices - The coordinates of the triangle mesh's vertices.
+ * @param indices - The indices of the triangle mesh's triangles.
+ */
+ constructor(vertices: Float32Array, indices: Uint32Array, flags?: TriMeshFlags) {
+ super();
+ this.vertices = vertices;
+ this.indices = indices;
+ this.flags = flags!;
+ }
+
+ public intoRaw(): RawShape {
+ return RawShape.trimesh(this.vertices, this.indices, this.flags)!;
+ }
+}
+
+/**
+ * A shape that is a convex polygon.
+ */
+export class ConvexPolygon extends Shape {
+ readonly type = ShapeType.ConvexPolygon;
+
+ /**
+ * The vertices of the convex polygon.
+ */
+ vertices: Float32Array;
+
+ /**
+ * Do we want to assume the vertices already form a convex hull?
+ */
+ skipConvexHullComputation: boolean;
+
+ /**
+ * Creates a new convex polygon shape.
+ *
+ * @param vertices - The coordinates of the convex polygon's vertices.
+ * @param skipConvexHullComputation - If set to `true`, the input points will
+ * be assumed to form a convex polyline and no convex-hull computation will
+ * be done automatically.
+ */
+ constructor(vertices: Float32Array, skipConvexHullComputation: boolean) {
+ super();
+ this.vertices = vertices;
+ this.skipConvexHullComputation = !!skipConvexHullComputation;
+ }
+
+ public intoRaw(): RawShape {
+ if (this.skipConvexHullComputation) {
+ return RawShape.convexPolyline(this.vertices)!;
+ } else {
+ return RawShape.convexHull(this.vertices)!;
+ }
+ }
+}
+
+/**
+ * A shape that is a convex polygon.
+ */
+export class RoundConvexPolygon extends Shape {
+ readonly type = ShapeType.RoundConvexPolygon;
+
+ /**
+ * The vertices of the convex polygon.
+ */
+ vertices: Float32Array;
+
+ /**
+ * Do we want to assume the vertices already form a convex hull?
+ */
+ skipConvexHullComputation: boolean;
+
+ /**
+ * The radius of the convex polygon's rounded edges and vertices.
+ */
+ borderRadius: number;
+
+ /**
+ * Creates a new convex polygon shape.
+ *
+ * @param vertices - The coordinates of the convex polygon's vertices.
+ * @param borderRadius - The radius of the borders of this convex polygon.
+ * @param skipConvexHullComputation - If set to `true`, the input points will
+ * be assumed to form a convex polyline and no convex-hull computation will
+ * be done automatically.
+ */
+ constructor(vertices: Float32Array, borderRadius: number, skipConvexHullComputation: boolean) {
+ super();
+ this.vertices = vertices;
+ this.borderRadius = borderRadius;
+ this.skipConvexHullComputation = !!skipConvexHullComputation;
+ }
+
+ public intoRaw(): RawShape {
+ if (this.skipConvexHullComputation) {
+ return RawShape.roundConvexPolyline(this.vertices, this.borderRadius)!;
+ } else {
+ return RawShape.roundConvexHull(this.vertices, this.borderRadius)!;
+ }
+ }
+}
+
+/**
+ * A shape that is a heightfield.
+ */
+export class Heightfield extends Shape {
+ readonly type = ShapeType.HeightField;
+
+ /**
+ * The heights of the heightfield, along its local `y` axis.
+ */
+ heights: Float32Array;
+
+ /**
+ * The heightfield's length along its local `x` axis.
+ */
+ scale: Vector;
+
+ /**
+ * Creates a new heightfield shape.
+ *
+ * @param heights - The heights of the heightfield, along its local `y` axis.
+ * @param scale - The scale factor applied to the heightfield.
+ */
+ constructor(heights: Float32Array, scale: Vector) {
+ super();
+ this.heights = heights;
+ this.scale = scale;
+ }
+
+ public intoRaw(): RawShape {
+ let rawScale = VectorOps.intoRaw(this.scale);
+ let rawShape = RawShape.heightfield(this.heights, rawScale);
+ rawScale.free();
+ return rawShape;
+ }
+}
diff --git a/src.ts/geometry/toi.ts b/packages/rapier-2d/src/geometry/toi.ts
similarity index 80%
rename from src.ts/geometry/toi.ts
rename to packages/rapier-2d/src/geometry/toi.ts
index ade13f17..890362de 100644
--- a/src.ts/geometry/toi.ts
+++ b/packages/rapier-2d/src/geometry/toi.ts
@@ -1,6 +1,6 @@
-import {Collider} from "./collider";
import {Vector, VectorOps} from "../math";
import {RawShapeCastHit, RawColliderShapeCastHit} from "../raw";
+import {Collider} from "./collider";
import {ColliderSet} from "./collider_set";
/**
@@ -47,17 +47,17 @@ export class ShapeCastHit {
}
public static fromRaw(
- colliderSet: ColliderSet,
+ colliderSet: ColliderSet | null,
raw: RawShapeCastHit,
- ): ShapeCastHit {
+ ): ShapeCastHit | null {
if (!raw) return null;
const result = new ShapeCastHit(
raw.time_of_impact(),
- VectorOps.fromRaw(raw.witness1()),
- VectorOps.fromRaw(raw.witness2()),
- VectorOps.fromRaw(raw.normal1()),
- VectorOps.fromRaw(raw.normal2()),
+ VectorOps.fromRaw(raw.witness1())!,
+ VectorOps.fromRaw(raw.witness2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
);
raw.free();
return result;
@@ -88,16 +88,16 @@ export class ColliderShapeCastHit extends ShapeCastHit {
public static fromRaw(
colliderSet: ColliderSet,
raw: RawColliderShapeCastHit,
- ): ColliderShapeCastHit {
+ ): ColliderShapeCastHit | null {
if (!raw) return null;
const result = new ColliderShapeCastHit(
- colliderSet.get(raw.colliderHandle()),
+ colliderSet.get(raw.colliderHandle())!,
raw.time_of_impact(),
- VectorOps.fromRaw(raw.witness1()),
- VectorOps.fromRaw(raw.witness2()),
- VectorOps.fromRaw(raw.normal1()),
- VectorOps.fromRaw(raw.normal2()),
+ VectorOps.fromRaw(raw.witness1())!,
+ VectorOps.fromRaw(raw.witness2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
);
raw.free();
return result;
diff --git a/packages/rapier-2d/src/init-compat-simd.ts b/packages/rapier-2d/src/init-compat-simd.ts
new file mode 100644
index 00000000..c9f67e20
--- /dev/null
+++ b/packages/rapier-2d/src/init-compat-simd.ts
@@ -0,0 +1,13 @@
+import base64 from "base64-js";
+import {initSync} from "../wasm/release-simd/rapier_wasm_2d";
+// @ts-ignore - WASM file imported as base64 string by bundler
+import wasmBase64 from "../wasm/release-simd/rapier_wasm_2d_bg.wasm";
+
+/**
+ * Initializes RAPIER SIMD with embedded WASM (no separate file needed).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init() {
+ const wasmBytes = base64.toByteArray(wasmBase64 as unknown as string);
+ initSync(wasmBytes.buffer);
+}
diff --git a/packages/rapier-2d/src/init-compat.ts b/packages/rapier-2d/src/init-compat.ts
new file mode 100644
index 00000000..d1a16d51
--- /dev/null
+++ b/packages/rapier-2d/src/init-compat.ts
@@ -0,0 +1,13 @@
+import base64 from "base64-js";
+import {initSync} from "../wasm/release/rapier_wasm_2d";
+// @ts-ignore - WASM file imported as base64 string by bundler
+import wasmBase64 from "../wasm/release/rapier_wasm_2d_bg.wasm";
+
+/**
+ * Initializes RAPIER with embedded WASM (no separate file needed).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init() {
+ const wasmBytes = base64.toByteArray(wasmBase64 as unknown as string);
+ initSync(wasmBytes.buffer);
+}
diff --git a/packages/rapier-2d/src/init-simd.ts b/packages/rapier-2d/src/init-simd.ts
new file mode 100644
index 00000000..b7ab66fe
--- /dev/null
+++ b/packages/rapier-2d/src/init-simd.ts
@@ -0,0 +1,12 @@
+import wasmInit, {InitInput} from "../wasm/release-simd/rapier_wasm_2d";
+
+/**
+ * Initializes RAPIER SIMD using fetch (requires WASM file to be served).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init(input?: InitInput) {
+ if (!input) {
+ input = new URL("rapier_wasm_2d_simd_bg.wasm", import.meta.url);
+ }
+ await wasmInit(input);
+}
diff --git a/packages/rapier-2d/src/init.ts b/packages/rapier-2d/src/init.ts
new file mode 100644
index 00000000..7e3c0276
--- /dev/null
+++ b/packages/rapier-2d/src/init.ts
@@ -0,0 +1,12 @@
+import wasmInit, {InitInput} from "../wasm/release/rapier_wasm_2d";
+
+/**
+ * Initializes RAPIER using fetch (requires WASM file to be served).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init(input?: InitInput) {
+ if (!input) {
+ input = new URL("rapier_wasm_2d_bg.wasm", import.meta.url);
+ }
+ await wasmInit(input);
+}
diff --git a/packages/rapier-2d/src/math.ts b/packages/rapier-2d/src/math.ts
new file mode 100644
index 00000000..1cad3f65
--- /dev/null
+++ b/packages/rapier-2d/src/math.ts
@@ -0,0 +1,83 @@
+import {RawVector, RawRotation} from "./raw";
+
+export interface Vector {
+ x: number;
+ y: number;
+}
+
+/**
+ * A 2D vector.
+ */
+export class Vector2 implements Vector {
+ x: number;
+ y: number;
+
+ constructor(x: number, y: number) {
+ this.x = x;
+ this.y = y;
+ }
+}
+
+export class VectorOps {
+ public static new(x: number, y: number): Vector {
+ return new Vector2(x, y);
+ }
+
+ public static zeros(): Vector {
+ return VectorOps.new(0.0, 0.0);
+ }
+
+ // FIXME: type ram: RawVector?
+ public static fromRaw(raw: RawVector, target?: Vector): Vector | null {
+ if (!raw) return null;
+
+ target ??= VectorOps.zeros();
+ target.x = raw.x;
+ target.y = raw.y;
+ raw.free();
+ return target;
+ }
+
+ public static intoRaw(v: Vector): RawVector {
+ return new RawVector(v.x, v.y);
+ }
+
+ public static copy(out: Vector, input: Vector) {
+ out.x = input.x;
+ out.y = input.y;
+ }
+
+ public static fromBuffer(buffer: Float32Array, target?: Vector): Vector {
+ target ??= VectorOps.zeros();
+ target.x = buffer[0];
+ target.y = buffer[1];
+ return target;
+ }
+}
+
+/**
+ * A rotation angle in radians.
+ */
+export type Rotation = number;
+
+export class RotationOps {
+ public static identity(): number {
+ return 0.0;
+ }
+
+ public static fromRaw(raw: RawRotation): Rotation | null {
+ if (!raw) return null;
+
+ let res = raw.angle;
+ raw.free();
+ return res;
+ }
+
+ public static intoRaw(angle: Rotation): RawRotation {
+ return RawRotation.fromAngle(angle);
+ }
+
+ public static fromBuffer(buffer: Float32Array): Rotation {
+ return buffer[0];
+ }
+}
diff --git a/src.ts/pipeline/debug_render_pipeline.ts b/packages/rapier-2d/src/pipeline/debug_render_pipeline.ts
similarity index 80%
rename from src.ts/pipeline/debug_render_pipeline.ts
rename to packages/rapier-2d/src/pipeline/debug_render_pipeline.ts
index bf0d7057..9b42dd67 100644
--- a/src.ts/pipeline/debug_render_pipeline.ts
+++ b/packages/rapier-2d/src/pipeline/debug_render_pipeline.ts
@@ -1,13 +1,6 @@
+import {ImpulseJointSet, MultibodyJointSet, RigidBodySet} from "../dynamics";
+import {Collider, ColliderSet, NarrowPhase} from "../geometry";
import {RawDebugRenderPipeline} from "../raw";
-import {Vector, VectorOps} from "../math";
-import {
- IntegrationParameters,
- IslandManager,
- ImpulseJointSet,
- MultibodyJointSet,
- RigidBodySet,
-} from "../dynamics";
-import {BroadPhase, Collider, ColliderSet, NarrowPhase} from "../geometry";
import {QueryFilterFlags} from "./query_pipeline";
/**
@@ -42,8 +35,8 @@ export class DebugRenderBuffers {
*/
export class DebugRenderPipeline {
raw: RawDebugRenderPipeline;
- public vertices: Float32Array;
- public colors: Float32Array;
+ public vertices!: Float32Array;
+ public colors!: Float32Array;
/**
* Release the WASM memory occupied by this serialization pipeline.
@@ -52,9 +45,9 @@ export class DebugRenderPipeline {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
- this.vertices = undefined;
- this.colors = undefined;
+ this.raw = undefined!;
+ this.vertices = undefined!;
+ this.colors = undefined!;
}
constructor(raw?: RawDebugRenderPipeline) {
@@ -76,8 +69,8 @@ export class DebugRenderPipeline {
impulse_joints.raw,
multibody_joints.raw,
narrow_phase.raw,
- filterFlags,
- colliders.castClosure(filterPredicate),
+ filterFlags ?? 0,
+ colliders.castClosure(filterPredicate) as unknown as Function,
);
this.vertices = this.raw.vertices();
this.colors = this.raw.colors();
diff --git a/packages/rapier-2d/src/pipeline/event_queue.ts b/packages/rapier-2d/src/pipeline/event_queue.ts
new file mode 100644
index 00000000..a08f73a3
--- /dev/null
+++ b/packages/rapier-2d/src/pipeline/event_queue.ts
@@ -0,0 +1,153 @@
+import {ColliderHandle} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {RawContactForceEvent, RawEventQueue} from "../raw";
+
+/**
+ * Flags indicating what events are enabled for colliders.
+ */
+export enum ActiveEvents {
+ NONE = 0,
+ /**
+ * Enable collision events.
+ */
+ COLLISION_EVENTS = 0b0001,
+ /**
+ * Enable contact force events.
+ */
+ CONTACT_FORCE_EVENTS = 0b0010,
+}
+
+/**
+ * Event occurring when the sum of the magnitudes of the
+ * contact forces between two colliders exceed a threshold.
+ *
+ * This object should **not** be stored anywhere. Its properties can only be
+ * read from within the closure given to `EventHandler.drainContactForceEvents`.
+ */
+export class TempContactForceEvent {
+ raw!: RawContactForceEvent;
+
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ /**
+ * The first collider involved in the contact.
+ */
+ public collider1(): ColliderHandle {
+ return this.raw.collider1();
+ }
+
+ /**
+ * The second collider involved in the contact.
+ */
+ public collider2(): ColliderHandle {
+ return this.raw.collider2();
+ }
+
+ /**
+ * The sum of all the forces between the two colliders.
+ */
+ public totalForce(): Vector {
+ return VectorOps.fromRaw(this.raw.total_force()!)!;
+ }
+
+ /**
+ * The sum of the magnitudes of each force between the two colliders.
+ *
+ * Note that this is **not** the same as the magnitude of `self.total_force`.
+ * Here we are summing the magnitude of all the forces, instead of taking
+ * the magnitude of their sum.
+ */
+ public totalForceMagnitude(): number {
+ return this.raw.total_force_magnitude();
+ }
+
+ /**
+ * The world-space (unit) direction of the force with strongest magnitude.
+ */
+ public maxForceDirection(): Vector {
+ return VectorOps.fromRaw(this.raw.max_force_direction()!)!;
+ }
+
+ /**
+ * The magnitude of the largest force at a contact point of this contact pair.
+ */
+ public maxForceMagnitude(): number {
+ return this.raw.max_force_magnitude();
+ }
+}
+
+/**
+ * A structure responsible for collecting events generated
+ * by the physics engine.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `eventQueue.free()`
+ * once you are done using it.
+ */
+export class EventQueue {
+ raw!: RawEventQueue;
+
+ /**
+ * Creates a new event collector.
+ *
+ * @param autoDrain -setting this to `true` is strongly recommended. If true, the collector will
+ * be automatically drained before each `world.step(collector)`. If false, the collector will
+ * keep all events in memory unless it is manually drained/cleared; this may lead to unbounded use of
+ * RAM if no drain is performed.
+ */
+ constructor(autoDrain: boolean, raw?: RawEventQueue) {
+ this.raw = raw || new RawEventQueue(autoDrain);
+ }
+
+ /**
+ * Release the WASM memory occupied by this event-queue.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ /**
+ * Applies the given javascript closure on each collision event of this collector, then clear
+ * the internal collision event buffer.
+ *
+ * @param f - JavaScript closure applied to each collision event. The
+ * closure must take three arguments: two integers representing the handles of the colliders
+ * involved in the collision, and a boolean indicating if the collision started (true) or stopped
+ * (false).
+ */
+ public drainCollisionEvents(
+ f: (handle1: ColliderHandle, handle2: ColliderHandle, started: boolean) => void,
+ ) {
+ this.raw.drainCollisionEvents(f);
+ }
+
+ /**
+ * Applies the given javascript closure on each contact force event of this collector, then clear
+ * the internal collision event buffer.
+ *
+ * @param f - JavaScript closure applied to each collision event. The
+ * closure must take one `TempContactForceEvent` argument.
+ */
+ public drainContactForceEvents(f: (event: TempContactForceEvent) => void) {
+ let event = new TempContactForceEvent();
+ this.raw.drainContactForceEvents((raw: RawContactForceEvent) => {
+ event.raw = raw;
+ f(event);
+ event.free();
+ });
+ }
+
+ /**
+ * Removes all events contained by this collector
+ */
+ public clear() {
+ this.raw.clear();
+ }
+}
diff --git a/src.ts/pipeline/index.ts b/packages/rapier-2d/src/pipeline/index.ts
similarity index 100%
rename from src.ts/pipeline/index.ts
rename to packages/rapier-2d/src/pipeline/index.ts
diff --git a/src.ts/pipeline/physics_hooks.ts b/packages/rapier-2d/src/pipeline/physics_hooks.ts
similarity index 100%
rename from src.ts/pipeline/physics_hooks.ts
rename to packages/rapier-2d/src/pipeline/physics_hooks.ts
diff --git a/src.ts/pipeline/physics_pipeline.ts b/packages/rapier-2d/src/pipeline/physics_pipeline.ts
similarity index 65%
rename from src.ts/pipeline/physics_pipeline.ts
rename to packages/rapier-2d/src/pipeline/physics_pipeline.ts
index a3319205..f6a50b5a 100644
--- a/src.ts/pipeline/physics_pipeline.ts
+++ b/packages/rapier-2d/src/pipeline/physics_pipeline.ts
@@ -1,31 +1,32 @@
-import {RawPhysicsPipeline} from "../raw";
-import {Vector, VectorOps} from "../math";
import {
IntegrationParameters,
ImpulseJointSet,
MultibodyJointSet,
- RigidBodyHandle,
RigidBodySet,
CCDSolver,
IslandManager,
} from "../dynamics";
-import {
- BroadPhase,
- ColliderHandle,
- ColliderSet,
- NarrowPhase,
-} from "../geometry";
+import {BroadPhase, ColliderSet, NarrowPhase} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {RawPhysicsPipeline, RawVector} from "../raw";
import {EventQueue} from "./event_queue";
import {PhysicsHooks} from "./physics_hooks";
export class PhysicsPipeline {
raw: RawPhysicsPipeline;
+ private cachedGravity: RawVector | null = null;
+ private lastGravityX = 0;
+ private lastGravityY = 0;
public free() {
+ if (this.cachedGravity) {
+ this.cachedGravity.free();
+ this.cachedGravity = null;
+ }
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawPhysicsPipeline) {
@@ -46,11 +47,20 @@ export class PhysicsPipeline {
eventQueue?: EventQueue,
hooks?: PhysicsHooks,
) {
- let rawG = VectorOps.intoRaw(gravity);
+ if (
+ !this.cachedGravity ||
+ gravity.x !== this.lastGravityX ||
+ gravity.y !== this.lastGravityY
+ ) {
+ this.cachedGravity?.free();
+ this.cachedGravity = VectorOps.intoRaw(gravity);
+ this.lastGravityX = gravity.x;
+ this.lastGravityY = gravity.y;
+ }
if (!!eventQueue) {
this.raw.stepWithEvents(
- rawG,
+ this.cachedGravity,
integrationParameters.raw,
islands.raw,
broadPhase.raw,
@@ -61,13 +71,13 @@ export class PhysicsPipeline {
multibodyJoints.raw,
ccdSolver.raw,
eventQueue.raw,
- hooks,
- !!hooks ? hooks.filterContactPair : null,
- !!hooks ? hooks.filterIntersectionPair : null,
+ hooks as object,
+ hooks?.filterContactPair as Function,
+ hooks?.filterIntersectionPair as Function,
);
} else {
this.raw.step(
- rawG,
+ this.cachedGravity,
integrationParameters.raw,
islands.raw,
broadPhase.raw,
@@ -79,7 +89,5 @@ export class PhysicsPipeline {
ccdSolver.raw,
);
}
-
- rawG.free();
}
}
diff --git a/src.ts/pipeline/query_pipeline.ts b/packages/rapier-2d/src/pipeline/query_pipeline.ts
similarity index 62%
rename from src.ts/pipeline/query_pipeline.ts
rename to packages/rapier-2d/src/pipeline/query_pipeline.ts
index 5610ff31..dc4b1204 100644
--- a/src.ts/pipeline/query_pipeline.ts
+++ b/packages/rapier-2d/src/pipeline/query_pipeline.ts
@@ -1,17 +1,4 @@
-import {RawRayColliderIntersection} from "../raw";
-import {
- ColliderHandle,
- ColliderSet,
- InteractionGroups,
- PointColliderProjection,
- Ray,
- RayColliderIntersection,
- RayColliderHit,
- Shape,
- ColliderShapeCastHit,
-} from "../geometry";
-import {IslandManager, RigidBodyHandle, RigidBodySet} from "../dynamics";
-import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+// NOTE: must match the bits in the QueryFilterFlags on the Rust side.
// NOTE: must match the bits in the QueryFilterFlags on the Rust side.
/**
@@ -41,17 +28,14 @@ export enum QueryFilterFlags {
/**
* Excludes all colliders not attached to a dynamic rigid-body.
*/
- ONLY_DYNAMIC = QueryFilterFlags.EXCLUDE_FIXED |
- QueryFilterFlags.EXCLUDE_KINEMATIC,
+ ONLY_DYNAMIC = QueryFilterFlags.EXCLUDE_FIXED | QueryFilterFlags.EXCLUDE_KINEMATIC,
/**
* Excludes all colliders not attached to a kinematic rigid-body.
*/
- ONLY_KINEMATIC = QueryFilterFlags.EXCLUDE_DYNAMIC |
- QueryFilterFlags.EXCLUDE_FIXED,
+ ONLY_KINEMATIC = QueryFilterFlags.EXCLUDE_DYNAMIC | QueryFilterFlags.EXCLUDE_FIXED,
/**
* Exclude all colliders attached to a non-fixed rigid-body
* (this will not exclude colliders not attached to any rigid-body).
*/
- ONLY_FIXED = QueryFilterFlags.EXCLUDE_DYNAMIC |
- QueryFilterFlags.EXCLUDE_KINEMATIC,
+ ONLY_FIXED = QueryFilterFlags.EXCLUDE_DYNAMIC | QueryFilterFlags.EXCLUDE_KINEMATIC,
}
diff --git a/src.ts/pipeline/serialization_pipeline.ts b/packages/rapier-2d/src/pipeline/serialization_pipeline.ts
similarity index 95%
rename from src.ts/pipeline/serialization_pipeline.ts
rename to packages/rapier-2d/src/pipeline/serialization_pipeline.ts
index 87fde398..dd7ab11a 100644
--- a/src.ts/pipeline/serialization_pipeline.ts
+++ b/packages/rapier-2d/src/pipeline/serialization_pipeline.ts
@@ -1,5 +1,3 @@
-import {RawSerializationPipeline} from "../raw";
-import {Vector, VectorOps} from "../math";
import {
IntegrationParameters,
IslandManager,
@@ -8,6 +6,8 @@ import {
RigidBodySet,
} from "../dynamics";
import {BroadPhase, ColliderSet, NarrowPhase} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {RawSerializationPipeline} from "../raw";
import {World} from "./world";
/**
@@ -26,7 +26,7 @@ export class SerializationPipeline {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawSerializationPipeline) {
@@ -70,7 +70,7 @@ export class SerializationPipeline {
);
rawGra.free();
- return res;
+ return res!;
}
/**
@@ -79,6 +79,6 @@ export class SerializationPipeline {
* @param data - The byte array to deserialize.
*/
public deserializeAll(data: Uint8Array): World {
- return World.fromRaw(this.raw.deserializeAll(data));
+ return World.fromRaw(this.raw.deserializeAll(data)!)!;
}
}
diff --git a/packages/rapier-2d/src/pipeline/world.ts b/packages/rapier-2d/src/pipeline/world.ts
new file mode 100644
index 00000000..8b0ec4c1
--- /dev/null
+++ b/packages/rapier-2d/src/pipeline/world.ts
@@ -0,0 +1,1213 @@
+import {KinematicCharacterController, PidAxesMask, PidController} from "../control";
+import {
+ CCDSolver,
+ IntegrationParameters,
+ IslandManager,
+ ImpulseJoint,
+ ImpulseJointHandle,
+ MultibodyJoint,
+ MultibodyJointHandle,
+ JointData,
+ ImpulseJointSet,
+ MultibodyJointSet,
+ RigidBody,
+ RigidBodyDesc,
+ RigidBodyHandle,
+ RigidBodySet,
+} from "../dynamics";
+import {
+ BroadPhase,
+ Collider,
+ ColliderDesc,
+ ColliderHandle,
+ ColliderSet,
+ InteractionGroups,
+ NarrowPhase,
+ PointColliderProjection,
+ Ray,
+ RayColliderIntersection,
+ RayColliderHit,
+ Shape,
+ ColliderShapeCastHit,
+ TempContactManifold,
+} from "../geometry";
+import {Rotation, Vector, VectorOps} from "../math";
+import {
+ RawBroadPhase,
+ RawCCDSolver,
+ RawColliderSet,
+ RawDeserializedWorld,
+ RawIntegrationParameters,
+ RawIslandManager,
+ RawImpulseJointSet,
+ RawMultibodyJointSet,
+ RawNarrowPhase,
+ RawPhysicsPipeline,
+ RawRigidBodySet,
+ RawSerializationPipeline,
+ RawDebugRenderPipeline,
+} from "../raw";
+import {DebugRenderBuffers, DebugRenderPipeline} from "./debug_render_pipeline";
+import {EventQueue} from "./event_queue";
+import {PhysicsHooks} from "./physics_hooks";
+import {PhysicsPipeline} from "./physics_pipeline";
+import {QueryFilterFlags} from "./query_pipeline";
+import {SerializationPipeline} from "./serialization_pipeline";
+
+/**
+ * The physics world.
+ *
+ * This contains all the data-structures necessary for creating and simulating
+ * bodies with contacts, joints, and external forces.
+ */
+export class World {
+ public gravity: Vector;
+ integrationParameters: IntegrationParameters;
+ islands: IslandManager;
+ broadPhase: BroadPhase;
+ narrowPhase: NarrowPhase;
+ bodies: RigidBodySet;
+ colliders: ColliderSet;
+ impulseJoints: ImpulseJointSet;
+ multibodyJoints: MultibodyJointSet;
+ ccdSolver: CCDSolver;
+ physicsPipeline: PhysicsPipeline;
+ serializationPipeline: SerializationPipeline;
+ debugRenderPipeline: DebugRenderPipeline;
+ characterControllers: Set;
+ pidControllers: Set;
+
+ /**
+ * Release the WASM memory occupied by this physics world.
+ *
+ * All the fields of this physics world will be freed as well,
+ * so there is no need to call their `.free()` methods individually.
+ */
+ public free() {
+ this.integrationParameters.free();
+ this.islands.free();
+ this.broadPhase.free();
+ this.narrowPhase.free();
+ this.bodies.free();
+ this.colliders.free();
+ this.impulseJoints.free();
+ this.multibodyJoints.free();
+ this.ccdSolver.free();
+ this.physicsPipeline.free();
+ this.serializationPipeline.free();
+ this.debugRenderPipeline.free();
+ this.characterControllers.forEach((controller) => controller.free());
+ this.pidControllers.forEach((controller) => controller.free());
+
+ this.integrationParameters = undefined!;
+ this.islands = undefined!;
+ this.broadPhase = undefined!;
+ this.narrowPhase = undefined!;
+ this.bodies = undefined!;
+ this.colliders = undefined!;
+ this.ccdSolver = undefined!;
+ this.impulseJoints = undefined!;
+ this.multibodyJoints = undefined!;
+ this.physicsPipeline = undefined!;
+ this.serializationPipeline = undefined!;
+ this.debugRenderPipeline = undefined!;
+ this.characterControllers = undefined!;
+ this.pidControllers = undefined!;
+ }
+
+ constructor(
+ gravity: Vector,
+ rawIntegrationParameters?: RawIntegrationParameters,
+ rawIslands?: RawIslandManager,
+ rawBroadPhase?: RawBroadPhase,
+ rawNarrowPhase?: RawNarrowPhase,
+ rawBodies?: RawRigidBodySet,
+ rawColliders?: RawColliderSet,
+ rawImpulseJoints?: RawImpulseJointSet,
+ rawMultibodyJoints?: RawMultibodyJointSet,
+ rawCCDSolver?: RawCCDSolver,
+ rawPhysicsPipeline?: RawPhysicsPipeline,
+ rawSerializationPipeline?: RawSerializationPipeline,
+ rawDebugRenderPipeline?: RawDebugRenderPipeline,
+ ) {
+ this.gravity = gravity;
+ this.integrationParameters = new IntegrationParameters(rawIntegrationParameters);
+ this.islands = new IslandManager(rawIslands);
+ this.broadPhase = new BroadPhase(rawBroadPhase);
+ this.narrowPhase = new NarrowPhase(rawNarrowPhase);
+ this.bodies = new RigidBodySet(rawBodies);
+ this.colliders = new ColliderSet(rawColliders);
+ this.impulseJoints = new ImpulseJointSet(rawImpulseJoints);
+ this.multibodyJoints = new MultibodyJointSet(rawMultibodyJoints);
+ this.ccdSolver = new CCDSolver(rawCCDSolver);
+ this.physicsPipeline = new PhysicsPipeline(rawPhysicsPipeline);
+ this.serializationPipeline = new SerializationPipeline(rawSerializationPipeline);
+ this.debugRenderPipeline = new DebugRenderPipeline(rawDebugRenderPipeline);
+ this.characterControllers = new Set();
+ this.pidControllers = new Set();
+
+ this.impulseJoints.finalizeDeserialization(this.bodies);
+ this.bodies.finalizeDeserialization(this.colliders);
+ this.colliders.finalizeDeserialization(this.bodies);
+ }
+
+ public static fromRaw(raw: RawDeserializedWorld): World | null {
+ if (!raw) return null;
+
+ return new World(
+ VectorOps.fromRaw(raw.takeGravity()!)!,
+ raw.takeIntegrationParameters(),
+ raw.takeIslandManager(),
+ raw.takeBroadPhase(),
+ raw.takeNarrowPhase(),
+ raw.takeBodies(),
+ raw.takeColliders(),
+ raw.takeImpulseJoints(),
+ raw.takeMultibodyJoints(),
+ );
+ }
+
+ /**
+ * Takes a snapshot of this world.
+ *
+ * Use `World.restoreSnapshot` to create a new physics world with a state identical to
+ * the state when `.takeSnapshot()` is called.
+ */
+ public takeSnapshot(): Uint8Array {
+ return this.serializationPipeline.serializeAll(
+ this.gravity,
+ this.integrationParameters,
+ this.islands,
+ this.broadPhase,
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ this.impulseJoints,
+ this.multibodyJoints,
+ );
+ }
+
+ /**
+ * Creates a new physics world from a snapshot.
+ *
+ * This new physics world will be an identical copy of the snapshoted physics world.
+ */
+ public static restoreSnapshot(data: Uint8Array): World {
+ let deser = new SerializationPipeline();
+ return deser.deserializeAll(data);
+ }
+
+ /**
+ * Computes all the lines (and their colors) needed to render the scene.
+ *
+ * @param filterFlags - Flags for excluding whole subsets of colliders from rendering.
+ * @param filterPredicate - Any collider for which this closure returns `false` will be excluded from the
+ * debug rendering.
+ */
+ public debugRender(
+ filterFlags?: QueryFilterFlags,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): DebugRenderBuffers {
+ this.debugRenderPipeline.render(
+ this.bodies,
+ this.colliders,
+ this.impulseJoints,
+ this.multibodyJoints,
+ this.narrowPhase,
+ filterFlags,
+ filterPredicate,
+ );
+ return new DebugRenderBuffers(
+ this.debugRenderPipeline.vertices,
+ this.debugRenderPipeline.colors,
+ );
+ }
+
+ /**
+ * Advance the simulation by one time step.
+ *
+ * All events generated by the physics engine are ignored.
+ *
+ * @param EventQueue - (optional) structure responsible for collecting
+ * events generated by the physics engine.
+ */
+ public step(eventQueue?: EventQueue, hooks?: PhysicsHooks) {
+ this.physicsPipeline.step(
+ this.gravity,
+ this.integrationParameters,
+ this.islands,
+ this.broadPhase,
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ this.impulseJoints,
+ this.multibodyJoints,
+ this.ccdSolver,
+ eventQueue,
+ hooks,
+ );
+ }
+
+ /**
+ * Update colliders positions after rigid-bodies moved.
+ *
+ * When a rigid-body moves, the positions of the colliders attached to it need to be updated. This update is
+ * generally automatically done at the beginning and the end of each simulation step with World.step.
+ * If the positions need to be updated without running a simulation step this method can be called manually.
+ */
+ public propagateModifiedBodyPositionsToColliders() {
+ this.bodies.raw.propagateModifiedBodyPositionsToColliders(this.colliders.raw);
+ }
+
+ // TODO: This needs to trigger a broad-phase update but without emitting collision events?
+ // /**
+ // * Ensure subsequent scene queries take into account the collider positions set before this method is called.
+ // *
+ // * This does not step the physics simulation forward.
+ // */
+ // public updateSceneQueries() {
+ // this.propagateModifiedBodyPositionsToColliders();
+ // this.queryPipeline.update(this.colliders);
+ // }
+
+ /**
+ * The current simulation timestep.
+ */
+ get timestep(): number {
+ return this.integrationParameters.dt;
+ }
+
+ /**
+ * Sets the new simulation timestep.
+ *
+ * The simulation timestep governs by how much the physics state of the world will
+ * be integrated. A simulation timestep should:
+ * - be as small as possible. Typical values evolve around 0.016 (assuming the chosen unit is milliseconds,
+ * corresponds to the time between two frames of a game running at 60FPS).
+ * - not vary too much during the course of the simulation. A timestep with large variations may
+ * cause instabilities in the simulation.
+ *
+ * @param dt - The timestep length, in seconds.
+ */
+ set timestep(dt: number) {
+ this.integrationParameters.dt = dt;
+ }
+
+ /**
+ * The approximate size of most dynamic objects in the scene.
+ *
+ * See the documentation of the `World.lengthUnit` setter for further details.
+ */
+ get lengthUnit(): number {
+ return this.integrationParameters.lengthUnit;
+ }
+
+ /**
+ * The approximate size of most dynamic objects in the scene.
+ *
+ * This value is used internally to estimate some length-based tolerance. In particular, the
+ * values `IntegrationParameters.allowedLinearError`,
+ * `IntegrationParameters.maxPenetrationCorrection`,
+ * `IntegrationParameters.predictionDistance`, `RigidBodyActivation.linearThreshold`
+ * are scaled by this value implicitly.
+ *
+ * This value can be understood as the number of units-per-meter in your physical world compared
+ * to a human-sized world in meter. For example, in a 2d game, if your typical object size is 100
+ * pixels, set the `[`Self::length_unit`]` parameter to 100.0. The physics engine will interpret
+ * it as if 100 pixels is equivalent to 1 meter in its various internal threshold.
+ * (default `1.0`).
+ */
+ set lengthUnit(unitsPerMeter: number) {
+ this.integrationParameters.lengthUnit = unitsPerMeter;
+ }
+
+ /**
+ * The number of solver iterations run by the constraints solver for calculating forces (default: `4`).
+ */
+ get numSolverIterations(): number {
+ return this.integrationParameters.numSolverIterations;
+ }
+
+ /**
+ * Sets the number of solver iterations run by the constraints solver for calculating forces (default: `4`).
+ *
+ * The greater this value is, the most rigid and realistic the physics simulation will be.
+ * However a greater number of iterations is more computationally intensive.
+ *
+ * @param niter - The new number of solver iterations.
+ */
+ set numSolverIterations(niter: number) {
+ this.integrationParameters.numSolverIterations = niter;
+ }
+
+ /**
+ * Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).
+ */
+ get numInternalPgsIterations(): number {
+ return this.integrationParameters.numInternalPgsIterations;
+ }
+
+ /**
+ * Sets the Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).
+ *
+ * Increasing this parameter will improve stability of the simulation. It will have a lesser effect than
+ * increasing `numSolverIterations` but is also less computationally expensive.
+ *
+ * @param niter - The new number of internal PGS iterations.
+ */
+ set numInternalPgsIterations(niter: number) {
+ this.integrationParameters.numInternalPgsIterations = niter;
+ }
+
+ /**
+ * The number of substeps continuous collision-detection can run (default: `1`).
+ */
+ get maxCcdSubsteps(): number {
+ return this.integrationParameters.maxCcdSubsteps;
+ }
+
+ /**
+ * Sets the number of substeps continuous collision-detection can run (default: `1`).
+ *
+ * CCD operates using a "motion clamping" mechanism where all fast-moving object trajectories will
+ * be truncated to their first impact on their path. The number of CCD substeps beyond 1 indicate how
+ * many times that trajectory will be updated and continued after a hit. This can results in smoother
+ * paths, but at a significant computational cost.
+ *
+ * @param niter - The new maximum number of CCD substeps. Setting to `0` disables CCD entirely.
+ */
+ set maxCcdSubsteps(substeps: number) {
+ this.integrationParameters.maxCcdSubsteps = substeps;
+ }
+
+ /**
+ * Creates a new rigid-body from the given rigid-body descriptor.
+ *
+ * @param body - The description of the rigid-body to create.
+ */
+ public createRigidBody(body: RigidBodyDesc): RigidBody {
+ return this.bodies.createRigidBody(this.colliders, body);
+ }
+
+ /**
+ * Creates a new character controller.
+ *
+ * @param offset - The artificial gap added between the character’s chape and its environment.
+ */
+ public createCharacterController(offset: number): KinematicCharacterController {
+ let controller = new KinematicCharacterController(
+ offset,
+ this.integrationParameters,
+ this.broadPhase,
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ );
+ this.characterControllers.add(controller);
+ return controller;
+ }
+
+ /**
+ * Removes a character controller from this world.
+ *
+ * @param controller - The character controller to remove.
+ */
+ public removeCharacterController(controller: KinematicCharacterController) {
+ this.characterControllers.delete(controller);
+ controller.free();
+ }
+
+ /**
+ * Creates a new PID (Proportional-Integral-Derivative) controller.
+ *
+ * @param kp - The Proportional gain applied to the instantaneous linear position errors.
+ * This is usually set to a multiple of the inverse of simulation step time
+ * (e.g. `60` if the delta-time is `1.0 / 60.0`).
+ * @param ki - The linear gain applied to the Integral part of the PID controller.
+ * @param kd - The Derivative gain applied to the instantaneous linear velocity errors.
+ * This is usually set to a value in `[0.0, 1.0]` where `0.0` implies no damping
+ * (no correction of velocity errors) and `1.0` implies complete damping (velocity errors
+ * are corrected in a single simulation step).
+ * @param axes - The axes affected by this controller.
+ * Only coordinate axes with a bit flags set to `true` will be taken into
+ * account when calculating the errors and corrections.
+ */
+ public createPidController(
+ kp: number,
+ ki: number,
+ kd: number,
+ axes: PidAxesMask,
+ ): PidController {
+ let controller = new PidController(
+ this.integrationParameters,
+ this.bodies,
+ kp,
+ ki,
+ kd,
+ axes,
+ );
+ this.pidControllers.add(controller);
+ return controller;
+ }
+
+ /**
+ * Removes a PID controller from this world.
+ *
+ * @param controller - The PID controller to remove.
+ */
+ public removePidController(controller: PidController) {
+ this.pidControllers.delete(controller);
+ controller.free();
+ }
+
+ /**
+ * Creates a new collider.
+ *
+ * @param desc - The description of the collider.
+ * @param parent - The rigid-body this collider is attached to.
+ */
+ public createCollider(desc: ColliderDesc, parent?: RigidBody): Collider {
+ let parentHandle = parent ? parent.handle : undefined!;
+ return this.colliders.createCollider(this.bodies, desc, parentHandle);
+ }
+
+ /**
+ * Creates a new impulse joint from the given joint descriptor.
+ *
+ * @param params - The description of the joint to create.
+ * @param parent1 - The first rigid-body attached to this joint.
+ * @param parent2 - The second rigid-body attached to this joint.
+ * @param wakeUp - Should the attached rigid-bodies be awakened?
+ */
+ public createImpulseJoint(
+ params: JointData,
+ parent1: RigidBody,
+ parent2: RigidBody,
+ wakeUp: boolean,
+ ): ImpulseJoint {
+ return this.impulseJoints.createJoint(
+ this.bodies,
+ params,
+ parent1.handle,
+ parent2.handle,
+ wakeUp,
+ );
+ }
+
+ /**
+ * Creates a new multibody joint from the given joint descriptor.
+ *
+ * @param params - The description of the joint to create.
+ * @param parent1 - The first rigid-body attached to this joint.
+ * @param parent2 - The second rigid-body attached to this joint.
+ * @param wakeUp - Should the attached rigid-bodies be awakened?
+ */
+ public createMultibodyJoint(
+ params: JointData,
+ parent1: RigidBody,
+ parent2: RigidBody,
+ wakeUp: boolean,
+ ): MultibodyJoint {
+ return this.multibodyJoints.createJoint(params, parent1.handle, parent2.handle, wakeUp);
+ }
+
+ /**
+ * Retrieves a rigid-body from its handle.
+ *
+ * @param handle - The integer handle of the rigid-body to retrieve.
+ */
+ public getRigidBody(handle: RigidBodyHandle): RigidBody | null {
+ return this.bodies.get(handle);
+ }
+
+ /**
+ * Retrieves a collider from its handle.
+ *
+ * @param handle - The integer handle of the collider to retrieve.
+ */
+ public getCollider(handle: ColliderHandle): Collider | null {
+ return this.colliders.get(handle);
+ }
+
+ /**
+ * Retrieves an impulse joint from its handle.
+ *
+ * @param handle - The integer handle of the impulse joint to retrieve.
+ */
+ public getImpulseJoint(handle: ImpulseJointHandle): ImpulseJoint | null {
+ return this.impulseJoints.get(handle);
+ }
+
+ /**
+ * Retrieves an multibody joint from its handle.
+ *
+ * @param handle - The integer handle of the multibody joint to retrieve.
+ */
+ public getMultibodyJoint(handle: MultibodyJointHandle): MultibodyJoint | null {
+ return this.multibodyJoints.get(handle);
+ }
+
+ /**
+ * Removes the given rigid-body from this physics world.
+ *
+ * This will remove this rigid-body as well as all its attached colliders and joints.
+ * Every other bodies touching or attached by joints to this rigid-body will be woken-up.
+ *
+ * @param body - The rigid-body to remove.
+ */
+ public removeRigidBody(body: RigidBody) {
+ if (this.bodies) {
+ this.bodies.remove(
+ body.handle,
+ this.islands,
+ this.colliders,
+ this.impulseJoints,
+ this.multibodyJoints,
+ );
+ }
+ }
+
+ /**
+ * Removes the given collider from this physics world.
+ *
+ * @param collider - The collider to remove.
+ * @param wakeUp - If set to `true`, the rigid-body this collider is attached to will be awaken.
+ */
+ public removeCollider(collider: Collider, wakeUp: boolean) {
+ if (this.colliders) {
+ this.colliders.remove(collider.handle, this.islands, this.bodies, wakeUp);
+ }
+ }
+
+ /**
+ * Removes the given impulse joint from this physics world.
+ *
+ * @param joint - The impulse joint to remove.
+ * @param wakeUp - If set to `true`, the rigid-bodies attached by this joint will be awaken.
+ */
+ public removeImpulseJoint(joint: ImpulseJoint, wakeUp: boolean) {
+ if (this.impulseJoints) {
+ this.impulseJoints.remove(joint.handle, wakeUp);
+ }
+ }
+
+ /**
+ * Removes the given multibody joint from this physics world.
+ *
+ * @param joint - The multibody joint to remove.
+ * @param wakeUp - If set to `true`, the rigid-bodies attached by this joint will be awaken.
+ */
+ public removeMultibodyJoint(joint: MultibodyJoint, wakeUp: boolean) {
+ if (this.impulseJoints) {
+ this.multibodyJoints.remove(joint.handle, wakeUp);
+ }
+ }
+
+ /**
+ * Applies the given closure to each collider managed by this physics world.
+ *
+ * @param f(collider) - The function to apply to each collider managed by this physics world. Called as `f(collider)`.
+ */
+ public forEachCollider(f: (collider: Collider) => void) {
+ this.colliders.forEach(f);
+ }
+
+ /**
+ * Applies the given closure to each rigid-body managed by this physics world.
+ *
+ * @param f(body) - The function to apply to each rigid-body managed by this physics world. Called as `f(collider)`.
+ */
+ public forEachRigidBody(f: (body: RigidBody) => void) {
+ this.bodies.forEach(f);
+ }
+
+ /**
+ * Applies the given closure to each active rigid-body managed by this physics world.
+ *
+ * After a short time of inactivity, a rigid-body is automatically deactivated ("asleep") by
+ * the physics engine in order to save computational power. A sleeping rigid-body never moves
+ * unless it is moved manually by the user.
+ *
+ * @param f - The function to apply to each active rigid-body managed by this physics world. Called as `f(collider)`.
+ */
+ public forEachActiveRigidBody(f: (body: RigidBody) => void) {
+ this.bodies.forEachActiveRigidBody(this.islands, f);
+ }
+
+ /**
+ * Find the closest intersection between a ray and the physics world.
+ *
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ * @param filter - The callback to filter out which collider will be hit.
+ */
+ public castRay(
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): RayColliderHit | null {
+ return this.broadPhase.castRay(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ ray,
+ maxToi,
+ solid,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Find the closest intersection between a ray and the physics world.
+ *
+ * This also computes the normal at the hit point.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ */
+ public castRayAndGetNormal(
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): RayColliderIntersection | null {
+ return this.broadPhase.castRayAndGetNormal(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ ray,
+ maxToi,
+ solid,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Cast a ray and collects all the intersections between a ray and the scene.
+ *
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ * @param callback - The callback called once per hit (in no particular order) between a ray and a collider.
+ * If this callback returns `false`, then the cast will stop and no further hits will be detected/reported.
+ */
+ public intersectionsWithRay(
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ callback: (intersect: RayColliderIntersection) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ) {
+ this.broadPhase.intersectionsWithRay(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ ray,
+ maxToi,
+ solid,
+ callback,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Gets the handle of up to one collider intersecting the given shape.
+ *
+ * @param shapePos - The position of the shape used for the intersection test.
+ * @param shapeRot - The orientation of the shape used for the intersection test.
+ * @param shape - The shape used for the intersection test.
+ * @param groups - The bit groups and filter associated to the ray, in order to only
+ * hit the colliders with collision groups compatible with the ray's group.
+ */
+ public intersectionWithShape(
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shape: Shape,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): Collider | null {
+ let handle = this.broadPhase.intersectionWithShape(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ shapePos,
+ shapeRot,
+ shape,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ return handle != null ? this.colliders.get(handle) : null;
+ }
+
+ /**
+ * Find the projection of a point on the closest collider.
+ *
+ * @param point - The point to project.
+ * @param solid - If this is set to `true` then the collider shapes are considered to
+ * be plain (if the point is located inside of a plain shape, its projection is the point
+ * itself). If it is set to `false` the collider shapes are considered to be hollow
+ * (if the point is located inside of an hollow shape, it is projected on the shape's
+ * boundary).
+ * @param groups - The bit groups and filter associated to the point to project, in order to only
+ * project on colliders with collision groups compatible with the ray's group.
+ */
+ public projectPoint(
+ point: Vector,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): PointColliderProjection | null {
+ return this.broadPhase.projectPoint(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ point,
+ solid,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Find the projection of a point on the closest collider.
+ *
+ * @param point - The point to project.
+ * @param groups - The bit groups and filter associated to the point to project, in order to only
+ * project on colliders with collision groups compatible with the ray's group.
+ */
+ public projectPointAndGetFeature(
+ point: Vector,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): PointColliderProjection | null {
+ return this.broadPhase.projectPointAndGetFeature(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ point,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Find all the colliders containing the given point.
+ *
+ * @param point - The point used for the containment test.
+ * @param groups - The bit groups and filter associated to the point to test, in order to only
+ * test on colliders with collision groups compatible with the ray's group.
+ * @param callback - A function called with the handles of each collider with a shape
+ * containing the `point`.
+ */
+ public intersectionsWithPoint(
+ point: Vector,
+ callback: (handle: Collider) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ) {
+ this.broadPhase.intersectionsWithPoint(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ point,
+ this.colliders.castClosure(callback)!,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Casts a shape at a constant linear velocity and retrieve the first collider it hits.
+ * This is similar to ray-casting except that we are casting a whole shape instead of
+ * just a point (the ray origin).
+ *
+ * @param shapePos - The initial position of the shape to cast.
+ * @param shapeRot - The initial rotation of the shape to cast.
+ * @param shapeVel - The constant velocity of the shape to cast (i.e. the cast direction).
+ * @param shape - The shape to cast.
+ * @param targetDistance − If the shape moves closer to this distance from a collider, a hit
+ * will be returned.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.
+ * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if
+ * the shape is penetrating another shape at its starting point **and** its trajectory is such
+ * that it’s on a path to exit that penetration state.
+ * @param groups - The bit groups and filter associated to the shape to cast, in order to only
+ * test on colliders with collision groups compatible with this group.
+ */
+ public castShape(
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shapeVel: Vector,
+ shape: Shape,
+ targetDistance: number,
+ maxToi: number,
+ stopAtPenetration: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ): ColliderShapeCastHit | null {
+ return this.broadPhase.castShape(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ shapePos,
+ shapeRot,
+ shapeVel,
+ shape,
+ targetDistance,
+ maxToi,
+ stopAtPenetration,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Retrieve all the colliders intersecting the given shape.
+ *
+ * @param shapePos - The position of the shape to test.
+ * @param shapeRot - The orientation of the shape to test.
+ * @param shape - The shape to test.
+ * @param groups - The bit groups and filter associated to the shape to test, in order to only
+ * test on colliders with collision groups compatible with this group.
+ * @param callback - A function called with the handles of each collider intersecting the `shape`.
+ */
+ public intersectionsWithShape(
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shape: Shape,
+ callback: (collider: Collider) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: Collider,
+ filterExcludeRigidBody?: RigidBody,
+ filterPredicate?: (collider: Collider) => boolean,
+ ) {
+ this.broadPhase.intersectionsWithShape(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ shapePos,
+ shapeRot,
+ shape,
+ this.colliders.castClosure(callback)!,
+ filterFlags,
+ filterGroups,
+ filterExcludeCollider ? filterExcludeCollider.handle : undefined,
+ filterExcludeRigidBody ? filterExcludeRigidBody.handle : undefined,
+ this.colliders.castClosure(filterPredicate),
+ );
+ }
+
+ /**
+ * Finds the handles of all the colliders with an AABB intersecting the given AABB.
+ *
+ * @param aabbCenter - The center of the AABB to test.
+ * @param aabbHalfExtents - The half-extents of the AABB to test.
+ * @param callback - The callback that will be called with the handles of all the colliders
+ * currently intersecting the given AABB.
+ */
+ public collidersWithAabbIntersectingAabb(
+ aabbCenter: Vector,
+ aabbHalfExtents: Vector,
+ callback: (handle: Collider) => boolean,
+ ) {
+ this.broadPhase.collidersWithAabbIntersectingAabb(
+ this.narrowPhase,
+ this.bodies,
+ this.colliders,
+ aabbCenter,
+ aabbHalfExtents,
+ this.colliders.castClosure(callback)!,
+ );
+ }
+
+ /**
+ * Enumerates all the colliders potentially in contact with the given collider.
+ *
+ * @param collider1 - The second collider involved in the contact.
+ * @param f - Closure that will be called on each collider that is in contact with `collider1`.
+ */
+ public contactPairsWith(collider1: Collider, f: (collider2: Collider) => void) {
+ this.narrowPhase.contactPairsWith(collider1.handle, this.colliders.castClosure(f)!);
+ }
+
+ /**
+ * Enumerates all the colliders intersecting the given colliders, assuming one of them
+ * is a sensor.
+ */
+ public intersectionPairsWith(collider1: Collider, f: (collider2: Collider) => void) {
+ this.narrowPhase.intersectionPairsWith(collider1.handle, this.colliders.castClosure(f)!);
+ }
+
+ /**
+ * Iterates through all the contact manifolds between the given pair of colliders.
+ *
+ * @param collider1 - The first collider involved in the contact.
+ * @param collider2 - The second collider involved in the contact.
+ * @param f - Closure that will be called on each contact manifold between the two colliders. If the second argument
+ * passed to this closure is `true`, then the contact manifold data is flipped, i.e., methods like `localNormal1`
+ * actually apply to the `collider2` and fields like `localNormal2` apply to the `collider1`.
+ */
+ public contactPair(
+ collider1: Collider,
+ collider2: Collider,
+ f: (manifold: TempContactManifold, flipped: boolean) => void,
+ ) {
+ this.narrowPhase.contactPair(collider1.handle, collider2.handle, f);
+ }
+
+ /**
+ * Returns `true` if `collider1` and `collider2` intersect and at least one of them is a sensor.
+ * @param collider1 − The first collider involved in the intersection.
+ * @param collider2 − The second collider involved in the intersection.
+ */
+ public intersectionPair(collider1: Collider, collider2: Collider): boolean {
+ return this.narrowPhase.intersectionPair(collider1.handle, collider2.handle);
+ }
+
+ /**
+ * Sets whether internal performance profiling is enabled (default: false).
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ set profilerEnabled(enabled: boolean) {
+ this.physicsPipeline.raw.set_profiler_enabled(enabled);
+ }
+
+ /**
+ * Indicates if the internal performance profiling is enabled.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ get profilerEnabled(): boolean {
+ return this.physicsPipeline.raw.is_profiler_enabled();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the entire simulation step.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingStep(): number {
+ return this.physicsPipeline.raw.timing_step();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the collision-detection
+ * (broad-phase + narrow-phase).
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCollisionDetection(): number {
+ return this.physicsPipeline.raw.timing_collision_detection();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the broad-phase.
+ *
+ * This timing is included in `timingCollisionDetection`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingBroadPhase(): number {
+ return this.physicsPipeline.raw.timing_broad_phase();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the narrow-phase.
+ *
+ * This timing is included in `timingCollisionDetection`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingNarrowPhase(): number {
+ return this.physicsPipeline.raw.timing_narrow_phase();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the constraint solver.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingSolver(): number {
+ return this.physicsPipeline.raw.timing_solver();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the constraint
+ * initialization.
+ *
+ * This timing is included in `timingSolver`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingVelocityAssembly(): number {
+ return this.physicsPipeline.raw.timing_velocity_assembly();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the constraint
+ * resolution.
+ *
+ * This timing is included in `timingSolver`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingVelocityResolution(): number {
+ return this.physicsPipeline.raw.timing_velocity_resolution();
+ }
+
+ /**
+ * The time spent in milliseconds by the last step to run the rigid-body
+ * velocity update.
+ *
+ * This timing is included in `timingSolver`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingVelocityUpdate(): number {
+ return this.physicsPipeline.raw.timing_velocity_update();
+ }
+
+ /**
+ * The time spent in milliseconds by writing rigid-body velocities
+ * calculated by the solver back into the rigid-bodies.
+ *
+ * This timing is included in `timingSolver`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingVelocityWriteback(): number {
+ return this.physicsPipeline.raw.timing_velocity_writeback();
+ }
+
+ /**
+ * The total time spent in CCD detection and resolution.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCcd(): number {
+ return this.physicsPipeline.raw.timing_ccd();
+ }
+
+ /**
+ * The total time spent searching for the continuous hits during CCD.
+ *
+ * This timing is included in `timingCcd`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCcdToiComputation(): number {
+ return this.physicsPipeline.raw.timing_ccd_toi_computation();
+ }
+
+ /**
+ * The total time spent in the broad-phase during CCD.
+ *
+ * This timing is included in `timingCcd`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCcdBroadPhase(): number {
+ return this.physicsPipeline.raw.timing_ccd_broad_phase();
+ }
+
+ /**
+ * The total time spent in the narrow-phase during CCD.
+ *
+ * This timing is included in `timingCcd`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCcdNarrowPhase(): number {
+ return this.physicsPipeline.raw.timing_ccd_narrow_phase();
+ }
+
+ /**
+ * The total time spent in the constraints resolution during CCD.
+ *
+ * This timing is included in `timingCcd`.
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingCcdSolver(): number {
+ return this.physicsPipeline.raw.timing_ccd_solver();
+ }
+
+ /**
+ * The total time spent in the islands calculation during CCD.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingIslandConstruction(): number {
+ return this.physicsPipeline.raw.timing_island_construction();
+ }
+
+ /**
+ * The total time spent propagating detected user changes.
+ *
+ * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.
+ */
+ public timingUserChanges(): number {
+ return this.physicsPipeline.raw.timing_user_changes();
+ }
+}
diff --git a/packages/rapier-2d/src/rapier-compat-simd.ts b/packages/rapier-2d/src/rapier-compat-simd.ts
new file mode 100644
index 00000000..c33cd274
--- /dev/null
+++ b/packages/rapier-2d/src/rapier-compat-simd.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-compat-simd";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/packages/rapier-2d/src/rapier-compat.ts b/packages/rapier-2d/src/rapier-compat.ts
new file mode 100644
index 00000000..af40f7c3
--- /dev/null
+++ b/packages/rapier-2d/src/rapier-compat.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-compat";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/packages/rapier-2d/src/rapier-simd.ts b/packages/rapier-2d/src/rapier-simd.ts
new file mode 100644
index 00000000..64f53025
--- /dev/null
+++ b/packages/rapier-2d/src/rapier-simd.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-simd";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/src.ts/rapier.ts b/packages/rapier-2d/src/rapier.ts
similarity index 78%
rename from src.ts/rapier.ts
rename to packages/rapier-2d/src/rapier.ts
index dbf4d053..f8a07dfa 100644
--- a/src.ts/rapier.ts
+++ b/packages/rapier-2d/src/rapier.ts
@@ -1,3 +1,4 @@
import * as RAPIER from "./exports";
export * from "./exports";
+export * from "./init";
export default RAPIER;
diff --git a/packages/rapier-2d/src/raw-simd.ts b/packages/rapier-2d/src/raw-simd.ts
new file mode 100644
index 00000000..e2c33b1a
--- /dev/null
+++ b/packages/rapier-2d/src/raw-simd.ts
@@ -0,0 +1 @@
+export * from "../wasm/release-simd/rapier_wasm_2d";
diff --git a/packages/rapier-2d/src/raw.ts b/packages/rapier-2d/src/raw.ts
new file mode 100644
index 00000000..5e61e284
--- /dev/null
+++ b/packages/rapier-2d/src/raw.ts
@@ -0,0 +1 @@
+export * from "../wasm/release/rapier_wasm_2d";
diff --git a/packages/rapier-2d/tsconfig.json b/packages/rapier-2d/tsconfig.json
new file mode 100644
index 00000000..bc768587
--- /dev/null
+++ b/packages/rapier-2d/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "lib": ["ES2020", "DOM"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/packages/rapier-2d/tsdown.config.ts b/packages/rapier-2d/tsdown.config.ts
new file mode 100644
index 00000000..fc81fa53
--- /dev/null
+++ b/packages/rapier-2d/tsdown.config.ts
@@ -0,0 +1,47 @@
+import {copyFileSync} from "node:fs";
+import {resolve} from "node:path";
+import {defineConfig} from "tsdown";
+
+const common = {
+ format: ["esm"] as ["esm"],
+ dts: true,
+ sourcemap: true,
+ loader: {
+ ".wasm": "base64" as const,
+ },
+};
+
+export default defineConfig([
+ {
+ ...common,
+ entry: {rapier: "./src/rapier.ts"},
+ clean: true,
+ onSuccess: () => {
+ copyFileSync("./wasm/release/rapier_wasm_2d_bg.wasm", "./dist/rapier_wasm_2d_bg.wasm");
+ },
+ },
+ {
+ ...common,
+ entry: {compat: "./src/rapier-compat.ts"},
+ },
+ {
+ ...common,
+ entry: {simd: "./src/rapier-simd.ts"},
+ alias: {
+ [resolve("./src/raw")]: resolve("./src/raw-simd"),
+ },
+ onSuccess: () => {
+ copyFileSync(
+ "./wasm/release-simd/rapier_wasm_2d_bg.wasm",
+ "./dist/rapier_wasm_2d_simd_bg.wasm",
+ );
+ },
+ },
+ {
+ ...common,
+ entry: {"compat-simd": "./src/rapier-compat-simd.ts"},
+ alias: {
+ [resolve("./src/raw")]: resolve("./src/raw-simd"),
+ },
+ },
+]);
diff --git a/packages/rapier-3d/package.json b/packages/rapier-3d/package.json
new file mode 100644
index 00000000..7b12d92d
--- /dev/null
+++ b/packages/rapier-3d/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "@alexandernanberg/rapier3d",
+ "version": "0.0.1",
+ "description": "3-dimensional physics engine - official JS bindings",
+ "keywords": [
+ "3d",
+ "dynamics",
+ "joints",
+ "physics",
+ "rapier",
+ "real-time",
+ "rigid"
+ ],
+ "homepage": "https://rapier.rs",
+ "license": "Apache-2.0",
+ "author": "Sébastien Crozet ",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/dimforge/rapier.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/rapier.d.mts",
+ "default": "./dist/rapier.mjs"
+ },
+ "./compat": {
+ "types": "./dist/compat.d.mts",
+ "default": "./dist/compat.mjs"
+ },
+ "./simd": {
+ "types": "./dist/simd.d.mts",
+ "default": "./dist/simd.mjs"
+ },
+ "./compat-simd": {
+ "types": "./dist/compat-simd.d.mts",
+ "default": "./dist/compat-simd.mjs"
+ }
+ },
+ "scripts": {
+ "build": "tsdown",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "base64-js": "^1.5.1"
+ },
+ "devDependencies": {
+ "tsdown": "^0.20.1",
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/packages/rapier-3d/src/coarena.ts b/packages/rapier-3d/src/coarena.ts
new file mode 100644
index 00000000..677c2458
--- /dev/null
+++ b/packages/rapier-3d/src/coarena.ts
@@ -0,0 +1,70 @@
+export class Coarena {
+ fconv: Float64Array;
+ uconv: Uint32Array;
+ data: Array;
+ size: number;
+
+ public constructor() {
+ this.fconv = new Float64Array(1);
+ this.uconv = new Uint32Array(this.fconv.buffer);
+ this.data = new Array();
+ this.size = 0;
+ }
+
+ public set(handle: number, data: T) {
+ let i = this.index(handle);
+ while (this.data.length <= i) {
+ this.data.push(null);
+ }
+
+ if (this.data[i] == null) this.size += 1;
+ this.data[i] = data;
+ }
+
+ public len(): number {
+ return this.size;
+ }
+
+ public delete(handle: number) {
+ let i = this.index(handle);
+ if (i < this.data.length) {
+ if (this.data[i] != null) this.size -= 1;
+ this.data[i] = null;
+ }
+ }
+
+ public clear() {
+ this.data = new Array();
+ }
+
+ public get(handle: number): T | null {
+ let i = this.index(handle);
+ if (i < this.data.length) {
+ return this.data[i];
+ } else {
+ return null;
+ }
+ }
+
+ public forEach(f: (elt: T) => void) {
+ for (const elt of this.data) {
+ if (elt != null) f(elt);
+ }
+ }
+
+ public getAll(): Array {
+ return this.data.filter((elt) => elt != null);
+ }
+
+ private index(handle: number): number {
+ /// Extracts the index part of a handle (the lower 32 bits).
+ /// This is done by first injecting the handle into an Float64Array
+ /// which is itself injected into an Uint32Array (at construction time).
+ /// The 0-th value of the Uint32Array will become the `number` integer
+ /// representation of the lower 32 bits.
+ /// Also `this.uconv[1]` then contains the generation number as a `number`,
+ /// which we don’t really need.
+ this.fconv[0] = handle;
+ return this.uconv[0];
+ }
+}
diff --git a/packages/rapier-3d/src/control/character_controller.ts b/packages/rapier-3d/src/control/character_controller.ts
new file mode 100644
index 00000000..4278a943
--- /dev/null
+++ b/packages/rapier-3d/src/control/character_controller.ts
@@ -0,0 +1,374 @@
+import {IntegrationParameters, RigidBodySet} from "../dynamics";
+import {
+ BroadPhase,
+ Collider,
+ ColliderSet,
+ InteractionGroups,
+ NarrowPhase,
+} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {QueryFilterFlags} from "../pipeline";
+import {RawKinematicCharacterController, RawCharacterCollision} from "../raw";
+
+/**
+ * A collision between the character and an obstacle hit on its path.
+ */
+export class CharacterCollision {
+ /** The collider involved in the collision. Null if the collider no longer exists in the physics world. */
+ public collider: Collider | null = null;
+ /** The translation delta applied to the character before this collision took place. */
+ public translationDeltaApplied!: Vector;
+ /** The translation delta the character would move after this collision if there is no other obstacles. */
+ public translationDeltaRemaining!: Vector;
+ /** The time-of-impact between the character and the obstacles. */
+ public toi!: number;
+ /** The world-space contact point on the collider when the collision happens. */
+ public witness1!: Vector;
+ /** The local-space contact point on the character when the collision happens. */
+ public witness2!: Vector;
+ /** The world-space outward contact normal on the collider when the collision happens. */
+ public normal1!: Vector;
+ /** The local-space outward contact normal on the character when the collision happens. */
+ public normal2!: Vector;
+}
+
+/**
+ * A character controller for controlling kinematic bodies and parentless colliders by hitting
+ * and sliding against obstacles.
+ */
+export class KinematicCharacterController {
+ private raw: RawKinematicCharacterController;
+ private rawCharacterCollision: RawCharacterCollision;
+
+ private params: IntegrationParameters;
+ private broadPhase: BroadPhase;
+ private narrowPhase: NarrowPhase;
+ private bodies: RigidBodySet;
+ private colliders: ColliderSet;
+ private _applyImpulsesToDynamicBodies: boolean;
+ private _characterMass: number | null;
+
+ constructor(
+ offset: number,
+ params: IntegrationParameters,
+ broadPhase: BroadPhase,
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ ) {
+ this.params = params;
+ this.bodies = bodies;
+ this.colliders = colliders;
+ this.broadPhase = broadPhase;
+ this.narrowPhase = narrowPhase;
+ this.raw = new RawKinematicCharacterController(offset);
+ this.rawCharacterCollision = new RawCharacterCollision();
+ this._applyImpulsesToDynamicBodies = false;
+ this._characterMass = null;
+ }
+
+ /** @internal */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ this.rawCharacterCollision.free();
+ }
+
+ this.raw = undefined!;
+ this.rawCharacterCollision = undefined!;
+ }
+
+ /**
+ * The direction that goes "up". Used to determine where the floor is, and the floor’s angle.
+ */
+ public up(): Vector {
+ return this.raw.up();
+ }
+
+ /**
+ * Sets the direction that goes "up". Used to determine where the floor is, and the floor’s angle.
+ */
+ public setUp(vector: Vector) {
+ let rawVect = VectorOps.intoRaw(vector);
+ this.raw.setUp(rawVect);
+ rawVect.free();
+ }
+
+ public applyImpulsesToDynamicBodies(): boolean {
+ return this._applyImpulsesToDynamicBodies;
+ }
+
+ public setApplyImpulsesToDynamicBodies(enabled: boolean) {
+ this._applyImpulsesToDynamicBodies = enabled;
+ }
+
+ /**
+ * Returns the custom value of the character mass, if it was set by `this.setCharacterMass`.
+ */
+ public characterMass(): number | null {
+ return this._characterMass;
+ }
+
+ /**
+ * Set the mass of the character to be used for impulse resolution if `self.applyImpulsesToDynamicBodies`
+ * is set to `true`.
+ *
+ * If no character mass is set explicitly (or if it is set to `null`) it is automatically assumed to be equal
+ * to the mass of the rigid-body the character collider is attached to; or equal to 0 if the character collider
+ * isn’t attached to any rigid-body.
+ *
+ * @param mass - The mass to set.
+ */
+ public setCharacterMass(mass: number | null) {
+ this._characterMass = mass;
+ }
+
+ /**
+ * A small gap to preserve between the character and its surroundings.
+ *
+ * This value should not be too large to avoid visual artifacts, but shouldn’t be too small
+ * (must not be zero) to improve numerical stability of the character controller.
+ */
+ public offset(): number {
+ return this.raw.offset();
+ }
+
+ /**
+ * Sets a small gap to preserve between the character and its surroundings.
+ *
+ * This value should not be too large to avoid visual artifacts, but shouldn’t be too small
+ * (must not be zero) to improve numerical stability of the character controller.
+ */
+ public setOffset(value: number) {
+ this.raw.setOffset(value);
+ }
+
+ /// Increase this number if your character appears to get stuck when sliding against surfaces.
+ ///
+ /// This is a small distance applied to the movement toward the contact normals of shapes hit
+ /// by the character controller. This helps shape-casting not getting stuck in an always-penetrating
+ /// state during the sliding calculation.
+ ///
+ /// This value should remain fairly small since it can introduce artificial "bumps" when sliding
+ /// along a flat surface.
+ public normalNudgeFactor(): number {
+ return this.raw.normalNudgeFactor();
+ }
+
+ /// Increase this number if your character appears to get stuck when sliding against surfaces.
+ ///
+ /// This is a small distance applied to the movement toward the contact normals of shapes hit
+ /// by the character controller. This helps shape-casting not getting stuck in an always-penetrating
+ /// state during the sliding calculation.
+ ///
+ /// This value should remain fairly small since it can introduce artificial "bumps" when sliding
+ /// along a flat surface.
+ public setNormalNudgeFactor(value: number) {
+ this.raw.setNormalNudgeFactor(value);
+ }
+
+ /**
+ * Is sliding against obstacles enabled?
+ */
+ public slideEnabled(): boolean {
+ return this.raw.slideEnabled();
+ }
+
+ /**
+ * Enable or disable sliding against obstacles.
+ */
+ public setSlideEnabled(enabled: boolean) {
+ this.raw.setSlideEnabled(enabled);
+ }
+
+ /**
+ * The maximum step height a character can automatically step over.
+ */
+ public autostepMaxHeight(): number | null {
+ return this.raw.autostepMaxHeight() ?? null;
+ }
+
+ /**
+ * The minimum width of free space that must be available after stepping on a stair.
+ */
+ public autostepMinWidth(): number | null {
+ return this.raw.autostepMinWidth() ?? null;
+ }
+
+ /**
+ * Can the character automatically step over dynamic bodies too?
+ */
+ public autostepIncludesDynamicBodies(): boolean | null {
+ return this.raw.autostepIncludesDynamicBodies() ?? null;
+ }
+
+ /**
+ * Is automatically stepping over small objects enabled?
+ */
+ public autostepEnabled(): boolean {
+ return this.raw.autostepEnabled();
+ }
+
+ /**
+ * Enabled automatically stepping over small objects.
+ *
+ * @param maxHeight - The maximum step height a character can automatically step over.
+ * @param minWidth - The minimum width of free space that must be available after stepping on a stair.
+ * @param includeDynamicBodies - Can the character automatically step over dynamic bodies too?
+ */
+ public enableAutostep(maxHeight: number, minWidth: number, includeDynamicBodies: boolean) {
+ this.raw.enableAutostep(maxHeight, minWidth, includeDynamicBodies);
+ }
+
+ /**
+ * Disable automatically stepping over small objects.
+ */
+ public disableAutostep() {
+ return this.raw.disableAutostep();
+ }
+
+ /**
+ * The maximum angle (radians) between the floor’s normal and the `up` vector that the
+ * character is able to climb.
+ */
+ public maxSlopeClimbAngle(): number {
+ return this.raw.maxSlopeClimbAngle();
+ }
+
+ /**
+ * Sets the maximum angle (radians) between the floor’s normal and the `up` vector that the
+ * character is able to climb.
+ */
+ public setMaxSlopeClimbAngle(angle: number) {
+ this.raw.setMaxSlopeClimbAngle(angle);
+ }
+
+ /**
+ * The minimum angle (radians) between the floor’s normal and the `up` vector before the
+ * character starts to slide down automatically.
+ */
+ public minSlopeSlideAngle(): number {
+ return this.raw.minSlopeSlideAngle();
+ }
+
+ /**
+ * Sets the minimum angle (radians) between the floor’s normal and the `up` vector before the
+ * character starts to slide down automatically.
+ */
+ public setMinSlopeSlideAngle(angle: number) {
+ this.raw.setMinSlopeSlideAngle(angle);
+ }
+
+ /**
+ * If snap-to-ground is enabled, should the character be automatically snapped to the ground if
+ * the distance between the ground and its feet are smaller than the specified threshold?
+ */
+ public snapToGroundDistance(): number | null {
+ return this.raw.snapToGroundDistance() ?? null;
+ }
+
+ /**
+ * Enables automatically snapping the character to the ground if the distance between
+ * the ground and its feet are smaller than the specified threshold.
+ */
+ public enableSnapToGround(distance: number) {
+ this.raw.enableSnapToGround(distance);
+ }
+
+ /**
+ * Disables automatically snapping the character to the ground.
+ */
+ public disableSnapToGround() {
+ this.raw.disableSnapToGround();
+ }
+
+ /**
+ * Is automatically snapping the character to the ground enabled?
+ */
+ public snapToGroundEnabled(): boolean {
+ return this.raw.snapToGroundEnabled();
+ }
+
+ /**
+ * Computes the movement the given collider is able to execute after hitting and sliding on obstacles.
+ *
+ * @param collider - The collider to move.
+ * @param desiredTranslationDelta - The desired collider movement.
+ * @param filterFlags - Flags for excluding whole subsets of colliders from the obstacles taken into account.
+ * @param filterGroups - Groups for excluding colliders with incompatible collision groups from the obstacles
+ * taken into account.
+ * @param filterPredicate - Any collider for which this closure returns `false` will be excluded from the
+ * obstacles taken into account.
+ */
+ public computeColliderMovement(
+ collider: Collider,
+ desiredTranslationDelta: Vector,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterPredicate?: (collider: Collider) => boolean,
+ ) {
+ let rawTranslationDelta = VectorOps.intoRaw(desiredTranslationDelta);
+ this.raw.computeColliderMovement(
+ this.params.dt,
+ this.broadPhase.raw,
+ this.narrowPhase.raw,
+ this.bodies.raw,
+ this.colliders.raw,
+ collider.handle,
+ rawTranslationDelta,
+ this._applyImpulsesToDynamicBodies,
+ this._characterMass,
+ filterFlags ?? 0,
+ filterGroups,
+ this.colliders.castClosure(filterPredicate) as unknown as Function,
+ );
+ rawTranslationDelta.free();
+ }
+
+ /**
+ * The movement computed by the last call to `this.computeColliderMovement`.
+ */
+ public computedMovement(): Vector {
+ return VectorOps.fromRaw(this.raw.computedMovement())!;
+ }
+
+ /**
+ * The result of ground detection computed by the last call to `this.computeColliderMovement`.
+ */
+ public computedGrounded(): boolean {
+ return this.raw.computedGrounded();
+ }
+
+ /**
+ * The number of collisions against obstacles detected along the path of the last call
+ * to `this.computeColliderMovement`.
+ */
+ public numComputedCollisions(): number {
+ return this.raw.numComputedCollisions();
+ }
+
+ /**
+ * Returns the collision against one of the obstacles detected along the path of the last
+ * call to `this.computeColliderMovement`.
+ *
+ * @param i - The i-th collision will be returned.
+ * @param out - If this argument is set, it will be filled with the collision information.
+ */
+ public computedCollision(i: number, out?: CharacterCollision): CharacterCollision | null {
+ if (!this.raw.computedCollision(i, this.rawCharacterCollision)) {
+ return null;
+ } else {
+ let c = this.rawCharacterCollision;
+ out = out ?? new CharacterCollision();
+ out.translationDeltaApplied = VectorOps.fromRaw(c.translationDeltaApplied())!;
+ out.translationDeltaRemaining = VectorOps.fromRaw(c.translationDeltaRemaining())!;
+ out.toi = c.toi();
+ out.witness1 = VectorOps.fromRaw(c.worldWitness1())!;
+ out.witness2 = VectorOps.fromRaw(c.worldWitness2())!;
+ out.normal1 = VectorOps.fromRaw(c.worldNormal1())!;
+ out.normal2 = VectorOps.fromRaw(c.worldNormal2())!;
+ out.collider = this.colliders.get(c.handle());
+ return out;
+ }
+ }
+}
diff --git a/src.ts/control/index.ts b/packages/rapier-3d/src/control/index.ts
similarity index 84%
rename from src.ts/control/index.ts
rename to packages/rapier-3d/src/control/index.ts
index 43e495a5..54df6d0f 100644
--- a/src.ts/control/index.ts
+++ b/packages/rapier-3d/src/control/index.ts
@@ -1,6 +1,4 @@
export * from "./character_controller";
export * from "./pid_controller";
-// #if DIM3
export * from "./ray_cast_vehicle_controller";
-// #endif
diff --git a/src.ts/control/pid_controller.ts b/packages/rapier-3d/src/control/pid_controller.ts
similarity index 69%
rename from src.ts/control/pid_controller.ts
rename to packages/rapier-3d/src/control/pid_controller.ts
index 52b2f006..76753c27 100644
--- a/src.ts/control/pid_controller.ts
+++ b/packages/rapier-3d/src/control/pid_controller.ts
@@ -1,8 +1,6 @@
-import {RawPidController} from "../raw";
-import {Rotation, RotationOps, Vector, VectorOps} from "../math";
-import {Collider, ColliderSet, InteractionGroups, Shape} from "../geometry";
-import {QueryFilterFlags, World} from "../pipeline";
import {IntegrationParameters, RigidBody, RigidBodySet} from "../dynamics";
+import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+import {RawPidController} from "../raw";
// TODO: unify with the JointAxesMask
/**
@@ -25,19 +23,11 @@ export enum PidAxesMask {
LinX = 1 << 0,
LinY = 1 << 1,
LinZ = 1 << 2,
- // #if DIM3
AngX = 1 << 3,
AngY = 1 << 4,
- // #endif
AngZ = 1 << 5,
- // #if DIM2
- AllLin = PidAxesMask.LinX | PidAxesMask.LinY,
- AllAng = PidAxesMask.AngZ,
- // #endif
- // #if DIM3
AllLin = PidAxesMask.LinX | PidAxesMask.LinY | PidAxesMask.LinZ,
AllAng = PidAxesMask.AngX | PidAxesMask.AngY | PidAxesMask.AngZ,
- // #endif
All = PidAxesMask.AllLin | PidAxesMask.AllAng,
}
@@ -70,7 +60,7 @@ export class PidController {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
public setKp(kp: number, axes: PidAxesMask) {
@@ -93,11 +83,7 @@ export class PidController {
this.raw.reset_integrals();
}
- public applyLinearCorrection(
- body: RigidBody,
- targetPosition: Vector,
- targetLinvel: Vector,
- ) {
+ public applyLinearCorrection(body: RigidBody, targetPosition: Vector, targetLinvel: Vector) {
let rawPos = VectorOps.intoRaw(targetPosition);
let rawVel = VectorOps.intoRaw(targetLinvel);
this.raw.apply_linear_correction(
@@ -111,28 +97,7 @@ export class PidController {
rawVel.free();
}
- // #if DIM2
- public applyAngularCorrection(
- body: RigidBody,
- targetRotation: number,
- targetAngVel: number,
- ) {
- this.raw.apply_angular_correction(
- this.params.dt,
- this.bodies.raw,
- body.handle,
- targetRotation,
- targetAngVel,
- );
- }
- // #endif
-
- // #if DIM3
- public applyAngularCorrection(
- body: RigidBody,
- targetRotation: Rotation,
- targetAngVel: Vector,
- ) {
+ public applyAngularCorrection(body: RigidBody, targetRotation: Rotation, targetAngVel: Vector) {
let rawPos = RotationOps.intoRaw(targetRotation);
let rawVel = VectorOps.intoRaw(targetAngVel);
this.raw.apply_angular_correction(
@@ -145,13 +110,8 @@ export class PidController {
rawPos.free();
rawVel.free();
}
- // #endif
- public linearCorrection(
- body: RigidBody,
- targetPosition: Vector,
- targetLinvel: Vector,
- ): Vector {
+ public linearCorrection(body: RigidBody, targetPosition: Vector, targetLinvel: Vector): Vector {
let rawPos = VectorOps.intoRaw(targetPosition);
let rawVel = VectorOps.intoRaw(targetLinvel);
let correction = this.raw.linear_correction(
@@ -164,26 +124,9 @@ export class PidController {
rawPos.free();
rawVel.free();
- return VectorOps.fromRaw(correction);
- }
-
- // #if DIM2
- public angularCorrection(
- body: RigidBody,
- targetRotation: number,
- targetAngVel: number,
- ): number {
- return this.raw.angular_correction(
- this.params.dt,
- this.bodies.raw,
- body.handle,
- targetRotation,
- targetAngVel,
- );
+ return VectorOps.fromRaw(correction)!;
}
- // #endif
- // #if DIM3
public angularCorrection(
body: RigidBody,
targetRotation: Rotation,
@@ -201,7 +144,6 @@ export class PidController {
rawPos.free();
rawVel.free();
- return VectorOps.fromRaw(correction);
+ return VectorOps.fromRaw(correction)!;
}
- // #endif
}
diff --git a/src.ts/control/ray_cast_vehicle_controller.ts b/packages/rapier-3d/src/control/ray_cast_vehicle_controller.ts
similarity index 90%
rename from src.ts/control/ray_cast_vehicle_controller.ts
rename to packages/rapier-3d/src/control/ray_cast_vehicle_controller.ts
index fa65b3e3..60db9919 100644
--- a/src.ts/control/ray_cast_vehicle_controller.ts
+++ b/packages/rapier-3d/src/control/ray_cast_vehicle_controller.ts
@@ -1,14 +1,8 @@
-import {RawDynamicRayCastVehicleController} from "../raw";
+import {RigidBody, RigidBodySet} from "../dynamics";
+import {BroadPhase, Collider, ColliderSet, InteractionGroups, NarrowPhase} from "../geometry";
import {Vector, VectorOps} from "../math";
-import {
- BroadPhase,
- Collider,
- ColliderSet,
- InteractionGroups,
- NarrowPhase,
-} from "../geometry";
import {QueryFilterFlags} from "../pipeline";
-import {RigidBody, RigidBodyHandle, RigidBodySet} from "../dynamics";
+import {RawDynamicRayCastVehicleController} from "../raw";
/**
* A character controller to simulate vehicles using ray-casting for the wheels.
@@ -42,7 +36,7 @@ export class DynamicRayCastVehicleController {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
/**
@@ -67,9 +61,9 @@ export class DynamicRayCastVehicleController {
this.narrowPhase.raw,
this.bodies.raw,
this.colliders.raw,
- filterFlags,
+ filterFlags ?? 0,
filterGroups,
- this.colliders.castClosure(filterPredicate),
+ this.colliders.castClosure(filterPredicate) as unknown as Function,
);
}
@@ -167,7 +161,7 @@ export class DynamicRayCastVehicleController {
* The position of the i-th wheel, relative to the chassis.
*/
public wheelChassisConnectionPointCs(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_chassis_connection_point_cs(i));
+ return VectorOps.fromRaw(this.raw.wheel_chassis_connection_point_cs(i)!);
}
/**
@@ -183,7 +177,7 @@ export class DynamicRayCastVehicleController {
* The rest length of the i-th wheel’s suspension spring.
*/
public wheelSuspensionRestLength(i: number): number | null {
- return this.raw.wheel_suspension_rest_length(i);
+ return this.raw.wheel_suspension_rest_length(i) ?? null;
}
/**
@@ -197,7 +191,7 @@ export class DynamicRayCastVehicleController {
* The maximum distance the i-th wheel suspension can travel before and after its resting length.
*/
public wheelMaxSuspensionTravel(i: number): number | null {
- return this.raw.wheel_max_suspension_travel(i);
+ return this.raw.wheel_max_suspension_travel(i) ?? null;
}
/**
@@ -211,7 +205,7 @@ export class DynamicRayCastVehicleController {
* The i-th wheel’s radius.
*/
public wheelRadius(i: number): number | null {
- return this.raw.wheel_radius(i);
+ return this.raw.wheel_radius(i) ?? null;
}
/**
@@ -227,7 +221,7 @@ export class DynamicRayCastVehicleController {
* Increase this value if the suspension appears to not push the vehicle strong enough.
*/
public wheelSuspensionStiffness(i: number): number | null {
- return this.raw.wheel_suspension_stiffness(i);
+ return this.raw.wheel_suspension_stiffness(i) ?? null;
}
/**
@@ -243,7 +237,7 @@ export class DynamicRayCastVehicleController {
* The i-th wheel’s suspension’s damping when it is being compressed.
*/
public wheelSuspensionCompression(i: number): number | null {
- return this.raw.wheel_suspension_compression(i);
+ return this.raw.wheel_suspension_compression(i) ?? null;
}
/**
@@ -259,7 +253,7 @@ export class DynamicRayCastVehicleController {
* Increase this value if the suspension appears to overshoot.
*/
public wheelSuspensionRelaxation(i: number): number | null {
- return this.raw.wheel_suspension_relaxation(i);
+ return this.raw.wheel_suspension_relaxation(i) ?? null;
}
/**
@@ -275,7 +269,7 @@ export class DynamicRayCastVehicleController {
* The maximum force applied by the i-th wheel’s suspension.
*/
public wheelMaxSuspensionForce(i: number): number | null {
- return this.raw.wheel_max_suspension_force(i);
+ return this.raw.wheel_max_suspension_force(i) ?? null;
}
/**
@@ -289,7 +283,7 @@ export class DynamicRayCastVehicleController {
* The maximum amount of braking impulse applied on the i-th wheel to slow down the vehicle.
*/
public wheelBrake(i: number): number | null {
- return this.raw.wheel_brake(i);
+ return this.raw.wheel_brake(i) ?? null;
}
/**
@@ -303,7 +297,7 @@ export class DynamicRayCastVehicleController {
* The steering angle (radians) for the i-th wheel.
*/
public wheelSteering(i: number): number | null {
- return this.raw.wheel_steering(i);
+ return this.raw.wheel_steering(i) ?? null;
}
/**
@@ -317,7 +311,7 @@ export class DynamicRayCastVehicleController {
* The forward force applied by the i-th wheel on the chassis.
*/
public wheelEngineForce(i: number): number | null {
- return this.raw.wheel_engine_force(i);
+ return this.raw.wheel_engine_force(i) ?? null;
}
/**
@@ -333,7 +327,7 @@ export class DynamicRayCastVehicleController {
* The ray-casting will happen following this direction to detect the ground.
*/
public wheelDirectionCs(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_direction_cs(i));
+ return VectorOps.fromRaw(this.raw.wheel_direction_cs(i)!);
}
/**
@@ -353,7 +347,7 @@ export class DynamicRayCastVehicleController {
* The axis index defined as 0 = X, 1 = Y, 2 = Z.
*/
public wheelAxleCs(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_axle_cs(i));
+ return VectorOps.fromRaw(this.raw.wheel_axle_cs(i)!);
}
/**
@@ -374,7 +368,7 @@ export class DynamicRayCastVehicleController {
* causing the vehicle to flip if it’s too strong).
*/
public wheelFrictionSlip(i: number): number | null {
- return this.raw.wheel_friction_slip(i);
+ return this.raw.wheel_friction_slip(i) ?? null;
}
/**
@@ -393,7 +387,7 @@ export class DynamicRayCastVehicleController {
* The larger the value, the stronger side friction will be.
*/
public wheelSideFrictionStiffness(i: number): number | null {
- return this.raw.wheel_side_friction_stiffness(i);
+ return this.raw.wheel_side_friction_stiffness(i) ?? null;
}
/**
@@ -413,56 +407,56 @@ export class DynamicRayCastVehicleController {
* The i-th wheel’s current rotation angle (radians) on its axle.
*/
public wheelRotation(i: number): number | null {
- return this.raw.wheel_rotation(i);
+ return this.raw.wheel_rotation(i) ?? null;
}
/**
* The forward impulses applied by the i-th wheel on the chassis.
*/
public wheelForwardImpulse(i: number): number | null {
- return this.raw.wheel_forward_impulse(i);
+ return this.raw.wheel_forward_impulse(i) ?? null;
}
/**
* The side impulses applied by the i-th wheel on the chassis.
*/
public wheelSideImpulse(i: number): number | null {
- return this.raw.wheel_side_impulse(i);
+ return this.raw.wheel_side_impulse(i) ?? null;
}
/**
* The force applied by the i-th wheel suspension.
*/
public wheelSuspensionForce(i: number): number | null {
- return this.raw.wheel_suspension_force(i);
+ return this.raw.wheel_suspension_force(i) ?? null;
}
/**
* The (world-space) contact normal between the i-th wheel and the floor.
*/
public wheelContactNormal(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_contact_normal_ws(i));
+ return VectorOps.fromRaw(this.raw.wheel_contact_normal_ws(i)!);
}
/**
* The (world-space) point hit by the wheel’s ray-cast for the i-th wheel.
*/
public wheelContactPoint(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_contact_point_ws(i));
+ return VectorOps.fromRaw(this.raw.wheel_contact_point_ws(i)!);
}
/**
* The suspension length for the i-th wheel.
*/
public wheelSuspensionLength(i: number): number | null {
- return this.raw.wheel_suspension_length(i);
+ return this.raw.wheel_suspension_length(i) ?? null;
}
/**
* The (world-space) starting point of the ray-cast for the i-th wheel.
*/
public wheelHardPoint(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.wheel_hard_point_ws(i));
+ return VectorOps.fromRaw(this.raw.wheel_hard_point_ws(i)!);
}
/**
@@ -476,6 +470,6 @@ export class DynamicRayCastVehicleController {
* The collider hit by the ray-cast for the i-th wheel.
*/
public wheelGroundObject(i: number): Collider | null {
- return this.colliders.get(this.raw.wheel_ground_object(i));
+ return this.colliders.get(this.raw.wheel_ground_object(i)!);
}
}
diff --git a/packages/rapier-3d/src/dynamics/ccd_solver.ts b/packages/rapier-3d/src/dynamics/ccd_solver.ts
new file mode 100644
index 00000000..a0de715f
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/ccd_solver.ts
@@ -0,0 +1,25 @@
+import {RawCCDSolver} from "../raw";
+
+/**
+ * The CCD solver responsible for resolving Continuous Collision Detection.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `ccdSolver.free()`
+ * once you are done using it.
+ */
+export class CCDSolver {
+ raw: RawCCDSolver;
+
+ /**
+ * Release the WASM memory occupied by this narrow-phase.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw?: RawCCDSolver) {
+ this.raw = raw || new RawCCDSolver();
+ }
+}
diff --git a/packages/rapier-3d/src/dynamics/coefficient_combine_rule.ts b/packages/rapier-3d/src/dynamics/coefficient_combine_rule.ts
new file mode 100644
index 00000000..680b402a
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/coefficient_combine_rule.ts
@@ -0,0 +1,13 @@
+/**
+ * A rule applied to combine coefficients.
+ *
+ * Use this when configuring the `ColliderDesc` to specify
+ * how friction and restitution coefficient should be combined
+ * in a contact.
+ */
+export enum CoefficientCombineRule {
+ Average = 0,
+ Min = 1,
+ Multiply = 2,
+ Max = 3,
+}
diff --git a/src.ts/dynamics/impulse_joint.ts b/packages/rapier-3d/src/dynamics/impulse_joint.ts
similarity index 81%
rename from src.ts/dynamics/impulse_joint.ts
rename to packages/rapier-3d/src/dynamics/impulse_joint.ts
index 0c637ddf..d91a62a4 100644
--- a/src.ts/dynamics/impulse_joint.ts
+++ b/packages/rapier-3d/src/dynamics/impulse_joint.ts
@@ -2,16 +2,12 @@ import {Rotation, Vector, VectorOps, RotationOps} from "../math";
import {
RawGenericJoint,
RawImpulseJointSet,
- RawRigidBodySet,
RawJointAxis,
RawJointType,
RawMotorModel,
} from "../raw";
-import {RigidBody, RigidBodyHandle} from "./rigid_body";
+import {RigidBody} from "./rigid_body";
import {RigidBodySet} from "./rigid_body_set";
-// #if DIM3
-import {Quaternion} from "../math";
-// #endif
/**
* The integer identifier of a collider added to a `ColliderSet`.
@@ -35,10 +31,8 @@ export enum JointType {
Prismatic,
Rope,
Spring,
- // #if DIM3
Spherical,
Generic,
- // #endif
}
export enum MotorModel {
@@ -75,11 +69,7 @@ export class ImpulseJoint {
protected bodySet: RigidBodySet; // The ImpulseJoint won’t need to free this.
handle: ImpulseJointHandle;
- constructor(
- rawSet: RawImpulseJointSet,
- bodySet: RigidBodySet,
- handle: ImpulseJointHandle,
- ) {
+ constructor(rawSet: RawImpulseJointSet, bodySet: RigidBodySet, handle: ImpulseJointHandle) {
this.rawSet = rawSet;
this.bodySet = bodySet;
this.handle = handle;
@@ -101,12 +91,10 @@ export class ImpulseJoint {
return new SpringImpulseJoint(rawSet, bodySet, handle);
case RawJointType.Rope:
return new RopeImpulseJoint(rawSet, bodySet, handle);
- // #if DIM3
case RawJointType.Spherical:
return new SphericalImpulseJoint(rawSet, bodySet, handle);
case RawJointType.Generic:
return new GenericImpulseJoint(rawSet, bodySet, handle);
- // #endif
default:
return new ImpulseJoint(rawSet, bodySet, handle);
}
@@ -129,14 +117,14 @@ export class ImpulseJoint {
* The first rigid-body this joint it attached to.
*/
public body1(): RigidBody {
- return this.bodySet.get(this.rawSet.jointBodyHandle1(this.handle));
+ return this.bodySet.get(this.rawSet.jointBodyHandle1(this.handle))!;
}
/**
* The second rigid-body this joint is attached to.
*/
public body2(): RigidBody {
- return this.bodySet.get(this.rawSet.jointBodyHandle2(this.handle));
+ return this.bodySet.get(this.rawSet.jointBodyHandle2(this.handle))!;
}
/**
@@ -146,26 +134,20 @@ export class ImpulseJoint {
return this.rawSet.jointType(this.handle) as number as JointType;
}
- // #if DIM3
/**
* The rotation quaternion that aligns this joint's first local axis to the `x` axis.
*/
public frameX1(): Rotation {
- return RotationOps.fromRaw(this.rawSet.jointFrameX1(this.handle));
+ return RotationOps.fromRaw(this.rawSet.jointFrameX1(this.handle))!;
}
- // #endif
-
- // #if DIM3
/**
* The rotation matrix that aligns this joint's second local axis to the `x` axis.
*/
public frameX2(): Rotation {
- return RotationOps.fromRaw(this.rawSet.jointFrameX2(this.handle));
+ return RotationOps.fromRaw(this.rawSet.jointFrameX2(this.handle))!;
}
- // #endif
-
/**
* The position of the first anchor of this joint.
*
@@ -173,7 +155,7 @@ export class ImpulseJoint {
* local frame of the first rigid-body it is attached to.
*/
public anchor1(): Vector {
- return VectorOps.fromRaw(this.rawSet.jointAnchor1(this.handle));
+ return VectorOps.fromRaw(this.rawSet.jointAnchor1(this.handle))!;
}
/**
@@ -183,7 +165,7 @@ export class ImpulseJoint {
* local frame of the second rigid-body it is attached to.
*/
public anchor2(): Vector {
- return VectorOps.fromRaw(this.rawSet.jointAnchor2(this.handle));
+ return VectorOps.fromRaw(this.rawSet.jointAnchor2(this.handle))!;
}
/**
@@ -231,7 +213,9 @@ export class UnitImpulseJoint extends ImpulseJoint {
/**
* The axis left free by this joint.
*/
- protected rawAxis?(): RawJointAxis;
+ protected rawAxis(): RawJointAxis {
+ throw new Error("rawAxis must be implemented by subclasses");
+ }
/**
* Are the limits enabled for this joint?
@@ -273,19 +257,10 @@ export class UnitImpulseJoint extends ImpulseJoint {
}
public configureMotorVelocity(targetVel: number, factor: number) {
- this.rawSet.jointConfigureMotorVelocity(
- this.handle,
- this.rawAxis(),
- targetVel,
- factor,
- );
+ this.rawSet.jointConfigureMotorVelocity(this.handle, this.rawAxis(), targetVel, factor);
}
- public configureMotorPosition(
- targetPos: number,
- stiffness: number,
- damping: number,
- ) {
+ public configureMotorPosition(targetPos: number, stiffness: number, damping: number) {
this.rawSet.jointConfigureMotorPosition(
this.handle,
this.rawAxis(),
@@ -330,7 +305,6 @@ export class RevoluteImpulseJoint extends UnitImpulseJoint {
}
}
-// #if DIM3
export class GenericImpulseJoint extends ImpulseJoint {}
export class SphericalImpulseJoint extends ImpulseJoint {
@@ -355,21 +329,20 @@ export class SphericalImpulseJoint extends ImpulseJoint {
}
*/
}
-// #endif
export class JointData {
- anchor1: Vector;
- anchor2: Vector;
- axis: Vector;
- frame1: Rotation;
- frame2: Rotation;
- jointType: JointType;
- limitsEnabled: boolean;
- limits: Array;
- axesMask: JointAxesMask;
- stiffness: number;
- damping: number;
- length: number;
+ anchor1!: Vector;
+ anchor2!: Vector;
+ axis!: Vector;
+ frame1!: Rotation;
+ frame2!: Rotation;
+ jointType!: JointType;
+ limitsEnabled!: boolean;
+ limits!: Array;
+ axesMask!: JointAxesMask;
+ stiffness!: number;
+ damping!: number;
+ length!: number;
private constructor() {}
@@ -418,11 +391,7 @@ export class JointData {
return res;
}
- public static rope(
- length: number,
- anchor1: Vector,
- anchor2: Vector,
- ): JointData {
+ public static rope(length: number, anchor1: Vector, anchor2: Vector): JointData {
let res = new JointData();
res.anchor1 = anchor1;
res.anchor2 = anchor2;
@@ -431,56 +400,6 @@ export class JointData {
return res;
}
- // #if DIM2
-
- /**
- * Create a new joint descriptor that builds revolute joints.
- *
- * A revolute joint allows three relative rotational degrees of freedom
- * by preventing any relative translation between the anchors of the
- * two attached rigid-bodies.
- *
- * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the
- * local-space of the rigid-body.
- * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the
- * local-space of the rigid-body.
- */
- public static revolute(anchor1: Vector, anchor2: Vector): JointData {
- let res = new JointData();
- res.anchor1 = anchor1;
- res.anchor2 = anchor2;
- res.jointType = JointType.Revolute;
- return res;
- }
-
- /**
- * Creates a new joint descriptor that builds a Prismatic joint.
- *
- * A prismatic joint removes all the degrees of freedom between the
- * affected bodies, except for the translation along one axis.
- *
- * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the
- * local-space of the rigid-body.
- * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the
- * local-space of the rigid-body.
- * @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.
- */
- public static prismatic(
- anchor1: Vector,
- anchor2: Vector,
- axis: Vector,
- ): JointData {
- let res = new JointData();
- res.anchor1 = anchor1;
- res.anchor2 = anchor2;
- res.axis = axis;
- res.jointType = JointType.Prismatic;
- return res;
- }
-
- // #endif
-
- // #if DIM3
/**
* Create a new joint descriptor that builds generic joints.
*
@@ -543,11 +462,7 @@ export class JointData {
* local-space of the rigid-body.
* @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.
*/
- public static prismatic(
- anchor1: Vector,
- anchor2: Vector,
- axis: Vector,
- ): JointData {
+ public static prismatic(anchor1: Vector, anchor2: Vector, axis: Vector): JointData {
let res = new JointData();
res.anchor1 = anchor1;
res.anchor2 = anchor2;
@@ -568,11 +483,7 @@ export class JointData {
* local-space of the rigid-body.
* @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.
*/
- public static revolute(
- anchor1: Vector,
- anchor2: Vector,
- axis: Vector,
- ): JointData {
+ public static revolute(anchor1: Vector, anchor2: Vector, axis: Vector): JointData {
let res = new JointData();
res.anchor1 = anchor1;
res.anchor2 = anchor2;
@@ -580,7 +491,6 @@ export class JointData {
res.jointType = JointType.Revolute;
return res;
}
- // #endif
public intoRaw(): RawGenericJoint {
let rawA1 = VectorOps.intoRaw(this.anchor1);
@@ -620,7 +530,6 @@ export class JointData {
limitsMax = this.limits[1];
}
- // #if DIM2
result = RawGenericJoint.prismatic(
rawA1,
rawA2,
@@ -629,38 +538,15 @@ export class JointData {
limitsMin,
limitsMax,
);
- // #endif
-
- // #if DIM3
- result = RawGenericJoint.prismatic(
- rawA1,
- rawA2,
- rawAx,
- limitsEnabled,
- limitsMin,
- limitsMax,
- );
- // #endif
rawAx.free();
break;
- // #if DIM2
- case JointType.Revolute:
- result = RawGenericJoint.revolute(rawA1, rawA2);
- break;
- // #endif
- // #if DIM3
case JointType.Generic:
rawAx = VectorOps.intoRaw(this.axis);
// implicit type cast: axesMask is a JointAxesMask bitflag enum,
// we're treating it as a u8 on the Rust side
let rawAxesMask = this.axesMask;
- result = RawGenericJoint.generic(
- rawA1,
- rawA2,
- rawAx,
- rawAxesMask,
- );
+ result = RawGenericJoint.generic(rawA1, rawA2, rawAx, rawAxesMask);
break;
case JointType.Spherical:
result = RawGenericJoint.spherical(rawA1, rawA2);
@@ -670,12 +556,11 @@ export class JointData {
result = RawGenericJoint.revolute(rawA1, rawA2, rawAx);
rawAx.free();
break;
- // #endif
}
rawA1.free();
rawA2.free();
- return result;
+ return result!;
}
}
diff --git a/packages/rapier-3d/src/dynamics/impulse_joint_set.ts b/packages/rapier-3d/src/dynamics/impulse_joint_set.ts
new file mode 100644
index 00000000..6bd04dea
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/impulse_joint_set.ts
@@ -0,0 +1,147 @@
+import {Coarena} from "../coarena";
+import {RawImpulseJointSet} from "../raw";
+import {ImpulseJoint, ImpulseJointHandle, JointData} from "./impulse_joint";
+import {RigidBodyHandle} from "./rigid_body";
+import {RigidBodySet} from "./rigid_body_set";
+
+/**
+ * A set of joints.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `jointSet.free()`
+ * once you are done using it (and all the joints it created).
+ */
+export class ImpulseJointSet {
+ raw: RawImpulseJointSet;
+ private map: Coarena;
+
+ /**
+ * Release the WASM memory occupied by this joint set.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+
+ if (!!this.map) {
+ this.map.clear();
+ }
+ this.map = undefined!;
+ }
+
+ constructor(raw?: RawImpulseJointSet) {
+ this.raw = raw || new RawImpulseJointSet();
+ this.map = new Coarena();
+ // Initialize the map with the existing elements, if any.
+ if (raw) {
+ raw.forEachJointHandle((handle: ImpulseJointHandle) => {
+ this.map.set(handle, ImpulseJoint.newTyped(raw, null!, handle));
+ });
+ }
+ }
+
+ /** @internal */
+ public finalizeDeserialization(bodies: RigidBodySet) {
+ this.map.forEach((joint) => joint.finalizeDeserialization(bodies));
+ }
+
+ /**
+ * Creates a new joint and return its integer handle.
+ *
+ * @param bodies - The set of rigid-bodies containing the bodies the joint is attached to.
+ * @param desc - The joint's parameters.
+ * @param parent1 - The handle of the first rigid-body this joint is attached to.
+ * @param parent2 - The handle of the second rigid-body this joint is attached to.
+ * @param wakeUp - Should the attached rigid-bodies be awakened?
+ */
+ public createJoint(
+ bodies: RigidBodySet,
+ desc: JointData,
+ parent1: RigidBodyHandle,
+ parent2: RigidBodyHandle,
+ wakeUp: boolean,
+ ): ImpulseJoint {
+ const rawParams = desc.intoRaw();
+ const handle = this.raw.createJoint(rawParams, parent1, parent2, wakeUp);
+ rawParams.free();
+ let joint = ImpulseJoint.newTyped(this.raw, bodies, handle);
+ this.map.set(handle, joint);
+ return joint;
+ }
+
+ /**
+ * Remove a joint from this set.
+ *
+ * @param handle - The integer handle of the joint.
+ * @param wakeUp - If `true`, the rigid-bodies attached by the removed joint will be woken-up automatically.
+ */
+ public remove(handle: ImpulseJointHandle, wakeUp: boolean) {
+ this.raw.remove(handle, wakeUp);
+ this.unmap(handle);
+ }
+
+ /**
+ * Calls the given closure with the integer handle of each impulse joint attached to this rigid-body.
+ *
+ * @param f - The closure called with the integer handle of each impulse joint attached to the rigid-body.
+ */
+ public forEachJointHandleAttachedToRigidBody(
+ handle: RigidBodyHandle,
+ f: (handle: ImpulseJointHandle) => void,
+ ) {
+ this.raw.forEachJointAttachedToRigidBody(handle, f);
+ }
+
+ /**
+ * Internal function, do not call directly.
+ * @param handle
+ */
+ public unmap(handle: ImpulseJointHandle) {
+ this.map.delete(handle);
+ }
+
+ /**
+ * The number of joints on this set.
+ */
+ public len(): number {
+ return this.map.len();
+ }
+
+ /**
+ * Does this set contain a joint with the given handle?
+ *
+ * @param handle - The joint handle to check.
+ */
+ public contains(handle: ImpulseJointHandle): boolean {
+ return this.get(handle) != null;
+ }
+
+ /**
+ * Gets the joint with the given handle.
+ *
+ * Returns `null` if no joint with the specified handle exists.
+ *
+ * @param handle - The integer handle of the joint to retrieve.
+ */
+ public get(handle: ImpulseJointHandle): ImpulseJoint | null {
+ return this.map.get(handle);
+ }
+
+ /**
+ * Applies the given closure to each joint contained by this set.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEach(f: (joint: ImpulseJoint) => void) {
+ this.map.forEach(f);
+ }
+
+ /**
+ * Gets all joints in the list.
+ *
+ * @returns joint list.
+ */
+ public getAll(): ImpulseJoint[] {
+ return this.map.getAll();
+ }
+}
diff --git a/packages/rapier-3d/src/dynamics/index.ts b/packages/rapier-3d/src/dynamics/index.ts
new file mode 100644
index 00000000..4141658e
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/index.ts
@@ -0,0 +1,10 @@
+export * from "./rigid_body";
+export * from "./rigid_body_set";
+export * from "./integration_parameters";
+export * from "./impulse_joint";
+export * from "./impulse_joint_set";
+export * from "./multibody_joint";
+export * from "./multibody_joint_set";
+export * from "./coefficient_combine_rule";
+export * from "./ccd_solver";
+export * from "./island_manager";
diff --git a/packages/rapier-3d/src/dynamics/integration_parameters.ts b/packages/rapier-3d/src/dynamics/integration_parameters.ts
new file mode 100644
index 00000000..5c71e8a0
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/integration_parameters.ts
@@ -0,0 +1,126 @@
+import {RawIntegrationParameters} from "../raw";
+
+export class IntegrationParameters {
+ raw: RawIntegrationParameters;
+
+ constructor(raw?: RawIntegrationParameters) {
+ this.raw = raw || new RawIntegrationParameters();
+ }
+
+ /**
+ * Free the WASM memory used by these integration parameters.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ /**
+ * The timestep length (default: `1.0 / 60.0`)
+ */
+ get dt(): number {
+ return this.raw.dt;
+ }
+
+ /**
+ * The Error Reduction Parameter in `[0, 1]` is the proportion of
+ * the positional error to be corrected at each time step (default: `0.2`).
+ */
+ get contact_erp(): number {
+ return this.raw.contact_erp;
+ }
+
+ get lengthUnit(): number {
+ return this.raw.lengthUnit;
+ }
+
+ /**
+ * Normalized amount of penetration the engine won’t attempt to correct (default: `0.001m`).
+ *
+ * This threshold considered by the physics engine is this value multiplied by the `lengthUnit`.
+ */
+ get normalizedAllowedLinearError(): number {
+ return this.raw.normalizedAllowedLinearError;
+ }
+
+ /**
+ * The maximal normalized distance separating two objects that will generate predictive contacts (default: `0.002`).
+ *
+ * This threshold considered by the physics engine is this value multiplied by the `lengthUnit`.
+ */
+ get normalizedPredictionDistance(): number {
+ return this.raw.normalizedPredictionDistance;
+ }
+
+ /**
+ * The number of solver iterations run by the constraints solver for calculating forces (default: `4`).
+ */
+ get numSolverIterations(): number {
+ return this.raw.numSolverIterations;
+ }
+
+ /**
+ * Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).
+ */
+ get numInternalPgsIterations(): number {
+ return this.raw.numInternalPgsIterations;
+ }
+
+ /**
+ * Minimum number of dynamic bodies in each active island (default: `128`).
+ */
+ get minIslandSize(): number {
+ return this.raw.minIslandSize;
+ }
+
+ /**
+ * Maximum number of substeps performed by the solver (default: `1`).
+ */
+ get maxCcdSubsteps(): number {
+ return this.raw.maxCcdSubsteps;
+ }
+
+ set dt(value: number) {
+ this.raw.dt = value;
+ }
+
+ set contact_natural_frequency(value: number) {
+ this.raw.contact_natural_frequency = value;
+ }
+
+ set lengthUnit(value: number) {
+ this.raw.lengthUnit = value;
+ }
+
+ set normalizedAllowedLinearError(value: number) {
+ this.raw.normalizedAllowedLinearError = value;
+ }
+
+ set normalizedPredictionDistance(value: number) {
+ this.raw.normalizedPredictionDistance = value;
+ }
+
+ /**
+ * Sets the number of solver iterations run by the constraints solver for calculating forces (default: `4`).
+ */
+ set numSolverIterations(value: number) {
+ this.raw.numSolverIterations = value;
+ }
+
+ /**
+ * Sets the number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).
+ */
+ set numInternalPgsIterations(value: number) {
+ this.raw.numInternalPgsIterations = value;
+ }
+
+ set minIslandSize(value: number) {
+ this.raw.minIslandSize = value;
+ }
+
+ set maxCcdSubsteps(value: number) {
+ this.raw.maxCcdSubsteps = value;
+ }
+}
diff --git a/packages/rapier-3d/src/dynamics/island_manager.ts b/packages/rapier-3d/src/dynamics/island_manager.ts
new file mode 100644
index 00000000..c48c1727
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/island_manager.ts
@@ -0,0 +1,37 @@
+import {RawIslandManager} from "../raw";
+import {RigidBodyHandle} from "./rigid_body";
+
+/**
+ * The CCD solver responsible for resolving Continuous Collision Detection.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `ccdSolver.free()`
+ * once you are done using it.
+ */
+export class IslandManager {
+ raw: RawIslandManager;
+
+ /**
+ * Release the WASM memory occupied by this narrow-phase.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw?: RawIslandManager) {
+ this.raw = raw || new RawIslandManager();
+ }
+
+ /**
+ * Applies the given closure to the handle of each active rigid-bodies contained by this set.
+ *
+ * A rigid-body is active if it is not sleeping, i.e., if it moved recently.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEachActiveRigidBodyHandle(f: (handle: RigidBodyHandle) => void) {
+ this.raw.forEachActiveRigidBodyHandle(f);
+ }
+}
diff --git a/src.ts/dynamics/multibody_joint.ts b/packages/rapier-3d/src/dynamics/multibody_joint.ts
similarity index 91%
rename from src.ts/dynamics/multibody_joint.ts
rename to packages/rapier-3d/src/dynamics/multibody_joint.ts
index 5608aec7..a524bbc6 100644
--- a/src.ts/dynamics/multibody_joint.ts
+++ b/packages/rapier-3d/src/dynamics/multibody_joint.ts
@@ -1,22 +1,4 @@
-import {
- RawImpulseJointSet,
- RawJointAxis,
- RawJointType,
- RawMultibodyJointSet,
-} from "../raw";
-import {
- FixedImpulseJoint,
- ImpulseJointHandle,
- JointType,
- MotorModel,
- PrismaticImpulseJoint,
- RevoluteImpulseJoint,
-} from "./impulse_joint";
-
-// #if DIM3
-import {Quaternion} from "../math";
-import {SphericalImpulseJoint} from "./impulse_joint";
-// #endif
+import {RawJointAxis, RawJointType, RawMultibodyJointSet} from "../raw";
/**
* The integer identifier of a collider added to a `ColliderSet`.
@@ -43,10 +25,8 @@ export class MultibodyJoint {
return new PrismaticMultibodyJoint(rawSet, handle);
case RawJointType.Fixed:
return new FixedMultibodyJoint(rawSet, handle);
- // #if DIM3
case RawJointType.Spherical:
return new SphericalMultibodyJoint(rawSet, handle);
- // #endif
default:
return new MultibodyJoint(rawSet, handle);
}
@@ -81,7 +61,6 @@ export class MultibodyJoint {
// return this.rawSet.jointType(this.handle);
// }
//
- // // #if DIM3
// /**
// * The rotation quaternion that aligns this joint's first local axis to the `x` axis.
// */
@@ -89,9 +68,7 @@ export class MultibodyJoint {
// return RotationOps.fromRaw(this.rawSet.jointFrameX1(this.handle));
// }
//
- // // #endif
//
- // // #if DIM3
// /**
// * The rotation matrix that aligns this joint's second local axis to the `x` axis.
// */
@@ -99,7 +76,6 @@ export class MultibodyJoint {
// return RotationOps.fromRaw(this.rawSet.jointFrameX2(this.handle));
// }
//
- // // #endif
//
// /**
// * The position of the first anchor of this joint.
@@ -142,7 +118,9 @@ export class UnitMultibodyJoint extends MultibodyJoint {
/**
* The axis left free by this joint.
*/
- protected rawAxis?(): RawJointAxis;
+ protected rawAxis(): RawJointAxis {
+ throw new Error("rawAxis must be implemented by subclasses");
+ }
// /**
// * Are the limits enabled for this joint?
@@ -196,7 +174,6 @@ export class RevoluteMultibodyJoint extends UnitMultibodyJoint {
}
}
-// #if DIM3
export class SphericalMultibodyJoint extends MultibodyJoint {
/* Unsupported by this alpha release.
public configureMotorModel(model: MotorModel) {
@@ -219,4 +196,3 @@ export class SphericalMultibodyJoint extends MultibodyJoint {
}
*/
}
-// #endif
diff --git a/packages/rapier-3d/src/dynamics/multibody_joint_set.ts b/packages/rapier-3d/src/dynamics/multibody_joint_set.ts
new file mode 100644
index 00000000..78840397
--- /dev/null
+++ b/packages/rapier-3d/src/dynamics/multibody_joint_set.ts
@@ -0,0 +1,140 @@
+import {Coarena} from "../coarena";
+import {RawMultibodyJointSet} from "../raw";
+import {JointData} from "./impulse_joint";
+import {MultibodyJoint, MultibodyJointHandle} from "./multibody_joint";
+import {RigidBodyHandle} from "./rigid_body";
+
+/**
+ * A set of joints.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `jointSet.free()`
+ * once you are done using it (and all the joints it created).
+ */
+export class MultibodyJointSet {
+ raw: RawMultibodyJointSet;
+ private map: Coarena;
+
+ /**
+ * Release the WASM memory occupied by this joint set.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+
+ if (!!this.map) {
+ this.map.clear();
+ }
+ this.map = undefined!;
+ }
+
+ constructor(raw?: RawMultibodyJointSet) {
+ this.raw = raw || new RawMultibodyJointSet();
+ this.map = new Coarena();
+ // Initialize the map with the existing elements, if any.
+ if (raw) {
+ raw.forEachJointHandle((handle: MultibodyJointHandle) => {
+ this.map.set(handle, MultibodyJoint.newTyped(this.raw, handle));
+ });
+ }
+ }
+
+ /**
+ * Creates a new joint and return its integer handle.
+ *
+ * @param desc - The joint's parameters.
+ * @param parent1 - The handle of the first rigid-body this joint is attached to.
+ * @param parent2 - The handle of the second rigid-body this joint is attached to.
+ * @param wakeUp - Should the attached rigid-bodies be awakened?
+ */
+ public createJoint(
+ desc: JointData,
+ parent1: RigidBodyHandle,
+ parent2: RigidBodyHandle,
+ wakeUp: boolean,
+ ): MultibodyJoint {
+ const rawParams = desc.intoRaw();
+ const handle = this.raw.createJoint(rawParams, parent1, parent2, wakeUp);
+ rawParams.free();
+ let joint = MultibodyJoint.newTyped(this.raw, handle);
+ this.map.set(handle, joint);
+ return joint;
+ }
+
+ /**
+ * Remove a joint from this set.
+ *
+ * @param handle - The integer handle of the joint.
+ * @param wake_up - If `true`, the rigid-bodies attached by the removed joint will be woken-up automatically.
+ */
+ public remove(handle: MultibodyJointHandle, wake_up: boolean) {
+ this.raw.remove(handle, wake_up);
+ this.map.delete(handle);
+ }
+
+ /**
+ * Internal function, do not call directly.
+ * @param handle
+ */
+ public unmap(handle: MultibodyJointHandle) {
+ this.map.delete(handle);
+ }
+
+ /**
+ * The number of joints on this set.
+ */
+ public len(): number {
+ return this.map.len();
+ }
+
+ /**
+ * Does this set contain a joint with the given handle?
+ *
+ * @param handle - The joint handle to check.
+ */
+ public contains(handle: MultibodyJointHandle): boolean {
+ return this.get(handle) != null;
+ }
+
+ /**
+ * Gets the joint with the given handle.
+ *
+ * Returns `null` if no joint with the specified handle exists.
+ *
+ * @param handle - The integer handle of the joint to retrieve.
+ */
+ public get(handle: MultibodyJointHandle): MultibodyJoint | null {
+ return this.map.get(handle);
+ }
+
+ /**
+ * Applies the given closure to each joint contained by this set.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEach(f: (joint: MultibodyJoint) => void) {
+ this.map.forEach(f);
+ }
+
+ /**
+ * Calls the given closure with the integer handle of each multibody joint attached to this rigid-body.
+ *
+ * @param f - The closure called with the integer handle of each multibody joint attached to the rigid-body.
+ */
+ public forEachJointHandleAttachedToRigidBody(
+ handle: RigidBodyHandle,
+ f: (handle: MultibodyJointHandle) => void,
+ ) {
+ this.raw.forEachJointAttachedToRigidBody(handle, f);
+ }
+
+ /**
+ * Gets all joints in the list.
+ *
+ * @returns joint list.
+ */
+ public getAll(): MultibodyJoint[] {
+ return this.map.getAll();
+ }
+}
diff --git a/src.ts/dynamics/rigid_body.ts b/packages/rapier-3d/src/dynamics/rigid_body.ts
similarity index 73%
rename from src.ts/dynamics/rigid_body.ts
rename to packages/rapier-3d/src/dynamics/rigid_body.ts
index 8f52dbe5..4cc24a50 100644
--- a/src.ts/dynamics/rigid_body.ts
+++ b/packages/rapier-3d/src/dynamics/rigid_body.ts
@@ -1,9 +1,7 @@
-import {RawRigidBodySet, RawRigidBodyType} from "../raw";
+import {Collider, ColliderSet} from "../geometry";
import {Rotation, RotationOps, Vector, VectorOps} from "../math";
-// #if DIM3
import {SdpMatrix3, SdpMatrix3Ops} from "../math";
-// #endif
-import {Collider, ColliderSet} from "../geometry";
+import {RawRigidBodySet, RawRigidBodyType} from "../raw";
/**
* The integer identifier of a collider added to a `ColliderSet`.
@@ -50,20 +48,18 @@ export class RigidBody {
private rawSet: RawRigidBodySet; // The RigidBody won't need to free this.
private colliderSet: ColliderSet;
readonly handle: RigidBodyHandle;
+ private scratchBuffer: Float32Array;
/**
* An arbitrary user-defined object associated with this rigid-body.
*/
public userData?: unknown;
- constructor(
- rawSet: RawRigidBodySet,
- colliderSet: ColliderSet,
- handle: RigidBodyHandle,
- ) {
+ constructor(rawSet: RawRigidBodySet, colliderSet: ColliderSet, handle: RigidBodyHandle) {
this.rawSet = rawSet;
this.colliderSet = colliderSet;
this.handle = handle;
+ this.scratchBuffer = new Float32Array(4);
}
/** @internal */
@@ -99,45 +95,6 @@ export class RigidBody {
return this.rawSet.rbLockRotations(this.handle, locked, wakeUp);
}
- // #if DIM2
- /**
- * Locks or unlocks the ability of this rigid-body to translation along individual coordinate axes.
- *
- * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.
- * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.
- * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
- */
- public setEnabledTranslations(
- enableX: boolean,
- enableY: boolean,
- wakeUp: boolean,
- ) {
- return this.rawSet.rbSetEnabledTranslations(
- this.handle,
- enableX,
- enableY,
- wakeUp,
- );
- }
-
- /**
- * Locks or unlocks the ability of this rigid-body to translation along individual coordinate axes.
- *
- * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.
- * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.
- * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.
- * @deprecated use `this.setEnabledTranslations` with the same arguments instead.
- */
- public restrictTranslations(
- enableX: boolean,
- enableY: boolean,
- wakeUp: boolean,
- ) {
- this.setEnabledTranslations(enableX, enableX, wakeUp);
- }
-
- // #endif
- // #if DIM3
/**
* Locks or unlocks the ability of this rigid-body to translate along individual coordinate axes.
*
@@ -152,13 +109,7 @@ export class RigidBody {
enableZ: boolean,
wakeUp: boolean,
) {
- return this.rawSet.rbSetEnabledTranslations(
- this.handle,
- enableX,
- enableY,
- enableZ,
- wakeUp,
- );
+ return this.rawSet.rbSetEnabledTranslations(this.handle, enableX, enableY, enableZ, wakeUp);
}
/**
@@ -193,13 +144,7 @@ export class RigidBody {
enableZ: boolean,
wakeUp: boolean,
) {
- return this.rawSet.rbSetEnabledRotations(
- this.handle,
- enableX,
- enableY,
- enableZ,
- wakeUp,
- );
+ return this.rawSet.rbSetEnabledRotations(this.handle, enableX, enableY, enableZ, wakeUp);
}
/**
@@ -220,8 +165,6 @@ export class RigidBody {
this.setEnabledRotations(enableX, enableY, enableZ, wakeUp);
}
- // #endif
-
/**
* The dominance group, in [-127, +127] this rigid-body is part of.
*/
@@ -293,18 +236,22 @@ export class RigidBody {
/**
* The world-space translation of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public translation(): Vector {
- let res = this.rawSet.rbTranslation(this.handle);
- return VectorOps.fromRaw(res);
+ public translation(target?: Vector): Vector {
+ this.rawSet.rbTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
* The world-space orientation of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public rotation(): Rotation {
- let res = this.rawSet.rbRotation(this.handle);
- return RotationOps.fromRaw(res);
+ public rotation(target?: Rotation): Rotation {
+ this.rawSet.rbRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer, target);
}
/**
@@ -313,10 +260,12 @@ export class RigidBody {
* If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`
* method and is used for estimating the kinematic body velocity at the next timestep.
* For non-kinematic bodies, this value is currently unspecified.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public nextTranslation(): Vector {
- let res = this.rawSet.rbNextTranslation(this.handle);
- return VectorOps.fromRaw(res);
+ public nextTranslation(target?: Vector): Vector {
+ this.rawSet.rbNextTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
@@ -325,10 +274,12 @@ export class RigidBody {
* If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`
* method and is used for estimating the kinematic body velocity at the next timestep.
* For non-kinematic bodies, this value is currently unspecified.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public nextRotation(): Rotation {
- let res = this.rawSet.rbNextRotation(this.handle);
- return RotationOps.fromRaw(res);
+ public nextRotation(target?: Rotation): Rotation {
+ this.rawSet.rbNextRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer, target);
}
/**
@@ -339,12 +290,7 @@ export class RigidBody {
* wasn't moving before modifying its position.
*/
public setTranslation(tra: Vector, wakeUp: boolean) {
- // #if DIM2
- this.rawSet.rbSetTranslation(this.handle, tra.x, tra.y, wakeUp);
- // #endif
- // #if DIM3
this.rawSet.rbSetTranslation(this.handle, tra.x, tra.y, tra.z, wakeUp);
- // #endif
}
/**
@@ -379,7 +325,6 @@ export class RigidBody {
this.rawSet.rbSetGravityScale(this.handle, factor, wakeUp);
}
- // #if DIM3
/**
* Sets the rotation quaternion of this rigid-body.
*
@@ -390,14 +335,7 @@ export class RigidBody {
* wasn't moving before modifying its position.
*/
public setRotation(rot: Rotation, wakeUp: boolean) {
- this.rawSet.rbSetRotation(
- this.handle,
- rot.x,
- rot.y,
- rot.z,
- rot.w,
- wakeUp,
- );
+ this.rawSet.rbSetRotation(this.handle, rot.x, rot.y, rot.z, rot.w, wakeUp);
}
/**
@@ -412,32 +350,6 @@ export class RigidBody {
rawVel.free();
}
- // #endif
-
- // #if DIM2
- /**
- * Sets the rotation angle of this rigid-body.
- *
- * @param angle - The rotation angle, in radians.
- * @param wakeUp - Forces the rigid-body to wake-up so it is properly affected by forces if it
- * wasn't moving before modifying its position.
- */
- public setRotation(angle: number, wakeUp: boolean) {
- this.rawSet.rbSetRotation(this.handle, angle, wakeUp);
- }
-
- /**
- * Sets the angular velocity fo this rigid-body.
- *
- * @param vel - The angular velocity to set.
- * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.
- */
- public setAngvel(vel: number, wakeUp: boolean) {
- this.rawSet.rbSetAngvel(this.handle, vel, wakeUp);
- }
-
- // #endif
-
/**
* If this rigid body is kinematic, sets its future translation after the next timestep integration.
*
@@ -450,15 +362,9 @@ export class RigidBody {
* @param t - The kinematic translation to set.
*/
public setNextKinematicTranslation(t: Vector) {
- // #if DIM2
- this.rawSet.rbSetNextKinematicTranslation(this.handle, t.x, t.y);
- // #endif
- // #if DIM3
this.rawSet.rbSetNextKinematicTranslation(this.handle, t.x, t.y, t.z);
- // #endif
}
- // #if DIM3
/**
* If this rigid body is kinematic, sets its future rotation after the next timestep integration.
*
@@ -471,40 +377,17 @@ export class RigidBody {
* @param rot - The kinematic rotation to set.
*/
public setNextKinematicRotation(rot: Rotation) {
- this.rawSet.rbSetNextKinematicRotation(
- this.handle,
- rot.x,
- rot.y,
- rot.z,
- rot.w,
- );
- }
-
- // #endif
-
- // #if DIM2
- /**
- * If this rigid body is kinematic, sets its future rotation after the next timestep integration.
- *
- * This should be used instead of `rigidBody.setRotation` to make the dynamic object
- * interacting with this kinematic body behave as expected. Internally, Rapier will compute
- * an artificial velocity for this rigid-body from its current position and its next kinematic
- * position. This velocity will be used to compute forces on dynamic bodies interacting with
- * this body.
- *
- * @param angle - The kinematic rotation angle, in radians.
- */
- public setNextKinematicRotation(angle: number) {
- this.rawSet.rbSetNextKinematicRotation(this.handle, angle);
+ this.rawSet.rbSetNextKinematicRotation(this.handle, rot.x, rot.y, rot.z, rot.w);
}
- // #endif
-
/**
* The linear velocity of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public linvel(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbLinvel(this.handle));
+ public linvel(target?: Vector): Vector {
+ this.rawSet.rbLinvel(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
@@ -512,33 +395,21 @@ export class RigidBody {
*/
public velocityAtPoint(point: Vector): Vector {
const rawPoint = VectorOps.intoRaw(point);
- let result = VectorOps.fromRaw(
- this.rawSet.rbVelocityAtPoint(this.handle, rawPoint),
- );
+ let result = VectorOps.fromRaw(this.rawSet.rbVelocityAtPoint(this.handle, rawPoint));
rawPoint.free();
- return result;
+ return result!;
}
- // #if DIM3
- /**
- * The angular velocity of this rigid-body.
- */
- public angvel(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbAngvel(this.handle));
- }
-
- // #endif
-
- // #if DIM2
/**
* The angular velocity of this rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public angvel(): number {
- return this.rawSet.rbAngvel(this.handle);
+ public angvel(target?: Vector): Vector {
+ this.rawSet.rbAngvel(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
- // #endif
-
/**
* The mass of this rigid-body.
*/
@@ -550,7 +421,7 @@ export class RigidBody {
* The inverse mass taking into account translation locking.
*/
public effectiveInvMass(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbEffectiveInvMass(this.handle));
+ return VectorOps.fromRaw(this.rawSet.rbEffectiveInvMass(this.handle))!;
}
/**
@@ -564,124 +435,63 @@ export class RigidBody {
/**
* The center of mass of a rigid-body expressed in its local-space.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public localCom(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbLocalCom(this.handle));
+ public localCom(target?: Vector): Vector {
+ this.rawSet.rbLocalCom(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
* The world-space center of mass of the rigid-body.
- */
- public worldCom(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbWorldCom(this.handle));
- }
-
- // #if DIM2
- /**
- * The inverse of the principal angular inertia of the rigid-body.
*
- * Components set to zero are assumed to be infinite along the corresponding principal axis.
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public invPrincipalInertia(): number {
- return this.rawSet.rbInvPrincipalInertia(this.handle);
+ public worldCom(target?: Vector): Vector {
+ this.rawSet.rbWorldCom(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
- // #endif
-
- // #if DIM3
/**
* The inverse of the principal angular inertia of the rigid-body.
*
* Components set to zero are assumed to be infinite along the corresponding principal axis.
*/
public invPrincipalInertia(): Vector {
- return VectorOps.fromRaw(
- this.rawSet.rbInvPrincipalInertia(this.handle),
- );
+ return VectorOps.fromRaw(this.rawSet.rbInvPrincipalInertia(this.handle))!;
}
- // #endif
-
- // #if DIM2
- /**
- * The angular inertia along the principal inertia axes of the rigid-body.
- */
- public principalInertia(): number {
- return this.rawSet.rbPrincipalInertia(this.handle);
- }
-
- // #endif
-
- // #if DIM3
/**
* The angular inertia along the principal inertia axes of the rigid-body.
*/
public principalInertia(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbPrincipalInertia(this.handle));
+ return VectorOps.fromRaw(this.rawSet.rbPrincipalInertia(this.handle))!;
}
- // #endif
-
- // #if DIM3
/**
* The principal vectors of the local angular inertia tensor of the rigid-body.
*/
public principalInertiaLocalFrame(): Rotation {
- return RotationOps.fromRaw(
- this.rawSet.rbPrincipalInertiaLocalFrame(this.handle),
- );
+ return RotationOps.fromRaw(this.rawSet.rbPrincipalInertiaLocalFrame(this.handle))!;
}
- // #endif
-
- // #if DIM2
- /**
- * The world-space inverse angular inertia tensor of the rigid-body,
- * taking into account rotation locking.
- */
- public effectiveWorldInvInertia(): number {
- return this.rawSet.rbEffectiveWorldInvInertia(this.handle);
- }
-
- // #endif
-
- // #if DIM3
/**
* The world-space inverse angular inertia tensor of the rigid-body,
* taking into account rotation locking.
*/
public effectiveWorldInvInertia(): SdpMatrix3 {
- return SdpMatrix3Ops.fromRaw(
- this.rawSet.rbEffectiveWorldInvInertia(this.handle),
- );
+ return SdpMatrix3Ops.fromRaw(this.rawSet.rbEffectiveWorldInvInertia(this.handle));
}
- // #endif
-
- // #if DIM2
- /**
- * The effective world-space angular inertia (that takes the potential rotation locking into account) of
- * this rigid-body.
- */
- public effectiveAngularInertia(): number {
- return this.rawSet.rbEffectiveAngularInertia(this.handle);
- }
-
- // #endif
-
- // #if DIM3
/**
* The effective world-space angular inertia (that takes the potential rotation locking into account) of
* this rigid-body.
*/
public effectiveAngularInertia(): SdpMatrix3 {
- return SdpMatrix3Ops.fromRaw(
- this.rawSet.rbEffectiveAngularInertia(this.handle),
- );
+ return SdpMatrix3Ops.fromRaw(this.rawSet.rbEffectiveAngularInertia(this.handle));
}
- // #endif
-
/**
* Put this rigid body to sleep.
*
@@ -727,7 +537,7 @@ export class RigidBody {
* This index is **not** the same as the unique identifier of the collider.
*/
public collider(i: number): Collider {
- return this.colliderSet.get(this.rawSet.rbCollider(this.handle, i));
+ return this.colliderSet.get(this.rawSet.rbCollider(this.handle, i))!;
}
/**
@@ -757,11 +567,7 @@ export class RigidBody {
* Set a new status for this rigid-body: static, dynamic, or kinematic.
*/
public setBodyType(type: RigidBodyType, wakeUp: boolean) {
- return this.rawSet.rbSetBodyType(
- this.handle,
- type as number as RawRigidBodyType,
- wakeUp,
- );
+ return this.rawSet.rbSetBodyType(this.handle, type as number as RawRigidBodyType, wakeUp);
}
/**
@@ -826,10 +632,7 @@ export class RigidBody {
* Recompute the mass-properties of this rigid-bodies based on its currently attached colliders.
*/
public recomputeMassPropertiesFromColliders() {
- this.rawSet.rbRecomputeMassPropertiesFromColliders(
- this.handle,
- this.colliderSet.raw,
- );
+ this.rawSet.rbRecomputeMassPropertiesFromColliders(this.handle, this.colliderSet.raw);
}
/**
@@ -855,7 +658,6 @@ export class RigidBody {
this.rawSet.rbSetAdditionalMass(this.handle, mass, wakeUp);
}
- // #if DIM3
/**
* Sets the rigid-body's additional mass-properties.
*
@@ -897,44 +699,6 @@ export class RigidBody {
rawInertiaFrame.free();
}
- // #endif
-
- // #if DIM2
- /**
- * Sets the rigid-body's additional mass-properties.
- *
- * This is only the "additional" mass-properties because the total mass-properties of the rigid-body is equal to the
- * sum of this additional mass-properties and the mass computed from the colliders (with non-zero densities) attached
- * to this rigid-body.
- *
- * That total mass-properties (which include the attached colliders’ contributions) will be updated at the name
- * physics step, or can be updated manually with `this.recomputeMassPropertiesFromColliders`.
- *
- * This will override any previous mass-properties set by `this.setAdditionalMass`,
- * `this.setAdditionalMassProperties`, `RigidBodyDesc.setAdditionalMass`, or `RigidBodyDesc.setAdditionalMassProperties`
- * for this rigid-body.
- *
- * If `wake_up` is true then the rigid-body will be woken up if it was put to sleep because it did not move for a while.
- */
- public setAdditionalMassProperties(
- mass: number,
- centerOfMass: Vector,
- principalAngularInertia: number,
- wakeUp: boolean,
- ) {
- let rawCom = VectorOps.intoRaw(centerOfMass);
- this.rawSet.rbSetAdditionalMassProperties(
- this.handle,
- mass,
- rawCom,
- principalAngularInertia,
- wakeUp,
- );
- rawCom.free();
- }
-
- // #endif
-
/**
* Sets the linear damping factor applied to this rigid-body.
*
@@ -986,20 +750,6 @@ export class RigidBody {
rawImpulse.free();
}
- // #if DIM2
- /**
- * Adds a torque at the center-of-mass of this rigid-body.
- *
- * @param torque - the torque to add to the rigid-body.
- * @param wakeUp - should the rigid-body be automatically woken-up?
- */
- public addTorque(torque: number, wakeUp: boolean) {
- this.rawSet.rbAddTorque(this.handle, torque, wakeUp);
- }
-
- // #endif
-
- // #if DIM3
/**
* Adds a torque at the center-of-mass of this rigid-body.
*
@@ -1012,22 +762,6 @@ export class RigidBody {
rawTorque.free();
}
- // #endif
-
- // #if DIM2
- /**
- * Applies an impulsive torque at the center-of-mass of this rigid-body.
- *
- * @param torqueImpulse - the torque impulse to apply on the rigid-body.
- * @param wakeUp - should the rigid-body be automatically woken-up?
- */
- public applyTorqueImpulse(torqueImpulse: number, wakeUp: boolean) {
- this.rawSet.rbApplyTorqueImpulse(this.handle, torqueImpulse, wakeUp);
- }
-
- // #endif
-
- // #if DIM3
/**
* Applies an impulsive torque at the center-of-mass of this rigid-body.
*
@@ -1040,8 +774,6 @@ export class RigidBody {
rawTorqueImpulse.free();
}
- // #endif
-
/**
* Adds a force at the given world-space point of this rigid-body.
*
@@ -1064,19 +796,10 @@ export class RigidBody {
* @param point - the world-space point where the impulse is to be applied on the rigid-body.
* @param wakeUp - should the rigid-body be automatically woken-up?
*/
- public applyImpulseAtPoint(
- impulse: Vector,
- point: Vector,
- wakeUp: boolean,
- ) {
+ public applyImpulseAtPoint(impulse: Vector, point: Vector, wakeUp: boolean) {
const rawImpulse = VectorOps.intoRaw(impulse);
const rawPoint = VectorOps.intoRaw(point);
- this.rawSet.rbApplyImpulseAtPoint(
- this.handle,
- rawImpulse,
- rawPoint,
- wakeUp,
- );
+ this.rawSet.rbApplyImpulseAtPoint(this.handle, rawImpulse, rawPoint, wakeUp);
rawImpulse.free();
rawPoint.free();
}
@@ -1086,28 +809,16 @@ export class RigidBody {
* Returns zero if the rigid-body is not dynamic.
*/
public userForce(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbUserForce(this.handle));
- }
-
- // #if DIM2
- /**
- * Retrieves the constant torque(s) the user added to this rigid-body
- * Returns zero if the rigid-body is not dynamic.
- */
- public userTorque(): number {
- return this.rawSet.rbUserTorque(this.handle);
+ return VectorOps.fromRaw(this.rawSet.rbUserForce(this.handle))!;
}
- // #endif
- // #if DIM3
/**
* Retrieves the constant torque(s) the user added to this rigid-body
* Returns zero if the rigid-body is not dynamic.
*/
public userTorque(): Vector {
- return VectorOps.fromRaw(this.rawSet.rbUserTorque(this.handle));
+ return VectorOps.fromRaw(this.rawSet.rbUserTorque(this.handle))!;
}
- // #endif
}
export class RigidBodyDesc {
@@ -1121,12 +832,6 @@ export class RigidBodyDesc {
translationsEnabledX: boolean;
translationsEnabledY: boolean;
linvel: Vector;
- // #if DIM2
- angvel: number;
- principalAngularInertia: number;
- rotationsEnabled: boolean;
- // #endif
- // #if DIM3
angvel: Vector;
principalAngularInertia: Vector;
angularInertiaLocalFrame: Rotation;
@@ -1134,7 +839,6 @@ export class RigidBodyDesc {
rotationsEnabledX: boolean;
rotationsEnabledY: boolean;
rotationsEnabledZ: boolean;
- // #endif
linearDamping: number;
angularDamping: number;
status: RigidBodyType;
@@ -1158,12 +862,6 @@ export class RigidBodyDesc {
this.centerOfMass = VectorOps.zeros();
this.translationsEnabledX = true;
this.translationsEnabledY = true;
- // #if DIM2
- this.angvel = 0.0;
- this.principalAngularInertia = 0.0;
- this.rotationsEnabled = true;
- // #endif
- // #if DIM3
this.angvel = VectorOps.zeros();
this.principalAngularInertia = VectorOps.zeros();
this.angularInertiaLocalFrame = RotationOps.identity();
@@ -1171,7 +869,6 @@ export class RigidBodyDesc {
this.rotationsEnabledX = true;
this.rotationsEnabledY = true;
this.rotationsEnabledZ = true;
- // #endif
this.linearDamping = 0.0;
this.angularDamping = 0.0;
this.canSleep = true;
@@ -1276,52 +973,26 @@ export class RigidBodyDesc {
return this;
}
- // #if DIM2
- /**
- * Sets the initial translation of the rigid-body to create.
- */
- public setTranslation(x: number, y: number): RigidBodyDesc {
- if (typeof x != "number" || typeof y != "number")
- throw TypeError("The translation components must be numbers.");
-
- this.translation = {x: x, y: y};
- return this;
- }
-
- // #endif
-
- // #if DIM3
/**
* Sets the initial translation of the rigid-body to create.
*
* @param tra - The translation to set.
*/
public setTranslation(x: number, y: number, z: number): RigidBodyDesc {
- if (
- typeof x != "number" ||
- typeof y != "number" ||
- typeof z != "number"
- )
+ if (typeof x != "number" || typeof y != "number" || typeof z != "number")
throw TypeError("The translation components must be numbers.");
this.translation = {x: x, y: y, z: z};
return this;
}
- // #endif
-
/**
* Sets the initial rotation of the rigid-body to create.
*
* @param rot - The rotation to set.
*/
public setRotation(rot: Rotation): RigidBodyDesc {
- // #if DIM2
- this.rotation = rot;
- // #endif
- // #if DIM3
RotationOps.copy(this.rotation, rot);
- // #endif
return this;
}
@@ -1348,109 +1019,6 @@ export class RigidBodyDesc {
return this;
}
- // #if DIM2
- /**
- * Sets the initial linear velocity of the rigid-body to create.
- *
- * @param x - The linear velocity to set along the `x` axis.
- * @param y - The linear velocity to set along the `y` axis.
- */
- public setLinvel(x: number, y: number): RigidBodyDesc {
- if (typeof x != "number" || typeof y != "number")
- throw TypeError("The linvel components must be numbers.");
-
- this.linvel = {x: x, y: y};
- return this;
- }
-
- /**
- * Sets the initial angular velocity of the rigid-body to create.
- *
- * @param vel - The angular velocity to set.
- */
- public setAngvel(vel: number): RigidBodyDesc {
- this.angvel = vel;
- return this;
- }
-
- /**
- * Sets the mass properties of the rigid-body being built.
- *
- * Note that the final mass properties of the rigid-bodies depends
- * on the initial mass-properties of the rigid-body (set by this method)
- * to which is added the contributions of all the colliders with non-zero density
- * attached to this rigid-body.
- *
- * Therefore, if you want your provided mass properties to be the final
- * mass properties of your rigid-body, don't attach colliders to it, or
- * only attach colliders with densities equal to zero.
- *
- * @param mass − The initial mass of the rigid-body to create.
- * @param centerOfMass − The initial center-of-mass of the rigid-body to create.
- * @param principalAngularInertia − The initial principal angular inertia of the rigid-body to create.
- */
- public setAdditionalMassProperties(
- mass: number,
- centerOfMass: Vector,
- principalAngularInertia: number,
- ): RigidBodyDesc {
- this.mass = mass;
- VectorOps.copy(this.centerOfMass, centerOfMass);
- this.principalAngularInertia = principalAngularInertia;
- this.massOnly = false;
- return this;
- }
-
- /**
- * Allow translation of this rigid-body only along specific axes.
- * @param translationsEnabledX - Are translations along the X axis enabled?
- * @param translationsEnabledY - Are translations along the y axis enabled?
- */
- public enabledTranslations(
- translationsEnabledX: boolean,
- translationsEnabledY: boolean,
- ): RigidBodyDesc {
- this.translationsEnabledX = translationsEnabledX;
- this.translationsEnabledY = translationsEnabledY;
- return this;
- }
-
- /**
- * Allow translation of this rigid-body only along specific axes.
- * @param translationsEnabledX - Are translations along the X axis enabled?
- * @param translationsEnabledY - Are translations along the y axis enabled?
- * @deprecated use `this.enabledTranslations` with the same arguments instead.
- */
- public restrictTranslations(
- translationsEnabledX: boolean,
- translationsEnabledY: boolean,
- ): RigidBodyDesc {
- return this.enabledTranslations(
- translationsEnabledX,
- translationsEnabledY,
- );
- }
-
- /**
- * Locks all translations that would have resulted from forces on
- * the created rigid-body.
- */
- public lockTranslations(): RigidBodyDesc {
- return this.restrictTranslations(false, false);
- }
-
- /**
- * Locks all rotations that would have resulted from forces on
- * the created rigid-body.
- */
- public lockRotations(): RigidBodyDesc {
- this.rotationsEnabled = false;
- return this;
- }
-
- // #endif
-
- // #if DIM3
/**
* Sets the initial linear velocity of the rigid-body to create.
*
@@ -1459,11 +1027,7 @@ export class RigidBodyDesc {
* @param z - The linear velocity to set along the `z` axis.
*/
public setLinvel(x: number, y: number, z: number): RigidBodyDesc {
- if (
- typeof x != "number" ||
- typeof y != "number" ||
- typeof z != "number"
- )
+ if (typeof x != "number" || typeof y != "number" || typeof z != "number")
throw TypeError("The linvel components must be numbers.");
this.linvel = {x: x, y: y, z: z};
@@ -1508,10 +1072,7 @@ export class RigidBodyDesc {
this.mass = mass;
VectorOps.copy(this.centerOfMass, centerOfMass);
VectorOps.copy(this.principalAngularInertia, principalAngularInertia);
- RotationOps.copy(
- this.angularInertiaLocalFrame,
- angularInertiaLocalFrame,
- );
+ RotationOps.copy(this.angularInertiaLocalFrame, angularInertiaLocalFrame);
this.massOnly = false;
return this;
}
@@ -1589,11 +1150,7 @@ export class RigidBodyDesc {
rotationsEnabledY: boolean,
rotationsEnabledZ: boolean,
): RigidBodyDesc {
- return this.enabledRotations(
- rotationsEnabledX,
- rotationsEnabledY,
- rotationsEnabledZ,
- );
+ return this.enabledRotations(rotationsEnabledX, rotationsEnabledY, rotationsEnabledZ);
}
/**
@@ -1604,8 +1161,6 @@ export class RigidBodyDesc {
return this.restrictRotations(false, false, false);
}
- // #endif
-
/**
* Sets the linear damping of the rigid-body to create.
*
diff --git a/src.ts/dynamics/rigid_body_set.ts b/packages/rapier-3d/src/dynamics/rigid_body_set.ts
similarity index 80%
rename from src.ts/dynamics/rigid_body_set.ts
rename to packages/rapier-3d/src/dynamics/rigid_body_set.ts
index 4c2e47bd..f906b60e 100644
--- a/src.ts/dynamics/rigid_body_set.ts
+++ b/packages/rapier-3d/src/dynamics/rigid_body_set.ts
@@ -1,16 +1,11 @@
-import {RawRigidBodySet, RawRigidBodyType} from "../raw";
import {Coarena} from "../coarena";
-import {VectorOps, RotationOps} from "../math";
-import {
- RigidBody,
- RigidBodyDesc,
- RigidBodyHandle,
- RigidBodyType,
-} from "./rigid_body";
import {ColliderSet} from "../geometry";
+import {VectorOps, RotationOps} from "../math";
+import {RawRigidBodySet, RawRigidBodyType} from "../raw";
import {ImpulseJointSet} from "./impulse_joint_set";
-import {MultibodyJointSet} from "./multibody_joint_set";
import {IslandManager} from "./island_manager";
+import {MultibodyJointSet} from "./multibody_joint_set";
+import {RigidBody, RigidBodyDesc, RigidBodyHandle} from "./rigid_body";
/**
* A set of rigid bodies that can be handled by a physics pipeline.
@@ -29,12 +24,12 @@ export class RigidBodySet {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
if (!!this.map) {
this.map.clear();
}
- this.map = undefined;
+ this.map = undefined!;
}
constructor(raw?: RawRigidBodySet) {
@@ -43,7 +38,7 @@ export class RigidBodySet {
// deserialize
if (raw) {
raw.forEachRigidBodyHandle((handle: RigidBodyHandle) => {
- this.map.set(handle, new RigidBody(raw, null, handle));
+ this.map.set(handle, new RigidBody(raw, null!, handle));
});
}
}
@@ -60,24 +55,15 @@ export class RigidBodySet {
*
* @param desc - The description of the rigid-body to create.
*/
- public createRigidBody(
- colliderSet: ColliderSet,
- desc: RigidBodyDesc,
- ): RigidBody {
+ public createRigidBody(colliderSet: ColliderSet, desc: RigidBodyDesc): RigidBody {
let rawTra = VectorOps.intoRaw(desc.translation);
let rawRot = RotationOps.intoRaw(desc.rotation);
let rawLv = VectorOps.intoRaw(desc.linvel);
let rawCom = VectorOps.intoRaw(desc.centerOfMass);
- // #if DIM3
let rawAv = VectorOps.intoRaw(desc.angvel);
- let rawPrincipalInertia = VectorOps.intoRaw(
- desc.principalAngularInertia,
- );
- let rawInertiaFrame = RotationOps.intoRaw(
- desc.angularInertiaLocalFrame,
- );
- // #endif
+ let rawPrincipalInertia = VectorOps.intoRaw(desc.principalAngularInertia);
+ let rawInertiaFrame = RotationOps.intoRaw(desc.angularInertiaLocalFrame);
let handle = this.raw.createRigidBody(
desc.enabled,
@@ -88,14 +74,6 @@ export class RigidBodySet {
desc.massOnly,
rawCom,
rawLv,
- // #if DIM2
- desc.angvel,
- desc.principalAngularInertia,
- desc.translationsEnabledX,
- desc.translationsEnabledY,
- desc.rotationsEnabled,
- // #endif
- // #if DIM3
rawAv,
rawPrincipalInertia,
rawInertiaFrame,
@@ -105,7 +83,6 @@ export class RigidBodySet {
desc.rotationsEnabledX,
desc.rotationsEnabledY,
desc.rotationsEnabledZ,
- // #endif
desc.linearDamping,
desc.angularDamping,
desc.status as number as RawRigidBodyType,
@@ -122,11 +99,9 @@ export class RigidBodySet {
rawLv.free();
rawCom.free();
- // #if DIM3
rawAv.free();
rawPrincipalInertia.free();
rawInertiaFrame.free();
- // #endif
const body = new RigidBody(this.raw, colliderSet, handle);
body.userData = desc.userData;
@@ -161,19 +136,12 @@ export class RigidBodySet {
impulseJoints.forEachJointHandleAttachedToRigidBody(handle, (handle) =>
impulseJoints.unmap(handle),
);
- multibodyJoints.forEachJointHandleAttachedToRigidBody(
- handle,
- (handle) => multibodyJoints.unmap(handle),
+ multibodyJoints.forEachJointHandleAttachedToRigidBody(handle, (handle) =>
+ multibodyJoints.unmap(handle),
);
// Remove the rigid-body.
- this.raw.remove(
- handle,
- islands.raw,
- colliders.raw,
- impulseJoints.raw,
- multibodyJoints.raw,
- );
+ this.raw.remove(handle, islands.raw, colliders.raw, impulseJoints.raw, multibodyJoints.raw);
this.map.delete(handle);
}
@@ -218,12 +186,9 @@ export class RigidBodySet {
*
* @param f - The closure to apply.
*/
- public forEachActiveRigidBody(
- islands: IslandManager,
- f: (body: RigidBody) => void,
- ) {
+ public forEachActiveRigidBody(islands: IslandManager, f: (body: RigidBody) => void) {
islands.forEachActiveRigidBodyHandle((handle) => {
- f(this.get(handle));
+ f(this.get(handle)!);
});
}
diff --git a/packages/rapier-3d/src/exports.ts b/packages/rapier-3d/src/exports.ts
new file mode 100644
index 00000000..46ca8d90
--- /dev/null
+++ b/packages/rapier-3d/src/exports.ts
@@ -0,0 +1,26 @@
+import {version as vers, reserve_memory as reserve} from "./raw";
+
+export function version(): string {
+ return vers();
+}
+
+/// Reserves additional memory in WASM land.
+///
+/// This will grow the internal WASM memory buffer so that it can fit at least
+/// the specified amount of extra bytes. This can help reduce future runtime
+/// overhead due to dynamic internal memory growth once the limit of the
+/// pre-allocated memory is reached.
+///
+/// This feature is still experimental. Due to the nature of the internal
+/// allocator, there can be situations where the allocator decides to perform
+/// additional internal memory growth even though not all `extraBytesCount`
+/// are occupied yet.
+export function reserveMemory(extraBytesCount: number) {
+ reserve(extraBytesCount);
+}
+
+export * from "./math";
+export * from "./dynamics";
+export * from "./geometry";
+export * from "./pipeline";
+export * from "./control";
diff --git a/packages/rapier-3d/src/geometry/broad_phase.ts b/packages/rapier-3d/src/geometry/broad_phase.ts
new file mode 100644
index 00000000..58cd911e
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/broad_phase.ts
@@ -0,0 +1,511 @@
+import {RigidBodyHandle, RigidBodySet} from "../dynamics";
+import {Rotation, RotationOps, Vector, VectorOps} from "../math";
+import {QueryFilterFlags} from "../pipeline";
+import {RawBroadPhase, RawRayColliderIntersection} from "../raw";
+import {ColliderHandle} from "./collider";
+import {ColliderSet} from "./collider_set";
+import {InteractionGroups} from "./interaction_groups";
+import {NarrowPhase} from "./narrow_phase";
+import {PointColliderProjection} from "./point";
+import {Ray, RayColliderHit, RayColliderIntersection} from "./ray";
+import {Shape} from "./shape";
+import {ColliderShapeCastHit} from "./toi";
+
+/**
+ * The broad-phase used for coarse collision-detection.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `broadPhase.free()`
+ * once you are done using it.
+ */
+export class BroadPhase {
+ raw: RawBroadPhase;
+
+ /**
+ * Release the WASM memory occupied by this broad-phase.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw?: RawBroadPhase) {
+ this.raw = raw || new RawBroadPhase();
+ }
+
+ /**
+ * Find the closest intersection between a ray and a set of collider.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ * @param filter - The callback to filter out which collider will be hit.
+ */
+ public castRay(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): RayColliderHit | null {
+ return RayColliderHit.fromRaw(
+ colliders,
+ this.raw.castRay(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ ray.origin.x,
+ ray.origin.y,
+ ray.origin.z,
+ ray.dir.x,
+ ray.dir.y,
+ ray.dir.z,
+ maxToi,
+ solid,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ )!,
+ );
+ }
+
+ /**
+ * Find the closest intersection between a ray and a set of collider.
+ *
+ * This also computes the normal at the hit point.
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ */
+ public castRayAndGetNormal(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): RayColliderIntersection | null {
+ return RayColliderIntersection.fromRaw(
+ colliders,
+ this.raw.castRayAndGetNormal(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ ray.origin.x,
+ ray.origin.y,
+ ray.origin.z,
+ ray.dir.x,
+ ray.dir.y,
+ ray.dir.z,
+ maxToi,
+ solid,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ )!,
+ );
+ }
+
+ /**
+ * Cast a ray and collects all the intersections between a ray and the scene.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param ray - The ray to cast.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the length of the ray to `ray.dir.norm() * maxToi`.
+ * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its
+ * origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
+ * whereas `false` implies that all shapes are hollow for this ray-cast.
+ * @param groups - Used to filter the colliders that can or cannot be hit by the ray.
+ * @param callback - The callback called once per hit (in no particular order) between a ray and a collider.
+ * If this callback returns `false`, then the cast will stop and no further hits will be detected/reported.
+ */
+ public intersectionsWithRay(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ ray: Ray,
+ maxToi: number,
+ solid: boolean,
+ callback: (intersect: RayColliderIntersection) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ) {
+ let rawCallback = (rawInter: RawRayColliderIntersection) => {
+ return callback(RayColliderIntersection.fromRaw(colliders, rawInter)!);
+ };
+
+ this.raw.intersectionsWithRay(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ ray.origin.x,
+ ray.origin.y,
+ ray.origin.z,
+ ray.dir.x,
+ ray.dir.y,
+ ray.dir.z,
+ maxToi,
+ solid,
+ rawCallback,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ );
+ }
+
+ /**
+ * Gets the handle of up to one collider intersecting the given shape.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param shapePos - The position of the shape used for the intersection test.
+ * @param shapeRot - The orientation of the shape used for the intersection test.
+ * @param shape - The shape used for the intersection test.
+ * @param groups - The bit groups and filter associated to the ray, in order to only
+ * hit the colliders with collision groups compatible with the ray's group.
+ */
+ public intersectionWithShape(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shape: Shape,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): ColliderHandle | null {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawShape = shape.intoRaw();
+ let result = this.raw.intersectionWithShape(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPos,
+ rawRot,
+ rawShape,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ );
+
+ rawPos.free();
+ rawRot.free();
+ rawShape.free();
+
+ return result ?? null;
+ }
+
+ /**
+ * Find the projection of a point on the closest collider.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param point - The point to project.
+ * @param solid - If this is set to `true` then the collider shapes are considered to
+ * be plain (if the point is located inside of a plain shape, its projection is the point
+ * itself). If it is set to `false` the collider shapes are considered to be hollow
+ * (if the point is located inside of an hollow shape, it is projected on the shape's
+ * boundary).
+ * @param groups - The bit groups and filter associated to the point to project, in order to only
+ * project on colliders with collision groups compatible with the ray's group.
+ */
+ public projectPoint(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ point: Vector,
+ solid: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): PointColliderProjection | null {
+ let rawPoint = VectorOps.intoRaw(point);
+ let result = PointColliderProjection.fromRaw(
+ colliders,
+ this.raw.projectPoint(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPoint,
+ solid,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ )!,
+ );
+
+ rawPoint.free();
+
+ return result;
+ }
+
+ /**
+ * Find the projection of a point on the closest collider.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param point - The point to project.
+ * @param groups - The bit groups and filter associated to the point to project, in order to only
+ * project on colliders with collision groups compatible with the ray's group.
+ */
+ public projectPointAndGetFeature(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ point: Vector,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): PointColliderProjection | null {
+ let rawPoint = VectorOps.intoRaw(point);
+ let result = PointColliderProjection.fromRaw(
+ colliders,
+ this.raw.projectPointAndGetFeature(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPoint,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ )!,
+ );
+
+ rawPoint.free();
+
+ return result;
+ }
+
+ /**
+ * Find all the colliders containing the given point.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param point - The point used for the containment test.
+ * @param groups - The bit groups and filter associated to the point to test, in order to only
+ * test on colliders with collision groups compatible with the ray's group.
+ * @param callback - A function called with the handles of each collider with a shape
+ * containing the `point`.
+ */
+ public intersectionsWithPoint(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ point: Vector,
+ callback: (handle: ColliderHandle) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ) {
+ let rawPoint = VectorOps.intoRaw(point);
+
+ this.raw.intersectionsWithPoint(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPoint,
+ callback,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ );
+
+ rawPoint.free();
+ }
+
+ /**
+ * Casts a shape at a constant linear velocity and retrieve the first collider it hits.
+ * This is similar to ray-casting except that we are casting a whole shape instead of
+ * just a point (the ray origin).
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param shapePos - The initial position of the shape to cast.
+ * @param shapeRot - The initial rotation of the shape to cast.
+ * @param shapeVel - The constant velocity of the shape to cast (i.e. the cast direction).
+ * @param shape - The shape to cast.
+ * @param targetDistance − If the shape moves closer to this distance from a collider, a hit
+ * will be returned.
+ * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively
+ * limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.
+ * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if
+ * the shape is penetrating another shape at its starting point **and** its trajectory is such
+ * that it’s on a path to exit that penetration state.
+ * @param groups - The bit groups and filter associated to the shape to cast, in order to only
+ * test on colliders with collision groups compatible with this group.
+ */
+ public castShape(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shapeVel: Vector,
+ shape: Shape,
+ targetDistance: number,
+ maxToi: number,
+ stopAtPenetration: boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ): ColliderShapeCastHit | null {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawVel = VectorOps.intoRaw(shapeVel);
+ let rawShape = shape.intoRaw();
+
+ let result = ColliderShapeCastHit.fromRaw(
+ colliders,
+ this.raw.castShape(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPos,
+ rawRot,
+ rawVel,
+ rawShape,
+ targetDistance,
+ maxToi,
+ stopAtPenetration,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ )!,
+ );
+
+ rawPos.free();
+ rawRot.free();
+ rawVel.free();
+ rawShape.free();
+
+ return result;
+ }
+
+ /**
+ * Retrieve all the colliders intersecting the given shape.
+ *
+ * @param colliders - The set of colliders taking part in this pipeline.
+ * @param shapePos - The position of the shape to test.
+ * @param shapeRot - The orientation of the shape to test.
+ * @param shape - The shape to test.
+ * @param groups - The bit groups and filter associated to the shape to test, in order to only
+ * test on colliders with collision groups compatible with this group.
+ * @param callback - A function called with the handles of each collider intersecting the `shape`.
+ */
+ public intersectionsWithShape(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ shapePos: Vector,
+ shapeRot: Rotation,
+ shape: Shape,
+ callback: (handle: ColliderHandle) => boolean,
+ filterFlags?: QueryFilterFlags,
+ filterGroups?: InteractionGroups,
+ filterExcludeCollider?: ColliderHandle,
+ filterExcludeRigidBody?: RigidBodyHandle,
+ filterPredicate?: (collider: ColliderHandle) => boolean,
+ ) {
+ let rawPos = VectorOps.intoRaw(shapePos);
+ let rawRot = RotationOps.intoRaw(shapeRot);
+ let rawShape = shape.intoRaw();
+
+ this.raw.intersectionsWithShape(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawPos,
+ rawRot,
+ rawShape,
+ callback,
+ filterFlags ?? 0,
+ filterGroups,
+ filterExcludeCollider,
+ filterExcludeRigidBody,
+ filterPredicate as unknown as Function,
+ );
+
+ rawPos.free();
+ rawRot.free();
+ rawShape.free();
+ }
+
+ /**
+ * Finds the handles of all the colliders with an AABB intersecting the given AABB.
+ *
+ * @param aabbCenter - The center of the AABB to test.
+ * @param aabbHalfExtents - The half-extents of the AABB to test.
+ * @param callback - The callback that will be called with the handles of all the colliders
+ * currently intersecting the given AABB.
+ */
+ public collidersWithAabbIntersectingAabb(
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ aabbCenter: Vector,
+ aabbHalfExtents: Vector,
+ callback: (handle: ColliderHandle) => boolean,
+ ) {
+ let rawCenter = VectorOps.intoRaw(aabbCenter);
+ let rawHalfExtents = VectorOps.intoRaw(aabbHalfExtents);
+ this.raw.collidersWithAabbIntersectingAabb(
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ rawCenter,
+ rawHalfExtents,
+ callback,
+ );
+ rawCenter.free();
+ rawHalfExtents.free();
+ }
+}
diff --git a/src.ts/geometry/collider.ts b/packages/rapier-3d/src/geometry/collider.ts
similarity index 80%
rename from src.ts/geometry/collider.ts
rename to packages/rapier-3d/src/geometry/collider.ts
index 25817362..971a8b6f 100644
--- a/src.ts/geometry/collider.ts
+++ b/packages/rapier-3d/src/geometry/collider.ts
@@ -1,13 +1,11 @@
-import {RawColliderSet} from "../raw";
+import {CoefficientCombineRule, RigidBody, RigidBodySet} from "../dynamics";
import {Rotation, RotationOps, Vector, VectorOps} from "../math";
-import {
- CoefficientCombineRule,
- RigidBody,
- RigidBodyHandle,
- RigidBodySet,
-} from "../dynamics";
import {ActiveHooks, ActiveEvents} from "../pipeline";
+import {ColliderSet} from "./collider_set";
+import {ShapeContact} from "./contact";
import {InteractionGroups} from "./interaction_groups";
+import {PointProjection} from "./point";
+import {Ray, RayIntersection} from "./ray";
import {
Shape,
Cuboid,
@@ -22,13 +20,7 @@ import {
Triangle,
RoundTriangle,
RoundCuboid,
- HalfSpace,
TriMeshFlags,
- // #if DIM2
- ConvexPolygon,
- RoundConvexPolygon,
- // #endif
- // #if DIM3
Cylinder,
RoundCylinder,
Cone,
@@ -36,13 +28,8 @@ import {
ConvexPolyhedron,
RoundConvexPolyhedron,
HeightFieldFlags,
- // #endif
} from "./shape";
-import {Ray, RayIntersection} from "./ray";
-import {PointProjection} from "./point";
import {ColliderShapeCastHit, ShapeCastHit} from "./toi";
-import {ShapeContact} from "./contact";
-import {ColliderSet} from "./collider_set";
/**
* Flags affecting whether collision-detection happens between two colliders
@@ -110,8 +97,9 @@ export type ColliderHandle = number;
export class Collider {
private colliderSet: ColliderSet; // The Collider won't need to free this.
readonly handle: ColliderHandle;
- private _shape: Shape; // TODO: deprecate/remove this since it isn’t a reliable way of getting the latest shape properties.
+ private _shape: Shape; // TODO: deprecate/remove this since it isn't a reliable way of getting the latest shape properties.
private _parent: RigidBody | null;
+ private scratchBuffer: Float32Array;
constructor(
colliderSet: ColliderSet,
@@ -122,21 +110,19 @@ export class Collider {
this.colliderSet = colliderSet;
this.handle = handle;
this._parent = parent;
- this._shape = shape;
+ this._shape = shape!;
+ this.scratchBuffer = new Float32Array(4);
}
/** @internal */
public finalizeDeserialization(bodies: RigidBodySet) {
if (this.handle != null) {
- this._parent = bodies.get(
- this.colliderSet.raw.coParent(this.handle),
- );
+ this._parent = bodies.get(this.colliderSet.raw.coParent(this.handle)!);
}
}
private ensureShapeIsCached() {
- if (!this._shape)
- this._shape = Shape.fromRaw(this.colliderSet.raw, this.handle);
+ if (!this._shape) this._shape = Shape.fromRaw(this.colliderSet.raw, this.handle);
}
/**
@@ -156,7 +142,7 @@ export class Collider {
* accessed) from the WASM source of truth.
*/
public clearShapeCache() {
- this._shape = null;
+ this._shape = null!;
}
/**
@@ -169,42 +155,51 @@ export class Collider {
/**
* The world-space translation of this collider.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public translation(): Vector {
- return VectorOps.fromRaw(
- this.colliderSet.raw.coTranslation(this.handle),
- );
+ public translation(target?: Vector): Vector {
+ this.colliderSet.raw.coTranslation(this.handle, this.scratchBuffer);
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
* The translation of this collider relative to its parent rigid-body.
*
- * Returns `null` if the collider doesn’t have a parent rigid-body.
+ * Returns `null` if the collider doesn't have a parent rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public translationWrtParent(): Vector | null {
- return VectorOps.fromRaw(
- this.colliderSet.raw.coTranslationWrtParent(this.handle),
+ public translationWrtParent(target?: Vector): Vector | null {
+ const hasParent = this.colliderSet.raw.coTranslationWrtParent(
+ this.handle,
+ this.scratchBuffer,
);
+ if (!hasParent) return null;
+ return VectorOps.fromBuffer(this.scratchBuffer, target);
}
/**
* The world-space orientation of this collider.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public rotation(): Rotation {
- return RotationOps.fromRaw(
- this.colliderSet.raw.coRotation(this.handle),
- );
+ public rotation(target?: Rotation): Rotation {
+ this.colliderSet.raw.coRotation(this.handle, this.scratchBuffer);
+ return RotationOps.fromBuffer(this.scratchBuffer, target);
}
/**
* The orientation of this collider relative to its parent rigid-body.
*
- * Returns `null` if the collider doesn’t have a parent rigid-body.
+ * Returns `null` if the collider doesn't have a parent rigid-body.
+ *
+ * @param target - Optional target object to write the result to (avoids allocation).
*/
- public rotationWrtParent(): Rotation | null {
- return RotationOps.fromRaw(
- this.colliderSet.raw.coRotationWrtParent(this.handle),
- );
+ public rotationWrtParent(target?: Rotation): Rotation | null {
+ const hasParent = this.colliderSet.raw.coRotationWrtParent(this.handle, this.scratchBuffer);
+ if (!hasParent) return null;
+ return RotationOps.fromBuffer(this.scratchBuffer, target);
}
/**
@@ -401,10 +396,7 @@ export class Collider {
* @param threshold - The new force threshold.
*/
public setContactForceEventThreshold(threshold: number) {
- return this.colliderSet.raw.coSetContactForceEventThreshold(
- this.handle,
- threshold,
- );
+ return this.colliderSet.raw.coSetContactForceEventThreshold(this.handle, threshold);
}
/**
@@ -420,10 +412,7 @@ export class Collider {
* @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.
*/
public setActiveCollisionTypes(activeCollisionTypes: ActiveCollisionTypes) {
- this.colliderSet.raw.coSetActiveCollisionTypes(
- this.handle,
- activeCollisionTypes,
- );
+ this.colliderSet.raw.coSetActiveCollisionTypes(this.handle, activeCollisionTypes);
}
/**
@@ -454,7 +443,6 @@ export class Collider {
this.colliderSet.raw.coSetMass(this.handle, mass);
}
- // #if DIM3
/**
* Sets the mass of this collider.
*
@@ -485,45 +473,13 @@ export class Collider {
rawInertiaFrame.free();
}
- // #endif
-
- // #if DIM2
- /**
- * Sets the mass of this collider.
- *
- * This will override any previous mass-properties set by `this.setDensity`,
- * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,
- * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.
- */
- public setMassProperties(
- mass: number,
- centerOfMass: Vector,
- principalAngularInertia: number,
- ) {
- let rawCom = VectorOps.intoRaw(centerOfMass);
- this.colliderSet.raw.coSetMassProperties(
- this.handle,
- mass,
- rawCom,
- principalAngularInertia,
- );
- rawCom.free();
- }
-
- // #endif
-
/**
* Sets the translation of this collider.
*
* @param tra - The world-space position of the collider.
*/
public setTranslation(tra: Vector) {
- // #if DIM2
- this.colliderSet.raw.coSetTranslation(this.handle, tra.x, tra.y);
- // #endif
- // #if DIM3
this.colliderSet.raw.coSetTranslation(this.handle, tra.x, tra.y, tra.z);
- // #endif
}
/**
@@ -534,24 +490,9 @@ export class Collider {
* @param tra - The new translation of the collider relative to its parent.
*/
public setTranslationWrtParent(tra: Vector) {
- // #if DIM2
- this.colliderSet.raw.coSetTranslationWrtParent(
- this.handle,
- tra.x,
- tra.y,
- );
- // #endif
- // #if DIM3
- this.colliderSet.raw.coSetTranslationWrtParent(
- this.handle,
- tra.x,
- tra.y,
- tra.z,
- );
- // #endif
+ this.colliderSet.raw.coSetTranslationWrtParent(this.handle, tra.x, tra.y, tra.z);
}
- // #if DIM3
/**
* Sets the rotation quaternion of this collider.
*
@@ -560,13 +501,7 @@ export class Collider {
* @param rotation - The rotation to set.
*/
public setRotation(rot: Rotation) {
- this.colliderSet.raw.coSetRotation(
- this.handle,
- rot.x,
- rot.y,
- rot.z,
- rot.w,
- );
+ this.colliderSet.raw.coSetRotation(this.handle, rot.x, rot.y, rot.z, rot.w);
}
/**
@@ -578,55 +513,21 @@ export class Collider {
* @param rotation - The rotation to set.
*/
public setRotationWrtParent(rot: Rotation) {
- this.colliderSet.raw.coSetRotationWrtParent(
- this.handle,
- rot.x,
- rot.y,
- rot.z,
- rot.w,
- );
- }
-
- // #endif
- // #if DIM2
- /**
- * Sets the rotation angle of this collider.
- *
- * @param angle - The rotation angle, in radians.
- */
- public setRotation(angle: number) {
- this.colliderSet.raw.coSetRotation(this.handle, angle);
- }
-
- /**
- * Sets the rotation angle of this collider relative to its parent rigid-body.
- *
- * Does nothing if this collider isn't attached to a rigid-body.
- *
- * @param angle - The rotation angle, in radians.
- */
- public setRotationWrtParent(angle: number) {
- this.colliderSet.raw.coSetRotationWrtParent(this.handle, angle);
+ this.colliderSet.raw.coSetRotationWrtParent(this.handle, rot.x, rot.y, rot.z, rot.w);
}
- // #endif
-
/**
* The type of the shape of this collider.
*/
public shapeType(): ShapeType {
- return this.colliderSet.raw.coShapeType(
- this.handle,
- ) as number as ShapeType;
+ return this.colliderSet.raw.coShapeType(this.handle) as number as ShapeType;
}
/**
* The half-extents of this collider if it is a cuboid shape.
*/
public halfExtents(): Vector {
- return VectorOps.fromRaw(
- this.colliderSet.raw.coHalfExtents(this.handle),
- );
+ return VectorOps.fromRaw(this.colliderSet.raw.coHalfExtents(this.handle)!)!;
}
/**
@@ -643,7 +544,7 @@ export class Collider {
* The radius of this collider if it is a ball, cylinder, capsule, or cone shape.
*/
public radius(): number {
- return this.colliderSet.raw.coRadius(this.handle);
+ return this.colliderSet.raw.coRadius(this.handle)!;
}
/**
@@ -659,7 +560,7 @@ export class Collider {
* The radius of the round edges of this collider if it is a round cylinder.
*/
public roundRadius(): number {
- return this.colliderSet.raw.coRoundRadius(this.handle);
+ return this.colliderSet.raw.coRoundRadius(this.handle)!;
}
/**
@@ -675,7 +576,7 @@ export class Collider {
* The half height of this collider if it is a cylinder, capsule, or cone shape.
*/
public halfHeight(): number {
- return this.colliderSet.raw.coHalfHeight(this.handle);
+ return this.colliderSet.raw.coHalfHeight(this.handle)!;
}
/**
@@ -698,28 +599,13 @@ export class Collider {
* bounds of the currently allocated internal grid in which case the grid
* will be grown automatically.
*/
- public setVoxel(
- ix: number,
- iy: number,
- // #if DIM3
- iz: number,
- // #endif
- filled: boolean,
- ) {
- this.colliderSet.raw.coSetVoxel(
- this.handle,
- ix,
- iy,
- // #if DIM3
- iz,
- // #endif
- filled,
- );
+ public setVoxel(ix: number, iy: number, iz: number, filled: boolean) {
+ this.colliderSet.raw.coSetVoxel(this.handle, ix, iy, iz, filled);
// We modified the shape, invalidate it to keep our cache
// up-to-date the next time the user requests the shape data.
// PERF: this isn’t ideal for performances as this adds a
// hidden, non-constant, cost.
- this._shape = null;
+ this._shape = null!;
}
/**
@@ -744,34 +630,26 @@ export class Collider {
voxels2: Collider,
ix: number,
iy: number,
- // #if DIM3
iz: number,
- // #endif
shift_x: number,
shift_y: number,
- // #if DIM3
shift_z: number,
- // #endif
) {
this.colliderSet.raw.coPropagateVoxelChange(
this.handle,
voxels2.handle,
ix,
iy,
- // #if DIM3
iz,
- // #endif
shift_x,
shift_y,
- // #if DIM3
shift_z,
- // #endif
);
// We modified the shape, invalidate it to keep our cache
// up-to-date the next time the user requests the shape data.
// PERF: this isn’t ideal for performances as this adds a
// hidden, non-constant, cost.
- this._shape = null;
+ this._shape = null!;
}
/**
@@ -794,24 +672,20 @@ export class Collider {
voxels2: Collider,
shift_x: number,
shift_y: number,
- // #if DIM3
shift_z: number,
- // #endif
) {
this.colliderSet.raw.coCombineVoxelStates(
this.handle,
voxels2.handle,
shift_x,
shift_y,
- // #if DIM3
shift_z,
- // #endif
);
// We modified the shape, invalidate it to keep our cache
// up-to-date the next time the user requests the shape data.
// PERF: this isn’t ideal for performances as this adds a
// hidden, non-constant, cost.
- this._shape = null;
+ this._shape = null!;
}
/**
@@ -819,7 +693,7 @@ export class Collider {
* this returns the vertex buffer of said shape.
*/
public vertices(): Float32Array {
- return this.colliderSet.raw.coVertices(this.handle);
+ return this.colliderSet.raw.coVertices(this.handle)!;
}
/**
@@ -836,7 +710,7 @@ export class Collider {
* In 3D, the returned height matrix is provided in column-major order.
*/
public heightfieldHeights(): Float32Array {
- return this.colliderSet.raw.coHeightfieldHeights(this.handle);
+ return this.colliderSet.raw.coHeightfieldHeights(this.handle)!;
}
/**
@@ -844,17 +718,16 @@ export class Collider {
* applied to it.
*/
public heightfieldScale(): Vector {
- let scale = this.colliderSet.raw.coHeightfieldScale(this.handle);
- return VectorOps.fromRaw(scale);
+ let scale = this.colliderSet.raw.coHeightfieldScale(this.handle)!;
+ return VectorOps.fromRaw(scale)!;
}
- // #if DIM3
/**
* If this collider has a heightfield shape, this returns the number of
* rows of its height matrix.
*/
public heightfieldNRows(): number {
- return this.colliderSet.raw.coHeightfieldNRows(this.handle);
+ return this.colliderSet.raw.coHeightfieldNRows(this.handle)!;
}
/**
@@ -862,11 +735,9 @@ export class Collider {
* columns of its height matrix.
*/
public heightfieldNCols(): number {
- return this.colliderSet.raw.coHeightfieldNCols(this.handle);
+ return this.colliderSet.raw.coHeightfieldNCols(this.handle)!;
}
- // #endif
-
/**
* The rigid-body this collider is attached to.
*/
@@ -930,10 +801,7 @@ export class Collider {
*/
public containsPoint(point: Vector): boolean {
let rawPoint = VectorOps.intoRaw(point);
- let result = this.colliderSet.raw.coContainsPoint(
- this.handle,
- rawPoint,
- );
+ let result = this.colliderSet.raw.coContainsPoint(this.handle, rawPoint);
rawPoint.free();
@@ -971,12 +839,7 @@ export class Collider {
public intersectsRay(ray: Ray, maxToi: number): boolean {
let rawOrig = VectorOps.intoRaw(ray.origin);
let rawDir = VectorOps.intoRaw(ray.dir);
- let result = this.colliderSet.raw.coIntersectsRay(
- this.handle,
- rawOrig,
- rawDir,
- maxToi,
- );
+ let result = this.colliderSet.raw.coIntersectsRay(this.handle, rawOrig, rawDir, maxToi);
rawOrig.free();
rawDir.free();
@@ -1028,7 +891,7 @@ export class Collider {
targetDistance,
maxToi,
stopAtPenetration,
- ),
+ )!,
);
rawCollider1Vel.free();
@@ -1075,7 +938,7 @@ export class Collider {
targetDistance,
maxToi,
stopAtPenetration,
- ),
+ )!,
);
rawCollider1Vel.free();
@@ -1084,11 +947,7 @@ export class Collider {
return result;
}
- public intersectsShape(
- shape2: Shape,
- shapePos2: Vector,
- shapeRot2: Rotation,
- ): boolean {
+ public intersectsShape(shape2: Shape, shapePos2: Vector, shapeRot2: Rotation): boolean {
let rawPos2 = VectorOps.intoRaw(shapePos2);
let rawRot2 = RotationOps.intoRaw(shapeRot2);
let rawShape2 = shape2.intoRaw();
@@ -1133,7 +992,7 @@ export class Collider {
rawPos2,
rawRot2,
prediction,
- ),
+ )!,
);
rawPos2.free();
@@ -1150,16 +1009,9 @@ export class Collider {
* @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.
* @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.
*/
- contactCollider(
- collider2: Collider,
- prediction: number,
- ): ShapeContact | null {
+ contactCollider(collider2: Collider, prediction: number): ShapeContact | null {
let result = ShapeContact.fromRaw(
- this.colliderSet.raw.coContactCollider(
- this.handle,
- collider2.handle,
- prediction,
- ),
+ this.colliderSet.raw.coContactCollider(this.handle, collider2.handle, prediction)!,
);
return result;
@@ -1180,13 +1032,7 @@ export class Collider {
public castRay(ray: Ray, maxToi: number, solid: boolean): number {
let rawOrig = VectorOps.intoRaw(ray.origin);
let rawDir = VectorOps.intoRaw(ray.dir);
- let result = this.colliderSet.raw.coCastRay(
- this.handle,
- rawOrig,
- rawDir,
- maxToi,
- solid,
- );
+ let result = this.colliderSet.raw.coCastRay(this.handle, rawOrig, rawDir, maxToi, solid);
rawOrig.free();
rawDir.free();
@@ -1205,11 +1051,7 @@ export class Collider {
* origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,
* whereas `false` implies that all shapes are hollow for this ray-cast.
*/
- public castRayAndGetNormal(
- ray: Ray,
- maxToi: number,
- solid: boolean,
- ): RayIntersection | null {
+ public castRayAndGetNormal(ray: Ray, maxToi: number, solid: boolean): RayIntersection | null {
let rawOrig = VectorOps.intoRaw(ray.origin);
let rawDir = VectorOps.intoRaw(ray.dir);
let result = RayIntersection.fromRaw(
@@ -1219,7 +1061,7 @@ export class Collider {
rawDir,
maxToi,
solid,
- ),
+ )!,
);
rawOrig.free();
@@ -1241,14 +1083,8 @@ export class ColliderDesc {
massPropsMode: MassPropsMode;
mass: number;
centerOfMass: Vector;
- // #if DIM2
- principalAngularInertia: number;
- rotationsEnabled: boolean;
- // #endif
- // #if DIM3
principalAngularInertia: Vector;
angularInertiaLocalFrame: Rotation;
- // #endif
density: number;
friction: number;
restitution: number;
@@ -1292,14 +1128,8 @@ export class ColliderDesc {
this.contactForceEventThreshold = 0.0;
this.contactSkin = 0.0;
- // #if DIM2
- this.principalAngularInertia = 0.0;
- this.rotationsEnabled = true;
- // #endif
- // #if DIM3
this.principalAngularInertia = VectorOps.zeros();
this.angularInertiaLocalFrame = RotationOps.identity();
- // #endif
}
/**
@@ -1372,11 +1202,8 @@ export class ColliderDesc {
* @param indices - The indices of the polyline's segments. If this is `undefined` or `null`,
* the vertices are assumed to describe a line strip.
*/
- public static polyline(
- vertices: Float32Array,
- indices?: Uint32Array | null,
- ): ColliderDesc {
- const shape = new Polyline(vertices, indices);
+ public static polyline(vertices: Float32Array, indices?: Uint32Array | null): ColliderDesc {
+ const shape = new Polyline(vertices, indices ?? undefined);
return new ColliderDesc(shape);
}
@@ -1392,10 +1219,7 @@ export class ColliderDesc {
* in 3D (resp 2D).
* @param voxelSize - The size of each voxel.
*/
- public static voxels(
- voxels: Float32Array | Int32Array,
- voxelSize: Vector,
- ): ColliderDesc {
+ public static voxels(voxels: Float32Array | Int32Array, voxelSize: Vector): ColliderDesc {
const shape = new Voxels(voxels, voxelSize);
return new ColliderDesc(shape);
}
@@ -1415,114 +1239,6 @@ export class ColliderDesc {
return new ColliderDesc(shape);
}
- // #if DIM2
- /**
- * Creates a new collider descriptor with a rectangular shape.
- *
- * @param hx - The half-width of the rectangle along its local `x` axis.
- * @param hy - The half-width of the rectangle along its local `y` axis.
- */
- public static cuboid(hx: number, hy: number): ColliderDesc {
- const shape = new Cuboid(hx, hy);
- return new ColliderDesc(shape);
- }
-
- /**
- * Creates a new collider descriptor with a rectangular shape with round borders.
- *
- * @param hx - The half-width of the rectangle along its local `x` axis.
- * @param hy - The half-width of the rectangle along its local `y` axis.
- * @param borderRadius - The radius of the cuboid's borders.
- */
- public static roundCuboid(
- hx: number,
- hy: number,
- borderRadius: number,
- ): ColliderDesc {
- const shape = new RoundCuboid(hx, hy, borderRadius);
- return new ColliderDesc(shape);
- }
-
- /**
- * Creates a new collider description with a halfspace (infinite plane) shape.
- *
- * @param normal - The outward normal of the plane.
- */
- public static halfspace(normal: Vector): ColliderDesc {
- const shape = new HalfSpace(normal);
- return new ColliderDesc(shape);
- }
-
- /**
- * Creates a new collider descriptor with a heightfield shape.
- *
- * @param heights - The heights of the heightfield, along its local `y` axis.
- * @param scale - The scale factor applied to the heightfield.
- */
- public static heightfield(
- heights: Float32Array,
- scale: Vector,
- ): ColliderDesc {
- const shape = new Heightfield(heights, scale);
- return new ColliderDesc(shape);
- }
-
- /**
- * Computes the convex-hull of the given points and use the resulting
- * convex polygon as the shape for this new collider descriptor.
- *
- * @param points - The point that will be used to compute the convex-hull.
- */
- public static convexHull(points: Float32Array): ColliderDesc | null {
- const shape = new ConvexPolygon(points, false);
- return new ColliderDesc(shape);
- }
-
- /**
- * Creates a new collider descriptor that uses the given set of points assumed
- * to form a convex polyline (no convex-hull computation will be done).
- *
- * @param vertices - The vertices of the convex polyline.
- */
- public static convexPolyline(vertices: Float32Array): ColliderDesc | null {
- const shape = new ConvexPolygon(vertices, true);
- return new ColliderDesc(shape);
- }
-
- /**
- * Computes the convex-hull of the given points and use the resulting
- * convex polygon as the shape for this new collider descriptor. A
- * border is added to that convex polygon to give it round corners.
- *
- * @param points - The point that will be used to compute the convex-hull.
- * @param borderRadius - The radius of the round border added to the convex polygon.
- */
- public static roundConvexHull(
- points: Float32Array,
- borderRadius: number,
- ): ColliderDesc | null {
- const shape = new RoundConvexPolygon(points, borderRadius, false);
- return new ColliderDesc(shape);
- }
-
- /**
- * Creates a new collider descriptor that uses the given set of points assumed
- * to form a round convex polyline (no convex-hull computation will be done).
- *
- * @param vertices - The vertices of the convex polyline.
- * @param borderRadius - The radius of the round border added to the convex polyline.
- */
- public static roundConvexPolyline(
- vertices: Float32Array,
- borderRadius: number,
- ): ColliderDesc | null {
- const shape = new RoundConvexPolygon(vertices, borderRadius, true);
- return new ColliderDesc(shape);
- }
-
- // #endif
-
- // #if DIM3
/**
* Creates a new collider descriptor with a cuboid shape.
*
@@ -1660,10 +1376,7 @@ export class ColliderDesc {
* @param points - The point that will be used to compute the convex-hull.
* @param borderRadius - The radius of the round border added to the convex polyhedron.
*/
- public static roundConvexHull(
- points: Float32Array,
- borderRadius: number,
- ): ColliderDesc | null {
+ public static roundConvexHull(points: Float32Array, borderRadius: number): ColliderDesc | null {
const shape = new RoundConvexPolyhedron(points, null, borderRadius);
return new ColliderDesc(shape);
}
@@ -1680,60 +1393,28 @@ export class ColliderDesc {
indices: Uint32Array | null,
borderRadius: number,
): ColliderDesc | null {
- const shape = new RoundConvexPolyhedron(
- vertices,
- indices,
- borderRadius,
- );
+ const shape = new RoundConvexPolyhedron(vertices, indices, borderRadius);
return new ColliderDesc(shape);
}
- // #endif
-
- // #if DIM2
- /**
- * Sets the position of the collider to be created relative to the rigid-body it is attached to.
- */
- public setTranslation(x: number, y: number): ColliderDesc {
- if (typeof x != "number" || typeof y != "number")
- throw TypeError("The translation components must be numbers.");
-
- this.translation = {x: x, y: y};
- return this;
- }
-
- // #endif
-
- // #if DIM3
/**
* Sets the position of the collider to be created relative to the rigid-body it is attached to.
*/
public setTranslation(x: number, y: number, z: number): ColliderDesc {
- if (
- typeof x != "number" ||
- typeof y != "number" ||
- typeof z != "number"
- )
+ if (typeof x != "number" || typeof y != "number" || typeof z != "number")
throw TypeError("The translation components must be numbers.");
this.translation = {x: x, y: y, z: z};
return this;
}
- // #endif
-
/**
* Sets the rotation of the collider to be created relative to the rigid-body it is attached to.
*
* @param rot - The rotation of the collider to be created relative to the rigid-body it is attached to.
*/
public setRotation(rot: Rotation): ColliderDesc {
- // #if DIM2
- this.rotation = rot;
- // #endif
- // #if DIM3
RotationOps.copy(this.rotation, rot);
- // #endif
return this;
}
@@ -1802,32 +1483,6 @@ export class ColliderDesc {
return this;
}
- // #if DIM2
- /**
- * Sets the mass properties of the collider being built.
- *
- * This replaces the mass-properties automatically computed from the collider's density and shape.
- * These mass-properties will be added to the mass-properties of the rigid-body this collider will be attached to.
- *
- * @param mass − The mass of the collider to create.
- * @param centerOfMass − The center-of-mass of the collider to create.
- * @param principalAngularInertia − The principal angular inertia of the collider to create.
- */
- public setMassProperties(
- mass: number,
- centerOfMass: Vector,
- principalAngularInertia: number,
- ): ColliderDesc {
- this.massPropsMode = MassPropsMode.MassProps;
- this.mass = mass;
- VectorOps.copy(this.centerOfMass, centerOfMass);
- this.principalAngularInertia = principalAngularInertia;
- return this;
- }
-
- // #endif
-
- // #if DIM3
/**
* Sets the mass properties of the collider being built.
*
@@ -1851,15 +1506,10 @@ export class ColliderDesc {
this.mass = mass;
VectorOps.copy(this.centerOfMass, centerOfMass);
VectorOps.copy(this.principalAngularInertia, principalAngularInertia);
- RotationOps.copy(
- this.angularInertiaLocalFrame,
- angularInertiaLocalFrame,
- );
+ RotationOps.copy(this.angularInertiaLocalFrame, angularInertiaLocalFrame);
return this;
}
- // #endif
-
/**
* Sets the restitution coefficient of the collider to be created.
*
@@ -1901,9 +1551,7 @@ export class ColliderDesc {
*
* @param rule − The combine rule to apply.
*/
- public setRestitutionCombineRule(
- rule: CoefficientCombineRule,
- ): ColliderDesc {
+ public setRestitutionCombineRule(rule: CoefficientCombineRule): ColliderDesc {
this.restitutionCombineRule = rule;
return this;
}
@@ -1964,9 +1612,7 @@ export class ColliderDesc {
*
* @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.
*/
- public setActiveCollisionTypes(
- activeCollisionTypes: ActiveCollisionTypes,
- ): ColliderDesc {
+ public setActiveCollisionTypes(activeCollisionTypes: ActiveCollisionTypes): ColliderDesc {
this.activeCollisionTypes = activeCollisionTypes;
return this;
}
diff --git a/packages/rapier-3d/src/geometry/collider_set.ts b/packages/rapier-3d/src/geometry/collider_set.ts
new file mode 100644
index 00000000..64390d44
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/collider_set.ts
@@ -0,0 +1,195 @@
+import {Coarena} from "../coarena";
+import {ImpulseJointHandle, IslandManager, RigidBodyHandle} from "../dynamics";
+import {RigidBodySet} from "../dynamics";
+import {RotationOps, VectorOps} from "../math";
+import {RawColliderSet} from "../raw";
+import {Collider, ColliderDesc, ColliderHandle} from "./collider";
+
+/**
+ * A set of rigid bodies that can be handled by a physics pipeline.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `colliderSet.free()`
+ * once you are done using it (and all the rigid-bodies it created).
+ */
+export class ColliderSet {
+ raw: RawColliderSet;
+ private map: Coarena;
+
+ /**
+ * Release the WASM memory occupied by this collider set.
+ */
+ public free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+
+ if (!!this.map) {
+ this.map.clear();
+ }
+ this.map = undefined!;
+ }
+
+ constructor(raw?: RawColliderSet) {
+ this.raw = raw || new RawColliderSet();
+ this.map = new Coarena();
+ // Initialize the map with the existing elements, if any.
+ if (raw) {
+ raw.forEachColliderHandle((handle: ColliderHandle) => {
+ this.map.set(handle, new Collider(this, handle, null));
+ });
+ }
+ }
+
+ /** @internal */
+ public castClosure(
+ f?: (collider: Collider) => Res,
+ ): ((handle: ColliderHandle) => Res) | undefined {
+ if (!f) return undefined;
+ return (handle) => {
+ return f(this.get(handle)!);
+ };
+ }
+
+ /** @internal */
+ public finalizeDeserialization(bodies: RigidBodySet) {
+ this.map.forEach((collider) => collider.finalizeDeserialization(bodies));
+ }
+
+ /**
+ * Creates a new collider and return its integer handle.
+ *
+ * @param bodies - The set of bodies where the collider's parent can be found.
+ * @param desc - The collider's description.
+ * @param parentHandle - The integer handle of the rigid-body this collider is attached to.
+ */
+ public createCollider(
+ bodies: RigidBodySet,
+ desc: ColliderDesc,
+ parentHandle?: RigidBodyHandle,
+ ): Collider {
+ let hasParent = parentHandle != undefined && parentHandle != null;
+
+ if (hasParent && isNaN(parentHandle!))
+ throw Error(
+ "Cannot create a collider with a parent rigid-body handle that is not a number.",
+ );
+
+ let rawShape = desc.shape.intoRaw();
+ let rawTra = VectorOps.intoRaw(desc.translation);
+ let rawRot = RotationOps.intoRaw(desc.rotation);
+ let rawCom = VectorOps.intoRaw(desc.centerOfMass);
+
+ let rawPrincipalInertia = VectorOps.intoRaw(desc.principalAngularInertia);
+ let rawInertiaFrame = RotationOps.intoRaw(desc.angularInertiaLocalFrame);
+
+ let handle = this.raw.createCollider(
+ desc.enabled,
+ rawShape,
+ rawTra,
+ rawRot,
+ desc.massPropsMode,
+ desc.mass,
+ rawCom,
+ rawPrincipalInertia,
+ rawInertiaFrame,
+ desc.density,
+ desc.friction,
+ desc.restitution,
+ desc.frictionCombineRule,
+ desc.restitutionCombineRule,
+ desc.isSensor,
+ desc.collisionGroups,
+ desc.solverGroups,
+ desc.activeCollisionTypes,
+ desc.activeHooks,
+ desc.activeEvents,
+ desc.contactForceEventThreshold,
+ desc.contactSkin,
+ hasParent,
+ hasParent ? parentHandle! : 0,
+ bodies.raw,
+ );
+
+ rawShape.free();
+ rawTra.free();
+ rawRot.free();
+ rawCom.free();
+
+ rawPrincipalInertia.free();
+ rawInertiaFrame.free();
+
+ let parent = hasParent ? bodies.get(parentHandle!) : null;
+ let collider = new Collider(this, handle!, parent, desc.shape);
+ this.map.set(handle!, collider);
+ return collider;
+ }
+
+ /**
+ * Remove a collider from this set.
+ *
+ * @param handle - The integer handle of the collider to remove.
+ * @param bodies - The set of rigid-body containing the rigid-body the collider is attached to.
+ * @param wakeUp - If `true`, the rigid-body the removed collider is attached to will be woken-up automatically.
+ */
+ public remove(
+ handle: ColliderHandle,
+ islands: IslandManager,
+ bodies: RigidBodySet,
+ wakeUp: boolean,
+ ) {
+ this.raw.remove(handle, islands.raw, bodies.raw, wakeUp);
+ this.unmap(handle);
+ }
+
+ /**
+ * Internal function, do not call directly.
+ * @param handle
+ */
+ public unmap(handle: ImpulseJointHandle) {
+ this.map.delete(handle);
+ }
+
+ /**
+ * Gets the rigid-body with the given handle.
+ *
+ * @param handle - The handle of the rigid-body to retrieve.
+ */
+ public get(handle: ColliderHandle): Collider | null {
+ return this.map.get(handle);
+ }
+
+ /**
+ * The number of colliders on this set.
+ */
+ public len(): number {
+ return this.map.len();
+ }
+
+ /**
+ * Does this set contain a collider with the given handle?
+ *
+ * @param handle - The collider handle to check.
+ */
+ public contains(handle: ColliderHandle): boolean {
+ return this.get(handle) != null;
+ }
+
+ /**
+ * Applies the given closure to each collider contained by this set.
+ *
+ * @param f - The closure to apply.
+ */
+ public forEach(f: (collider: Collider) => void) {
+ this.map.forEach(f);
+ }
+
+ /**
+ * Gets all colliders in the list.
+ *
+ * @returns collider list.
+ */
+ public getAll(): Collider[] {
+ return this.map.getAll();
+ }
+}
diff --git a/packages/rapier-3d/src/geometry/contact.ts b/packages/rapier-3d/src/geometry/contact.ts
new file mode 100644
index 00000000..99b345fb
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/contact.ts
@@ -0,0 +1,56 @@
+import {Vector, VectorOps} from "../math";
+import {RawShapeContact} from "../raw";
+
+/**
+ * The contact info between two shapes.
+ */
+export class ShapeContact {
+ /**
+ * Distance between the two contact points.
+ * If this is negative, this contact represents a penetration.
+ */
+ distance: number;
+
+ /**
+ * Position of the contact on the first shape.
+ */
+ point1: Vector;
+
+ /**
+ * Position of the contact on the second shape.
+ */
+ point2: Vector;
+
+ /**
+ * Contact normal, pointing towards the exterior of the first shape.
+ */
+ normal1: Vector;
+
+ /**
+ * Contact normal, pointing towards the exterior of the second shape.
+ * If these contact data are expressed in world-space, this normal is equal to -normal1.
+ */
+ normal2: Vector;
+
+ constructor(dist: number, point1: Vector, point2: Vector, normal1: Vector, normal2: Vector) {
+ this.distance = dist;
+ this.point1 = point1;
+ this.point2 = point2;
+ this.normal1 = normal1;
+ this.normal2 = normal2;
+ }
+
+ public static fromRaw(raw: RawShapeContact): ShapeContact | null {
+ if (!raw) return null;
+
+ const result = new ShapeContact(
+ raw.distance(),
+ VectorOps.fromRaw(raw.point1())!,
+ VectorOps.fromRaw(raw.point2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
+ );
+ raw.free();
+ return result;
+ }
+}
diff --git a/packages/rapier-3d/src/geometry/feature.ts b/packages/rapier-3d/src/geometry/feature.ts
new file mode 100644
index 00000000..9a9c2fb6
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/feature.ts
@@ -0,0 +1,6 @@
+export enum FeatureType {
+ Vertex,
+ Edge,
+ Face,
+ Unknown,
+}
diff --git a/packages/rapier-3d/src/geometry/index.ts b/packages/rapier-3d/src/geometry/index.ts
new file mode 100644
index 00000000..1bd19e50
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/index.ts
@@ -0,0 +1,11 @@
+export * from "./broad_phase";
+export * from "./narrow_phase";
+export * from "./shape";
+export * from "./collider";
+export * from "./collider_set";
+export * from "./feature";
+export * from "./ray";
+export * from "./point";
+export * from "./toi";
+export * from "./interaction_groups";
+export * from "./contact";
diff --git a/packages/rapier-3d/src/geometry/interaction_groups.ts b/packages/rapier-3d/src/geometry/interaction_groups.ts
new file mode 100644
index 00000000..4d73fd31
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/interaction_groups.ts
@@ -0,0 +1,18 @@
+/**
+ * Pairwise filtering using bit masks.
+ *
+ * This filtering method is based on two 16-bit values:
+ * - The interaction groups (the 16 left-most bits of `self.0`).
+ * - The interaction mask (the 16 right-most bits of `self.0`).
+ *
+ * An interaction is allowed between two filters `a` and `b` two conditions
+ * are met simultaneously:
+ * - The interaction groups of `a` has at least one bit set to `1` in common with the interaction mask of `b`.
+ * - The interaction groups of `b` has at least one bit set to `1` in common with the interaction mask of `a`.
+ * In other words, interactions are allowed between two filter iff. the following condition is met:
+ *
+ * ```
+ * ((a >> 16) & b) != 0 && ((b >> 16) & a) != 0
+ * ```
+ */
+export type InteractionGroups = number;
diff --git a/src.ts/geometry/narrow_phase.ts b/packages/rapier-3d/src/geometry/narrow_phase.ts
similarity index 80%
rename from src.ts/geometry/narrow_phase.ts
rename to packages/rapier-3d/src/geometry/narrow_phase.ts
index af04a227..85ee8263 100644
--- a/src.ts/geometry/narrow_phase.ts
+++ b/packages/rapier-3d/src/geometry/narrow_phase.ts
@@ -1,6 +1,6 @@
+import {Vector, VectorOps} from "../math";
import {RawNarrowPhase, RawContactManifold} from "../raw";
import {ColliderHandle} from "./collider";
-import {Vector, VectorOps} from "../math";
/**
* The narrow-phase used for precise collision-detection.
@@ -19,12 +19,12 @@ export class NarrowPhase {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw?: RawNarrowPhase) {
this.raw = raw || new RawNarrowPhase();
- this.tempManifold = new TempContactManifold(null);
+ this.tempManifold = new TempContactManifold(null!);
}
/**
@@ -33,10 +33,7 @@ export class NarrowPhase {
* @param collider1 - The second collider involved in the contact.
* @param f - Closure that will be called on each collider that is in contact with `collider1`.
*/
- public contactPairsWith(
- collider1: ColliderHandle,
- f: (collider2: ColliderHandle) => void,
- ) {
+ public contactPairsWith(collider1: ColliderHandle, f: (collider2: ColliderHandle) => void) {
this.raw.contact_pairs_with(collider1, f);
}
@@ -72,7 +69,7 @@ export class NarrowPhase {
let i;
for (i = 0; i < rawPair.numContactManifolds(); ++i) {
- this.tempManifold.raw = rawPair.contactManifold(i);
+ this.tempManifold.raw = rawPair.contactManifold(i)!;
if (!!this.tempManifold.raw) {
f(this.tempManifold, flipped);
}
@@ -91,10 +88,7 @@ export class NarrowPhase {
* @param collider1 − The first collider involved in the intersection.
* @param collider2 − The second collider involved in the intersection.
*/
- public intersectionPair(
- collider1: ColliderHandle,
- collider2: ColliderHandle,
- ): boolean {
+ public intersectionPair(collider1: ColliderHandle, collider2: ColliderHandle): boolean {
return this.raw.intersection_pair(collider1, collider2);
}
}
@@ -106,23 +100,23 @@ export class TempContactManifold {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
constructor(raw: RawContactManifold) {
this.raw = raw;
}
- public normal(): Vector {
- return VectorOps.fromRaw(this.raw.normal());
+ public normal(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.normal(), target)!;
}
- public localNormal1(): Vector {
- return VectorOps.fromRaw(this.raw.local_n1());
+ public localNormal1(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.local_n1(), target)!;
}
- public localNormal2(): Vector {
- return VectorOps.fromRaw(this.raw.local_n2());
+ public localNormal2(target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.local_n2(), target)!;
}
public subshape1(): number {
@@ -137,12 +131,12 @@ export class TempContactManifold {
return this.raw.num_contacts();
}
- public localContactPoint1(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.contact_local_p1(i));
+ public localContactPoint1(i: number, target?: Vector): Vector | null {
+ return VectorOps.fromRaw(this.raw.contact_local_p1(i)!, target);
}
- public localContactPoint2(i: number): Vector | null {
- return VectorOps.fromRaw(this.raw.contact_local_p2(i));
+ public localContactPoint2(i: number, target?: Vector): Vector | null {
+ return VectorOps.fromRaw(this.raw.contact_local_p2(i)!, target);
}
public contactDist(i: number): number {
@@ -161,13 +155,6 @@ export class TempContactManifold {
return this.raw.contact_impulse(i);
}
- // #if DIM2
- public contactTangentImpulse(i: number): number {
- return this.raw.contact_tangent_impulse(i);
- }
- // #endif
-
- // #if DIM3
public contactTangentImpulseX(i: number): number {
return this.raw.contact_tangent_impulse_x(i);
}
@@ -175,14 +162,13 @@ export class TempContactManifold {
public contactTangentImpulseY(i: number): number {
return this.raw.contact_tangent_impulse_y(i);
}
- // #endif
public numSolverContacts(): number {
return this.raw.num_solver_contacts();
}
- public solverContactPoint(i: number): Vector {
- return VectorOps.fromRaw(this.raw.solver_contact_point(i));
+ public solverContactPoint(i: number, target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.solver_contact_point(i)!, target)!;
}
public solverContactDist(i: number): number {
@@ -197,7 +183,7 @@ export class TempContactManifold {
return this.raw.solver_contact_restitution(i);
}
- public solverContactTangentVelocity(i: number): Vector {
- return VectorOps.fromRaw(this.raw.solver_contact_tangent_velocity(i));
+ public solverContactTangentVelocity(i: number, target?: Vector): Vector {
+ return VectorOps.fromRaw(this.raw.solver_contact_tangent_velocity(i)!, target)!;
}
}
diff --git a/packages/rapier-3d/src/geometry/point.ts b/packages/rapier-3d/src/geometry/point.ts
new file mode 100644
index 00000000..b784eeda
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/point.ts
@@ -0,0 +1,91 @@
+import {Vector, VectorOps} from "../math";
+import {RawPointColliderProjection, RawPointProjection} from "../raw";
+import {Collider} from "./collider";
+import {ColliderSet} from "./collider_set";
+import {FeatureType} from "./feature";
+
+/**
+ * The projection of a point on a collider.
+ */
+export class PointProjection {
+ /**
+ * The projection of the point on the collider.
+ */
+ point: Vector;
+ /**
+ * Is the point inside of the collider?
+ */
+ isInside: boolean;
+
+ constructor(point: Vector, isInside: boolean) {
+ this.point = point;
+ this.isInside = isInside;
+ }
+
+ public static fromRaw(raw: RawPointProjection): PointProjection | null {
+ if (!raw) return null;
+
+ const result = new PointProjection(VectorOps.fromRaw(raw.point())!, raw.isInside());
+ raw.free();
+ return result;
+ }
+}
+
+/**
+ * The projection of a point on a collider (includes the collider handle).
+ */
+export class PointColliderProjection {
+ /**
+ * The collider hit by the ray.
+ */
+ collider: Collider;
+ /**
+ * The projection of the point on the collider.
+ */
+ point: Vector;
+ /**
+ * Is the point inside of the collider?
+ */
+ isInside: boolean;
+
+ /**
+ * The type of the geometric feature the point was projected on.
+ */
+ featureType = FeatureType.Unknown;
+
+ /**
+ * The id of the geometric feature the point was projected on.
+ */
+ featureId: number | undefined = undefined;
+
+ constructor(
+ collider: Collider,
+ point: Vector,
+ isInside: boolean,
+ featureType?: FeatureType,
+ featureId?: number,
+ ) {
+ this.collider = collider;
+ this.point = point;
+ this.isInside = isInside;
+ if (featureId !== undefined) this.featureId = featureId;
+ if (featureType !== undefined) this.featureType = featureType;
+ }
+
+ public static fromRaw(
+ colliderSet: ColliderSet,
+ raw: RawPointColliderProjection,
+ ): PointColliderProjection | null {
+ if (!raw) return null;
+
+ const result = new PointColliderProjection(
+ colliderSet.get(raw.colliderHandle())!,
+ VectorOps.fromRaw(raw.point())!,
+ raw.isInside(),
+ raw.featureType() as number as FeatureType,
+ raw.featureId(),
+ );
+ raw.free();
+ return result;
+ }
+}
diff --git a/src.ts/geometry/ray.ts b/packages/rapier-3d/src/geometry/ray.ts
similarity index 89%
rename from src.ts/geometry/ray.ts
rename to packages/rapier-3d/src/geometry/ray.ts
index 36df5ee3..1f4d9c8a 100644
--- a/src.ts/geometry/ray.ts
+++ b/packages/rapier-3d/src/geometry/ray.ts
@@ -1,13 +1,8 @@
import {Vector, VectorOps} from "../math";
-import {
- RawFeatureType,
- RawRayColliderIntersection,
- RawRayColliderHit,
- RawRayIntersection,
-} from "../raw";
+import {RawRayColliderIntersection, RawRayColliderHit, RawRayIntersection} from "../raw";
import {Collider} from "./collider";
-import {FeatureType} from "./feature";
import {ColliderSet} from "./collider_set";
+import {FeatureType} from "./feature";
/**
* A ray. This is a directed half-line.
@@ -37,9 +32,7 @@ export class Ray {
return {
x: this.origin.x + this.dir.x * t,
y: this.origin.y + this.dir.y * t,
- // #if DIM3
z: this.origin.z + this.dir.z * t,
- // #endif
};
}
}
@@ -81,12 +74,12 @@ export class RayIntersection {
if (featureType !== undefined) this.featureType = featureType;
}
- public static fromRaw(raw: RawRayIntersection): RayIntersection {
+ public static fromRaw(raw: RawRayIntersection): RayIntersection | null {
if (!raw) return null;
const result = new RayIntersection(
raw.time_of_impact(),
- VectorOps.fromRaw(raw.normal()),
+ VectorOps.fromRaw(raw.normal())!,
raw.featureType() as number as FeatureType,
raw.featureId(),
);
@@ -141,13 +134,13 @@ export class RayColliderIntersection {
public static fromRaw(
colliderSet: ColliderSet,
raw: RawRayColliderIntersection,
- ): RayColliderIntersection {
+ ): RayColliderIntersection | null {
if (!raw) return null;
const result = new RayColliderIntersection(
- colliderSet.get(raw.colliderHandle()),
+ colliderSet.get(raw.colliderHandle())!,
raw.time_of_impact(),
- VectorOps.fromRaw(raw.normal()),
+ VectorOps.fromRaw(raw.normal())!,
raw.featureType() as number as FeatureType,
raw.featureId(),
);
@@ -176,14 +169,11 @@ export class RayColliderHit {
this.timeOfImpact = timeOfImpact;
}
- public static fromRaw(
- colliderSet: ColliderSet,
- raw: RawRayColliderHit,
- ): RayColliderHit {
+ public static fromRaw(colliderSet: ColliderSet, raw: RawRayColliderHit): RayColliderHit | null {
if (!raw) return null;
const result = new RayColliderHit(
- colliderSet.get(raw.colliderHandle()),
+ colliderSet.get(raw.colliderHandle())!,
raw.timeOfImpact(),
);
raw.free();
diff --git a/src.ts/geometry/shape.ts b/packages/rapier-3d/src/geometry/shape.ts
similarity index 73%
rename from src.ts/geometry/shape.ts
rename to packages/rapier-3d/src/geometry/shape.ts
index f3546982..667634f2 100644
--- a/src.ts/geometry/shape.ts
+++ b/packages/rapier-3d/src/geometry/shape.ts
@@ -1,10 +1,10 @@
import {Vector, VectorOps, Rotation, RotationOps} from "../math";
import {RawColliderSet, RawShape, RawShapeType} from "../raw";
+import {ColliderHandle} from "./collider";
import {ShapeContact} from "./contact";
import {PointProjection} from "./point";
import {Ray, RayIntersection} from "./ray";
import {ShapeCastHit} from "./toi";
-import {ColliderHandle} from "./collider";
export abstract class Shape {
public abstract intoRaw(): RawShape;
@@ -17,10 +17,7 @@ export abstract class Shape {
/**
* instant mode without cache
*/
- public static fromRaw(
- rawSet: RawColliderSet,
- handle: ColliderHandle,
- ): Shape {
+ public static fromRaw(rawSet: RawColliderSet, handle: ColliderHandle): Shape {
const rawType = rawSet.coShapeType(handle);
let extents: Vector;
@@ -33,169 +30,105 @@ export abstract class Shape {
switch (rawType) {
case RawShapeType.Ball:
- return new Ball(rawSet.coRadius(handle));
+ return new Ball(rawSet.coRadius(handle)!);
case RawShapeType.Cuboid:
- extents = rawSet.coHalfExtents(handle);
- // #if DIM2
- return new Cuboid(extents.x, extents.y);
- // #endif
+ extents = rawSet.coHalfExtents(handle)!;
- // #if DIM3
return new Cuboid(extents.x, extents.y, extents.z);
- // #endif
case RawShapeType.RoundCuboid:
- extents = rawSet.coHalfExtents(handle);
- borderRadius = rawSet.coRoundRadius(handle);
-
- // #if DIM2
- return new RoundCuboid(extents.x, extents.y, borderRadius);
- // #endif
-
- // #if DIM3
- return new RoundCuboid(
- extents.x,
- extents.y,
- extents.z,
- borderRadius,
- );
- // #endif
+ extents = rawSet.coHalfExtents(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
+
+ return new RoundCuboid(extents.x, extents.y, extents.z, borderRadius);
case RawShapeType.Capsule:
- halfHeight = rawSet.coHalfHeight(handle);
- radius = rawSet.coRadius(handle);
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
return new Capsule(halfHeight, radius);
case RawShapeType.Segment:
- vs = rawSet.coVertices(handle);
-
- // #if DIM2
- return new Segment(
- VectorOps.new(vs[0], vs[1]),
- VectorOps.new(vs[2], vs[3]),
- );
- // #endif
+ vs = rawSet.coVertices(handle)!;
- // #if DIM3
return new Segment(
VectorOps.new(vs[0], vs[1], vs[2]),
VectorOps.new(vs[3], vs[4], vs[5]),
);
- // #endif
case RawShapeType.Polyline:
- vs = rawSet.coVertices(handle);
- indices = rawSet.coIndices(handle);
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
return new Polyline(vs, indices);
case RawShapeType.Triangle:
- vs = rawSet.coVertices(handle);
-
- // #if DIM2
- return new Triangle(
- VectorOps.new(vs[0], vs[1]),
- VectorOps.new(vs[2], vs[3]),
- VectorOps.new(vs[4], vs[5]),
- );
- // #endif
+ vs = rawSet.coVertices(handle)!;
- // #if DIM3
return new Triangle(
VectorOps.new(vs[0], vs[1], vs[2]),
VectorOps.new(vs[3], vs[4], vs[5]),
VectorOps.new(vs[6], vs[7], vs[8]),
);
- // #endif
case RawShapeType.RoundTriangle:
- vs = rawSet.coVertices(handle);
- borderRadius = rawSet.coRoundRadius(handle);
-
- // #if DIM2
- return new RoundTriangle(
- VectorOps.new(vs[0], vs[1]),
- VectorOps.new(vs[2], vs[3]),
- VectorOps.new(vs[4], vs[5]),
- borderRadius,
- );
- // #endif
+ vs = rawSet.coVertices(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
- // #if DIM3
return new RoundTriangle(
VectorOps.new(vs[0], vs[1], vs[2]),
VectorOps.new(vs[3], vs[4], vs[5]),
VectorOps.new(vs[6], vs[7], vs[8]),
borderRadius,
);
- // #endif
case RawShapeType.HalfSpace:
- normal = VectorOps.fromRaw(rawSet.coHalfspaceNormal(handle));
+ normal = VectorOps.fromRaw(rawSet.coHalfspaceNormal(handle)!)!;
return new HalfSpace(normal);
case RawShapeType.Voxels:
- const vox_data = rawSet.coVoxelData(handle);
- const vox_size = rawSet.coVoxelSize(handle);
+ const vox_data = rawSet.coVoxelData(handle)!;
+ const vox_size = rawSet.coVoxelSize(handle)!;
return new Voxels(vox_data, vox_size);
case RawShapeType.TriMesh:
- vs = rawSet.coVertices(handle);
- indices = rawSet.coIndices(handle);
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
const tri_flags = rawSet.coTriMeshFlags(handle);
return new TriMesh(vs, indices, tri_flags);
case RawShapeType.HeightField:
- const scale = rawSet.coHeightfieldScale(handle);
- const heights = rawSet.coHeightfieldHeights(handle);
+ const scale = rawSet.coHeightfieldScale(handle)!;
+ const heights = rawSet.coHeightfieldHeights(handle)!;
- // #if DIM2
- return new Heightfield(heights, scale);
- // #endif
-
- // #if DIM3
- const nrows = rawSet.coHeightfieldNRows(handle);
- const ncols = rawSet.coHeightfieldNCols(handle);
+ const nrows = rawSet.coHeightfieldNRows(handle)!;
+ const ncols = rawSet.coHeightfieldNCols(handle)!;
const hf_flags = rawSet.coHeightFieldFlags(handle);
return new Heightfield(nrows, ncols, heights, scale, hf_flags);
- // #endif
-
- // #if DIM2
- case RawShapeType.ConvexPolygon:
- vs = rawSet.coVertices(handle);
- return new ConvexPolygon(vs, false);
- case RawShapeType.RoundConvexPolygon:
- vs = rawSet.coVertices(handle);
- borderRadius = rawSet.coRoundRadius(handle);
- return new RoundConvexPolygon(vs, borderRadius, false);
- // #endif
-
- // #if DIM3
+
case RawShapeType.ConvexPolyhedron:
- vs = rawSet.coVertices(handle);
- indices = rawSet.coIndices(handle);
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
return new ConvexPolyhedron(vs, indices);
case RawShapeType.RoundConvexPolyhedron:
- vs = rawSet.coVertices(handle);
- indices = rawSet.coIndices(handle);
- borderRadius = rawSet.coRoundRadius(handle);
+ vs = rawSet.coVertices(handle)!;
+ indices = rawSet.coIndices(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
return new RoundConvexPolyhedron(vs, indices, borderRadius);
case RawShapeType.Cylinder:
- halfHeight = rawSet.coHalfHeight(handle);
- radius = rawSet.coRadius(handle);
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
return new Cylinder(halfHeight, radius);
case RawShapeType.RoundCylinder:
- halfHeight = rawSet.coHalfHeight(handle);
- radius = rawSet.coRadius(handle);
- borderRadius = rawSet.coRoundRadius(handle);
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
return new RoundCylinder(halfHeight, radius, borderRadius);
case RawShapeType.Cone:
- halfHeight = rawSet.coHalfHeight(handle);
- radius = rawSet.coRadius(handle);
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
return new Cone(halfHeight, radius);
case RawShapeType.RoundCone:
- halfHeight = rawSet.coHalfHeight(handle);
- radius = rawSet.coRadius(handle);
- borderRadius = rawSet.coRoundRadius(handle);
+ halfHeight = rawSet.coHalfHeight(handle)!;
+ radius = rawSet.coRadius(handle)!;
+ borderRadius = rawSet.coRoundRadius(handle)!;
return new RoundCone(halfHeight, radius, borderRadius);
- // #endif
default:
throw new Error("unknown shape type: " + rawType);
@@ -256,7 +189,7 @@ export abstract class Shape {
targetDistance,
maxToi,
stopAtPenetration,
- ),
+ )!,
);
rawPos1.free();
@@ -297,13 +230,7 @@ export abstract class Shape {
let rawShape1 = this.intoRaw();
let rawShape2 = shape2.intoRaw();
- let result = rawShape1.intersectsShape(
- rawPos1,
- rawRot1,
- rawShape2,
- rawPos2,
- rawRot2,
- );
+ let result = rawShape1.intersectsShape(rawPos1, rawRot1, rawShape2, rawPos2, rawRot2);
rawPos1.free();
rawRot1.free();
@@ -344,14 +271,7 @@ export abstract class Shape {
let rawShape2 = shape2.intoRaw();
let result = ShapeContact.fromRaw(
- rawShape1.contactShape(
- rawPos1,
- rawRot1,
- rawShape2,
- rawPos2,
- rawRot2,
- prediction,
- ),
+ rawShape1.contactShape(rawPos1, rawRot1, rawShape2, rawPos2, rawRot2, prediction)!,
);
rawPos1.free();
@@ -365,11 +285,7 @@ export abstract class Shape {
return result;
}
- containsPoint(
- shapePos: Vector,
- shapeRot: Rotation,
- point: Vector,
- ): boolean {
+ containsPoint(shapePos: Vector, shapeRot: Rotation, point: Vector): boolean {
let rawPos = VectorOps.intoRaw(shapePos);
let rawRot = RotationOps.intoRaw(shapeRot);
let rawPoint = VectorOps.intoRaw(point);
@@ -405,28 +321,17 @@ export abstract class Shape {
rawPoint.free();
rawShape.free();
- return result;
+ return result!;
}
- intersectsRay(
- ray: Ray,
- shapePos: Vector,
- shapeRot: Rotation,
- maxToi: number,
- ): boolean {
+ intersectsRay(ray: Ray, shapePos: Vector, shapeRot: Rotation, maxToi: number): boolean {
let rawPos = VectorOps.intoRaw(shapePos);
let rawRot = RotationOps.intoRaw(shapeRot);
let rawRayOrig = VectorOps.intoRaw(ray.origin);
let rawRayDir = VectorOps.intoRaw(ray.dir);
let rawShape = this.intoRaw();
- let result = rawShape.intersectsRay(
- rawPos,
- rawRot,
- rawRayOrig,
- rawRayDir,
- maxToi,
- );
+ let result = rawShape.intersectsRay(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi);
rawPos.free();
rawRot.free();
@@ -450,14 +355,7 @@ export abstract class Shape {
let rawRayDir = VectorOps.intoRaw(ray.dir);
let rawShape = this.intoRaw();
- let result = rawShape.castRay(
- rawPos,
- rawRot,
- rawRayOrig,
- rawRayDir,
- maxToi,
- solid,
- );
+ let result = rawShape.castRay(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi, solid);
rawPos.free();
rawRot.free();
@@ -482,14 +380,7 @@ export abstract class Shape {
let rawShape = this.intoRaw();
let result = RayIntersection.fromRaw(
- rawShape.castRayAndGetNormal(
- rawPos,
- rawRot,
- rawRayOrig,
- rawRayDir,
- maxToi,
- solid,
- ),
+ rawShape.castRayAndGetNormal(rawPos, rawRot, rawRayOrig, rawRayDir, maxToi, solid)!,
);
rawPos.free();
@@ -498,36 +389,10 @@ export abstract class Shape {
rawRayDir.free();
rawShape.free();
- return result;
+ return result!;
}
}
-// #if DIM2
-/**
- * An enumeration representing the type of a shape.
- */
-export enum ShapeType {
- Ball = 0,
- Cuboid = 1,
- Capsule = 2,
- Segment = 3,
- Polyline = 4,
- Triangle = 5,
- TriMesh = 6,
- HeightField = 7,
- // Compound = 8,
- ConvexPolygon = 9,
- RoundCuboid = 10,
- RoundTriangle = 11,
- RoundConvexPolygon = 12,
- HalfSpace = 13,
- Voxels = 14,
-}
-
-// #endif
-
-// #if DIM3
-
/**
* An enumeration representing the type of a shape.
*/
@@ -569,8 +434,6 @@ export enum HeightFieldFlags {
FIX_INTERNAL_EDGES = 0b0000_0001,
}
-// #endif
-
// NOTE: this **must** match the TriMeshFlags on the rust side.
/**
* Flags controlling the behavior of the triangle mesh creation and of some
@@ -699,20 +562,6 @@ export class Cuboid extends Shape {
*/
halfExtents: Vector;
- // #if DIM2
- /**
- * Creates a new 2D rectangle.
- * @param hx - The half width of the rectangle.
- * @param hy - The helf height of the rectangle.
- */
- constructor(hx: number, hy: number) {
- super();
- this.halfExtents = VectorOps.new(hx, hy);
- }
-
- // #endif
-
- // #if DIM3
/**
* Creates a new 3D cuboid.
* @param hx - The half width of the cuboid.
@@ -724,20 +573,8 @@ export class Cuboid extends Shape {
this.halfExtents = VectorOps.new(hx, hy, hz);
}
- // #endif
-
public intoRaw(): RawShape {
- // #if DIM2
- return RawShape.cuboid(this.halfExtents.x, this.halfExtents.y);
- // #endif
-
- // #if DIM3
- return RawShape.cuboid(
- this.halfExtents.x,
- this.halfExtents.y,
- this.halfExtents.z,
- );
- // #endif
+ return RawShape.cuboid(this.halfExtents.x, this.halfExtents.y, this.halfExtents.z);
}
}
@@ -757,23 +594,6 @@ export class RoundCuboid extends Shape {
*/
borderRadius: number;
- // #if DIM2
- /**
- * Creates a new 2D rectangle.
- * @param hx - The half width of the rectangle.
- * @param hy - The helf height of the rectangle.
- * @param borderRadius - The radius of the borders of this cuboid. This will
- * effectively increase the half-extents of the cuboid by this radius.
- */
- constructor(hx: number, hy: number, borderRadius: number) {
- super();
- this.halfExtents = VectorOps.new(hx, hy);
- this.borderRadius = borderRadius;
- }
-
- // #endif
-
- // #if DIM3
/**
* Creates a new 3D cuboid.
* @param hx - The half width of the cuboid.
@@ -788,25 +608,13 @@ export class RoundCuboid extends Shape {
this.borderRadius = borderRadius;
}
- // #endif
-
public intoRaw(): RawShape {
- // #if DIM2
- return RawShape.roundCuboid(
- this.halfExtents.x,
- this.halfExtents.y,
- this.borderRadius,
- );
- // #endif
-
- // #if DIM3
return RawShape.roundCuboid(
this.halfExtents.x,
this.halfExtents.y,
this.halfExtents.z,
this.borderRadius,
);
- // #endif
}
}
@@ -1084,7 +892,7 @@ export class TriMesh extends Shape {
/**
* The triangle mesh flags.
*/
- flags: TriMeshFlags;
+ flags?: TriMeshFlags;
/**
* Creates a new triangle mesh shape.
@@ -1092,11 +900,7 @@ export class TriMesh extends Shape {
* @param vertices - The coordinates of the triangle mesh's vertices.
* @param indices - The indices of the triangle mesh's triangles.
*/
- constructor(
- vertices: Float32Array,
- indices: Uint32Array,
- flags?: TriMeshFlags,
- ) {
+ constructor(vertices: Float32Array, indices: Uint32Array, flags?: TriMeshFlags) {
super();
this.vertices = vertices;
this.indices = indices;
@@ -1104,142 +908,10 @@ export class TriMesh extends Shape {
}
public intoRaw(): RawShape {
- return RawShape.trimesh(this.vertices, this.indices, this.flags);
- }
-}
-
-// #if DIM2
-/**
- * A shape that is a convex polygon.
- */
-export class ConvexPolygon extends Shape {
- readonly type = ShapeType.ConvexPolygon;
-
- /**
- * The vertices of the convex polygon.
- */
- vertices: Float32Array;
-
- /**
- * Do we want to assume the vertices already form a convex hull?
- */
- skipConvexHullComputation: boolean;
-
- /**
- * Creates a new convex polygon shape.
- *
- * @param vertices - The coordinates of the convex polygon's vertices.
- * @param skipConvexHullComputation - If set to `true`, the input points will
- * be assumed to form a convex polyline and no convex-hull computation will
- * be done automatically.
- */
- constructor(vertices: Float32Array, skipConvexHullComputation: boolean) {
- super();
- this.vertices = vertices;
- this.skipConvexHullComputation = !!skipConvexHullComputation;
- }
-
- public intoRaw(): RawShape {
- if (this.skipConvexHullComputation) {
- return RawShape.convexPolyline(this.vertices);
- } else {
- return RawShape.convexHull(this.vertices);
- }
+ return RawShape.trimesh(this.vertices, this.indices, this.flags ?? 0)!;
}
}
-/**
- * A shape that is a convex polygon.
- */
-export class RoundConvexPolygon extends Shape {
- readonly type = ShapeType.RoundConvexPolygon;
-
- /**
- * The vertices of the convex polygon.
- */
- vertices: Float32Array;
-
- /**
- * Do we want to assume the vertices already form a convex hull?
- */
- skipConvexHullComputation: boolean;
-
- /**
- * The radius of the convex polygon's rounded edges and vertices.
- */
- borderRadius: number;
-
- /**
- * Creates a new convex polygon shape.
- *
- * @param vertices - The coordinates of the convex polygon's vertices.
- * @param borderRadius - The radius of the borders of this convex polygon.
- * @param skipConvexHullComputation - If set to `true`, the input points will
- * be assumed to form a convex polyline and no convex-hull computation will
- * be done automatically.
- */
- constructor(
- vertices: Float32Array,
- borderRadius: number,
- skipConvexHullComputation: boolean,
- ) {
- super();
- this.vertices = vertices;
- this.borderRadius = borderRadius;
- this.skipConvexHullComputation = !!skipConvexHullComputation;
- }
-
- public intoRaw(): RawShape {
- if (this.skipConvexHullComputation) {
- return RawShape.roundConvexPolyline(
- this.vertices,
- this.borderRadius,
- );
- } else {
- return RawShape.roundConvexHull(this.vertices, this.borderRadius);
- }
- }
-}
-
-/**
- * A shape that is a heightfield.
- */
-export class Heightfield extends Shape {
- readonly type = ShapeType.HeightField;
-
- /**
- * The heights of the heightfield, along its local `y` axis.
- */
- heights: Float32Array;
-
- /**
- * The heightfield's length along its local `x` axis.
- */
- scale: Vector;
-
- /**
- * Creates a new heightfield shape.
- *
- * @param heights - The heights of the heightfield, along its local `y` axis.
- * @param scale - The scale factor applied to the heightfield.
- */
- constructor(heights: Float32Array, scale: Vector) {
- super();
- this.heights = heights;
- this.scale = scale;
- }
-
- public intoRaw(): RawShape {
- let rawScale = VectorOps.intoRaw(this.scale);
- let rawShape = RawShape.heightfield(this.heights, rawScale);
- rawScale.free();
- return rawShape;
- }
-}
-
-// #endif
-
-// #if DIM3
/**
* A shape that is a convex polygon.
*/
@@ -1273,9 +945,9 @@ export class ConvexPolyhedron extends Shape {
public intoRaw(): RawShape {
if (!!this.indices) {
- return RawShape.convexMesh(this.vertices, this.indices);
+ return RawShape.convexMesh(this.vertices, this.indices)!;
} else {
- return RawShape.convexHull(this.vertices);
+ return RawShape.convexHull(this.vertices)!;
}
}
}
@@ -1294,7 +966,7 @@ export class RoundConvexPolyhedron extends Shape {
/**
* The indices of the convex polygon.
*/
- indices?: Uint32Array;
+ indices?: Uint32Array | null;
/**
* The radius of the convex polyhedron's rounded edges and vertices.
@@ -1324,13 +996,9 @@ export class RoundConvexPolyhedron extends Shape {
public intoRaw(): RawShape {
if (!!this.indices) {
- return RawShape.roundConvexMesh(
- this.vertices,
- this.indices,
- this.borderRadius,
- );
+ return RawShape.roundConvexMesh(this.vertices, this.indices, this.borderRadius)!;
} else {
- return RawShape.roundConvexHull(this.vertices, this.borderRadius);
+ return RawShape.roundConvexHull(this.vertices, this.borderRadius)!;
}
}
}
@@ -1365,7 +1033,7 @@ export class Heightfield extends Shape {
/**
* Flags applied to the heightfield.
*/
- flags: HeightFieldFlags;
+ flags?: HeightFieldFlags;
/**
* Creates a new heightfield shape.
@@ -1398,7 +1066,7 @@ export class Heightfield extends Shape {
this.ncols,
this.heights,
rawScale,
- this.flags,
+ this.flags ?? 0,
);
rawScale.free();
return rawShape;
@@ -1472,11 +1140,7 @@ export class RoundCylinder extends Shape {
}
public intoRaw(): RawShape {
- return RawShape.roundCylinder(
- this.halfHeight,
- this.radius,
- this.borderRadius,
- );
+ return RawShape.roundCylinder(this.halfHeight, this.radius, this.borderRadius);
}
}
@@ -1547,12 +1211,6 @@ export class RoundCone extends Shape {
}
public intoRaw(): RawShape {
- return RawShape.roundCone(
- this.halfHeight,
- this.radius,
- this.borderRadius,
- );
+ return RawShape.roundCone(this.halfHeight, this.radius, this.borderRadius);
}
}
-
-// #endif
diff --git a/packages/rapier-3d/src/geometry/toi.ts b/packages/rapier-3d/src/geometry/toi.ts
new file mode 100644
index 00000000..890362de
--- /dev/null
+++ b/packages/rapier-3d/src/geometry/toi.ts
@@ -0,0 +1,105 @@
+import {Vector, VectorOps} from "../math";
+import {RawShapeCastHit, RawColliderShapeCastHit} from "../raw";
+import {Collider} from "./collider";
+import {ColliderSet} from "./collider_set";
+
+/**
+ * The intersection between a ray and a collider.
+ */
+export class ShapeCastHit {
+ /**
+ * The time of impact of the two shapes.
+ */
+ time_of_impact: number;
+ /**
+ * The local-space contact point on the first shape, at
+ * the time of impact.
+ */
+ witness1: Vector;
+ /**
+ * The local-space contact point on the second shape, at
+ * the time of impact.
+ */
+ witness2: Vector;
+ /**
+ * The local-space normal on the first shape, at
+ * the time of impact.
+ */
+ normal1: Vector;
+ /**
+ * The local-space normal on the second shape, at
+ * the time of impact.
+ */
+ normal2: Vector;
+
+ constructor(
+ time_of_impact: number,
+ witness1: Vector,
+ witness2: Vector,
+ normal1: Vector,
+ normal2: Vector,
+ ) {
+ this.time_of_impact = time_of_impact;
+ this.witness1 = witness1;
+ this.witness2 = witness2;
+ this.normal1 = normal1;
+ this.normal2 = normal2;
+ }
+
+ public static fromRaw(
+ colliderSet: ColliderSet | null,
+ raw: RawShapeCastHit,
+ ): ShapeCastHit | null {
+ if (!raw) return null;
+
+ const result = new ShapeCastHit(
+ raw.time_of_impact(),
+ VectorOps.fromRaw(raw.witness1())!,
+ VectorOps.fromRaw(raw.witness2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
+ );
+ raw.free();
+ return result;
+ }
+}
+
+/**
+ * The intersection between a ray and a collider.
+ */
+export class ColliderShapeCastHit extends ShapeCastHit {
+ /**
+ * The handle of the collider hit by the ray.
+ */
+ collider: Collider;
+
+ constructor(
+ collider: Collider,
+ time_of_impact: number,
+ witness1: Vector,
+ witness2: Vector,
+ normal1: Vector,
+ normal2: Vector,
+ ) {
+ super(time_of_impact, witness1, witness2, normal1, normal2);
+ this.collider = collider;
+ }
+
+ public static fromRaw(
+ colliderSet: ColliderSet,
+ raw: RawColliderShapeCastHit,
+ ): ColliderShapeCastHit | null {
+ if (!raw) return null;
+
+ const result = new ColliderShapeCastHit(
+ colliderSet.get(raw.colliderHandle())!,
+ raw.time_of_impact(),
+ VectorOps.fromRaw(raw.witness1())!,
+ VectorOps.fromRaw(raw.witness2())!,
+ VectorOps.fromRaw(raw.normal1())!,
+ VectorOps.fromRaw(raw.normal2())!,
+ );
+ raw.free();
+ return result;
+ }
+}
diff --git a/packages/rapier-3d/src/init-compat-simd.ts b/packages/rapier-3d/src/init-compat-simd.ts
new file mode 100644
index 00000000..3265b18d
--- /dev/null
+++ b/packages/rapier-3d/src/init-compat-simd.ts
@@ -0,0 +1,13 @@
+import base64 from "base64-js";
+import {initSync} from "../wasm/release-simd/rapier_wasm_3d";
+// @ts-ignore - WASM file imported as base64 string by bundler
+import wasmBase64 from "../wasm/release-simd/rapier_wasm_3d_bg.wasm";
+
+/**
+ * Initializes RAPIER SIMD with embedded WASM (no separate file needed).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init() {
+ const wasmBytes = base64.toByteArray(wasmBase64 as unknown as string);
+ initSync(wasmBytes.buffer);
+}
diff --git a/packages/rapier-3d/src/init-compat.ts b/packages/rapier-3d/src/init-compat.ts
new file mode 100644
index 00000000..5ccd33b6
--- /dev/null
+++ b/packages/rapier-3d/src/init-compat.ts
@@ -0,0 +1,13 @@
+import base64 from "base64-js";
+import {initSync} from "../wasm/release/rapier_wasm_3d";
+// @ts-ignore - WASM file imported as base64 string by bundler
+import wasmBase64 from "../wasm/release/rapier_wasm_3d_bg.wasm";
+
+/**
+ * Initializes RAPIER with embedded WASM (no separate file needed).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init() {
+ const wasmBytes = base64.toByteArray(wasmBase64 as unknown as string);
+ initSync(wasmBytes.buffer);
+}
diff --git a/packages/rapier-3d/src/init-simd.ts b/packages/rapier-3d/src/init-simd.ts
new file mode 100644
index 00000000..c1beff08
--- /dev/null
+++ b/packages/rapier-3d/src/init-simd.ts
@@ -0,0 +1,12 @@
+import wasmInit, {InitInput} from "../wasm/release-simd/rapier_wasm_3d";
+
+/**
+ * Initializes RAPIER SIMD using fetch (requires WASM file to be served).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init(input?: InitInput) {
+ if (!input) {
+ input = new URL("rapier_wasm_3d_simd_bg.wasm", import.meta.url);
+ }
+ await wasmInit(input);
+}
diff --git a/packages/rapier-3d/src/init.ts b/packages/rapier-3d/src/init.ts
new file mode 100644
index 00000000..e07f796a
--- /dev/null
+++ b/packages/rapier-3d/src/init.ts
@@ -0,0 +1,12 @@
+import wasmInit, {InitInput} from "../wasm/release/rapier_wasm_3d";
+
+/**
+ * Initializes RAPIER using fetch (requires WASM file to be served).
+ * Has to be called and awaited before using any library methods.
+ */
+export async function init(input?: InitInput) {
+ if (!input) {
+ input = new URL("rapier_wasm_3d_bg.wasm", import.meta.url);
+ }
+ await wasmInit(input);
+}
diff --git a/src.ts/math.ts b/packages/rapier-3d/src/math.ts
similarity index 65%
rename from src.ts/math.ts
rename to packages/rapier-3d/src/math.ts
index ebca392b..e5a128c0 100644
--- a/src.ts/math.ts
+++ b/packages/rapier-3d/src/math.ts
@@ -1,81 +1,5 @@
-import {RawVector, RawRotation} from "./raw";
-// #if DIM3
-import {RawSdpMatrix3} from "./raw";
-// #endif
+import {RawVector, RawRotation, RawSdpMatrix3} from "./raw";
-// #if DIM2
-export interface Vector {
- x: number;
- y: number;
-}
-
-/**
- * A 2D vector.
- */
-export class Vector2 implements Vector {
- x: number;
- y: number;
-
- constructor(x: number, y: number) {
- this.x = x;
- this.y = y;
- }
-}
-
-export class VectorOps {
- public static new(x: number, y: number): Vector {
- return new Vector2(x, y);
- }
-
- public static zeros(): Vector {
- return VectorOps.new(0.0, 0.0);
- }
-
- // FIXME: type ram: RawVector?
- public static fromRaw(raw: RawVector): Vector {
- if (!raw) return null;
-
- let res = VectorOps.new(raw.x, raw.y);
- raw.free();
- return res;
- }
-
- public static intoRaw(v: Vector): RawVector {
- return new RawVector(v.x, v.y);
- }
-
- public static copy(out: Vector, input: Vector) {
- out.x = input.x;
- out.y = input.y;
- }
-}
-
-/**
- * A rotation angle in radians.
- */
-export type Rotation = number;
-
-export class RotationOps {
- public static identity(): number {
- return 0.0;
- }
-
- public static fromRaw(raw: RawRotation): Rotation {
- if (!raw) return null;
-
- let res = raw.angle;
- raw.free();
- return res;
- }
-
- public static intoRaw(angle: Rotation): RawRotation {
- return RawRotation.fromAngle(angle);
- }
-}
-
-// #endif
-
-// #if DIM3
export interface Vector {
x: number;
y: number;
@@ -110,13 +34,15 @@ export class VectorOps {
return VectorOps.new(0.0, 0.0, 0.0);
}
- // FIXME: type ram: RawVector?
- public static fromRaw(raw: RawVector): Vector {
+ public static fromRaw(raw: RawVector, target?: Vector): Vector | null {
if (!raw) return null;
- let res = VectorOps.new(raw.x, raw.y, raw.z);
+ target ??= VectorOps.zeros();
+ target.x = raw.x;
+ target.y = raw.y;
+ target.z = raw.z;
raw.free();
- return res;
+ return target;
}
public static copy(out: Vector, input: Vector) {
@@ -124,6 +50,14 @@ export class VectorOps {
out.y = input.y;
out.z = input.z;
}
+
+ public static fromBuffer(buffer: Float32Array, target?: Vector): Vector {
+ target ??= VectorOps.zeros();
+ target.x = buffer[0];
+ target.y = buffer[1];
+ target.z = buffer[2];
+ return target;
+ }
}
export interface Rotation {
@@ -155,12 +89,16 @@ export class RotationOps {
return new Quaternion(0.0, 0.0, 0.0, 1.0);
}
- public static fromRaw(raw: RawRotation): Rotation {
+ public static fromRaw(raw: RawRotation, target?: Rotation): Rotation | null {
if (!raw) return null;
- let res = new Quaternion(raw.x, raw.y, raw.z, raw.w);
+ target ??= RotationOps.identity();
+ target.x = raw.x;
+ target.y = raw.y;
+ target.z = raw.z;
+ target.w = raw.w;
raw.free();
- return res;
+ return target;
}
public static intoRaw(rot: Rotation): RawRotation {
@@ -173,6 +111,15 @@ export class RotationOps {
out.z = input.z;
out.w = input.w;
}
+
+ public static fromBuffer(buffer: Float32Array, target?: Rotation): Rotation {
+ target ??= RotationOps.identity();
+ target.x = buffer[0];
+ target.y = buffer[1];
+ target.z = buffer[2];
+ target.w = buffer[3];
+ return target;
+ }
}
/**
@@ -259,5 +206,3 @@ export class SdpMatrix3Ops {
return sdpMatrix3;
}
}
-
-// #endif
diff --git a/packages/rapier-3d/src/pipeline/debug_render_pipeline.ts b/packages/rapier-3d/src/pipeline/debug_render_pipeline.ts
new file mode 100644
index 00000000..9b42dd67
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/debug_render_pipeline.ts
@@ -0,0 +1,78 @@
+import {ImpulseJointSet, MultibodyJointSet, RigidBodySet} from "../dynamics";
+import {Collider, ColliderSet, NarrowPhase} from "../geometry";
+import {RawDebugRenderPipeline} from "../raw";
+import {QueryFilterFlags} from "./query_pipeline";
+
+/**
+ * The vertex and color buffers for debug-redering the physics scene.
+ */
+export class DebugRenderBuffers {
+ /**
+ * The lines to render. This is a flat array containing all the lines
+ * to render. Each line is described as two consecutive point. Each
+ * point is described as two (in 2D) or three (in 3D) consecutive
+ * floats. For example, in 2D, the array: `[1, 2, 3, 4, 5, 6, 7, 8]`
+ * describes the two segments `[[1, 2], [3, 4]]` and `[[5, 6], [7, 8]]`.
+ */
+ public vertices: Float32Array;
+ /**
+ * The color buffer. There is one color per vertex, and each color
+ * has four consecutive components (in RGBA format).
+ */
+ public colors: Float32Array;
+
+ constructor(vertices: Float32Array, colors: Float32Array) {
+ this.vertices = vertices;
+ this.colors = colors;
+ }
+}
+
+/**
+ * A pipeline for rendering the physics scene.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `debugRenderPipeline.free()`
+ * once you are done using it (and all the rigid-bodies it created).
+ */
+export class DebugRenderPipeline {
+ raw: RawDebugRenderPipeline;
+ public vertices!: Float32Array;
+ public colors!: Float32Array;
+
+ /**
+ * Release the WASM memory occupied by this serialization pipeline.
+ */
+ free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ this.vertices = undefined!;
+ this.colors = undefined!;
+ }
+
+ constructor(raw?: RawDebugRenderPipeline) {
+ this.raw = raw || new RawDebugRenderPipeline();
+ }
+
+ public render(
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ impulse_joints: ImpulseJointSet,
+ multibody_joints: MultibodyJointSet,
+ narrow_phase: NarrowPhase,
+ filterFlags?: QueryFilterFlags,
+ filterPredicate?: (collider: Collider) => boolean,
+ ) {
+ this.raw.render(
+ bodies.raw,
+ colliders.raw,
+ impulse_joints.raw,
+ multibody_joints.raw,
+ narrow_phase.raw,
+ filterFlags ?? 0,
+ colliders.castClosure(filterPredicate) as unknown as Function,
+ );
+ this.vertices = this.raw.vertices();
+ this.colors = this.raw.colors();
+ }
+}
diff --git a/src.ts/pipeline/event_queue.ts b/packages/rapier-3d/src/pipeline/event_queue.ts
similarity index 91%
rename from src.ts/pipeline/event_queue.ts
rename to packages/rapier-3d/src/pipeline/event_queue.ts
index e39c1582..91645636 100644
--- a/src.ts/pipeline/event_queue.ts
+++ b/packages/rapier-3d/src/pipeline/event_queue.ts
@@ -1,7 +1,6 @@
-import {RawContactForceEvent, RawEventQueue} from "../raw";
-import {RigidBodyHandle} from "../dynamics";
-import {Collider, ColliderHandle} from "../geometry";
+import {ColliderHandle} from "../geometry";
import {Vector, VectorOps} from "../math";
+import {RawContactForceEvent, RawEventQueue} from "../raw";
/**
* Flags indicating what events are enabled for colliders.
@@ -26,13 +25,13 @@ export enum ActiveEvents {
* read from within the closure given to `EventHandler.drainContactForceEvents`.
*/
export class TempContactForceEvent {
- raw: RawContactForceEvent;
+ raw!: RawContactForceEvent;
public free() {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
/**
@@ -53,7 +52,7 @@ export class TempContactForceEvent {
* The sum of all the forces between the two colliders.
*/
public totalForce(): Vector {
- return VectorOps.fromRaw(this.raw.total_force());
+ return VectorOps.fromRaw(this.raw.total_force())!;
}
/**
@@ -71,7 +70,7 @@ export class TempContactForceEvent {
* The world-space (unit) direction of the force with strongest magnitude.
*/
public maxForceDirection(): Vector {
- return VectorOps.fromRaw(this.raw.max_force_direction());
+ return VectorOps.fromRaw(this.raw.max_force_direction())!;
}
/**
@@ -111,7 +110,7 @@ export class EventQueue {
if (!!this.raw) {
this.raw.free();
}
- this.raw = undefined;
+ this.raw = undefined!;
}
/**
@@ -124,11 +123,7 @@ export class EventQueue {
* (false).
*/
public drainCollisionEvents(
- f: (
- handle1: ColliderHandle,
- handle2: ColliderHandle,
- started: boolean,
- ) => void,
+ f: (handle1: ColliderHandle, handle2: ColliderHandle, started: boolean) => void,
) {
this.raw.drainCollisionEvents(f);
}
diff --git a/packages/rapier-3d/src/pipeline/index.ts b/packages/rapier-3d/src/pipeline/index.ts
new file mode 100644
index 00000000..092c1a59
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/index.ts
@@ -0,0 +1,7 @@
+export * from "./world";
+export * from "./physics_pipeline";
+export * from "./serialization_pipeline";
+export * from "./event_queue";
+export * from "./physics_hooks";
+export * from "./debug_render_pipeline";
+export * from "./query_pipeline";
diff --git a/packages/rapier-3d/src/pipeline/physics_hooks.ts b/packages/rapier-3d/src/pipeline/physics_hooks.ts
new file mode 100644
index 00000000..20e12ad9
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/physics_hooks.ts
@@ -0,0 +1,54 @@
+import {RigidBodyHandle} from "../dynamics";
+import {ColliderHandle} from "../geometry";
+
+export enum ActiveHooks {
+ NONE = 0,
+ FILTER_CONTACT_PAIRS = 0b0001,
+ FILTER_INTERSECTION_PAIRS = 0b0010,
+ // MODIFY_SOLVER_CONTACTS = 0b0100, /* Not supported yet in JS. */
+}
+
+export enum SolverFlags {
+ EMPTY = 0b000,
+ COMPUTE_IMPULSE = 0b001,
+}
+
+export interface PhysicsHooks {
+ /**
+ * Function that determines if contacts computation should happen between two colliders, and how the
+ * constraints solver should behave for these contacts.
+ *
+ * This will only be executed and taken into account if at least one of the involved colliders contains the
+ * `ActiveHooks.FILTER_CONTACT_PAIR` flag in its active hooks.
+ *
+ * @param collider1 − Handle of the first collider involved in the potential contact.
+ * @param collider2 − Handle of the second collider involved in the potential contact.
+ * @param body1 − Handle of the first body involved in the potential contact.
+ * @param body2 − Handle of the second body involved in the potential contact.
+ */
+ filterContactPair(
+ collider1: ColliderHandle,
+ collider2: ColliderHandle,
+ body1: RigidBodyHandle,
+ body2: RigidBodyHandle,
+ ): SolverFlags | null;
+
+ /**
+ * Function that determines if intersection computation should happen between two colliders (where at least
+ * one is a sensor).
+ *
+ * This will only be executed and taken into account if `one of the involved colliders contains the
+ * `ActiveHooks.FILTER_INTERSECTION_PAIR` flag in its active hooks.
+ *
+ * @param collider1 − Handle of the first collider involved in the potential contact.
+ * @param collider2 − Handle of the second collider involved in the potential contact.
+ * @param body1 − Handle of the first body involved in the potential contact.
+ * @param body2 − Handle of the second body involved in the potential contact.
+ */
+ filterIntersectionPair(
+ collider1: ColliderHandle,
+ collider2: ColliderHandle,
+ body1: RigidBodyHandle,
+ body2: RigidBodyHandle,
+ ): boolean;
+}
diff --git a/packages/rapier-3d/src/pipeline/physics_pipeline.ts b/packages/rapier-3d/src/pipeline/physics_pipeline.ts
new file mode 100644
index 00000000..28980604
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/physics_pipeline.ts
@@ -0,0 +1,96 @@
+import {
+ IntegrationParameters,
+ ImpulseJointSet,
+ MultibodyJointSet,
+ RigidBodySet,
+ CCDSolver,
+ IslandManager,
+} from "../dynamics";
+import {BroadPhase, ColliderSet, NarrowPhase} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {RawPhysicsPipeline, RawVector} from "../raw";
+import {EventQueue} from "./event_queue";
+import {PhysicsHooks} from "./physics_hooks";
+
+export class PhysicsPipeline {
+ raw: RawPhysicsPipeline;
+ private cachedGravity: RawVector | null = null;
+ private lastGravityX = 0;
+ private lastGravityY = 0;
+ private lastGravityZ = 0;
+
+ public free() {
+ if (this.cachedGravity) {
+ this.cachedGravity.free();
+ this.cachedGravity = null;
+ }
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined as unknown as RawPhysicsPipeline;
+ }
+
+ constructor(raw?: RawPhysicsPipeline) {
+ this.raw = raw || new RawPhysicsPipeline();
+ }
+
+ public step(
+ gravity: Vector,
+ integrationParameters: IntegrationParameters,
+ islands: IslandManager,
+ broadPhase: BroadPhase,
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ impulseJoints: ImpulseJointSet,
+ multibodyJoints: MultibodyJointSet,
+ ccdSolver: CCDSolver,
+ eventQueue?: EventQueue,
+ hooks?: PhysicsHooks,
+ ) {
+ if (
+ !this.cachedGravity ||
+ gravity.x !== this.lastGravityX ||
+ gravity.y !== this.lastGravityY ||
+ gravity.z !== this.lastGravityZ
+ ) {
+ this.cachedGravity?.free();
+ this.cachedGravity = VectorOps.intoRaw(gravity);
+ this.lastGravityX = gravity.x;
+ this.lastGravityY = gravity.y;
+ this.lastGravityZ = gravity.z;
+ }
+
+ if (!!eventQueue) {
+ this.raw.stepWithEvents(
+ this.cachedGravity,
+ integrationParameters.raw,
+ islands.raw,
+ broadPhase.raw,
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ impulseJoints.raw,
+ multibodyJoints.raw,
+ ccdSolver.raw,
+ eventQueue.raw,
+ hooks as object,
+ hooks?.filterContactPair as Function,
+ hooks?.filterIntersectionPair as Function,
+ );
+ } else {
+ this.raw.step(
+ this.cachedGravity,
+ integrationParameters.raw,
+ islands.raw,
+ broadPhase.raw,
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ impulseJoints.raw,
+ multibodyJoints.raw,
+ ccdSolver.raw,
+ );
+ }
+ }
+}
diff --git a/packages/rapier-3d/src/pipeline/query_pipeline.ts b/packages/rapier-3d/src/pipeline/query_pipeline.ts
new file mode 100644
index 00000000..dc4b1204
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/query_pipeline.ts
@@ -0,0 +1,41 @@
+// NOTE: must match the bits in the QueryFilterFlags on the Rust side.
+
+// NOTE: must match the bits in the QueryFilterFlags on the Rust side.
+/**
+ * Flags for excluding whole sets of colliders from a scene query.
+ */
+export enum QueryFilterFlags {
+ /**
+ * Exclude from the query any collider attached to a fixed rigid-body and colliders with no rigid-body attached.
+ */
+ EXCLUDE_FIXED = 0b0000_0001,
+ /**
+ * Exclude from the query any collider attached to a dynamic rigid-body.
+ */
+ EXCLUDE_KINEMATIC = 0b0000_0010,
+ /**
+ * Exclude from the query any collider attached to a kinematic rigid-body.
+ */
+ EXCLUDE_DYNAMIC = 0b0000_0100,
+ /**
+ * Exclude from the query any collider that is a sensor.
+ */
+ EXCLUDE_SENSORS = 0b0000_1000,
+ /**
+ * Exclude from the query any collider that is not a sensor.
+ */
+ EXCLUDE_SOLIDS = 0b0001_0000,
+ /**
+ * Excludes all colliders not attached to a dynamic rigid-body.
+ */
+ ONLY_DYNAMIC = QueryFilterFlags.EXCLUDE_FIXED | QueryFilterFlags.EXCLUDE_KINEMATIC,
+ /**
+ * Excludes all colliders not attached to a kinematic rigid-body.
+ */
+ ONLY_KINEMATIC = QueryFilterFlags.EXCLUDE_DYNAMIC | QueryFilterFlags.EXCLUDE_FIXED,
+ /**
+ * Exclude all colliders attached to a non-fixed rigid-body
+ * (this will not exclude colliders not attached to any rigid-body).
+ */
+ ONLY_FIXED = QueryFilterFlags.EXCLUDE_DYNAMIC | QueryFilterFlags.EXCLUDE_KINEMATIC,
+}
diff --git a/packages/rapier-3d/src/pipeline/serialization_pipeline.ts b/packages/rapier-3d/src/pipeline/serialization_pipeline.ts
new file mode 100644
index 00000000..5f0a25e0
--- /dev/null
+++ b/packages/rapier-3d/src/pipeline/serialization_pipeline.ts
@@ -0,0 +1,84 @@
+import {
+ IntegrationParameters,
+ IslandManager,
+ ImpulseJointSet,
+ MultibodyJointSet,
+ RigidBodySet,
+} from "../dynamics";
+import {BroadPhase, ColliderSet, NarrowPhase} from "../geometry";
+import {Vector, VectorOps} from "../math";
+import {RawSerializationPipeline} from "../raw";
+import {World} from "./world";
+
+/**
+ * A pipeline for serializing the physics scene.
+ *
+ * To avoid leaking WASM resources, this MUST be freed manually with `serializationPipeline.free()`
+ * once you are done using it (and all the rigid-bodies it created).
+ */
+export class SerializationPipeline {
+ raw: RawSerializationPipeline;
+
+ /**
+ * Release the WASM memory occupied by this serialization pipeline.
+ */
+ free() {
+ if (!!this.raw) {
+ this.raw.free();
+ }
+ this.raw = undefined!;
+ }
+
+ constructor(raw?: RawSerializationPipeline) {
+ this.raw = raw || new RawSerializationPipeline();
+ }
+
+ /**
+ * Serialize a complete physics state into a single byte array.
+ * @param gravity - The current gravity affecting the simulation.
+ * @param integrationParameters - The integration parameters of the simulation.
+ * @param broadPhase - The broad-phase of the simulation.
+ * @param narrowPhase - The narrow-phase of the simulation.
+ * @param bodies - The rigid-bodies taking part into the simulation.
+ * @param colliders - The colliders taking part into the simulation.
+ * @param impulseJoints - The impulse joints taking part into the simulation.
+ * @param multibodyJoints - The multibody joints taking part into the simulation.
+ */
+ public serializeAll(
+ gravity: Vector,
+ integrationParameters: IntegrationParameters,
+ islands: IslandManager,
+ broadPhase: BroadPhase,
+ narrowPhase: NarrowPhase,
+ bodies: RigidBodySet,
+ colliders: ColliderSet,
+ impulseJoints: ImpulseJointSet,
+ multibodyJoints: MultibodyJointSet,
+ ): Uint8Array {
+ let rawGra = VectorOps.intoRaw(gravity);
+
+ const res = this.raw.serializeAll(
+ rawGra,
+ integrationParameters.raw,
+ islands.raw,
+ broadPhase.raw,
+ narrowPhase.raw,
+ bodies.raw,
+ colliders.raw,
+ impulseJoints.raw,
+ multibodyJoints.raw,
+ );
+ rawGra.free();
+
+ return res!;
+ }
+
+ /**
+ * Deserialize the complete physics state from a single byte array.
+ *
+ * @param data - The byte array to deserialize.
+ */
+ public deserializeAll(data: Uint8Array): World | null {
+ return World.fromRaw(this.raw.deserializeAll(data)!);
+ }
+}
diff --git a/src.ts/pipeline/world.ts b/packages/rapier-3d/src/pipeline/world.ts
similarity index 90%
rename from src.ts/pipeline/world.ts
rename to packages/rapier-3d/src/pipeline/world.ts
index 9ee85616..82d4acf4 100644
--- a/src.ts/pipeline/world.ts
+++ b/packages/rapier-3d/src/pipeline/world.ts
@@ -1,19 +1,21 @@
+import {KinematicCharacterController, PidAxesMask, PidController} from "../control";
+import {DynamicRayCastVehicleController} from "../control";
import {
- RawBroadPhase,
- RawCCDSolver,
- RawColliderSet,
- RawDeserializedWorld,
- RawIntegrationParameters,
- RawIslandManager,
- RawImpulseJointSet,
- RawMultibodyJointSet,
- RawNarrowPhase,
- RawPhysicsPipeline,
- RawRigidBodySet,
- RawSerializationPipeline,
- RawDebugRenderPipeline,
-} from "../raw";
-
+ CCDSolver,
+ IntegrationParameters,
+ IslandManager,
+ ImpulseJoint,
+ ImpulseJointHandle,
+ MultibodyJoint,
+ MultibodyJointHandle,
+ JointData,
+ ImpulseJointSet,
+ MultibodyJointSet,
+ RigidBody,
+ RigidBodyDesc,
+ RigidBodyHandle,
+ RigidBodySet,
+} from "../dynamics";
import {
BroadPhase,
Collider,
@@ -30,40 +32,28 @@ import {
ColliderShapeCastHit,
TempContactManifold,
} from "../geometry";
-import {
- CCDSolver,
- IntegrationParameters,
- IslandManager,
- ImpulseJoint,
- ImpulseJointHandle,
- MultibodyJoint,
- MultibodyJointHandle,
- JointData,
- ImpulseJointSet,
- MultibodyJointSet,
- RigidBody,
- RigidBodyDesc,
- RigidBodyHandle,
- RigidBodySet,
-} from "../dynamics";
import {Rotation, Vector, VectorOps} from "../math";
+import {
+ RawBroadPhase,
+ RawCCDSolver,
+ RawColliderSet,
+ RawDeserializedWorld,
+ RawIntegrationParameters,
+ RawIslandManager,
+ RawImpulseJointSet,
+ RawMultibodyJointSet,
+ RawNarrowPhase,
+ RawPhysicsPipeline,
+ RawRigidBodySet,
+ RawSerializationPipeline,
+ RawDebugRenderPipeline,
+} from "../raw";
+import {DebugRenderBuffers, DebugRenderPipeline} from "./debug_render_pipeline";
+import {EventQueue} from "./event_queue";
+import {PhysicsHooks} from "./physics_hooks";
import {PhysicsPipeline} from "./physics_pipeline";
import {QueryFilterFlags} from "./query_pipeline";
import {SerializationPipeline} from "./serialization_pipeline";
-import {EventQueue} from "./event_queue";
-import {PhysicsHooks} from "./physics_hooks";
-import {DebugRenderBuffers, DebugRenderPipeline} from "./debug_render_pipeline";
-import {
- KinematicCharacterController,
- PidAxesMask,
- PidController,
-} from "../control";
-import {Coarena} from "../coarena";
-
-// #if DIM3
-import {DynamicRayCastVehicleController} from "../control";
-
-// #endif
/**
* The physics world.
@@ -88,11 +78,8 @@ export class World {
characterControllers: Set;
pidControllers: Set;
- // #if DIM3
vehicleControllers: Set;
- // #endif
-
/**
* Release the WASM memory occupied by this physics world.
*
@@ -115,28 +102,24 @@ export class World {
this.characterControllers.forEach((controller) => controller.free());
this.pidControllers.forEach((controller) => controller.free());
- // #if DIM3
this.vehicleControllers.forEach((controller) => controller.free());
- // #endif
-
- this.integrationParameters = undefined;
- this.islands = undefined;
- this.broadPhase = undefined;
- this.narrowPhase = undefined;
- this.bodies = undefined;
- this.colliders = undefined;
- this.ccdSolver = undefined;
- this.impulseJoints = undefined;
- this.multibodyJoints = undefined;
- this.physicsPipeline = undefined;
- this.serializationPipeline = undefined;
- this.debugRenderPipeline = undefined;
- this.characterControllers = undefined;
- this.pidControllers = undefined;
-
- // #if DIM3
- this.vehicleControllers = undefined;
- // #endif
+
+ this.integrationParameters = undefined!;
+ this.islands = undefined!;
+ this.broadPhase = undefined!;
+ this.narrowPhase = undefined!;
+ this.bodies = undefined!;
+ this.colliders = undefined!;
+ this.ccdSolver = undefined!;
+ this.impulseJoints = undefined!;
+ this.multibodyJoints = undefined!;
+ this.physicsPipeline = undefined!;
+ this.serializationPipeline = undefined!;
+ this.debugRenderPipeline = undefined!;
+ this.characterControllers = undefined!;
+ this.pidControllers = undefined!;
+
+ this.vehicleControllers = undefined!;
}
constructor(
@@ -155,9 +138,7 @@ export class World {
rawDebugRenderPipeline?: RawDebugRenderPipeline,
) {
this.gravity = gravity;
- this.integrationParameters = new IntegrationParameters(
- rawIntegrationParameters,
- );
+ this.integrationParameters = new IntegrationParameters(rawIntegrationParameters);
this.islands = new IslandManager(rawIslands);
this.broadPhase = new BroadPhase(rawBroadPhase);
this.narrowPhase = new NarrowPhase(rawNarrowPhase);
@@ -167,29 +148,23 @@ export class World {
this.multibodyJoints = new MultibodyJointSet(rawMultibodyJoints);
this.ccdSolver = new CCDSolver(rawCCDSolver);
this.physicsPipeline = new PhysicsPipeline(rawPhysicsPipeline);
- this.serializationPipeline = new SerializationPipeline(
- rawSerializationPipeline,
- );
- this.debugRenderPipeline = new DebugRenderPipeline(
- rawDebugRenderPipeline,
- );
+ this.serializationPipeline = new SerializationPipeline(rawSerializationPipeline);
+ this.debugRenderPipeline = new DebugRenderPipeline(rawDebugRenderPipeline);
this.characterControllers = new Set();
this.pidControllers = new Set();
- // #if DIM3
this.vehicleControllers = new Set();
- // #endif
this.impulseJoints.finalizeDeserialization(this.bodies);
this.bodies.finalizeDeserialization(this.colliders);
this.colliders.finalizeDeserialization(this.bodies);
}
- public static fromRaw(raw: RawDeserializedWorld): World {
+ public static fromRaw(raw: RawDeserializedWorld): World | null {
if (!raw) return null;
return new World(
- VectorOps.fromRaw(raw.takeGravity()),
+ VectorOps.fromRaw(raw.takeGravity()!)!,
raw.takeIntegrationParameters(),
raw.takeIslandManager(),
raw.takeBroadPhase(),
@@ -226,7 +201,7 @@ export class World {
*
* This new physics world will be an identical copy of the snapshoted physics world.
*/
- public static restoreSnapshot(data: Uint8Array): World {
+ public static restoreSnapshot(data: Uint8Array): World | null {
let deser = new SerializationPipeline();
return deser.deserializeAll(data);
}
@@ -290,9 +265,7 @@ export class World {
* If the positions need to be updated without running a simulation step this method can be called manually.
*/
public propagateModifiedBodyPositionsToColliders() {
- this.bodies.raw.propagateModifiedBodyPositionsToColliders(
- this.colliders.raw,
- );
+ this.bodies.raw.propagateModifiedBodyPositionsToColliders(this.colliders.raw);
}
// TODO: This needs to trigger a broad-phase update but without emitting collision events?
@@ -430,9 +403,7 @@ export class World {
*
* @param offset - The artificial gap added between the character’s chape and its environment.
*/
- public createCharacterController(
- offset: number,
- ): KinematicCharacterController {
+ public createCharacterController(offset: number): KinematicCharacterController {
let controller = new KinematicCharacterController(
offset,
this.integrationParameters,
@@ -498,7 +469,6 @@ export class World {
controller.free();
}
- // #if DIM3
/**
* Creates a new vehicle controller.
*
@@ -506,9 +476,7 @@ export class World {
* controller is updated, it will change directly the rigid-body’s velocity. This
* rigid-body must be a dynamic or kinematic-velocity-based rigid-body.
*/
- public createVehicleController(
- chassis: RigidBody,
- ): DynamicRayCastVehicleController {
+ public createVehicleController(chassis: RigidBody): DynamicRayCastVehicleController {
let controller = new DynamicRayCastVehicleController(
chassis,
this.broadPhase,
@@ -525,15 +493,11 @@ export class World {
*
* @param controller - The vehicle controller to remove.
*/
- public removeVehicleController(
- controller: DynamicRayCastVehicleController,
- ) {
+ public removeVehicleController(controller: DynamicRayCastVehicleController) {
this.vehicleControllers.delete(controller);
controller.free();
}
- // #endif
-
/**
* Creates a new collider.
*
@@ -582,12 +546,7 @@ export class World {
parent2: RigidBody,
wakeUp: boolean,
): MultibodyJoint {
- return this.multibodyJoints.createJoint(
- params,
- parent1.handle,
- parent2.handle,
- wakeUp,
- );
+ return this.multibodyJoints.createJoint(params, parent1.handle, parent2.handle, wakeUp);
}
/**
@@ -595,7 +554,7 @@ export class World {
*
* @param handle - The integer handle of the rigid-body to retrieve.
*/
- public getRigidBody(handle: RigidBodyHandle): RigidBody {
+ public getRigidBody(handle: RigidBodyHandle): RigidBody | null {
return this.bodies.get(handle);
}
@@ -604,7 +563,7 @@ export class World {
*
* @param handle - The integer handle of the collider to retrieve.
*/
- public getCollider(handle: ColliderHandle): Collider {
+ public getCollider(handle: ColliderHandle): Collider | null {
return this.colliders.get(handle);
}
@@ -613,7 +572,7 @@ export class World {
*
* @param handle - The integer handle of the impulse joint to retrieve.
*/
- public getImpulseJoint(handle: ImpulseJointHandle): ImpulseJoint {
+ public getImpulseJoint(handle: ImpulseJointHandle): ImpulseJoint | null {
return this.impulseJoints.get(handle);
}
@@ -622,7 +581,7 @@ export class World {
*
* @param handle - The integer handle of the multibody joint to retrieve.
*/
- public getMultibodyJoint(handle: MultibodyJointHandle): MultibodyJoint {
+ public getMultibodyJoint(handle: MultibodyJointHandle): MultibodyJoint | null {
return this.multibodyJoints.get(handle);
}
@@ -654,12 +613,7 @@ export class World {
*/
public removeCollider(collider: Collider, wakeUp: boolean) {
if (this.colliders) {
- this.colliders.remove(
- collider.handle,
- this.islands,
- this.bodies,
- wakeUp,
- );
+ this.colliders.remove(collider.handle, this.islands, this.bodies, wakeUp);
}
}
@@ -749,8 +703,8 @@ export class World {
solid,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -786,8 +740,8 @@ export class World {
solid,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -826,8 +780,8 @@ export class World {
callback,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -860,8 +814,8 @@ export class World {
shape,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
return handle != null ? this.colliders.get(handle) : null;
@@ -896,8 +850,8 @@ export class World {
solid,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -924,8 +878,8 @@ export class World {
point,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -953,11 +907,11 @@ export class World {
this.bodies,
this.colliders,
point,
- this.colliders.castClosure(callback),
+ this.colliders.castClosure(callback)!,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -1008,8 +962,8 @@ export class World {
stopAtPenetration,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -1042,11 +996,11 @@ export class World {
shapePos,
shapeRot,
shape,
- this.colliders.castClosure(callback),
+ this.colliders.castClosure(callback)!,
filterFlags,
filterGroups,
- filterExcludeCollider ? filterExcludeCollider.handle : null,
- filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,
+ filterExcludeCollider?.handle,
+ filterExcludeRigidBody?.handle,
this.colliders.castClosure(filterPredicate),
);
}
@@ -1070,7 +1024,7 @@ export class World {
this.colliders,
aabbCenter,
aabbHalfExtents,
- this.colliders.castClosure(callback),
+ this.colliders.castClosure(callback)!,
);
}
@@ -1080,28 +1034,16 @@ export class World {
* @param collider1 - The second collider involved in the contact.
* @param f - Closure that will be called on each collider that is in contact with `collider1`.
*/
- public contactPairsWith(
- collider1: Collider,
- f: (collider2: Collider) => void,
- ) {
- this.narrowPhase.contactPairsWith(
- collider1.handle,
- this.colliders.castClosure(f),
- );
+ public contactPairsWith(collider1: Collider, f: (collider2: Collider) => void) {
+ this.narrowPhase.contactPairsWith(collider1.handle, this.colliders.castClosure(f)!);
}
/**
* Enumerates all the colliders intersecting the given colliders, assuming one of them
* is a sensor.
*/
- public intersectionPairsWith(
- collider1: Collider,
- f: (collider2: Collider) => void,
- ) {
- this.narrowPhase.intersectionPairsWith(
- collider1.handle,
- this.colliders.castClosure(f),
- );
+ public intersectionPairsWith(collider1: Collider, f: (collider2: Collider) => void) {
+ this.narrowPhase.intersectionPairsWith(collider1.handle, this.colliders.castClosure(f)!);
}
/**
@@ -1127,10 +1069,7 @@ export class World {
* @param collider2 − The second collider involved in the intersection.
*/
public intersectionPair(collider1: Collider, collider2: Collider): boolean {
- return this.narrowPhase.intersectionPair(
- collider1.handle,
- collider2.handle,
- );
+ return this.narrowPhase.intersectionPair(collider1.handle, collider2.handle);
}
/**
diff --git a/packages/rapier-3d/src/rapier-compat-simd.ts b/packages/rapier-3d/src/rapier-compat-simd.ts
new file mode 100644
index 00000000..c33cd274
--- /dev/null
+++ b/packages/rapier-3d/src/rapier-compat-simd.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-compat-simd";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/packages/rapier-3d/src/rapier-compat.ts b/packages/rapier-3d/src/rapier-compat.ts
new file mode 100644
index 00000000..af40f7c3
--- /dev/null
+++ b/packages/rapier-3d/src/rapier-compat.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-compat";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/packages/rapier-3d/src/rapier-simd.ts b/packages/rapier-3d/src/rapier-simd.ts
new file mode 100644
index 00000000..64f53025
--- /dev/null
+++ b/packages/rapier-3d/src/rapier-simd.ts
@@ -0,0 +1,4 @@
+export * from "./exports";
+export {init} from "./init-simd";
+import * as RAPIER from "./exports";
+export default RAPIER;
diff --git a/packages/rapier-3d/src/rapier.ts b/packages/rapier-3d/src/rapier.ts
new file mode 100644
index 00000000..f8a07dfa
--- /dev/null
+++ b/packages/rapier-3d/src/rapier.ts
@@ -0,0 +1,4 @@
+import * as RAPIER from "./exports";
+export * from "./exports";
+export * from "./init";
+export default RAPIER;
diff --git a/packages/rapier-3d/src/raw-simd.ts b/packages/rapier-3d/src/raw-simd.ts
new file mode 100644
index 00000000..cbfe7055
--- /dev/null
+++ b/packages/rapier-3d/src/raw-simd.ts
@@ -0,0 +1 @@
+export * from "../wasm/release-simd/rapier_wasm_3d";
diff --git a/packages/rapier-3d/src/raw.ts b/packages/rapier-3d/src/raw.ts
new file mode 100644
index 00000000..5de1a4a6
--- /dev/null
+++ b/packages/rapier-3d/src/raw.ts
@@ -0,0 +1 @@
+export * from "../wasm/release/rapier_wasm_3d";
diff --git a/packages/rapier-3d/tsconfig.json b/packages/rapier-3d/tsconfig.json
new file mode 100644
index 00000000..bc768587
--- /dev/null
+++ b/packages/rapier-3d/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "lib": ["ES2020", "DOM"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/packages/rapier-3d/tsdown.config.ts b/packages/rapier-3d/tsdown.config.ts
new file mode 100644
index 00000000..73e9f5cd
--- /dev/null
+++ b/packages/rapier-3d/tsdown.config.ts
@@ -0,0 +1,47 @@
+import {copyFileSync} from "node:fs";
+import {resolve} from "node:path";
+import {defineConfig} from "tsdown";
+
+const common = {
+ format: ["esm"] as ["esm"],
+ dts: true,
+ sourcemap: true,
+ loader: {
+ ".wasm": "base64" as const,
+ },
+};
+
+export default defineConfig([
+ {
+ ...common,
+ entry: {rapier: "./src/rapier.ts"},
+ clean: true,
+ onSuccess: () => {
+ copyFileSync("./wasm/release/rapier_wasm_3d_bg.wasm", "./dist/rapier_wasm_3d_bg.wasm");
+ },
+ },
+ {
+ ...common,
+ entry: {compat: "./src/rapier-compat.ts"},
+ },
+ {
+ ...common,
+ entry: {simd: "./src/rapier-simd.ts"},
+ alias: {
+ [resolve("./src/raw")]: resolve("./src/raw-simd"),
+ },
+ onSuccess: () => {
+ copyFileSync(
+ "./wasm/release-simd/rapier_wasm_3d_bg.wasm",
+ "./dist/rapier_wasm_3d_simd_bg.wasm",
+ );
+ },
+ },
+ {
+ ...common,
+ entry: {"compat-simd": "./src/rapier-compat-simd.ts"},
+ alias: {
+ [resolve("./src/raw")]: resolve("./src/raw-simd"),
+ },
+ },
+]);
diff --git a/testbed2d/.npmignore b/packages/testbed2d/.npmignore
similarity index 100%
rename from testbed2d/.npmignore
rename to packages/testbed2d/.npmignore
diff --git a/testbed2d/static/index.html b/packages/testbed2d/index.html
similarity index 79%
rename from testbed2d/static/index.html
rename to packages/testbed2d/index.html
index 6df5b069..ddccef81 100644
--- a/testbed2d/static/index.html
+++ b/packages/testbed2d/index.html
@@ -1,4 +1,4 @@
-
+
@@ -13,6 +13,6 @@
-
+
diff --git a/packages/testbed2d/package.json b/packages/testbed2d/package.json
new file mode 100644
index 00000000..686e9c8b
--- /dev/null
+++ b/packages/testbed2d/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "rapier-testbed2d",
+ "version": "0.1.0",
+ "private": true,
+ "description": "JavaScript testbed for rapier.",
+ "license": "Apache-2.0",
+ "author": "sebcrozet ",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@alexandernanberg/rapier-2d": "workspace:*",
+ "hash-wasm": "^4.12.0",
+ "lil-gui": "^0.21.0",
+ "pixi-viewport": "^6.0.3",
+ "pixi.js": "^8.15.0",
+ "seedrandom": "^3.0.5",
+ "stats.js": "^0.17.0"
+ },
+ "devDependencies": {
+ "@types/seedrandom": "^3.0.8",
+ "@types/stats.js": "^0.17.4",
+ "typescript": "^5.9.3",
+ "vite": "^7.3.1",
+ "vite-plugin-wasm": "^3.5.0"
+ }
+}
diff --git a/testbed2d/static/.htaccess b/packages/testbed2d/public/.htaccess
similarity index 100%
rename from testbed2d/static/.htaccess
rename to packages/testbed2d/public/.htaccess
diff --git a/testbed2d/publish.sh b/packages/testbed2d/publish.sh
similarity index 100%
rename from testbed2d/publish.sh
rename to packages/testbed2d/publish.sh
diff --git a/testbed2d/src/Graphics.ts b/packages/testbed2d/src/Graphics.ts
similarity index 60%
rename from testbed2d/src/Graphics.ts
rename to packages/testbed2d/src/Graphics.ts
index 4f9448f8..c77a503f 100644
--- a/testbed2d/src/Graphics.ts
+++ b/packages/testbed2d/src/Graphics.ts
@@ -1,32 +1,46 @@
-import * as PIXI from "pixi.js";
+import type * as RAPIER from "@alexandernanberg/rapier-2d";
import {Viewport} from "pixi-viewport";
-import type * as RAPIER from "@dimforge/rapier2d";
+import * as PIXI from "pixi.js";
+import {Color} from "pixi.js";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
const BOX_INSTANCE_INDEX = 0;
const BALL_INSTANCE_INDEX = 1;
var kk = 0;
+// Scratch object for zero-allocation getters
+const _translation = {x: 0, y: 0};
+
export class Graphics {
coll2gfx: Map;
colorIndex: number;
colorPalette: Array;
- renderer: PIXI.Renderer;
+ renderer: PIXI.WebGLRenderer;
scene: PIXI.Container;
viewport: Viewport;
instanceGroups: Array>;
lines: PIXI.Graphics;
- constructor() {
- // High pixel Ratio make the rendering extremely slow, so we cap it.
- // const pixelRatio = window.devicePixelRatio ? Math.min(window.devicePixelRatio, 1.5) : 1;
-
+ private constructor() {
this.coll2gfx = new Map();
this.colorIndex = 0;
this.colorPalette = [0xf3d9b1, 0x98c1d9, 0x053c5e, 0x1f7a8c];
- this.renderer = new PIXI.Renderer({
+ }
+
+ static async create(): Promise {
+ const graphics = new Graphics();
+ await graphics.init();
+ return graphics;
+ }
+
+ private async init() {
+ // High pixel Ratio make the rendering extremely slow, so we cap it.
+ // const pixelRatio = window.devicePixelRatio ? Math.min(window.devicePixelRatio, 1.5) : 1;
+
+ this.renderer = new PIXI.WebGLRenderer();
+ await this.renderer.init({
backgroundColor: 0x292929,
antialias: true,
// resolution: pixelRatio,
@@ -35,14 +49,14 @@ export class Graphics {
});
this.scene = new PIXI.Container();
- document.body.appendChild(this.renderer.view);
+ document.body.appendChild(this.renderer.canvas);
this.viewport = new Viewport({
screenWidth: window.innerWidth,
screenHeight: window.innerHeight,
worldWidth: 1000,
worldHeight: 1000,
- interaction: this.renderer.plugins.interaction,
+ events: this.renderer.events,
});
this.scene.addChild(this.viewport);
@@ -71,9 +85,8 @@ export class Graphics {
this.instanceGroups.push(
this.colorPalette.map((color) => {
let graphics = new PIXI.Graphics();
- graphics.beginFill(color);
- graphics.drawRect(-1.0, 1.0, 2.0, -2.0);
- graphics.endFill();
+ graphics.rect(-1.0, -1.0, 2.0, 2.0);
+ graphics.fill(color);
return graphics;
}),
);
@@ -81,20 +94,21 @@ export class Graphics {
this.instanceGroups.push(
this.colorPalette.map((color) => {
let graphics = new PIXI.Graphics();
- graphics.beginFill(color);
- graphics.drawCircle(0.0, 0.0, 1.0);
- graphics.endFill();
+ graphics.circle(0.0, 0.0, 1.0);
+ graphics.fill(color);
return graphics;
}),
);
}
- render(world: RAPIER.World, debugRender: Boolean) {
+ render(world: RAPIER.World, debugRender: boolean) {
kk += 1;
- if (!this.lines) {
- this.lines = new PIXI.Graphics();
- this.viewport.addChild(this.lines);
+ // Clean up previous debug lines
+ if (this.lines) {
+ this.viewport.removeChild(this.lines);
+ this.lines.destroy();
+ this.lines = null;
}
if (debugRender) {
@@ -102,20 +116,39 @@ export class Graphics {
let vtx = buffers.vertices;
let cls = buffers.colors;
- this.lines.clear();
+ // Group lines by color for efficient batching in pixi.js 8
+ // (stroke() re-strokes all accumulated paths, so we batch by color)
+ const linesByColor = new Map();
for (let i = 0; i < vtx.length / 4; i += 1) {
- let color = PIXI.utils.rgb2hex([
- cls[i * 8],
- cls[i * 8 + 1],
- cls[i * 8 + 2],
- ]);
- this.lines.lineStyle(1.0, color, cls[i * 8 + 3], 0.5, true);
- this.lines.moveTo(vtx[i * 4], -vtx[i * 4 + 1]);
- this.lines.lineTo(vtx[i * 4 + 2], -vtx[i * 4 + 3]);
+ const color = new Color([cls[i * 8], cls[i * 8 + 1], cls[i * 8 + 2]]).toNumber();
+ const alpha = cls[i * 8 + 3];
+ const key = color * 1000 + Math.round(alpha * 100); // Combine color and alpha as key
+
+ if (!linesByColor.has(key)) {
+ linesByColor.set(key, {vtx: [], alpha});
+ }
+ const group = linesByColor.get(key)!;
+ group.vtx.push(vtx[i * 4], -vtx[i * 4 + 1], vtx[i * 4 + 2], -vtx[i * 4 + 3]);
+ }
+
+ // Create container for all line groups
+ this.lines = new PIXI.Container() as any;
+ this.viewport.addChild(this.lines);
+
+ // Draw each color group as a single Graphics with one stroke call
+ for (const [key, group] of linesByColor) {
+ const color = Math.floor(key / 1000);
+ const gfx = new PIXI.Graphics();
+
+ for (let i = 0; i < group.vtx.length; i += 4) {
+ gfx.moveTo(group.vtx[i], group.vtx[i + 1]);
+ gfx.lineTo(group.vtx[i + 2], group.vtx[i + 3]);
+ }
+ gfx.stroke({width: 0.02, color, alpha: group.alpha});
+
+ this.lines.addChild(gfx);
}
- } else {
- this.lines.clear();
}
this.updatePositions(world);
@@ -130,12 +163,12 @@ export class Graphics {
updatePositions(world: RAPIER.World) {
world.forEachCollider((elt) => {
let gfx = this.coll2gfx.get(elt.handle);
- let translation = elt.translation();
- let rotation = elt.rotation();
+ elt.translation(_translation);
+ let rotation = elt.rotation(); // returns number, no allocation
if (!!gfx) {
- gfx.position.x = translation.x;
- gfx.position.y = -translation.y;
+ gfx.position.x = _translation.x;
+ gfx.position.y = -_translation.y;
gfx.rotation = -rotation;
}
});
@@ -150,15 +183,11 @@ export class Graphics {
this.colorIndex = 0;
}
- addCollider(
- RAPIER: RAPIER_API,
- world: RAPIER.World,
- collider: RAPIER.Collider,
- ) {
+ addCollider(RAPIER: RAPIER_API, world: RAPIER.World, collider: RAPIER.Collider) {
let i;
let parent = collider.parent();
let instance;
- let graphics;
+ let graphics: PIXI.Graphics;
let vertices;
let instanceId = parent.isFixed() ? 0 : this.colorIndex + 1;
@@ -166,30 +195,30 @@ export class Graphics {
case RAPIER.ShapeType.Cuboid:
let hext = collider.halfExtents();
instance = this.instanceGroups[BOX_INSTANCE_INDEX][instanceId];
- graphics = instance.clone();
- graphics.scale.x = hext.x;
- graphics.scale.y = hext.y;
+ graphics = instance.clone(true);
+ graphics.scale.set(hext.x, hext.y);
this.viewport.addChild(graphics);
break;
case RAPIER.ShapeType.Ball:
let rad = collider.radius();
instance = this.instanceGroups[BALL_INSTANCE_INDEX][instanceId];
- graphics = instance.clone();
- graphics.scale.x = rad;
- graphics.scale.y = rad;
+ graphics = instance.clone(true);
+ graphics.scale.set(rad, rad);
this.viewport.addChild(graphics);
break;
case RAPIER.ShapeType.Polyline:
vertices = Array.from(collider.vertices());
graphics = new PIXI.Graphics();
- graphics
- .lineStyle(0.2, this.colorPalette[instanceId])
- .moveTo(vertices[0], -vertices[1]);
+ graphics.moveTo(vertices[0], -vertices[1]);
for (i = 2; i < vertices.length; i += 2) {
graphics.lineTo(vertices[i], -vertices[i + 1]);
}
+ graphics.stroke({
+ width: 0.2,
+ color: this.colorPalette[instanceId],
+ });
this.viewport.addChild(graphics);
break;
case RAPIER.ShapeType.HeightField:
@@ -198,34 +227,35 @@ export class Graphics {
let step = scale.x / (heights.length - 1);
graphics = new PIXI.Graphics();
- graphics
- .lineStyle(0.2, this.colorPalette[instanceId])
- .moveTo(-scale.x / 2.0, -heights[0] * scale.y);
+ graphics.moveTo(-scale.x / 2.0, -heights[0] * scale.y);
for (i = 1; i < heights.length; i += 1) {
- graphics.lineTo(
- -scale.x / 2.0 + i * step,
- -heights[i] * scale.y,
- );
+ graphics.lineTo(-scale.x / 2.0 + i * step, -heights[i] * scale.y);
}
+ graphics.stroke({
+ width: 0.2,
+ color: this.colorPalette[instanceId],
+ });
this.viewport.addChild(graphics);
break;
case RAPIER.ShapeType.ConvexPolygon:
vertices = Array.from(collider.vertices());
graphics = new PIXI.Graphics();
- graphics.beginFill(this.colorPalette[instanceId], 1.0);
graphics.moveTo(vertices[0], -vertices[1]);
for (i = 2; i < vertices.length; i += 2) {
graphics.lineTo(vertices[i], -vertices[i + 1]);
}
+ graphics.fill({
+ color: this.colorPalette[instanceId],
+ alpha: 1.0,
+ });
this.viewport.addChild(graphics);
break;
case RAPIER.ShapeType.Voxels:
graphics = new PIXI.Graphics();
- graphics.beginFill(this.colorPalette[instanceId], 1.0);
collider.clearShapeCache();
let shape = collider.shape as RAPIER.Voxels;
let gridCoords = shape.data;
@@ -241,8 +271,13 @@ export class Graphics {
graphics.lineTo(maxx, -miny);
graphics.lineTo(maxx, -maxy);
graphics.lineTo(minx, -maxy);
+ graphics.closePath();
}
+ graphics.fill({
+ color: this.colorPalette[instanceId],
+ alpha: 1.0,
+ });
this.viewport.addChild(graphics);
break;
default:
@@ -250,20 +285,13 @@ export class Graphics {
return;
}
- let t = collider.translation();
+ collider.translation(_translation);
let r = collider.rotation();
- // dummy.position.set(t.x, t.y, t.z);
- // dummy.quaternion.set(r.x, r.y, r.z, r.w);
- // dummy.scale.set(instanceDesc.scale.x, instanceDesc.scale.y, instanceDesc.scale.z);
- // dummy.updateMatrix();
- // instance.setMatrixAt(instanceDesc.elementId, dummy.matrix);
- // instance.instanceMatrix.needsUpdate = true;
- graphics.position.x = t.x;
- graphics.position.y = -t.y;
+ graphics.position.x = _translation.x;
+ graphics.position.y = -_translation.y;
graphics.rotation = r;
this.coll2gfx.set(collider.handle, graphics);
- this.colorIndex =
- (this.colorIndex + 1) % (this.colorPalette.length - 1);
+ this.colorIndex = (this.colorIndex + 1) % (this.colorPalette.length - 1);
}
}
diff --git a/testbed2d/src/Gui.ts b/packages/testbed2d/src/Gui.ts
similarity index 85%
rename from testbed2d/src/Gui.ts
rename to packages/testbed2d/src/Gui.ts
index a410607e..af97eb5d 100644
--- a/testbed2d/src/Gui.ts
+++ b/packages/testbed2d/src/Gui.ts
@@ -1,5 +1,5 @@
import GUI from "lil-gui";
-import * as Stats from "stats.js";
+import Stats from "stats.js";
import type {Testbed} from "./Testbed";
export interface DebugInfos {
@@ -23,13 +23,11 @@ export class Gui {
this.stats = new Stats();
this.rapierVersion = testbed.RAPIER.version();
this.maxTimePanelValue = 16.0;
- this.stepTimePanel = this.stats.addPanel(
- new Stats.Panel("ms (step)", "#ff8", "#221"),
- );
+ this.stepTimePanel = this.stats.addPanel(new Stats.Panel("ms (step)", "#ff8", "#221"));
this.stats.showPanel(this.stats.dom.children.length - 1);
document.body.appendChild(this.stats.dom);
- var backends = simulationParameters.backends;
+ var _backends = simulationParameters.backends;
var demos = Array.from(simulationParameters.builders.keys());
var me = this;
@@ -42,10 +40,7 @@ export class Gui {
.onChange((demo: string) => {
testbed.switchToDemo(demo);
});
- this.gui
- .add(simulationParameters, "numSolverIters", 0, 20)
- .step(1)
- .listen();
+ this.gui.add(simulationParameters, "numSolverIters", 0, 20).step(1).listen();
this.gui
.add(simulationParameters, "debugInfos")
.listen()
@@ -88,12 +83,8 @@ export class Gui {
text += "
[Step " + infos.stepId + "]";
if (infos.worldHash) {
- text +=
- "
World hash (xxHash128): " + infos.worldHash.toString();
- text +=
- "
World hash time (xxHash128): " +
- infos.worldHashTime +
- "ms";
+ text += "
World hash (xxHash128): " + infos.worldHash.toString();
+ text += "
World hash time (xxHash128): " + infos.worldHashTime + "ms";
text += "
Snapshot time: " + infos.snapshotTime + "ms";
}
this.debugText.innerHTML = text;
diff --git a/testbed2d/src/Testbed.ts b/packages/testbed2d/src/Testbed.ts
similarity index 90%
rename from testbed2d/src/Testbed.ts
rename to packages/testbed2d/src/Testbed.ts
index 61279ab2..07261b19 100644
--- a/testbed2d/src/Testbed.ts
+++ b/packages/testbed2d/src/Testbed.ts
@@ -1,10 +1,10 @@
+import type * as RAPIER from "@alexandernanberg/rapier-2d";
+import {xxhash128} from "hash-wasm";
+import type {DebugInfos} from "./Gui";
import {Graphics} from "./Graphics";
import {Gui} from "./Gui";
-import type {DebugInfos} from "./Gui";
-import {xxhash128} from "hash-wasm";
-import type * as RAPIER from "@dimforge/rapier2d";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
type Builders = Map void>;
@@ -59,18 +59,27 @@ export class Testbed {
snap: Uint8Array;
snapStepId: number;
- constructor(RAPIER: RAPIER_API, builders: Builders) {
+ static async create(RAPIER: RAPIER_API, builders: Builders): Promise {
+ const testbed = new Testbed(RAPIER, builders);
+ await testbed.initGraphics();
+ testbed.switchToDemo(builders.keys().next().value);
+ return testbed;
+ }
+
+ private async initGraphics() {
+ this.graphics = await Graphics.create();
+ }
+
+ private constructor(RAPIER: RAPIER_API, builders: Builders) {
let backends = ["rapier"];
this.RAPIER = RAPIER;
let parameters = new SimulationParameters(backends, builders);
this.gui = new Gui(this, parameters);
- this.graphics = new Graphics();
this.inhibitLookAt = false;
this.parameters = parameters;
this.demoToken = 0;
this.mouse = {x: 0, y: 0};
this.events = new RAPIER.EventQueue(true);
- this.switchToDemo(builders.keys().next().value);
window.addEventListener("mousemove", (event) => {
this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
@@ -120,7 +129,7 @@ export class Testbed {
this.parameters.builders.get(demo)(this.RAPIER, this);
}
- switchToBackend(backend: string) {
+ switchToBackend(_backend: string) {
this.switchToDemo(this.parameters.demo);
}
diff --git a/testbed2d/src/demos/characterController.ts b/packages/testbed2d/src/demos/characterController.ts
similarity index 84%
rename from testbed2d/src/demos/characterController.ts
rename to packages/testbed2d/src/demos/characterController.ts
index 7877db12..37ff486f 100644
--- a/testbed2d/src/demos/characterController.ts
+++ b/packages/testbed2d/src/demos/characterController.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -15,7 +15,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// Dynamic cubes.
let rad = 0.5;
let num = 5;
- let i, j, k;
+ let i, _j, k;
let shift = rad * 2.5;
let center = num * rad;
let height = 5.0;
@@ -34,17 +34,10 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
}
// Character.
- let characterDesc =
- RAPIER.RigidBodyDesc.kinematicPositionBased().setTranslation(
- -10.0,
- 4.0,
- );
+ let characterDesc = RAPIER.RigidBodyDesc.kinematicPositionBased().setTranslation(-10.0, 4.0);
let character = world.createRigidBody(characterDesc);
let characterColliderDesc = RAPIER.ColliderDesc.cuboid(0.6, 1.2);
- let characterCollider = world.createCollider(
- characterColliderDesc,
- character,
- );
+ let characterCollider = world.createCollider(characterColliderDesc, character);
let characterController = world.createCharacterController(0.1);
characterController.enableAutostep(0.7, 0.3, true);
@@ -54,10 +47,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let movementDirection = {x: 0.0, y: -speed};
let updateCharacter = () => {
- characterController.computeColliderMovement(
- characterCollider,
- movementDirection,
- );
+ characterController.computeColliderMovement(characterCollider, movementDirection);
let movement = characterController.computedMovement();
let newPos = character.translation();
diff --git a/testbed2d/src/demos/collisionGroups.ts b/packages/testbed2d/src/demos/collisionGroups.ts
similarity index 88%
rename from testbed2d/src/demos/collisionGroups.ts
rename to packages/testbed2d/src/demos/collisionGroups.ts
index 51163618..390a52f6 100644
--- a/testbed2d/src/demos/collisionGroups.ts
+++ b/packages/testbed2d/src/demos/collisionGroups.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -12,10 +12,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let ground_size = 5.0;
let ground_height = 0.1;
- let groundBodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- 0.0,
- -ground_height,
- );
+ let groundBodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(0.0, -ground_height);
let groundBody = world.createRigidBody(groundBodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(ground_size, ground_height);
world.createCollider(colliderDesc, groundBody);
@@ -63,10 +60,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- ).setCollisionGroups(group);
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad).setCollisionGroups(group);
world.createCollider(colliderDesc, body);
}
}
diff --git a/testbed2d/src/demos/convexPolygons.ts b/packages/testbed2d/src/demos/convexPolygons.ts
similarity index 87%
rename from testbed2d/src/demos/convexPolygons.ts
rename to packages/testbed2d/src/demos/convexPolygons.ts
index 6edad202..f3b50178 100644
--- a/testbed2d/src/demos/convexPolygons.ts
+++ b/packages/testbed2d/src/demos/convexPolygons.ts
@@ -1,7 +1,7 @@
import seedrandom from "seedrandom";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -19,10 +19,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
];
grounds.forEach((ground) => {
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- ground.x,
- ground.y,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(ground.x, ground.y);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(ground.hx, ground.hy);
world.createCollider(colliderDesc, body);
@@ -53,9 +50,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
for (k = 0; k < 10; ++k) {
points.push(rng() * scale, rng() * scale);
}
- let colliderDesc = RAPIER.ColliderDesc.convexHull(
- new Float32Array(points),
- );
+ let colliderDesc = RAPIER.ColliderDesc.convexHull(new Float32Array(points));
world.createCollider(colliderDesc, body);
}
}
diff --git a/testbed2d/src/demos/cubes.ts b/packages/testbed2d/src/demos/cubes.ts
similarity index 93%
rename from testbed2d/src/demos/cubes.ts
rename to packages/testbed2d/src/demos/cubes.ts
index 5214b485..d609e6cf 100644
--- a/testbed2d/src/demos/cubes.ts
+++ b/packages/testbed2d/src/demos/cubes.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -15,10 +15,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
];
grounds.forEach((ground) => {
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- ground.x,
- ground.y,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(ground.x, ground.y);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(ground.hx, ground.hy);
world.createCollider(colliderDesc, body);
diff --git a/testbed2d/src/demos/heightfield.ts b/packages/testbed2d/src/demos/heightfield.ts
similarity index 90%
rename from testbed2d/src/demos/heightfield.ts
rename to packages/testbed2d/src/demos/heightfield.ts
index d055499b..91ba7a8e 100644
--- a/testbed2d/src/demos/heightfield.ts
+++ b/packages/testbed2d/src/demos/heightfield.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -22,10 +22,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.heightfield(
- new Float32Array(heights),
- ground_size,
- );
+ let colliderDesc = RAPIER.ColliderDesc.heightfield(new Float32Array(heights), ground_size);
world.createCollider(colliderDesc, body);
/*
diff --git a/testbed2d/src/demos/keva.ts b/packages/testbed2d/src/demos/keva.ts
similarity index 89%
rename from testbed2d/src/demos/keva.ts
rename to packages/testbed2d/src/demos/keva.ts
index 6ca57c0c..479f12a7 100644
--- a/testbed2d/src/demos/keva.ts
+++ b/packages/testbed2d/src/demos/keva.ts
@@ -1,7 +1,7 @@
-import type * as RAPIER from "@dimforge/rapier2d";
+import type * as RAPIER from "@alexandernanberg/rapier-2d";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
function buildBlock(
RAPIER: RAPIER_API,
@@ -48,10 +48,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// Create Ground.
let groundSize = 150.0;
let groundHeight = 0.1;
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- 0.0,
- -groundHeight,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(0.0, -groundHeight);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(groundSize, groundHeight);
world.createCollider(colliderDesc, body);
@@ -62,7 +59,6 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// These should only be set to odd values otherwise
// the blocks won't align in the nicest way.
let numyArr = [0, 3, 5, 5, 7, 9];
- let numBlocksBuilt = 0;
let i;
for (i = 5; i >= 1; --i) {
@@ -80,7 +76,6 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
numz,
);
blockHeight += (numy + 1) * (halfExtents.x + halfExtents.y);
- numBlocksBuilt += numx * numy;
}
testbed.setWorld(world);
diff --git a/testbed2d/src/demos/lockedRotations.ts b/packages/testbed2d/src/demos/lockedRotations.ts
similarity index 73%
rename from testbed2d/src/demos/lockedRotations.ts
rename to packages/testbed2d/src/demos/lockedRotations.ts
index 8600f95f..fdfa5737 100644
--- a/testbed2d/src/demos/lockedRotations.ts
+++ b/packages/testbed2d/src/demos/lockedRotations.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -12,10 +12,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let ground_size = 1.8;
let ground_height = 1.0;
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- 0.0,
- -ground_height,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(0.0, -ground_height);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(ground_size, ground_height);
world.createCollider(colliderDesc, body);
@@ -23,9 +20,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
/*
* A rectangle that only rotates along the `x` axis.
*/
- bodyDesc = RAPIER.RigidBodyDesc.dynamic()
- .setTranslation(0.0, 3.0)
- .lockTranslations();
+ bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0.0, 3.0).lockTranslations();
body = world.createRigidBody(bodyDesc);
colliderDesc = RAPIER.ColliderDesc.cuboid(2.0, 0.6);
world.createCollider(colliderDesc, body);
@@ -33,9 +28,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
/*
* A cuboid that cannot rotate.
*/
- bodyDesc = RAPIER.RigidBodyDesc.dynamic()
- .setTranslation(0.4, 5.0)
- .lockRotations();
+ bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0.4, 5.0).lockRotations();
body = world.createRigidBody(bodyDesc);
colliderDesc = RAPIER.ColliderDesc.cuboid(0.4, 0.6);
world.createCollider(colliderDesc, body);
diff --git a/testbed2d/src/demos/pidController.ts b/packages/testbed2d/src/demos/pidController.ts
similarity index 85%
rename from testbed2d/src/demos/pidController.ts
rename to packages/testbed2d/src/demos/pidController.ts
index fac2a7c4..13f520c1 100644
--- a/testbed2d/src/demos/pidController.ts
+++ b/packages/testbed2d/src/demos/pidController.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -15,7 +15,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// Dynamic cubes.
let rad = 0.5;
let num = 5;
- let i, j, k;
+ let i, _j, k;
let shift = rad * 2.5;
let center = num * rad;
let height = 5.0;
@@ -42,16 +42,11 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let characterColliderDesc = RAPIER.ColliderDesc.cuboid(0.6, 1.2);
world.createCollider(characterColliderDesc, character);
- let pidController = world.createPidController(
- 60.0,
- 0.0,
- 1.0,
- RAPIER.PidAxesMask.AllAng,
- );
+ let pidController = world.createPidController(60.0, 0.0, 1.0, RAPIER.PidAxesMask.AllAng);
let speed = 0.2;
let movementDirection = {x: 0.0, y: 0.0};
let targetVelocity = {x: 0.0, y: 0.0};
- let targetRotation = 0.0;
+ let _targetRotation = 0.0;
let updateCharacter = () => {
if (movementDirection.x == 0.0 && movementDirection.y == 0.0) {
@@ -59,9 +54,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
pidController.setAxes(RAPIER.PidAxesMask.AllAng);
} else if (movementDirection.y == 0.0) {
// Don’t control the linear Y axis so the player can fall down due to gravity.
- pidController.setAxes(
- RAPIER.PidAxesMask.AllAng | RAPIER.PidAxesMask.LinX,
- );
+ pidController.setAxes(RAPIER.PidAxesMask.AllAng | RAPIER.PidAxesMask.LinX);
} else {
pidController.setAxes(RAPIER.PidAxesMask.All);
}
@@ -70,11 +63,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
targetPoint.x += movementDirection.x;
targetPoint.y += movementDirection.y;
- pidController.applyLinearCorrection(
- character,
- targetPoint,
- targetVelocity,
- );
+ pidController.applyLinearCorrection(character, targetPoint, targetVelocity);
pidController.applyAngularCorrection(character, 0.0, 0.0);
};
diff --git a/testbed2d/src/demos/polyline.ts b/packages/testbed2d/src/demos/polyline.ts
similarity index 96%
rename from testbed2d/src/demos/polyline.ts
rename to packages/testbed2d/src/demos/polyline.ts
index 47d82540..556776cd 100644
--- a/testbed2d/src/demos/polyline.ts
+++ b/packages/testbed2d/src/demos/polyline.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
diff --git a/testbed2d/src/demos/revoluteJoints.ts b/packages/testbed2d/src/demos/revoluteJoints.ts
similarity index 93%
rename from testbed2d/src/demos/revoluteJoints.ts
rename to packages/testbed2d/src/demos/revoluteJoints.ts
index 2d7923fd..801d361c 100644
--- a/testbed2d/src/demos/revoluteJoints.ts
+++ b/packages/testbed2d/src/demos/revoluteJoints.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector2(0.0, -9.81);
@@ -20,10 +20,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
? RAPIER.RigidBodyType.Fixed
: RAPIER.RigidBodyType.Dynamic;
- let bodyDesc = new RAPIER.RigidBodyDesc(status).setTranslation(
- k * shift,
- -i * shift,
- );
+ let bodyDesc = new RAPIER.RigidBodyDesc(status).setTranslation(k * shift, -i * shift);
let child = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.ball(rad);
world.createCollider(colliderDesc, child);
diff --git a/testbed2d/src/demos/voxels.ts b/packages/testbed2d/src/demos/voxels.ts
similarity index 76%
rename from testbed2d/src/demos/voxels.ts
rename to packages/testbed2d/src/demos/voxels.ts
index 6a6fc366..b2ad4d67 100644
--- a/testbed2d/src/demos/voxels.ts
+++ b/packages/testbed2d/src/demos/voxels.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier2d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-2d");
function generateVoxels(n: number) {
let points = [];
@@ -24,10 +24,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let voxels = generateVoxels(100);
- let colliderDesc = RAPIER.ColliderDesc.voxels(
- voxels.points,
- voxels.voxelSize,
- );
+ let colliderDesc = RAPIER.ColliderDesc.voxels(voxels.points, voxels.voxelSize);
world.createCollider(colliderDesc, body);
// Dynamic cubes.
@@ -59,20 +56,17 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad / 2.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad / 2.0);
world.createCollider(colliderDesc, body);
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad).setTranslation(
rad,
- ).setTranslation(rad, 0.0);
+ 0.0,
+ );
world.createCollider(colliderDesc, body);
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad,
- ).setTranslation(-rad, 0.0);
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad).setTranslation(
+ -rad,
+ 0.0,
+ );
break;
}
diff --git a/testbed2d/src/index.ts b/packages/testbed2d/src/index.ts
similarity index 88%
rename from testbed2d/src/index.ts
rename to packages/testbed2d/src/index.ts
index 24bd18f4..d543e058 100644
--- a/testbed2d/src/index.ts
+++ b/packages/testbed2d/src/index.ts
@@ -1,17 +1,18 @@
-import {Testbed} from "./Testbed";
+import * as CharacterController from "./demos/characterController";
import * as CollisionGroups from "./demos/collisionGroups";
+import * as ConvexPolygons from "./demos/convexPolygons";
import * as Cubes from "./demos/cubes";
-import * as Keva from "./demos/keva";
import * as Heightfield from "./demos/heightfield";
-import * as Polyline from "./demos/polyline";
-import * as RevoluteJoints from "./demos/revoluteJoints";
+import * as Keva from "./demos/keva";
import * as LockedRotations from "./demos/lockedRotations";
-import * as ConvexPolygons from "./demos/convexPolygons";
-import * as CharacterController from "./demos/characterController";
import * as PidController from "./demos/pidController";
+import * as Polyline from "./demos/polyline";
+import * as RevoluteJoints from "./demos/revoluteJoints";
import * as Voxels from "./demos/voxels";
+import {Testbed} from "./Testbed";
-import("@dimforge/rapier2d").then((RAPIER) => {
+import("@alexandernanberg/rapier-2d/compat").then(async (RAPIER) => {
+ await RAPIER.init();
let builders = new Map([
["collision groups", CollisionGroups.initWorld],
["character controller", CharacterController.initWorld],
@@ -25,6 +26,6 @@ import("@dimforge/rapier2d").then((RAPIER) => {
["polyline", Polyline.initWorld],
["voxels", Voxels.initWorld],
]);
- let testbed = new Testbed(RAPIER, builders);
+ let testbed = await Testbed.create(RAPIER, builders);
testbed.run();
});
diff --git a/testbed2d/tsconfig.json b/packages/testbed2d/tsconfig.json
similarity index 60%
rename from testbed2d/tsconfig.json
rename to packages/testbed2d/tsconfig.json
index 5d07ecd8..af046b8c 100644
--- a/testbed2d/tsconfig.json
+++ b/packages/testbed2d/tsconfig.json
@@ -5,7 +5,8 @@
"module": "es2022",
"target": "es2022",
"allowJs": true,
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "skipLibCheck": true
}
}
diff --git a/packages/testbed2d/vite.config.ts b/packages/testbed2d/vite.config.ts
new file mode 100644
index 00000000..8efe6d74
--- /dev/null
+++ b/packages/testbed2d/vite.config.ts
@@ -0,0 +1,9 @@
+import {defineConfig} from "vite";
+import wasm from "vite-plugin-wasm";
+
+export default defineConfig({
+ plugins: [wasm()],
+ build: {
+ target: "esnext",
+ },
+});
diff --git a/testbed3d/.npmignore b/packages/testbed3d/.npmignore
similarity index 100%
rename from testbed3d/.npmignore
rename to packages/testbed3d/.npmignore
diff --git a/testbed3d/static/index.html b/packages/testbed3d/index.html
similarity index 79%
rename from testbed3d/static/index.html
rename to packages/testbed3d/index.html
index d2a61221..09e368ef 100644
--- a/testbed3d/static/index.html
+++ b/packages/testbed3d/index.html
@@ -1,4 +1,4 @@
-
+
@@ -13,6 +13,6 @@
-
+
diff --git a/packages/testbed3d/package.json b/packages/testbed3d/package.json
new file mode 100644
index 00000000..623fa95b
--- /dev/null
+++ b/packages/testbed3d/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "rapier-testbed3d",
+ "version": "0.1.0",
+ "private": true,
+ "description": "JavaScript testbed for rapier.",
+ "license": "Apache-2.0",
+ "author": "sebcrozet ",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@alexandernanberg/rapier-3d": "workspace:*",
+ "hash-wasm": "^4.12.0",
+ "lil-gui": "^0.21.0",
+ "seedrandom": "^3.0.5",
+ "stats.js": "^0.17.0",
+ "three": "^0.182.0"
+ },
+ "devDependencies": {
+ "@types/seedrandom": "^3.0.8",
+ "@types/stats.js": "^0.17.4",
+ "@types/three": "^0.182.0",
+ "typescript": "^5.9.3",
+ "vite": "^7.3.1",
+ "vite-plugin-wasm": "^3.5.0"
+ }
+}
diff --git a/testbed3d/static/.htaccess b/packages/testbed3d/public/.htaccess
similarity index 100%
rename from testbed3d/static/.htaccess
rename to packages/testbed3d/public/.htaccess
diff --git a/testbed3d/static/suzanne_blender_monkey.glb b/packages/testbed3d/public/suzanne_blender_monkey.glb
similarity index 100%
rename from testbed3d/static/suzanne_blender_monkey.glb
rename to packages/testbed3d/public/suzanne_blender_monkey.glb
diff --git a/testbed3d/publish.sh b/packages/testbed3d/publish.sh
similarity index 100%
rename from testbed3d/publish.sh
rename to packages/testbed3d/publish.sh
diff --git a/testbed3d/src/Graphics.ts b/packages/testbed3d/src/Graphics.ts
similarity index 82%
rename from testbed3d/src/Graphics.ts
rename to packages/testbed3d/src/Graphics.ts
index f52d6c96..7983c611 100644
--- a/testbed3d/src/Graphics.ts
+++ b/packages/testbed3d/src/Graphics.ts
@@ -1,6 +1,6 @@
+import RAPIER from "@alexandernanberg/rapier-3d";
import * as THREE from "three";
-import {OrbitControls} from "three/examples/jsm/controls/OrbitControls";
-import RAPIER from "@dimforge/rapier3d";
+import {OrbitControls} from "three/addons/controls/OrbitControls.js";
const BOX_INSTANCE_INDEX = 0;
const BALL_INSTANCE_INDEX = 1;
@@ -10,6 +10,10 @@ const CONE_INSTANCE_INDEX = 3;
var dummy = new THREE.Object3D();
var kk = 0;
+// Scratch objects for zero-allocation getters
+const _translation = {x: 0, y: 0, z: 0};
+const _rotation = {x: 0, y: 0, z: 0, w: 1};
+
interface InstanceDesc {
groupId: number;
instanceId: number;
@@ -18,7 +22,7 @@ interface InstanceDesc {
scale?: THREE.Vector3;
}
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
// NOTE: this is a very naive voxels -> mesh conversion. Proper
// conversions should use something like greedy meshing instead.
@@ -148,15 +152,15 @@ export class Graphics {
this.renderer.setSize(window.innerWidth, window.innerHeight);
this.renderer.setClearColor(0x292929, 1);
// High pixel Ratio make the rendering extremely slow, so we cap it.
- const pixelRatio = window.devicePixelRatio
- ? Math.min(window.devicePixelRatio, 1.5)
- : 1;
+ const pixelRatio = window.devicePixelRatio ? Math.min(window.devicePixelRatio, 1.5) : 1;
this.renderer.setPixelRatio(pixelRatio);
document.body.appendChild(this.renderer.domElement);
let ambientLight = new THREE.AmbientLight(0x606060);
this.scene.add(ambientLight);
- this.light = new THREE.PointLight(0xffffff, 1, 1000);
+ // In Three.js r155+, decay defaults to 2 for physically correct lighting.
+ // Set decay to 0 to restore the old non-physically-correct behavior.
+ this.light = new THREE.PointLight(0xffffff, 1, 0, 0);
this.scene.add(this.light);
// For the debug-renderer.
@@ -181,10 +185,7 @@ export class Graphics {
window.addEventListener("resize", onWindowResize, false);
- this.controls = new OrbitControls(
- this.camera,
- this.renderer.domElement,
- );
+ this.controls = new OrbitControls(this.camera, this.renderer.domElement);
this.controls.enableDamping = true;
this.controls.dampingFactor = 0.2;
this.controls.maxPolarAngle = Math.PI / 2;
@@ -268,10 +269,7 @@ export class Graphics {
"position",
new THREE.BufferAttribute(buffers.vertices, 3),
);
- this.lines.geometry.setAttribute(
- "color",
- new THREE.BufferAttribute(buffers.colors, 4),
- );
+ this.lines.geometry.setAttribute("color", new THREE.BufferAttribute(buffers.colors, 4));
} else {
this.lines.visible = false;
}
@@ -281,7 +279,7 @@ export class Graphics {
}
rayAtMousePosition(pos: {x: number; y: number}) {
- this.raycaster.setFromCamera(pos, this.camera);
+ this.raycaster.setFromCamera(new THREE.Vector2(pos.x, pos.y), this.camera);
return this.raycaster.ray;
}
@@ -308,9 +306,7 @@ export class Graphics {
if (!!desc) {
desc.highlighted = false;
- this.instanceGroups[desc.groupId][
- this.highlightInstanceId()
- ].count = 0;
+ this.instanceGroups[desc.groupId][this.highlightInstanceId()].count = 0;
}
}
if (handle != null) {
@@ -328,26 +324,19 @@ export class Graphics {
updatePositions(world: RAPIER.World) {
world.forEachCollider((elt) => {
let gfx = this.coll2instance.get(elt.handle);
- let translation = elt.translation();
- let rotation = elt.rotation();
+ elt.translation(_translation);
+ elt.rotation(_rotation);
if (!!gfx) {
let instance = this.instanceGroups[gfx.groupId][gfx.instanceId];
dummy.scale.set(gfx.scale.x, gfx.scale.y, gfx.scale.z);
- dummy.position.set(translation.x, translation.y, translation.z);
- dummy.quaternion.set(
- rotation.x,
- rotation.y,
- rotation.z,
- rotation.w,
- );
+ dummy.position.set(_translation.x, _translation.y, _translation.z);
+ dummy.quaternion.set(_rotation.x, _rotation.y, _rotation.z, _rotation.w);
dummy.updateMatrix();
instance.setMatrixAt(gfx.elementId, dummy.matrix);
let highlightInstance =
- this.instanceGroups[gfx.groupId][
- this.highlightInstanceId()
- ];
+ this.instanceGroups[gfx.groupId][this.highlightInstanceId()];
if (gfx.highlighted) {
highlightInstance.count = 1;
highlightInstance.setMatrixAt(0, dummy.matrix);
@@ -360,13 +349,8 @@ export class Graphics {
let mesh = this.coll2mesh.get(elt.handle);
if (!!mesh) {
- mesh.position.set(translation.x, translation.y, translation.z);
- mesh.quaternion.set(
- rotation.x,
- rotation.y,
- rotation.z,
- rotation.w,
- );
+ mesh.position.set(_translation.x, _translation.y, _translation.z);
+ mesh.quaternion.set(_rotation.x, _rotation.y, _rotation.z, _rotation.w);
mesh.updateMatrix();
}
});
@@ -406,9 +390,7 @@ export class Graphics {
removeRigidBody(body: RAPIER.RigidBody) {
if (!!this.rb2colls.get(body.handle)) {
- this.rb2colls
- .get(body.handle)
- .forEach((coll) => this.removeCollider(coll));
+ this.rb2colls.get(body.handle).forEach((coll) => this.removeCollider(coll));
this.rb2colls.delete(body.handle);
}
}
@@ -418,9 +400,7 @@ export class Graphics {
let instance = this.instanceGroups[gfx.groupId][gfx.instanceId];
if (instance.count > 1) {
- let coll2 = instance.userData.elementId2coll.get(
- instance.count - 1,
- );
+ let coll2 = instance.userData.elementId2coll.get(instance.count - 1);
instance.userData.elementId2coll.delete(instance.count - 1);
instance.userData.elementId2coll.set(gfx.elementId, coll2);
@@ -432,13 +412,8 @@ export class Graphics {
this.coll2instance.delete(collider.handle);
}
- addCollider(
- RAPIER: RAPIER_API,
- world: RAPIER.World,
- collider: RAPIER.Collider,
- ) {
- this.colorIndex =
- (this.colorIndex + 1) % (this.colorPalette.length - 2);
+ addCollider(RAPIER: RAPIER_API, world: RAPIER.World, collider: RAPIER.Collider) {
+ this.colorIndex = (this.colorIndex + 1) % (this.colorPalette.length - 2);
let parent = collider.parent();
if (!this.rb2colls.get(parent.handle)) {
this.rb2colls.set(parent.handle, [collider]);
@@ -457,19 +432,13 @@ export class Graphics {
switch (collider.shapeType()) {
case RAPIER.ShapeType.Cuboid:
let hext = collider.halfExtents();
- instance =
- this.instanceGroups[BOX_INSTANCE_INDEX][
- instanceDesc.instanceId
- ];
+ instance = this.instanceGroups[BOX_INSTANCE_INDEX][instanceDesc.instanceId];
instanceDesc.groupId = BOX_INSTANCE_INDEX;
instanceDesc.scale = new THREE.Vector3(hext.x, hext.y, hext.z);
break;
case RAPIER.ShapeType.Ball:
let rad = collider.radius();
- instance =
- this.instanceGroups[BALL_INSTANCE_INDEX][
- instanceDesc.instanceId
- ];
+ instance = this.instanceGroups[BALL_INSTANCE_INDEX][instanceDesc.instanceId];
instanceDesc.groupId = BALL_INSTANCE_INDEX;
instanceDesc.scale = new THREE.Vector3(rad, rad, rad);
break;
@@ -477,30 +446,16 @@ export class Graphics {
case RAPIER.ShapeType.RoundCylinder:
let cyl_rad = collider.radius();
let cyl_height = collider.halfHeight() * 2.0;
- instance =
- this.instanceGroups[CYLINDER_INSTANCE_INDEX][
- instanceDesc.instanceId
- ];
+ instance = this.instanceGroups[CYLINDER_INSTANCE_INDEX][instanceDesc.instanceId];
instanceDesc.groupId = CYLINDER_INSTANCE_INDEX;
- instanceDesc.scale = new THREE.Vector3(
- cyl_rad,
- cyl_height,
- cyl_rad,
- );
+ instanceDesc.scale = new THREE.Vector3(cyl_rad, cyl_height, cyl_rad);
break;
case RAPIER.ShapeType.Cone:
let cone_rad = collider.radius();
let cone_height = collider.halfHeight() * 2.0;
- instance =
- this.instanceGroups[CONE_INSTANCE_INDEX][
- instanceDesc.instanceId
- ];
+ instance = this.instanceGroups[CONE_INSTANCE_INDEX][instanceDesc.instanceId];
instanceDesc.groupId = CONE_INSTANCE_INDEX;
- instanceDesc.scale = new THREE.Vector3(
- cone_rad,
- cone_height,
- cone_rad,
- );
+ instanceDesc.scale = new THREE.Vector3(cone_rad, cone_height, cone_rad);
break;
case RAPIER.ShapeType.TriMesh:
case RAPIER.ShapeType.HeightField:
@@ -525,10 +480,7 @@ export class Graphics {
}
geometry.setIndex(Array.from(indices));
- geometry.setAttribute(
- "position",
- new THREE.BufferAttribute(vertices, 3),
- );
+ geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
let color = parent.isFixed() ? 0 : this.colorIndex + 1;
let material = new THREE.MeshPhongMaterial({
@@ -553,20 +505,14 @@ export class Graphics {
}
let highlightInstance =
- this.instanceGroups[instanceDesc.groupId][
- this.highlightInstanceId()
- ];
+ this.instanceGroups[instanceDesc.groupId][this.highlightInstanceId()];
highlightInstance.count = 0;
- let t = collider.translation();
- let r = collider.rotation();
- dummy.position.set(t.x, t.y, t.z);
- dummy.quaternion.set(r.x, r.y, r.z, r.w);
- dummy.scale.set(
- instanceDesc.scale.x,
- instanceDesc.scale.y,
- instanceDesc.scale.z,
- );
+ collider.translation(_translation);
+ collider.rotation(_rotation);
+ dummy.position.set(_translation.x, _translation.y, _translation.z);
+ dummy.quaternion.set(_rotation.x, _rotation.y, _rotation.z, _rotation.w);
+ dummy.scale.set(instanceDesc.scale.x, instanceDesc.scale.y, instanceDesc.scale.z);
dummy.updateMatrix();
instance.setMatrixAt(instanceDesc.elementId, dummy.matrix);
instance.instanceMatrix.needsUpdate = true;
diff --git a/testbed3d/src/Gui.ts b/packages/testbed3d/src/Gui.ts
similarity index 74%
rename from testbed3d/src/Gui.ts
rename to packages/testbed3d/src/Gui.ts
index e89b2f47..095ae5dd 100644
--- a/testbed3d/src/Gui.ts
+++ b/packages/testbed3d/src/Gui.ts
@@ -1,5 +1,5 @@
import GUI from "lil-gui";
-import * as Stats from "stats.js";
+import Stats from "stats.js";
import type {Testbed} from "./Testbed";
export interface DebugInfos {
@@ -40,13 +40,11 @@ export class Gui {
this.stats = new Stats();
this.rapierVersion = testbed.RAPIER.version();
this.maxTimePanelValue = 16.0;
- this.stepTimePanel = this.stats.addPanel(
- new Stats.Panel("ms (step)", "#ff8", "#221"),
- );
+ this.stepTimePanel = this.stats.addPanel(new Stats.Panel("ms (step)", "#ff8", "#221"));
this.stats.showPanel(this.stats.dom.children.length - 1);
document.body.appendChild(this.stats.dom);
- var backends = simulationParameters.backends;
+ var _backends = simulationParameters.backends;
var demos = Array.from(simulationParameters.builders.keys());
var me = this;
@@ -59,10 +57,7 @@ export class Gui {
.onChange((demo: string) => {
testbed.switchToDemo(demo);
});
- this.gui
- .add(simulationParameters, "numSolverIters", 0, 20)
- .step(1)
- .listen();
+ this.gui.add(simulationParameters, "numSolverIters", 0, 20).step(1).listen();
this.gui
.add(simulationParameters, "debugInfos")
.listen()
@@ -105,50 +100,26 @@ export class Gui {
text += "
[Step " + infos.stepId + "]";
if (infos.worldHash) {
- text +=
- "
World hash (xxHash128): " + infos.worldHash.toString();
- text +=
- "
World hash time (xxHash128): " +
- infos.worldHashTime +
- "ms";
+ text += "
World hash (xxHash128): " + infos.worldHash.toString();
+ text += "
World hash time (xxHash128): " + infos.worldHashTime + "ms";
text += "
Snapshot time: " + infos.snapshotTime + "ms";
}
text += "
timingStep: " + infos.timingStep + "ms";
- text +=
- "
timingCollisionDetection: " +
- infos.timingCollisionDetection +
- "ms";
+ text += "
timingCollisionDetection: " + infos.timingCollisionDetection + "ms";
text += "
timingBroadPhase: " + infos.timingBroadPhase + "ms";
text += "
timingNarrowPhase: " + infos.timingNarrowPhase + "ms";
text += "
timingSolver: " + infos.timingSolver + "ms";
- text +=
- "
timingVelocityAssembly: " +
- infos.timingVelocityAssembly +
- "ms";
- text +=
- "
timingVelocityResolution: " +
- infos.timingVelocityResolution +
- "ms";
- text +=
- "
timingVelocityUpdate: " + infos.timingVelocityUpdate + "ms";
- text +=
- "
timingVelocityWriteback: " +
- infos.timingVelocityWriteback +
- "ms";
+ text += "
timingVelocityAssembly: " + infos.timingVelocityAssembly + "ms";
+ text += "
timingVelocityResolution: " + infos.timingVelocityResolution + "ms";
+ text += "
timingVelocityUpdate: " + infos.timingVelocityUpdate + "ms";
+ text += "
timingVelocityWriteback: " + infos.timingVelocityWriteback + "ms";
text += "
timingCcd: " + infos.timingCcd + "ms";
- text +=
- "
timingCcdToiComputation: " +
- infos.timingCcdToiComputation +
- "ms";
+ text += "
timingCcdToiComputation: " + infos.timingCcdToiComputation + "ms";
text += "
timingCcdBroadPhase: " + infos.timingCcdBroadPhase + "ms";
- text +=
- "
timingCcdNarrowPhase: " + infos.timingCcdNarrowPhase + "ms";
+ text += "
timingCcdNarrowPhase: " + infos.timingCcdNarrowPhase + "ms";
text += "
timingCcdSolver: " + infos.timingCcdSolver + "ms";
- text +=
- "
timingIslandConstruction: " +
- infos.timingIslandConstruction +
- "ms";
+ text += "
timingIslandConstruction: " + infos.timingIslandConstruction + "ms";
text += "
timingUserChanges: " + infos.timingUserChanges + "ms";
this.debugText.innerHTML = text;
}
diff --git a/testbed3d/src/Testbed.ts b/packages/testbed3d/src/Testbed.ts
similarity index 90%
rename from testbed3d/src/Testbed.ts
rename to packages/testbed3d/src/Testbed.ts
index 5d3afd88..8aa8f291 100644
--- a/testbed3d/src/Testbed.ts
+++ b/packages/testbed3d/src/Testbed.ts
@@ -1,10 +1,10 @@
+import type * as RAPIER from "@alexandernanberg/rapier-3d";
+import {xxhash128} from "hash-wasm";
+import type {DebugInfos} from "./Gui";
import {Graphics} from "./Graphics";
import {Gui} from "./Gui";
-import type {DebugInfos} from "./Gui";
-import {xxhash128} from "hash-wasm";
-import type * as RAPIER from "@dimforge/rapier3d";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
type Builders = Map void>;
@@ -121,7 +121,7 @@ export class Testbed {
this.parameters.builders.get(demo)(this.RAPIER, this);
}
- switchToBackend(backend: string) {
+ switchToBackend(_backend: string) {
this.switchToDemo(this.parameters.demo);
}
@@ -164,25 +164,20 @@ export class Testbed {
worldHashTime: 0,
snapshotTime: 0,
timingStep: this.world.timingStep(),
- timingCollisionDetection:
- this.world.timingCollisionDetection(),
+ timingCollisionDetection: this.world.timingCollisionDetection(),
timingBroadPhase: this.world.timingBroadPhase(),
timingNarrowPhase: this.world.timingNarrowPhase(),
timingSolver: this.world.timingSolver(),
timingVelocityAssembly: this.world.timingVelocityAssembly(),
- timingVelocityResolution:
- this.world.timingVelocityResolution(),
+ timingVelocityResolution: this.world.timingVelocityResolution(),
timingVelocityUpdate: this.world.timingVelocityUpdate(),
- timingVelocityWriteback:
- this.world.timingVelocityWriteback(),
+ timingVelocityWriteback: this.world.timingVelocityWriteback(),
timingCcd: this.world.timingCcd(),
- timingCcdToiComputation:
- this.world.timingCcdToiComputation(),
+ timingCcdToiComputation: this.world.timingCcdToiComputation(),
timingCcdBroadPhase: this.world.timingCcdBroadPhase(),
timingCcdNarrowPhase: this.world.timingCcdNarrowPhase(),
timingCcdSolver: this.world.timingCcdSolver(),
- timingIslandConstruction:
- this.world.timingIslandConstruction(),
+ timingIslandConstruction: this.world.timingIslandConstruction(),
timingUserChanges: this.world.timingUserChanges(),
};
t0 = performance.now();
diff --git a/testbed3d/src/demos/ccd.ts b/packages/testbed3d/src/demos/ccd.ts
similarity index 87%
rename from testbed3d/src/demos/ccd.ts
rename to packages/testbed3d/src/demos/ccd.ts
index 823c9013..1eafad78 100644
--- a/testbed3d/src/demos/ccd.ts
+++ b/packages/testbed3d/src/demos/ccd.ts
@@ -1,7 +1,7 @@
-import type RAPIER from "@dimforge/rapier3d";
+import type RAPIER from "@alexandernanberg/rapier-3d";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function createWall(
RAPIER: RAPIER_API,
@@ -19,15 +19,10 @@ function createWall(
for (j = i; j < stackHeight; ++j) {
let x = offset.x;
let y = i * shiftY + offset.y;
- let z =
- (i * shiftZ) / 2.0 + (j - i) * shiftZ + offset.z - stackHeight;
+ let z = (i * shiftZ) / 2.0 + (j - i) * shiftZ + offset.z - stackHeight;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(0.5, 0.5, 1.0);
world.createCollider(colliderDesc, body);
diff --git a/testbed3d/src/demos/characterController.ts b/packages/testbed3d/src/demos/characterController.ts
similarity index 80%
rename from testbed3d/src/demos/characterController.ts
rename to packages/testbed3d/src/demos/characterController.ts
index 2406ebcc..1390a489 100644
--- a/testbed3d/src/demos/characterController.ts
+++ b/packages/testbed3d/src/demos/characterController.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -28,35 +28,23 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = (i * shift) / 2.0 + (j - i) * shift - center;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad / 2.0,
- rad,
- );
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad / 2.0, rad);
world.createCollider(colliderDesc, body);
}
}
}
// Character.
- let characterDesc =
- RAPIER.RigidBodyDesc.kinematicPositionBased().setTranslation(
- -10.0,
- 4.0,
- -10.0,
- );
+ let characterDesc = RAPIER.RigidBodyDesc.kinematicPositionBased().setTranslation(
+ -10.0,
+ 4.0,
+ -10.0,
+ );
let character = world.createRigidBody(characterDesc);
let characterColliderDesc = RAPIER.ColliderDesc.cylinder(1.2, 0.6);
- let characterCollider = world.createCollider(
- characterColliderDesc,
- character,
- );
+ let characterCollider = world.createCollider(characterColliderDesc, character);
let characterController = world.createCharacterController(0.1);
characterController.enableAutostep(0.7, 0.3, true);
@@ -66,10 +54,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let movementDirection = {x: 0.0, y: -speed, z: 0.0};
let updateCharacter = () => {
- characterController.computeColliderMovement(
- characterCollider,
- movementDirection,
- );
+ characterController.computeColliderMovement(characterCollider, movementDirection);
let movement = characterController.computedMovement();
let newPos = character.translation();
diff --git a/testbed3d/src/demos/collisionGroups.ts b/packages/testbed3d/src/demos/collisionGroups.ts
similarity index 85%
rename from testbed3d/src/demos/collisionGroups.ts
rename to packages/testbed3d/src/demos/collisionGroups.ts
index 49c9ddb7..c3850c10 100644
--- a/testbed3d/src/demos/collisionGroups.ts
+++ b/packages/testbed3d/src/demos/collisionGroups.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -47,18 +47,10 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// Alternate between the green and blue groups.
let group = k % 2 == 0 ? group1 : group2;
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- rad,
- ).setCollisionGroups(group);
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad).setCollisionGroups(group);
world.createCollider(colliderDesc, body);
}
}
diff --git a/testbed3d/src/demos/convexPolyhedron.ts b/packages/testbed3d/src/demos/convexPolyhedron.ts
similarity index 89%
rename from testbed3d/src/demos/convexPolyhedron.ts
rename to packages/testbed3d/src/demos/convexPolyhedron.ts
index 0ec4b903..0d0725c1 100644
--- a/testbed3d/src/demos/convexPolyhedron.ts
+++ b/packages/testbed3d/src/demos/convexPolyhedron.ts
@@ -1,7 +1,7 @@
-import type {Testbed} from "../Testbed";
import seedrandom from "seedrandom";
+import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function generateTriMesh(nsubdivs: number, wx: number, wy: number, wz: number) {
let vertices = [];
@@ -47,10 +47,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let trimesh = generateTriMesh(20, 40.0, 4.0, 40.0);
- let colliderDesc = RAPIER.ColliderDesc.trimesh(
- trimesh.vertices,
- trimesh.indices,
- );
+ let colliderDesc = RAPIER.ColliderDesc.trimesh(trimesh.vertices, trimesh.indices);
world.createCollider(colliderDesc, body);
/*
@@ -82,16 +79,9 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let v = new Float32Array(vertices);
// Build the rigid body.
- bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
body = world.createRigidBody(bodyDesc);
- colliderDesc = RAPIER.ColliderDesc.roundConvexHull(
- v,
- border_rad,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundConvexHull(v, border_rad);
world.createCollider(colliderDesc, body);
}
}
diff --git a/testbed3d/src/demos/damping.ts b/packages/testbed3d/src/demos/damping.ts
similarity index 94%
rename from testbed3d/src/demos/damping.ts
rename to packages/testbed3d/src/demos/damping.ts
index c6295f66..3277bee3 100644
--- a/testbed3d/src/demos/damping.ts
+++ b/packages/testbed3d/src/demos/damping.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, 0.0, 0.0);
diff --git a/testbed3d/src/demos/fountain.ts b/packages/testbed3d/src/demos/fountain.ts
similarity index 93%
rename from testbed3d/src/demos/fountain.ts
rename to packages/testbed3d/src/demos/fountain.ts
index 00d8dced..cde6f8c1 100644
--- a/testbed3d/src/demos/fountain.ts
+++ b/packages/testbed3d/src/demos/fountain.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -37,11 +37,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.roundCylinder(
- rad,
- rad,
- rad / 10.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundCylinder(rad, rad, rad / 10.0);
break;
case 3:
colliderDesc = RAPIER.ColliderDesc.cone(rad, rad);
diff --git a/testbed3d/src/demos/glbToTrimesh.ts b/packages/testbed3d/src/demos/glbToTrimesh.ts
similarity index 89%
rename from testbed3d/src/demos/glbToTrimesh.ts
rename to packages/testbed3d/src/demos/glbToTrimesh.ts
index fa65a7cd..dfef72da 100644
--- a/testbed3d/src/demos/glbToTrimesh.ts
+++ b/packages/testbed3d/src/demos/glbToTrimesh.ts
@@ -1,7 +1,7 @@
-import type {Testbed} from "../Testbed";
import {Vector3, Object3D, Mesh, BufferGeometry, BufferAttribute} from "three";
-import {GLTFLoader} from "three/examples/jsm/loaders/GLTFLoader";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+import {GLTFLoader} from "three/addons/loaders/GLTFLoader.js";
+import type {Testbed} from "../Testbed";
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -31,9 +31,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
const vertices: number[] = [];
const indices = new Uint32Array(geometry.index!.array); // assume index is non-null
- const positionAttribute = geometry.getAttribute(
- "position",
- ) as BufferAttribute;
+ const positionAttribute = geometry.getAttribute("position") as BufferAttribute;
mesh.updateWorldMatrix(true, true);
@@ -50,10 +48,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
const rigidBodyDesc = RAPIER.RigidBodyDesc.fixed();
const rigidBody = world.createRigidBody(rigidBodyDesc);
- const colliderDesc = RAPIER.ColliderDesc.trimesh(
- verticesArray,
- indices,
- );
+ const colliderDesc = RAPIER.ColliderDesc.trimesh(verticesArray, indices);
world.createCollider(colliderDesc, rigidBody);
}
});
diff --git a/testbed3d/src/demos/glbtoConvexHull.ts b/packages/testbed3d/src/demos/glbtoConvexHull.ts
similarity index 81%
rename from testbed3d/src/demos/glbtoConvexHull.ts
rename to packages/testbed3d/src/demos/glbtoConvexHull.ts
index a4d2619e..72e69d65 100644
--- a/testbed3d/src/demos/glbtoConvexHull.ts
+++ b/packages/testbed3d/src/demos/glbtoConvexHull.ts
@@ -1,14 +1,7 @@
+import {Vector3, Object3D, Mesh, BufferGeometry, BufferAttribute} from "three";
+import {GLTFLoader} from "three/addons/loaders/GLTFLoader.js";
import type {Testbed} from "../Testbed";
-import {
- Vector3,
- Object3D,
- Mesh,
- BufferGeometry,
- BufferAttribute,
- TriangleStripDrawMode,
-} from "three";
-import {GLTFLoader} from "three/examples/jsm/loaders/GLTFLoader";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -38,9 +31,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
if ((child as Mesh).isMesh && (child as Mesh).geometry) {
const mesh = child as Mesh;
const geometry = mesh.geometry as BufferGeometry;
- const positionAttribute = geometry.getAttribute(
- "position",
- ) as BufferAttribute;
+ const positionAttribute = geometry.getAttribute("position") as BufferAttribute;
for (let i = 0, l = positionAttribute.count; i < l; i++) {
v.fromBufferAttribute(positionAttribute, i);
@@ -53,9 +44,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
const rigidBodyDesc = RAPIER.RigidBodyDesc.fixed();
const rigidBody = world.createRigidBody(rigidBodyDesc);
- const colliderDesc = RAPIER.ColliderDesc.convexHull(
- new Float32Array(positions),
- );
+ const colliderDesc = RAPIER.ColliderDesc.convexHull(new Float32Array(positions));
world.createCollider(colliderDesc, rigidBody);
});
diff --git a/testbed3d/src/demos/heightfield.ts b/packages/testbed3d/src/demos/heightfield.ts
similarity index 81%
rename from testbed3d/src/demos/heightfield.ts
rename to packages/testbed3d/src/demos/heightfield.ts
index 5a2feece..072bb44d 100644
--- a/testbed3d/src/demos/heightfield.ts
+++ b/packages/testbed3d/src/demos/heightfield.ts
@@ -1,7 +1,7 @@
import seedrandom from "seedrandom";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function generateHeightfield(nsubdivs: number) {
let heights = [];
@@ -28,12 +28,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let heights = generateHeightfield(nsubdivs);
- let colliderDesc = RAPIER.ColliderDesc.heightfield(
- nsubdivs,
- nsubdivs,
- heights,
- scale,
- );
+ let colliderDesc = RAPIER.ColliderDesc.heightfield(nsubdivs, nsubdivs, heights, scale);
world.createCollider(colliderDesc, body);
// Dynamic cubes.
@@ -55,41 +50,25 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = k * shift + offset;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc;
switch (j % 5) {
case 0:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- rad,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
break;
case 1:
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.roundCylinder(
- rad,
- rad,
- rad / 10.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundCylinder(rad, rad, rad / 10.0);
break;
case 3:
colliderDesc = RAPIER.ColliderDesc.cone(rad, rad);
break;
case 4:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad / 2.0,
- rad / 2.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad / 2.0, rad / 2.0);
world.createCollider(colliderDesc, body);
colliderDesc = RAPIER.ColliderDesc.cuboid(
rad / 2.0,
diff --git a/testbed3d/src/demos/joints.ts b/packages/testbed3d/src/demos/joints.ts
similarity index 83%
rename from testbed3d/src/demos/joints.ts
rename to packages/testbed3d/src/demos/joints.ts
index 56546d7f..d05fb1cc 100644
--- a/testbed3d/src/demos/joints.ts
+++ b/packages/testbed3d/src/demos/joints.ts
@@ -1,7 +1,7 @@
-import type RAPIER from "@dimforge/rapier3d";
+import type RAPIER from "@alexandernanberg/rapier-3d";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function createPrismaticJoints(
RAPIER: RAPIER_API,
@@ -12,11 +12,7 @@ function createPrismaticJoints(
let rad = 0.4;
let shift = 1.0;
- let groundDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- origin.x,
- origin.y,
- origin.z,
- );
+ let groundDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(origin.x, origin.y, origin.z);
let currParent = world.createRigidBody(groundDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
world.createCollider(colliderDesc, currParent);
@@ -26,11 +22,7 @@ function createPrismaticJoints(
for (i = 0; i < num; ++i) {
z = origin.z + (i + 1) * shift;
- let rigidBodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- origin.x,
- origin.y,
- z,
- );
+ let rigidBodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(origin.x, origin.y, z);
let currChild = world.createRigidBody(rigidBodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
world.createCollider(colliderDesc, currChild);
@@ -66,11 +58,7 @@ function createRevoluteJoints(
let rad = 0.4;
let shift = 2.0;
- let groundDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- origin.x,
- origin.y,
- 0.0,
- );
+ let groundDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(origin.x, origin.y, 0.0);
let currParent = world.createRigidBody(groundDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
world.createCollider(colliderDesc, currParent);
@@ -110,26 +98,10 @@ function createRevoluteJoints(
z = new RAPIER.Vector3(0.0, 0.0, 1.0);
let revs = [
- RAPIER.JointData.revolute(
- o,
- new RAPIER.Vector3(0.0, 0.0, -shift),
- z,
- ),
- RAPIER.JointData.revolute(
- o,
- new RAPIER.Vector3(-shift, 0.0, 0.0),
- x,
- ),
- RAPIER.JointData.revolute(
- o,
- new RAPIER.Vector3(0.0, 0.0, -shift),
- z,
- ),
- RAPIER.JointData.revolute(
- o,
- new RAPIER.Vector3(shift, 0.0, 0.0),
- x,
- ),
+ RAPIER.JointData.revolute(o, new RAPIER.Vector3(0.0, 0.0, -shift), z),
+ RAPIER.JointData.revolute(o, new RAPIER.Vector3(-shift, 0.0, 0.0), x),
+ RAPIER.JointData.revolute(o, new RAPIER.Vector3(0.0, 0.0, -shift), z),
+ RAPIER.JointData.revolute(o, new RAPIER.Vector3(shift, 0.0, 0.0), x),
];
world.createImpulseJoint(revs[0], currParent, parents[0], true);
@@ -209,11 +181,7 @@ function createFixedJoints(
}
}
-function createBallJoints(
- RAPIER: RAPIER_API,
- world: RAPIER.World,
- num: number,
-) {
+function createBallJoints(RAPIER: RAPIER_API, world: RAPIER.World, num: number) {
let rad = 0.4;
let shift = 1.0;
let i, k;
@@ -246,10 +214,7 @@ function createBallJoints(
if (i > 0) {
let parent = parents[parents.length - 1];
- let params = RAPIER.JointData.spherical(
- o,
- new RAPIER.Vector3(0.0, 0.0, -shift),
- );
+ let params = RAPIER.JointData.spherical(o, new RAPIER.Vector3(0.0, 0.0, -shift));
world.createImpulseJoint(params, parent, child, true);
}
@@ -257,10 +222,7 @@ function createBallJoints(
if (k > 0) {
let parent_index = parents.length - num;
let parent = parents[parent_index];
- let params = RAPIER.JointData.spherical(
- o,
- new RAPIER.Vector3(-shift, 0.0, 0.0),
- );
+ let params = RAPIER.JointData.spherical(o, new RAPIER.Vector3(-shift, 0.0, 0.0));
world.createImpulseJoint(params, parent, child, true);
}
@@ -273,12 +235,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
let world = new RAPIER.World(gravity);
- createPrismaticJoints(
- RAPIER,
- world,
- new RAPIER.Vector3(20.0, 10.0, 0.0),
- 5,
- );
+ createPrismaticJoints(RAPIER, world, new RAPIER.Vector3(20.0, 10.0, 0.0), 5);
createFixedJoints(RAPIER, world, new RAPIER.Vector3(0.0, 10.0, 0.0), 5);
createRevoluteJoints(RAPIER, world, new RAPIER.Vector3(20.0, 0.0, 0.0), 3);
createBallJoints(RAPIER, world, 15);
diff --git a/testbed3d/src/demos/keva.ts b/packages/testbed3d/src/demos/keva.ts
similarity index 82%
rename from testbed3d/src/demos/keva.ts
rename to packages/testbed3d/src/demos/keva.ts
index d4e27cb0..e9c3c59d 100644
--- a/testbed3d/src/demos/keva.ts
+++ b/packages/testbed3d/src/demos/keva.ts
@@ -1,7 +1,7 @@
-import type RAPIER from "@dimforge/rapier3d";
+import type RAPIER from "@alexandernanberg/rapier-3d";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function buildBlock(
RAPIER: RAPIER_API,
@@ -43,11 +43,7 @@ function buildBlock(
z + dim.z + shift.z,
);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- dim.x,
- dim.y,
- dim.z,
- );
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(dim.x, dim.y, dim.z);
world.createCollider(colliderDesc, body);
}
}
@@ -78,17 +74,9 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// Create Ground.
let groundSize = 50.0;
let groundHeight = 0.1;
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- 0.0,
- -groundHeight,
- 0.0,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(0.0, -groundHeight, 0.0);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- groundSize,
- groundHeight,
- groundSize,
- );
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(groundSize, groundHeight, groundSize);
world.createCollider(colliderDesc, body);
// Keva tower.
@@ -97,7 +85,6 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
// These should only be set to odd values otherwise
// the blocks won't align in the nicest way.
let numyArr = [0, 3, 5, 5, 7, 9];
- let numBlocksBuilt = 0;
let i;
for (i = 5; i >= 1; --i) {
@@ -109,17 +96,12 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
RAPIER,
world,
halfExtents,
- new RAPIER.Vector3(
- -blockWidth / 2.0,
- blockHeight,
- -blockWidth / 2.0,
- ),
+ new RAPIER.Vector3(-blockWidth / 2.0, blockHeight, -blockWidth / 2.0),
numx,
numy,
numz,
);
blockHeight += numy * halfExtents.y * 2.0 + halfExtents.x * 2.0;
- numBlocksBuilt += numx * numy * numz;
}
testbed.setWorld(world);
diff --git a/testbed3d/src/demos/lockedRotations.ts b/packages/testbed3d/src/demos/lockedRotations.ts
similarity index 74%
rename from testbed3d/src/demos/lockedRotations.ts
rename to packages/testbed3d/src/demos/lockedRotations.ts
index e3b4c538..248f14af 100644
--- a/testbed3d/src/demos/lockedRotations.ts
+++ b/packages/testbed3d/src/demos/lockedRotations.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -12,17 +12,9 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let ground_size = 1.7;
let ground_height = 0.1;
- let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(
- 0.0,
- -ground_height,
- 0.0,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.fixed().setTranslation(0.0, -ground_height, 0.0);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- ground_size,
- ground_height,
- ground_size,
- );
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(ground_size, ground_height, ground_size);
world.createCollider(colliderDesc, body);
/*
@@ -39,9 +31,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
/*
* A cylinder that cannot rotate.
*/
- bodyDesc = RAPIER.RigidBodyDesc.dynamic()
- .setTranslation(0.2, 5.0, 0.4)
- .lockRotations();
+ bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0.2, 5.0, 0.4).lockRotations();
body = world.createRigidBody(bodyDesc);
colliderDesc = RAPIER.ColliderDesc.cylinder(0.6, 0.4);
world.createCollider(colliderDesc, body);
diff --git a/testbed3d/src/demos/pidController.ts b/packages/testbed3d/src/demos/pidController.ts
similarity index 80%
rename from testbed3d/src/demos/pidController.ts
rename to packages/testbed3d/src/demos/pidController.ts
index ea3e1286..28066755 100644
--- a/testbed3d/src/demos/pidController.ts
+++ b/packages/testbed3d/src/demos/pidController.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -28,17 +28,9 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = (i * shift) / 2.0 + (j - i) * shift - center;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
- let colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad / 2.0,
- rad,
- );
+ let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad / 2.0, rad);
world.createCollider(colliderDesc, body);
}
}
@@ -53,12 +45,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let characterColliderDesc = RAPIER.ColliderDesc.cylinder(1.2, 0.6);
world.createCollider(characterColliderDesc, character);
- let pidController = world.createPidController(
- 60.0,
- 0.0,
- 1.0,
- RAPIER.PidAxesMask.AllAng,
- );
+ let pidController = world.createPidController(60.0, 0.0, 1.0, RAPIER.PidAxesMask.AllAng);
let speed = 0.2;
let movementDirection = {x: 0.0, y: 0.0, z: 0.0};
let targetVelocity = {x: 0.0, y: 0.0, z: 0.0};
@@ -75,9 +62,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
} else if (movementDirection.y == 0.0) {
// Don’t control the linear Y axis so the player can fall down due to gravity.
pidController.setAxes(
- RAPIER.PidAxesMask.AllAng |
- RAPIER.PidAxesMask.LinX |
- RAPIER.PidAxesMask.LinZ,
+ RAPIER.PidAxesMask.AllAng | RAPIER.PidAxesMask.LinX | RAPIER.PidAxesMask.LinZ,
);
} else {
pidController.setAxes(RAPIER.PidAxesMask.All);
@@ -88,16 +73,8 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
targetPoint.y += movementDirection.y;
targetPoint.z += movementDirection.z;
- pidController.applyLinearCorrection(
- character,
- targetPoint,
- targetVelocity,
- );
- pidController.applyAngularCorrection(
- character,
- targetRotation,
- targetVelocity,
- );
+ pidController.applyLinearCorrection(character, targetPoint, targetVelocity);
+ pidController.applyAngularCorrection(character, targetRotation, targetVelocity);
};
testbed.setWorld(world);
diff --git a/testbed3d/src/demos/platform.ts b/packages/testbed3d/src/demos/platform.ts
similarity index 85%
rename from testbed3d/src/demos/platform.ts
rename to packages/testbed3d/src/demos/platform.ts
index fe51d9ae..0c78b267 100644
--- a/testbed3d/src/demos/platform.ts
+++ b/packages/testbed3d/src/demos/platform.ts
@@ -1,7 +1,7 @@
import seedrandom from "seedrandom";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function generateTriMesh(nsubdivs: number, wx: number, wy: number, wz: number) {
let vertices = [];
@@ -47,10 +47,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.kinematicVelocityBased();
let platformBody = world.createRigidBody(bodyDesc);
let trimesh = generateTriMesh(20, 70.0, 4.0, 70.0);
- let colliderDesc = RAPIER.ColliderDesc.trimesh(
- trimesh.vertices,
- trimesh.indices,
- );
+ let colliderDesc = RAPIER.ColliderDesc.trimesh(trimesh.vertices, trimesh.indices);
world.createCollider(colliderDesc, platformBody);
let t = 0.0;
@@ -81,41 +78,25 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = k * shift + offset;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc;
switch (j % 5) {
case 0:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- rad,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
break;
case 1:
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.roundCylinder(
- rad,
- rad,
- rad / 10.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundCylinder(rad, rad, rad / 10.0);
break;
case 3:
colliderDesc = RAPIER.ColliderDesc.cone(rad, rad);
break;
case 4:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad / 2.0,
- rad / 2.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad / 2.0, rad / 2.0);
world.createCollider(colliderDesc, body);
colliderDesc = RAPIER.ColliderDesc.cuboid(
rad / 2.0,
diff --git a/testbed3d/src/demos/pyramid.ts b/packages/testbed3d/src/demos/pyramid.ts
similarity index 78%
rename from testbed3d/src/demos/pyramid.ts
rename to packages/testbed3d/src/demos/pyramid.ts
index 9a63e47e..6e5c57d5 100644
--- a/testbed3d/src/demos/pyramid.ts
+++ b/packages/testbed3d/src/demos/pyramid.ts
@@ -1,6 +1,6 @@
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let gravity = new RAPIER.Vector3(0.0, -9.81, 0.0);
@@ -23,18 +23,12 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
for (i = 0; i < num; ++i) {
for (j = i; j < num; ++j) {
for (k = i; k < num; ++k) {
- let x =
- (i * shift) / 2.0 + (k - i) * shift - height * rad - center;
+ let x = (i * shift) / 2.0 + (k - i) * shift - height * rad - center;
let y = i * shift + height;
- let z =
- (i * shift) / 2.0 + (j - i) * shift - height * rad - center;
+ let z = (i * shift) / 2.0 + (j - i) * shift - height * rad - center;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
world.createCollider(colliderDesc, body);
diff --git a/testbed3d/src/demos/trimesh.ts b/packages/testbed3d/src/demos/trimesh.ts
similarity index 84%
rename from testbed3d/src/demos/trimesh.ts
rename to packages/testbed3d/src/demos/trimesh.ts
index 5a50bd3b..9fc77cf3 100644
--- a/testbed3d/src/demos/trimesh.ts
+++ b/packages/testbed3d/src/demos/trimesh.ts
@@ -1,7 +1,7 @@
import seedrandom from "seedrandom";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function generateTriMesh(nsubdivs: number, wx: number, wy: number, wz: number) {
let vertices = [];
@@ -47,10 +47,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let trimesh = generateTriMesh(20, 70.0, 4.0, 70.0);
- let colliderDesc = RAPIER.ColliderDesc.trimesh(
- trimesh.vertices,
- trimesh.indices,
- );
+ let colliderDesc = RAPIER.ColliderDesc.trimesh(trimesh.vertices, trimesh.indices);
world.createCollider(colliderDesc, body);
// Dynamic cubes.
@@ -72,41 +69,25 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = k * shift + offset;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc;
switch (j % 5) {
case 0:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- rad,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
break;
case 1:
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.roundCylinder(
- rad,
- rad,
- rad / 10.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundCylinder(rad, rad, rad / 10.0);
break;
case 3:
colliderDesc = RAPIER.ColliderDesc.cone(rad, rad);
break;
case 4:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad / 2.0,
- rad / 2.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad / 2.0, rad / 2.0);
world.createCollider(colliderDesc, body);
colliderDesc = RAPIER.ColliderDesc.cuboid(
rad / 2.0,
diff --git a/testbed3d/src/demos/voxels.ts b/packages/testbed3d/src/demos/voxels.ts
similarity index 76%
rename from testbed3d/src/demos/voxels.ts
rename to packages/testbed3d/src/demos/voxels.ts
index 936b8730..ba50fa47 100644
--- a/testbed3d/src/demos/voxels.ts
+++ b/packages/testbed3d/src/demos/voxels.ts
@@ -1,7 +1,6 @@
-import seedrandom from "seedrandom";
import type {Testbed} from "../Testbed";
-type RAPIER_API = typeof import("@dimforge/rapier3d");
+type RAPIER_API = typeof import("@alexandernanberg/rapier-3d");
function generateVoxels(n: number) {
let points = [];
@@ -10,13 +9,8 @@ function generateVoxels(n: number) {
for (i = 0; i <= n; ++i) {
for (j = 0; j <= n; ++j) {
let y =
- Math.max(
- -0.8,
- Math.min(
- Math.sin((i / n) * 10.0) * Math.cos((j / n) * 10.0),
- 0.8,
- ),
- ) * 8.0;
+ Math.max(-0.8, Math.min(Math.sin((i / n) * 10.0) * Math.cos((j / n) * 10.0), 0.8)) *
+ 8.0;
points.push(i - n / 2.0, y, j - n / 2.0);
}
}
@@ -34,10 +28,7 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let voxels = generateVoxels(100);
- let colliderDesc = RAPIER.ColliderDesc.voxels(
- voxels.points,
- voxels.voxelSize,
- );
+ let colliderDesc = RAPIER.ColliderDesc.voxels(voxels.points, voxels.voxelSize);
world.createCollider(colliderDesc, body);
// Dynamic cubes.
@@ -59,41 +50,25 @@ export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
let z = k * shift + offset;
// Create dynamic cube.
- let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(
- x,
- y,
- z,
- );
+ let bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(x, y, z);
let body = world.createRigidBody(bodyDesc);
let colliderDesc;
switch (j % 5) {
case 0:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad,
- rad,
- rad,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
break;
case 1:
colliderDesc = RAPIER.ColliderDesc.ball(rad);
break;
case 2:
- colliderDesc = RAPIER.ColliderDesc.roundCylinder(
- rad,
- rad,
- rad / 10.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.roundCylinder(rad, rad, rad / 10.0);
break;
case 3:
colliderDesc = RAPIER.ColliderDesc.cone(rad, rad);
break;
case 4:
- colliderDesc = RAPIER.ColliderDesc.cuboid(
- rad / 2.0,
- rad / 2.0,
- rad / 2.0,
- );
+ colliderDesc = RAPIER.ColliderDesc.cuboid(rad / 2.0, rad / 2.0, rad / 2.0);
world.createCollider(colliderDesc, body);
colliderDesc = RAPIER.ColliderDesc.cuboid(
rad / 2.0,
diff --git a/testbed3d/src/index.ts b/packages/testbed3d/src/index.ts
similarity index 94%
rename from testbed3d/src/index.ts
rename to packages/testbed3d/src/index.ts
index accfad53..63a2e9d7 100644
--- a/testbed3d/src/index.ts
+++ b/packages/testbed3d/src/index.ts
@@ -1,23 +1,24 @@
-import {Testbed} from "./Testbed";
-import * as Trimesh from "./demos/trimesh";
-import * as Voxels from "./demos/voxels";
+import * as CCD from "./demos/ccd";
+import * as CharacterController from "./demos/characterController";
import * as CollisionGroups from "./demos/collisionGroups";
-import * as Pyramid from "./demos/pyramid";
-import * as Keva from "./demos/keva";
-import * as Joints from "./demos/joints";
-import * as Fountain from "./demos/fountain";
+import * as ConvexPolyhedron from "./demos/convexPolyhedron";
import * as Damping from "./demos/damping";
+import * as Fountain from "./demos/fountain";
+import * as glbToConvexHull from "./demos/glbtoConvexHull";
+import * as glbToTrimesh from "./demos/glbToTrimesh";
import * as Heightfield from "./demos/heightfield";
+import * as Joints from "./demos/joints";
+import * as Keva from "./demos/keva";
import * as LockedRotations from "./demos/lockedRotations";
-import * as ConvexPolyhedron from "./demos/convexPolyhedron";
-import * as CCD from "./demos/ccd";
-import * as Platform from "./demos/platform";
-import * as CharacterController from "./demos/characterController";
import * as PidController from "./demos/pidController";
-import * as glbToTrimesh from "./demos/glbToTrimesh";
-import * as glbToConvexHull from "./demos/glbtoConvexHull";
+import * as Platform from "./demos/platform";
+import * as Pyramid from "./demos/pyramid";
+import * as Trimesh from "./demos/trimesh";
+import * as Voxels from "./demos/voxels";
+import {Testbed} from "./Testbed";
-import("@dimforge/rapier3d").then((RAPIER) => {
+import("@alexandernanberg/rapier-3d/compat-simd").then(async (RAPIER) => {
+ await RAPIER.init();
let builders = new Map([
["collision groups", CollisionGroups.initWorld],
["character controller", CharacterController.initWorld],
diff --git a/testbed3d/tsconfig.json b/packages/testbed3d/tsconfig.json
similarity index 60%
rename from testbed3d/tsconfig.json
rename to packages/testbed3d/tsconfig.json
index 5d07ecd8..af046b8c 100644
--- a/testbed3d/tsconfig.json
+++ b/packages/testbed3d/tsconfig.json
@@ -5,7 +5,8 @@
"module": "es2022",
"target": "es2022",
"allowJs": true,
- "moduleResolution": "node",
- "allowSyntheticDefaultImports": true
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "skipLibCheck": true
}
}
diff --git a/packages/testbed3d/vite.config.ts b/packages/testbed3d/vite.config.ts
new file mode 100644
index 00000000..8efe6d74
--- /dev/null
+++ b/packages/testbed3d/vite.config.ts
@@ -0,0 +1,9 @@
+import {defineConfig} from "vite";
+import wasm from "vite-plugin-wasm";
+
+export default defineConfig({
+ plugins: [wasm()],
+ build: {
+ target: "esnext",
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 00000000..24b0c675
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,2129 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ oxfmt:
+ specifier: 0.27.0
+ version: 0.27.0
+ oxlint:
+ specifier: ^1.42.0
+ version: 1.42.0
+ typedoc:
+ specifier: 0.28.16
+ version: 0.28.16(typescript@5.7.3)
+ typescript:
+ specifier: 5.7.3
+ version: 5.7.3
+ wasm-pack:
+ specifier: 0.14.0
+ version: 0.14.0
+
+ packages/benchmarks:
+ dependencies:
+ '@alexandernanberg/rapier-2d':
+ specifier: workspace:*
+ version: link:../rapier-2d
+ '@alexandernanberg/rapier-3d':
+ specifier: workspace:*
+ version: link:../rapier-3d
+ '@dimforge/rapier2d-compat':
+ specifier: ^0.19.3
+ version: 0.19.3
+ '@dimforge/rapier2d-simd-compat':
+ specifier: ^0.19.3
+ version: 0.19.3
+ '@dimforge/rapier3d-compat':
+ specifier: ^0.19.3
+ version: 0.19.3
+ '@dimforge/rapier3d-simd-compat':
+ specifier: ^0.19.3
+ version: 0.19.3
+ devDependencies:
+ '@types/node':
+ specifier: ^22.19.7
+ version: 22.19.7
+ tsx:
+ specifier: ^4.21.0
+ version: 4.21.0
+
+ packages/rapier-2d:
+ dependencies:
+ base64-js:
+ specifier: ^1.5.1
+ version: 1.5.1
+ devDependencies:
+ tsdown:
+ specifier: ^0.20.1
+ version: 0.20.1(typescript@5.9.3)
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+
+ packages/rapier-3d:
+ dependencies:
+ base64-js:
+ specifier: ^1.5.1
+ version: 1.5.1
+ devDependencies:
+ tsdown:
+ specifier: ^0.20.1
+ version: 0.20.1(typescript@5.9.3)
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+
+ packages/testbed2d:
+ dependencies:
+ '@alexandernanberg/rapier-2d':
+ specifier: workspace:*
+ version: link:../rapier-2d
+ hash-wasm:
+ specifier: ^4.12.0
+ version: 4.12.0
+ lil-gui:
+ specifier: ^0.21.0
+ version: 0.21.0
+ pixi-viewport:
+ specifier: ^6.0.3
+ version: 6.0.3(pixi.js@8.15.0)
+ pixi.js:
+ specifier: ^8.15.0
+ version: 8.15.0
+ seedrandom:
+ specifier: ^3.0.5
+ version: 3.0.5
+ stats.js:
+ specifier: ^0.17.0
+ version: 0.17.0
+ devDependencies:
+ '@types/seedrandom':
+ specifier: ^3.0.8
+ version: 3.0.8
+ '@types/stats.js':
+ specifier: ^0.17.4
+ version: 0.17.4
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^7.3.1
+ version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-plugin-wasm:
+ specifier: ^3.5.0
+ version: 3.5.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
+ packages/testbed3d:
+ dependencies:
+ '@alexandernanberg/rapier-3d':
+ specifier: workspace:*
+ version: link:../rapier-3d
+ hash-wasm:
+ specifier: ^4.12.0
+ version: 4.12.0
+ lil-gui:
+ specifier: ^0.21.0
+ version: 0.21.0
+ seedrandom:
+ specifier: ^3.0.5
+ version: 3.0.5
+ stats.js:
+ specifier: ^0.17.0
+ version: 0.17.0
+ three:
+ specifier: ^0.182.0
+ version: 0.182.0
+ devDependencies:
+ '@types/seedrandom':
+ specifier: ^3.0.8
+ version: 3.0.8
+ '@types/stats.js':
+ specifier: ^0.17.4
+ version: 0.17.4
+ '@types/three':
+ specifier: ^0.182.0
+ version: 0.182.0
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^7.3.1
+ version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+ vite-plugin-wasm:
+ specifier: ^3.5.0
+ version: 3.5.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
+packages:
+
+ '@babel/generator@8.0.0-beta.4':
+ resolution: {integrity: sha512-5xRfRZk6wx1BRu2XnTE8cTh2mx1ixrZ3/vpn7p/RCJpgctL6pexVVHE3eqtwlYvHhPAuOYCAlnsAyXpBdmfh5Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@babel/helper-string-parser@8.0.0-beta.4':
+ resolution: {integrity: sha512-FGwbdQ/I2nJXXfyxa7dT0Fr/zPWwgX7m+hNVj0HrIHYJtyLxSQeQY1Kd8QkAYviQJV3OWFlRLuGd5epF03bdQg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@babel/helper-validator-identifier@8.0.0-beta.4':
+ resolution: {integrity: sha512-6t0IaUEzlinbLmsGIvBZIHEJGjuchx+cMj+FbS78zL17tucYervgbwO07V5/CgBenVraontpmyMCTVyqCfxhFQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@babel/parser@8.0.0-beta.4':
+ resolution: {integrity: sha512-fBcUqUN3eenLyg25QFkOwY1lmV6L0RdG92g6gxyS2CVCY8kHdibkQz1+zV3bLzxcvNnfHoi3i9n5Dci+g93acg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ '@babel/types@8.0.0-beta.4':
+ resolution: {integrity: sha512-xjk2xqYp25ePzAs0I08hN2lrbUDDQFfCjwq6MIEa8HwHa0WK8NfNtdvtXod8Ku2CbE1iui7qwWojGvjQiyrQeA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@dimforge/rapier2d-compat@0.19.3':
+ resolution: {integrity: sha512-5HZUgiSpu9Uba3He+4SCPVte3h2vgxcodkxWThRjd3X/zgq/Z4OyRUKpNEOsOR6AC+OfulPkkZ5asZGzRMpcwA==}
+
+ '@dimforge/rapier2d-simd-compat@0.19.3':
+ resolution: {integrity: sha512-cj+NPfo3bh7YUnq/FZUrBpbDR7oyAaayMRL1XTRntZw/6b9IJsq2ubiy3/0PGQAZzfzqg39u9yhSVk5dEboFag==}
+
+ '@dimforge/rapier3d-compat@0.12.0':
+ resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==}
+
+ '@dimforge/rapier3d-compat@0.19.3':
+ resolution: {integrity: sha512-mMVdSj1PRTT108s9Swbu2GQOmHbn8kbJANRV5xfczL3s0T4vkgZAuoMRgvBzQcHanpKusbC0ZJj6z3mC3aj3vg==}
+
+ '@dimforge/rapier3d-simd-compat@0.19.3':
+ resolution: {integrity: sha512-gAiK4JoGPbjcfiu0I4fSKVnwrawCJcSILjteAjC/zs6zOs59GuMfaW5dsum/yhAzWHp+dH+w+3hp341M7ykxuQ==}
+
+ '@emnapi/core@1.8.1':
+ resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
+
+ '@emnapi/runtime@1.8.1':
+ resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+
+ '@emnapi/wasi-threads@1.1.0':
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+ '@esbuild/aix-ppc64@0.27.2':
+ resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.27.2':
+ resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.2':
+ resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.2':
+ resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.27.2':
+ resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.2':
+ resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.27.2':
+ resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.2':
+ resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.27.2':
+ resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.2':
+ resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.2':
+ resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.2':
+ resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.2':
+ resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.2':
+ resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.2':
+ resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.2':
+ resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.2':
+ resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.2':
+ resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.2':
+ resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.2':
+ resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.27.2':
+ resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.27.2':
+ resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.2':
+ resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.2':
+ resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@gerrit0/mini-shiki@3.22.0':
+ resolution: {integrity: sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@napi-rs/wasm-runtime@1.1.1':
+ resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
+
+ '@oxc-project/types@0.110.0':
+ resolution: {integrity: sha512-6Ct21OIlrEnFEJk5LT4e63pk3btsI6/TusD/GStLi7wYlGJNOl1GI9qvXAnRAxQU9zqA2Oz+UwhfTOU2rPZVow==}
+
+ '@oxfmt/darwin-arm64@0.27.0':
+ resolution: {integrity: sha512-3vwqyzNlVTVFVzHMlrqxb4tgVgHp6FYS0uIxsIZ/SeEDG0azaqiOw/2t8LlJ9f72PKRLWSey+Ak99tiKgpbsnQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@oxfmt/darwin-x64@0.27.0':
+ resolution: {integrity: sha512-5u8mZVLm70v6l1wLZ2MmeNIEzGsruwKw5F7duePzpakPfxGtLpiFNUwe4aBUJULTP6aMzH+A4dA0JOn8lb7Luw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@oxfmt/linux-arm64-gnu@0.27.0':
+ resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxfmt/linux-arm64-musl@0.27.0':
+ resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxfmt/linux-x64-gnu@0.27.0':
+ resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxfmt/linux-x64-musl@0.27.0':
+ resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxfmt/win32-arm64@0.27.0':
+ resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@oxfmt/win32-x64@0.27.0':
+ resolution: {integrity: sha512-cXKVkL1DuRq31QjwHqtBEUztyBmM9YZKdeFhsDLBURNdk1CFW42uWsmTsaqrXSoiCj7nCjfP0pwTOzxhQZra/A==}
+ cpu: [x64]
+ os: [win32]
+
+ '@oxlint/darwin-arm64@1.42.0':
+ resolution: {integrity: sha512-ui5CdAcDsXPQwZQEXOOSWsilJWhgj9jqHCvYBm2tDE8zfwZZuF9q58+hGKH1x5y0SV4sRlyobB2Quq6uU6EgeA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@oxlint/darwin-x64@1.42.0':
+ resolution: {integrity: sha512-wo0M/hcpHRv7vFje99zHHqheOhVEwUOKjOgBKyi0M99xcLizv04kcSm1rTd6HSCeZgOtiJYZRVAlKhQOQw2byQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@oxlint/linux-arm64-gnu@1.42.0':
+ resolution: {integrity: sha512-j4QzfCM8ks+OyM+KKYWDiBEQsm5RCW50H1Wz16wUyoFsobJ+X5qqcJxq6HvkE07m8euYmZelyB0WqsiDoz1v8g==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxlint/linux-arm64-musl@1.42.0':
+ resolution: {integrity: sha512-g5b1Uw7zo6yw4Ymzyd1etKzAY7xAaGA3scwB8tAp3QzuY7CYdfTwlhiLKSAKbd7T/JBgxOXAGNcLDorJyVTXcg==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@oxlint/linux-x64-gnu@1.42.0':
+ resolution: {integrity: sha512-HnD99GD9qAbpV4q9iQil7mXZUJFpoBdDavfcC2CgGLPlawfcV5COzQPNwOgvPVkr7C0cBx6uNCq3S6r9IIiEIg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxlint/linux-x64-musl@1.42.0':
+ resolution: {integrity: sha512-8NTe8A78HHFn+nBi+8qMwIjgv9oIBh+9zqCPNLH56ah4vKOPvbePLI6NIv9qSkmzrBuu8SB+FJ2TH/G05UzbNA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@oxlint/win32-arm64@1.42.0':
+ resolution: {integrity: sha512-lAPS2YAuu+qFqoTNPFcNsxXjwSV0M+dOgAzzVTAN7Yo2ifj+oLOx0GsntWoM78PvQWI7Q827ZxqtU2ImBmDapA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@oxlint/win32-x64@1.42.0':
+ resolution: {integrity: sha512-3/KmyUOHNriL6rLpaFfm9RJxdhpXY2/Ehx9UuorJr2pUA+lrZL15FAEx/DOszYm5r10hfzj40+efAHcCilNvSQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@pixi/colord@2.9.6':
+ resolution: {integrity: sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==}
+
+ '@quansync/fs@1.0.0':
+ resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==}
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.1':
+ resolution: {integrity: sha512-He6ZoCfv5D7dlRbrhNBkuMVIHd0GDnjJwbICE1OWpG7G3S2gmJ+eXkcNLJjzjNDpeI2aRy56ou39AJM9AD8YFA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.1':
+ resolution: {integrity: sha512-YzJdn08kSOXnj85ghHauH2iHpOJ6eSmstdRTLyaziDcUxe9SyQJgGyx/5jDIhDvtOcNvMm2Ju7m19+S/Rm1jFg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.1':
+ resolution: {integrity: sha512-cIvAbqM+ZVV6lBSKSBtlNqH5iCiW933t1q8j0H66B3sjbe8AxIRetVqfGgcHcJtMzBIkIALlL9fcDrElWLJQcQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.1':
+ resolution: {integrity: sha512-rVt+B1B/qmKwCl1XD02wKfgh3vQPXRXdB/TicV2w6g7RVAM1+cZcpigwhLarqiVCxDObFZ7UgXCxPC7tpDoRog==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1':
+ resolution: {integrity: sha512-69YKwJJBOFprQa1GktPgbuBOfnn+EGxu8sBJ1TjPER+zhSpYeaU4N07uqmyBiksOLGXsMegymuecLobfz03h8Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1':
+ resolution: {integrity: sha512-9JDhHUf3WcLfnViFWm+TyorqUtnSAHaCzlSNmMOq824prVuuzDOK91K0Hl8DUcEb9M5x2O+d2/jmBMsetRIn3g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1':
+ resolution: {integrity: sha512-UvApLEGholmxw/HIwmUnLq3CwdydbhaHHllvWiCTNbyGom7wTwOtz5OAQbAKZYyiEOeIXZNPkM7nA4Dtng7CLw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1':
+ resolution: {integrity: sha512-uVctNgZHiGnJx5Fij7wHLhgw4uyZBVi6mykeWKOqE7bVy9Hcxn0fM/IuqdMwk6hXlaf9fFShDTFz2+YejP+x0A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.1':
+ resolution: {integrity: sha512-T6Eg0xWwcxd/MzBcuv4Z37YVbUbJxy5cMNnbIt/Yr99wFwli30O4BPlY8hKeGyn6lWNtU0QioBS46lVzDN38bg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.1':
+ resolution: {integrity: sha512-PuGZVS2xNJyLADeh2F04b+Cz4NwvpglbtWACgrDOa5YDTEHKwmiTDjoD5eZ9/ptXtcpeFrMqD2H4Zn33KAh1Eg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.1':
+ resolution: {integrity: sha512-2mOxY562ihHlz9lEXuaGEIDCZ1vI+zyFdtsoa3M62xsEunDXQE+DVPO4S4x5MPK9tKulG/aFcA/IH5eVN257Cw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1':
+ resolution: {integrity: sha512-oQVOP5cfAWZwRD0Q3nGn/cA9FW3KhMMuQ0NIndALAe6obqjLhqYVYDiGGRGrxvnjJsVbpLwR14gIUYnpIcHR1g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1':
+ resolution: {integrity: sha512-Ydsxxx++FNOuov3wCBPaYjZrEvKOOGq3k+BF4BPridhg2pENfitSRD2TEuQ8i33bp5VptuNdC9IzxRKU031z5A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.1':
+ resolution: {integrity: sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==}
+
+ '@rollup/rollup-android-arm-eabi@4.57.1':
+ resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.57.1':
+ resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.57.1':
+ resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.57.1':
+ resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.57.1':
+ resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.57.1':
+ resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.57.1':
+ resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.57.1':
+ resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.57.1':
+ resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.57.1':
+ resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.57.1':
+ resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-musl@4.57.1':
+ resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.57.1':
+ resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-musl@4.57.1':
+ resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.57.1':
+ resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.57.1':
+ resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.57.1':
+ resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.57.1':
+ resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.57.1':
+ resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openbsd-x64@4.57.1':
+ resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.57.1':
+ resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.57.1':
+ resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.57.1':
+ resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.57.1':
+ resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.57.1':
+ resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@shikijs/engine-oniguruma@3.22.0':
+ resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==}
+
+ '@shikijs/langs@3.22.0':
+ resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==}
+
+ '@shikijs/themes@3.22.0':
+ resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==}
+
+ '@shikijs/types@3.22.0':
+ resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
+ '@tweenjs/tween.js@23.1.3':
+ resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
+
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+ '@types/css-font-loading-module@0.0.12':
+ resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==}
+
+ '@types/earcut@3.0.0':
+ resolution: {integrity: sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/jsesc@2.5.1':
+ resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==}
+
+ '@types/node@22.19.7':
+ resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==}
+
+ '@types/node@25.0.10':
+ resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==}
+
+ '@types/seedrandom@3.0.8':
+ resolution: {integrity: sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==}
+
+ '@types/stats.js@0.17.4':
+ resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==}
+
+ '@types/three@0.182.0':
+ resolution: {integrity: sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/webxr@0.5.24':
+ resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==}
+
+ '@webgpu/types@0.1.69':
+ resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==}
+
+ '@xmldom/xmldom@0.8.11':
+ resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==}
+ engines: {node: '>=10.0.0'}
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ansis@4.2.0:
+ resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+ engines: {node: '>=14'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ ast-kit@3.0.0-beta.1:
+ resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==}
+ engines: {node: '>=20.19.0'}
+
+ axios@0.26.1:
+ resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ binary-install@1.1.2:
+ resolution: {integrity: sha512-ZS2cqFHPZOy4wLxvzqfQvDjCOifn+7uCPqNmYRIBM/03+yllON+4fNnsD0VJdW0p97y+E+dTRNPStWNqMBq+9g==}
+ engines: {node: '>=10'}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
+ birpc@4.0.0:
+ resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ chownr@2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ dts-resolver@2.1.3:
+ resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ oxc-resolver: '>=11.0.0'
+ peerDependenciesMeta:
+ oxc-resolver:
+ optional: true
+
+ earcut@3.0.2:
+ resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==}
+
+ empathic@2.0.0:
+ resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+ engines: {node: '>=14'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ esbuild@0.27.2:
+ resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fflate@0.8.2:
+ resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
+
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ get-tsconfig@4.13.1:
+ resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==}
+
+ gifuct-js@2.1.2:
+ resolution: {integrity: sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ hash-wasm@4.12.0:
+ resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==}
+
+ hookable@6.0.1:
+ resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==}
+
+ import-without-cache@0.2.5:
+ resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==}
+ engines: {node: '>=20.19.0'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ismobilejs@1.1.1:
+ resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==}
+
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
+ js-binary-schema-parser@2.0.3:
+ resolution: {integrity: sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==}
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ lil-gui@0.21.0:
+ resolution: {integrity: sha512-tpvxN7v1GvE/Tv+GRopfOp0W7fVEjF4PltkuX8vOCIfim22rD1ztvfkoEMcv9lzQeuNUSeIrUmUjBwmlW/oUew==}
+
+ linkify-it@5.0.0:
+ resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
+
+ lunr@2.3.9:
+ resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
+
+ markdown-it@14.1.0:
+ resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
+ hasBin: true
+
+ mdurl@2.0.0:
+ resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
+
+ meshoptimizer@0.22.0:
+ resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
+ minizlib@2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ obug@2.1.1:
+ resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ oxfmt@0.27.0:
+ resolution: {integrity: sha512-FHR0HR3WeMKBuVEQvW3EeiRZXs/cQzNHxGbhCoAIEPr1FVcOa9GCqrKJXPqv2jkzmCg6Wqot+DvN9RzemyFJhw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ oxlint@1.42.0:
+ resolution: {integrity: sha512-qnspC/lrp8FgKNaONLLn14dm+W5t0SSlus6V5NJpgI2YNT1tkFYZt4fBf14ESxf9AAh98WBASnW5f0gtw462Lg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ oxlint-tsgolint: '>=0.11.2'
+ peerDependenciesMeta:
+ oxlint-tsgolint:
+ optional: true
+
+ parse-svg-path@0.1.2:
+ resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pixi-viewport@6.0.3:
+ resolution: {integrity: sha512-2+qPJ0/n+8hQYhWvY+795+x9y3MiUrCOWacK0DY53whowWaGdx9iDocy7z1pBwjkZhC52YvrJQuZKK0sdVLtBw==}
+ peerDependencies:
+ pixi.js: '>=8'
+
+ pixi.js@8.15.0:
+ resolution: {integrity: sha512-J/Ghze/K9fjHRlfwC2EMZ7vnMIhGo4ByKCsKMcS0AB12iT79nf9zzWKUTzMJ8QAQFqQfDOl5ULwmHMUdeih2zQ==}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ punycode.js@2.3.1:
+ resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
+ engines: {node: '>=6'}
+
+ quansync@1.0.0:
+ resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rolldown-plugin-dts@0.21.8:
+ resolution: {integrity: sha512-czOQoe6eZpRKCv9P+ijO/v4A2TwQjASAV7qezUxRZSua06Yb2REPIZv/mbfXiZDP1ZfI7Ez7re7qfK9F9u0Epw==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ '@ts-macro/tsc': ^0.3.6
+ '@typescript/native-preview': '>=7.0.0-dev.20250601.1'
+ rolldown: ^1.0.0-beta.57
+ typescript: ^5.0.0
+ vue-tsc: ~3.2.0
+ peerDependenciesMeta:
+ '@ts-macro/tsc':
+ optional: true
+ '@typescript/native-preview':
+ optional: true
+ typescript:
+ optional: true
+ vue-tsc:
+ optional: true
+
+ rolldown@1.0.0-rc.1:
+ resolution: {integrity: sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ rollup@4.57.1:
+ resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ seedrandom@3.0.5:
+ resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ stats.js@0.17.0:
+ resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==}
+
+ tar@6.2.1:
+ resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+ engines: {node: '>=10'}
+ deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me
+
+ terser@5.46.0:
+ resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ three@0.182.0:
+ resolution: {integrity: sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==}
+
+ tiny-lru@11.4.7:
+ resolution: {integrity: sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw==}
+ engines: {node: '>=12'}
+
+ tinyexec@1.0.2:
+ resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+ engines: {node: '>=18'}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@2.0.0:
+ resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
+ tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
+
+ tsdown@0.20.1:
+ resolution: {integrity: sha512-Wo1BzqNQVZ6SFQV8rjQBwMmNubO+yV3F+vp2WNTjEaS4S5CT1C1dHtUbeFMrCEasZpGy5w6TshpehNnfTe8QBQ==}
+ engines: {node: '>=20.19.0'}
+ hasBin: true
+ peerDependencies:
+ '@arethetypeswrong/core': ^0.18.1
+ '@vitejs/devtools': '*'
+ publint: ^0.3.0
+ typescript: ^5.0.0
+ unplugin-lightningcss: ^0.4.0
+ unplugin-unused: ^0.5.0
+ peerDependenciesMeta:
+ '@arethetypeswrong/core':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ publint:
+ optional: true
+ typescript:
+ optional: true
+ unplugin-lightningcss:
+ optional: true
+ unplugin-unused:
+ optional: true
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.21.0:
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ typedoc@0.28.16:
+ resolution: {integrity: sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==}
+ engines: {node: '>= 18', pnpm: '>= 10'}
+ hasBin: true
+ peerDependencies:
+ typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uc.micro@2.1.0:
+ resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+
+ unconfig-core@7.4.2:
+ resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ unrun@0.2.26:
+ resolution: {integrity: sha512-A3DQLBcDyTui4Hlaoojkldg+8x+CIR+tcSHY0wzW+CgB4X/DNyH58jJpXp1B/EkE+yG6tU8iH1mWsLtwFU3IQg==}
+ engines: {node: '>=20.19.0'}
+ hasBin: true
+ peerDependencies:
+ synckit: ^0.11.11
+ peerDependenciesMeta:
+ synckit:
+ optional: true
+
+ vite-plugin-wasm@3.5.0:
+ resolution: {integrity: sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==}
+ peerDependencies:
+ vite: ^2 || ^3 || ^4 || ^5 || ^6 || ^7
+
+ vite@7.3.1:
+ resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ wasm-pack@0.14.0:
+ resolution: {integrity: sha512-7uKj+483b6ETTnuWHK3zKNB3Ca3M159tPZ5shyXxI4j7i9Lk82rL2ck/L6E9O5VMWk9JgowdtTBOSfWmGBRFtw==}
+ hasBin: true
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@2.8.2:
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+snapshots:
+
+ '@babel/generator@8.0.0-beta.4':
+ dependencies:
+ '@babel/parser': 8.0.0-beta.4
+ '@babel/types': 8.0.0-beta.4
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ '@types/jsesc': 2.5.1
+ jsesc: 3.1.0
+
+ '@babel/helper-string-parser@8.0.0-beta.4': {}
+
+ '@babel/helper-validator-identifier@8.0.0-beta.4': {}
+
+ '@babel/parser@8.0.0-beta.4':
+ dependencies:
+ '@babel/types': 8.0.0-beta.4
+
+ '@babel/types@8.0.0-beta.4':
+ dependencies:
+ '@babel/helper-string-parser': 8.0.0-beta.4
+ '@babel/helper-validator-identifier': 8.0.0-beta.4
+
+ '@dimforge/rapier2d-compat@0.19.3': {}
+
+ '@dimforge/rapier2d-simd-compat@0.19.3': {}
+
+ '@dimforge/rapier3d-compat@0.12.0': {}
+
+ '@dimforge/rapier3d-compat@0.19.3': {}
+
+ '@dimforge/rapier3d-simd-compat@0.19.3': {}
+
+ '@emnapi/core@1.8.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.8.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.27.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/android-arm@0.27.2':
+ optional: true
+
+ '@esbuild/android-x64@0.27.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.2':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.2':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.2':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.2':
+ optional: true
+
+ '@gerrit0/mini-shiki@3.22.0':
+ dependencies:
+ '@shikijs/engine-oniguruma': 3.22.0
+ '@shikijs/langs': 3.22.0
+ '@shikijs/themes': 3.22.0
+ '@shikijs/types': 3.22.0
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@napi-rs/wasm-runtime@1.1.1':
+ dependencies:
+ '@emnapi/core': 1.8.1
+ '@emnapi/runtime': 1.8.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
+ '@oxc-project/types@0.110.0': {}
+
+ '@oxfmt/darwin-arm64@0.27.0':
+ optional: true
+
+ '@oxfmt/darwin-x64@0.27.0':
+ optional: true
+
+ '@oxfmt/linux-arm64-gnu@0.27.0':
+ optional: true
+
+ '@oxfmt/linux-arm64-musl@0.27.0':
+ optional: true
+
+ '@oxfmt/linux-x64-gnu@0.27.0':
+ optional: true
+
+ '@oxfmt/linux-x64-musl@0.27.0':
+ optional: true
+
+ '@oxfmt/win32-arm64@0.27.0':
+ optional: true
+
+ '@oxfmt/win32-x64@0.27.0':
+ optional: true
+
+ '@oxlint/darwin-arm64@1.42.0':
+ optional: true
+
+ '@oxlint/darwin-x64@1.42.0':
+ optional: true
+
+ '@oxlint/linux-arm64-gnu@1.42.0':
+ optional: true
+
+ '@oxlint/linux-arm64-musl@1.42.0':
+ optional: true
+
+ '@oxlint/linux-x64-gnu@1.42.0':
+ optional: true
+
+ '@oxlint/linux-x64-musl@1.42.0':
+ optional: true
+
+ '@oxlint/win32-arm64@1.42.0':
+ optional: true
+
+ '@oxlint/win32-x64@1.42.0':
+ optional: true
+
+ '@pixi/colord@2.9.6': {}
+
+ '@quansync/fs@1.0.0':
+ dependencies:
+ quansync: 1.0.0
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.1':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.1.1
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.1': {}
+
+ '@rollup/rollup-android-arm-eabi@4.57.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.57.1':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.57.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.57.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.57.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.57.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.57.1':
+ optional: true
+
+ '@shikijs/engine-oniguruma@3.22.0':
+ dependencies:
+ '@shikijs/types': 3.22.0
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@3.22.0':
+ dependencies:
+ '@shikijs/types': 3.22.0
+
+ '@shikijs/themes@3.22.0':
+ dependencies:
+ '@shikijs/types': 3.22.0
+
+ '@shikijs/types@3.22.0':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
+ '@tweenjs/tween.js@23.1.3': {}
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/css-font-loading-module@0.0.12': {}
+
+ '@types/earcut@3.0.0': {}
+
+ '@types/estree@1.0.8': {}
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/jsesc@2.5.1': {}
+
+ '@types/node@22.19.7':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/node@25.0.10':
+ dependencies:
+ undici-types: 7.16.0
+ optional: true
+
+ '@types/seedrandom@3.0.8': {}
+
+ '@types/stats.js@0.17.4': {}
+
+ '@types/three@0.182.0':
+ dependencies:
+ '@dimforge/rapier3d-compat': 0.12.0
+ '@tweenjs/tween.js': 23.1.3
+ '@types/stats.js': 0.17.4
+ '@types/webxr': 0.5.24
+ '@webgpu/types': 0.1.69
+ fflate: 0.8.2
+ meshoptimizer: 0.22.0
+
+ '@types/unist@3.0.3': {}
+
+ '@types/webxr@0.5.24': {}
+
+ '@webgpu/types@0.1.69': {}
+
+ '@xmldom/xmldom@0.8.11': {}
+
+ acorn@8.15.0:
+ optional: true
+
+ ansis@4.2.0: {}
+
+ argparse@2.0.1: {}
+
+ ast-kit@3.0.0-beta.1:
+ dependencies:
+ '@babel/parser': 8.0.0-beta.4
+ estree-walker: 3.0.3
+ pathe: 2.0.3
+
+ axios@0.26.1:
+ dependencies:
+ follow-redirects: 1.15.11
+ transitivePeerDependencies:
+ - debug
+
+ balanced-match@1.0.2: {}
+
+ base64-js@1.5.1: {}
+
+ binary-install@1.1.2:
+ dependencies:
+ axios: 0.26.1
+ rimraf: 3.0.2
+ tar: 6.2.1
+ transitivePeerDependencies:
+ - debug
+
+ birpc@4.0.0: {}
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ buffer-from@1.1.2:
+ optional: true
+
+ cac@6.7.14: {}
+
+ chownr@2.0.0: {}
+
+ commander@2.20.3:
+ optional: true
+
+ concat-map@0.0.1: {}
+
+ defu@6.1.4: {}
+
+ dts-resolver@2.1.3: {}
+
+ earcut@3.0.2: {}
+
+ empathic@2.0.0: {}
+
+ entities@4.5.0: {}
+
+ esbuild@0.27.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.2
+ '@esbuild/android-arm': 0.27.2
+ '@esbuild/android-arm64': 0.27.2
+ '@esbuild/android-x64': 0.27.2
+ '@esbuild/darwin-arm64': 0.27.2
+ '@esbuild/darwin-x64': 0.27.2
+ '@esbuild/freebsd-arm64': 0.27.2
+ '@esbuild/freebsd-x64': 0.27.2
+ '@esbuild/linux-arm': 0.27.2
+ '@esbuild/linux-arm64': 0.27.2
+ '@esbuild/linux-ia32': 0.27.2
+ '@esbuild/linux-loong64': 0.27.2
+ '@esbuild/linux-mips64el': 0.27.2
+ '@esbuild/linux-ppc64': 0.27.2
+ '@esbuild/linux-riscv64': 0.27.2
+ '@esbuild/linux-s390x': 0.27.2
+ '@esbuild/linux-x64': 0.27.2
+ '@esbuild/netbsd-arm64': 0.27.2
+ '@esbuild/netbsd-x64': 0.27.2
+ '@esbuild/openbsd-arm64': 0.27.2
+ '@esbuild/openbsd-x64': 0.27.2
+ '@esbuild/openharmony-arm64': 0.27.2
+ '@esbuild/sunos-x64': 0.27.2
+ '@esbuild/win32-arm64': 0.27.2
+ '@esbuild/win32-ia32': 0.27.2
+ '@esbuild/win32-x64': 0.27.2
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ eventemitter3@5.0.4: {}
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ fflate@0.8.2: {}
+
+ follow-redirects@1.15.11: {}
+
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ get-tsconfig@4.13.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ gifuct-js@2.1.2:
+ dependencies:
+ js-binary-schema-parser: 2.0.3
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ hash-wasm@4.12.0: {}
+
+ hookable@6.0.1: {}
+
+ import-without-cache@0.2.5: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ismobilejs@1.1.1: {}
+
+ jiti@2.6.1:
+ optional: true
+
+ js-binary-schema-parser@2.0.3: {}
+
+ jsesc@3.1.0: {}
+
+ lil-gui@0.21.0: {}
+
+ linkify-it@5.0.0:
+ dependencies:
+ uc.micro: 2.1.0
+
+ lunr@2.3.9: {}
+
+ markdown-it@14.1.0:
+ dependencies:
+ argparse: 2.0.1
+ entities: 4.5.0
+ linkify-it: 5.0.0
+ mdurl: 2.0.0
+ punycode.js: 2.3.1
+ uc.micro: 2.1.0
+
+ mdurl@2.0.0: {}
+
+ meshoptimizer@0.22.0: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@5.0.0: {}
+
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ mkdirp@1.0.4: {}
+
+ nanoid@3.3.11: {}
+
+ obug@2.1.1: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ oxfmt@0.27.0:
+ dependencies:
+ tinypool: 2.0.0
+ optionalDependencies:
+ '@oxfmt/darwin-arm64': 0.27.0
+ '@oxfmt/darwin-x64': 0.27.0
+ '@oxfmt/linux-arm64-gnu': 0.27.0
+ '@oxfmt/linux-arm64-musl': 0.27.0
+ '@oxfmt/linux-x64-gnu': 0.27.0
+ '@oxfmt/linux-x64-musl': 0.27.0
+ '@oxfmt/win32-arm64': 0.27.0
+ '@oxfmt/win32-x64': 0.27.0
+
+ oxlint@1.42.0:
+ optionalDependencies:
+ '@oxlint/darwin-arm64': 1.42.0
+ '@oxlint/darwin-x64': 1.42.0
+ '@oxlint/linux-arm64-gnu': 1.42.0
+ '@oxlint/linux-arm64-musl': 1.42.0
+ '@oxlint/linux-x64-gnu': 1.42.0
+ '@oxlint/linux-x64-musl': 1.42.0
+ '@oxlint/win32-arm64': 1.42.0
+ '@oxlint/win32-x64': 1.42.0
+
+ parse-svg-path@0.1.2: {}
+
+ path-is-absolute@1.0.1: {}
+
+ pathe@2.0.3: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@4.0.3: {}
+
+ pixi-viewport@6.0.3(pixi.js@8.15.0):
+ dependencies:
+ pixi.js: 8.15.0
+
+ pixi.js@8.15.0:
+ dependencies:
+ '@pixi/colord': 2.9.6
+ '@types/css-font-loading-module': 0.0.12
+ '@types/earcut': 3.0.0
+ '@webgpu/types': 0.1.69
+ '@xmldom/xmldom': 0.8.11
+ earcut: 3.0.2
+ eventemitter3: 5.0.4
+ gifuct-js: 2.1.2
+ ismobilejs: 1.1.1
+ parse-svg-path: 0.1.2
+ tiny-lru: 11.4.7
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ punycode.js@2.3.1: {}
+
+ quansync@1.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rolldown-plugin-dts@0.21.8(rolldown@1.0.0-rc.1)(typescript@5.9.3):
+ dependencies:
+ '@babel/generator': 8.0.0-beta.4
+ '@babel/parser': 8.0.0-beta.4
+ '@babel/types': 8.0.0-beta.4
+ ast-kit: 3.0.0-beta.1
+ birpc: 4.0.0
+ dts-resolver: 2.1.3
+ get-tsconfig: 4.13.1
+ obug: 2.1.1
+ rolldown: 1.0.0-rc.1
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - oxc-resolver
+
+ rolldown@1.0.0-rc.1:
+ dependencies:
+ '@oxc-project/types': 0.110.0
+ '@rolldown/pluginutils': 1.0.0-rc.1
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.1
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.1
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.1
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.1
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.1
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.1
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.1
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.1
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.1
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.1
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.1
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.1
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.1
+
+ rollup@4.57.1:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.57.1
+ '@rollup/rollup-android-arm64': 4.57.1
+ '@rollup/rollup-darwin-arm64': 4.57.1
+ '@rollup/rollup-darwin-x64': 4.57.1
+ '@rollup/rollup-freebsd-arm64': 4.57.1
+ '@rollup/rollup-freebsd-x64': 4.57.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.57.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.57.1
+ '@rollup/rollup-linux-arm64-gnu': 4.57.1
+ '@rollup/rollup-linux-arm64-musl': 4.57.1
+ '@rollup/rollup-linux-loong64-gnu': 4.57.1
+ '@rollup/rollup-linux-loong64-musl': 4.57.1
+ '@rollup/rollup-linux-ppc64-gnu': 4.57.1
+ '@rollup/rollup-linux-ppc64-musl': 4.57.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.57.1
+ '@rollup/rollup-linux-riscv64-musl': 4.57.1
+ '@rollup/rollup-linux-s390x-gnu': 4.57.1
+ '@rollup/rollup-linux-x64-gnu': 4.57.1
+ '@rollup/rollup-linux-x64-musl': 4.57.1
+ '@rollup/rollup-openbsd-x64': 4.57.1
+ '@rollup/rollup-openharmony-arm64': 4.57.1
+ '@rollup/rollup-win32-arm64-msvc': 4.57.1
+ '@rollup/rollup-win32-ia32-msvc': 4.57.1
+ '@rollup/rollup-win32-x64-gnu': 4.57.1
+ '@rollup/rollup-win32-x64-msvc': 4.57.1
+ fsevents: 2.3.3
+
+ seedrandom@3.0.5: {}
+
+ semver@7.7.3: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ optional: true
+
+ source-map@0.6.1:
+ optional: true
+
+ stats.js@0.17.0: {}
+
+ tar@6.2.1:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
+ terser@5.46.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.15.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+ optional: true
+
+ three@0.182.0: {}
+
+ tiny-lru@11.4.7: {}
+
+ tinyexec@1.0.2: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tinypool@2.0.0: {}
+
+ tree-kill@1.2.2: {}
+
+ tsdown@0.20.1(typescript@5.9.3):
+ dependencies:
+ ansis: 4.2.0
+ cac: 6.7.14
+ defu: 6.1.4
+ empathic: 2.0.0
+ hookable: 6.0.1
+ import-without-cache: 0.2.5
+ obug: 2.1.1
+ picomatch: 4.0.3
+ rolldown: 1.0.0-rc.1
+ rolldown-plugin-dts: 0.21.8(rolldown@1.0.0-rc.1)(typescript@5.9.3)
+ semver: 7.7.3
+ tinyexec: 1.0.2
+ tinyglobby: 0.2.15
+ tree-kill: 1.2.2
+ unconfig-core: 7.4.2
+ unrun: 0.2.26
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - '@ts-macro/tsc'
+ - '@typescript/native-preview'
+ - oxc-resolver
+ - synckit
+ - vue-tsc
+
+ tslib@2.8.1:
+ optional: true
+
+ tsx@4.21.0:
+ dependencies:
+ esbuild: 0.27.2
+ get-tsconfig: 4.13.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ typedoc@0.28.16(typescript@5.7.3):
+ dependencies:
+ '@gerrit0/mini-shiki': 3.22.0
+ lunr: 2.3.9
+ markdown-it: 14.1.0
+ minimatch: 9.0.5
+ typescript: 5.7.3
+ yaml: 2.8.2
+
+ typescript@5.7.3: {}
+
+ typescript@5.9.3: {}
+
+ uc.micro@2.1.0: {}
+
+ unconfig-core@7.4.2:
+ dependencies:
+ '@quansync/fs': 1.0.0
+ quansync: 1.0.0
+
+ undici-types@6.21.0: {}
+
+ undici-types@7.16.0:
+ optional: true
+
+ unrun@0.2.26:
+ dependencies:
+ rolldown: 1.0.0-rc.1
+
+ vite-plugin-wasm@3.5.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+ dependencies:
+ vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+ vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+ dependencies:
+ esbuild: 0.27.2
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.57.1
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 25.0.10
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ terser: 5.46.0
+ tsx: 4.21.0
+ yaml: 2.8.2
+
+ wasm-pack@0.14.0:
+ dependencies:
+ binary-install: 1.1.2
+ transitivePeerDependencies:
+ - debug
+
+ wrappy@1.0.2: {}
+
+ yallist@4.0.0: {}
+
+ yaml@2.8.2: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 00000000..acb886a1
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,5 @@
+packages:
+ - packages/*
+
+ignoredBuiltDependencies:
+ - wasm-pack
diff --git a/publish_all_canary.sh b/publish_all_canary.sh
deleted file mode 100755
index 21155429..00000000
--- a/publish_all_canary.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-for entry in builds/*/pkg
-do
- (
- echo "Publishing $entry"
- cd $entry; npm version 0.0.0-$(git rev-parse --short HEAD)-$(date '+%Y%m%d') --git-tag-version false;
- npm publish --tag canary --access public;
- )
-done;
-
-for entry in rapier-compat/builds/*/pkg
-do
- (
- echo "Publishing $entry"
- cd $entry; npm version 0.0.0-$(git rev-parse --short HEAD)-$(date '+%Y%m%d') --git-tag-version false;
- npm publish --tag canary --access public;
- )
-done;
\ No newline at end of file
diff --git a/publish_all_prod.sh b/publish_all_prod.sh
deleted file mode 100755
index f04915cb..00000000
--- a/publish_all_prod.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-for entry in builds/*/pkg
-do
- (
- echo "Publishing $entry"
- cd $entry;
- npm publish --access public;
- )
-done;
-
-for entry in rapier-compat/builds/*/pkg
-do
- (
- echo "Publishing $entry"
- cd $entry;
- npm publish --access public;
- )
-done;
\ No newline at end of file
diff --git a/rapier-compat/README.md b/rapier-compat/README.md
deleted file mode 100644
index 5d440ec2..00000000
--- a/rapier-compat/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# tsconfig json files
-
-- tsconfig.common.json - shared TypeScript options
-- tsconfig.pkg2d.json - config for compiling rapier2d-compat
-- tsconfig.pkg3d.json - config for compiling rapier3d-compat
-- tconfig.json - for IDE (VSCode) and unit tests. Includes Jest types.
-
-## Generation steps
-
-Check `./package.json scripts`, which are used by CI.
-
-Summary:
-
-- build rust wasm projects into their dedicated folder in `./builds/`
-- copy common javascript and generate dimension specific javascript into a common `./pkg` folder
-- copy that `pkg` folder in each folder from `./builds`
diff --git a/rapier-compat/build-rust.sh b/rapier-compat/build-rust.sh
deleted file mode 100755
index 2acd18f8..00000000
--- a/rapier-compat/build-rust.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash
-
-
-help()
-{
- printf "Usage: %s: [-d 2|3] [-f deterministim|non-deterministic|simd]\n" $0
-}
-
-while getopts :d:f: name
-do
- case $name in
- d)
- dimension="$OPTARG";;
- f)
- feature="$OPTARG";;
- ?) help ; exit 1;;
- esac
-done
-
-if [[ -z "$dimension" ]]; then
- help; exit 2;
-fi
-if [[ -z "$feature" ]]; then
- help; exit 3;
-fi
-
-if [[ $feature == "non-deterministic" ]]; then
- feature_postfix=""
-else
- feature_postfix="-${feature}"
-fi
-
-rust_source_directory="../builds/rapier${dimension}d${feature_postfix}"
-
-if [ ! -d "$rust_source_directory" ]; then
- echo "Directory $rust_source_directory does not exist";
- echo "You may want to generate rust projects first.";
- help
- exit 4;
-fi
-
-# Working dir in wasm-pack is the project root so we need that "../../"
-
-if [[ $feature == "simd" ]]; then
- export additional_rustflags='-C target-feature=+simd128'
-else
- export additional_rustflags=''
-fi
-
-RUSTFLAGS="${additional_rustflags}" wasm-pack --verbose build --target web --out-dir "../../rapier-compat/builds/${dimension}d${feature_postfix}/wasm-build" "$rust_source_directory"
diff --git a/rapier-compat/fix_raw_file.sh b/rapier-compat/fix_raw_file.sh
deleted file mode 100644
index 66f8bfaf..00000000
--- a/rapier-compat/fix_raw_file.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-for feature in \
-2d 2d-deterministic 2d-simd \
-3d 3d-deterministic 3d-simd
-do
-
-echo 'export * from "'"./rapier_wasm$feature"'"' > builds/${feature}/pkg/raw.d.ts
-echo 'export * from "'"./rapier_wasm$feature"'"' > builds/${feature}/pkg/raw.d.ts
-
-done;
\ No newline at end of file
diff --git a/rapier-compat/gen_src.sh b/rapier-compat/gen_src.sh
deleted file mode 100755
index 24ccc441..00000000
--- a/rapier-compat/gen_src.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copy source and remove #if sections - similar to script in ../rapierXd
-set -e
-
-gen_js() {
- DIM=$1
- GENOUT="./gen${DIM}"
-
- # Make output directories
- mkdir -p ${GENOUT}
-
- # Copy common sources
- cp -r ../src.ts/* $GENOUT
-
- # Copy compat mode override sources
- rm -f "${GENOUT}/raw.ts" "${GENOUT}/init.ts"
- cp -r ./src${DIM}/* $GENOUT
-}
-
-gen_js "2d"
-gen_js "3d"
-
-# See https://serverfault.com/a/137848
-find gen2d/ -type f -print0 | LC_ALL=C xargs -0 sed -i.bak '\:#if DIM3:,\:#endif:d'
-find gen3d/ -type f -print0 | LC_ALL=C xargs -0 sed -i.bak '\:#if DIM2:,\:#endif:d'
-
-# Clean up backup files.
-find gen2d/ -type f -name '*.bak' | xargs rm
-find gen3d/ -type f -name '*.bak' | xargs rm
-
-for features_set in \
-"2" "2 deterministic" "2 simd" \
-"3" "3 deterministic" "3 simd"
-do
-
- set -- $features_set # Convert the "tuple" into the param args $1 $2...
- dimension=$1
- if [ -z "$2" ]; then
- feature="${1}d";
- else
- feature="${1}d-${2}";
- fi
-
- mkdir -p ./builds/${feature}/pkg/
-
- cp ./builds/${feature}/wasm-build/rapier_wasm* ./builds/${feature}/pkg/
- cp -r ./gen${dimension}d ./builds/${feature}/
-
- # copy tsconfig, as they contain paths
- cp ./tsconfig.common.json ./tsconfig.json ./builds/${feature}/
- cp ./tsconfig.pkg${dimension}d.json ./builds/${feature}/tsconfig.pkg.json
-
- # "import.meta" causes Babel to choke, but the code path is never taken so just remove it.
- sed -i.bak 's/import.meta.url/""/g' ./builds/${feature}/pkg/rapier_wasm${dimension}d.js
-
- # Clean up backup files.
- find ./builds/${feature}/pkg/ -type f -name '*.bak' | xargs rm
-
-done
diff --git a/rapier-compat/package-lock.json b/rapier-compat/package-lock.json
deleted file mode 100644
index 22b6f023..00000000
--- a/rapier-compat/package-lock.json
+++ /dev/null
@@ -1,10500 +0,0 @@
-{
- "name": "build-rapier",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "build-rapier",
- "dependencies": {
- "base64-js": "^1.5.1"
- },
- "devDependencies": {
- "@rollup/plugin-commonjs": "^23.0.2",
- "@rollup/plugin-node-resolve": "^15.0.1",
- "@rollup/plugin-terser": "0.1.0",
- "@rollup/plugin-typescript": "^9.0.2",
- "@types/jest": "^29.2.1",
- "jest": "^29.2.2",
- "rimraf": "^3.0.2",
- "rollup": "^3.2.5",
- "rollup-plugin-base64": "^1.0.1",
- "rollup-plugin-copy": "^3.4.0",
- "rollup-plugin-filesize": "^9.1.2",
- "ts-jest": "^29.0.3",
- "tslib": "^2.4.1",
- "typescript": "^4.8.4"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.1.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
- "dev": true,
- "dependencies": {
- "@babel/highlight": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
- "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.19.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
- "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.6",
- "@babel/helper-compilation-targets": "^7.19.3",
- "@babel/helper-module-transforms": "^7.19.6",
- "@babel/helpers": "^7.19.4",
- "@babel/parser": "^7.19.6",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.6",
- "@babel/types": "^7.19.4",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.1.tgz",
- "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.0",
- "@jridgewell/gen-mapping": "^0.3.2",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
- "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.20.0",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.21.3",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
- "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.18.10",
- "@babel/types": "^7.19.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.19.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
- "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.19.4",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.6",
- "@babel/types": "^7.19.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz",
- "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
- "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.19.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
- "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
- "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.1",
- "@babel/types": "^7.20.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.1.tgz",
- "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.19.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
- "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
- "dev": true,
- "dependencies": {
- "regenerator-runtime": "^0.13.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
- "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.10",
- "@babel/types": "^7.18.10"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
- "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.1",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.19.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.20.1",
- "@babel/types": "^7.20.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
- "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true
- },
- "node_modules/@gar/promisify": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
- "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
- "dev": true
- },
- "node_modules/@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "dev": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/console": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz",
- "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/core": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.2.tgz",
- "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==",
- "dev": true,
- "dependencies": {
- "@jest/console": "^29.2.1",
- "@jest/reporters": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.2.0",
- "jest-config": "^29.2.2",
- "jest-haste-map": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-resolve-dependencies": "^29.2.2",
- "jest-runner": "^29.2.2",
- "jest-runtime": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "jest-watcher": "^29.2.2",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/environment": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.2.2.tgz",
- "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==",
- "dev": true,
- "dependencies": {
- "@jest/fake-timers": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-mock": "^29.2.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/expect": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.2.tgz",
- "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==",
- "dev": true,
- "dependencies": {
- "expect": "^29.2.2",
- "jest-snapshot": "^29.2.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/expect-utils": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.2.tgz",
- "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==",
- "dev": true,
- "dependencies": {
- "jest-get-type": "^29.2.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/fake-timers": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.2.2.tgz",
- "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "@sinonjs/fake-timers": "^9.1.2",
- "@types/node": "*",
- "jest-message-util": "^29.2.1",
- "jest-mock": "^29.2.2",
- "jest-util": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/globals": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.2.tgz",
- "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==",
- "dev": true,
- "dependencies": {
- "@jest/environment": "^29.2.2",
- "@jest/expect": "^29.2.2",
- "@jest/types": "^29.2.1",
- "jest-mock": "^29.2.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/reporters": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.2.tgz",
- "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==",
- "dev": true,
- "dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.2.1",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@jridgewell/trace-mapping": "^0.3.15",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^5.1.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "jest-worker": "^29.2.1",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/schemas": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
- "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
- "dev": true,
- "dependencies": {
- "@sinclair/typebox": "^0.24.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/source-map": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
- "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.15",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/test-result": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz",
- "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==",
- "dev": true,
- "dependencies": {
- "@jest/console": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/test-sequencer": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz",
- "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==",
- "dev": true,
- "dependencies": {
- "@jest/test-result": "^29.2.1",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/transform": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.2.tgz",
- "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.2.1",
- "@jridgewell/trace-mapping": "^0.3.15",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^1.4.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.2.1",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/types": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz",
- "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.0.0",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@npmcli/fs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
- "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
- "dev": true,
- "dependencies": {
- "@gar/promisify": "^1.0.1",
- "semver": "^7.3.5"
- }
- },
- "node_modules/@npmcli/fs/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@npmcli/git": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
- "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==",
- "dev": true,
- "dependencies": {
- "@npmcli/promise-spawn": "^1.3.2",
- "lru-cache": "^6.0.0",
- "mkdirp": "^1.0.4",
- "npm-pick-manifest": "^6.1.1",
- "promise-inflight": "^1.0.1",
- "promise-retry": "^2.0.1",
- "semver": "^7.3.5",
- "which": "^2.0.2"
- }
- },
- "node_modules/@npmcli/git/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@npmcli/installed-package-contents": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz",
- "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==",
- "dev": true,
- "dependencies": {
- "npm-bundled": "^1.1.1",
- "npm-normalize-package-bin": "^1.0.1"
- },
- "bin": {
- "installed-package-contents": "index.js"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "dev": true,
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@npmcli/node-gyp": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz",
- "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==",
- "dev": true
- },
- "node_modules/@npmcli/promise-spawn": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz",
- "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==",
- "dev": true,
- "dependencies": {
- "infer-owner": "^1.0.4"
- }
- },
- "node_modules/@npmcli/run-script": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz",
- "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==",
- "dev": true,
- "dependencies": {
- "@npmcli/node-gyp": "^1.0.2",
- "@npmcli/promise-spawn": "^1.3.2",
- "node-gyp": "^7.1.0",
- "read-package-json-fast": "^2.0.1"
- }
- },
- "node_modules/@rollup/plugin-commonjs": {
- "version": "23.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.2.tgz",
- "integrity": "sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.2",
- "glob": "^8.0.3",
- "is-reference": "1.2.1",
- "magic-string": "^0.26.4"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.68.0||^3.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@rollup/plugin-commonjs/node_modules/glob": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
- "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
- "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "@types/resolve": "1.20.2",
- "deepmerge": "^4.2.2",
- "is-builtin-module": "^3.2.0",
- "is-module": "^1.0.0",
- "resolve": "^1.22.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.78.0||^3.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-terser": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.1.0.tgz",
- "integrity": "sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==",
- "dev": true,
- "dependencies": {
- "terser": "^5.15.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.x || ^3.x"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-typescript": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-9.0.2.tgz",
- "integrity": "sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "resolve": "^1.22.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.14.0||^3.0.0",
- "tslib": "*",
- "typescript": ">=3.7.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- },
- "tslib": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
- "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
- "dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.24.51",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
- "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
- "dev": true
- },
- "node_modules/@sinonjs/commons": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
- "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
- "dev": true,
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/fake-timers": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
- "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
- "dev": true,
- "dependencies": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@types/babel__core": {
- "version": "7.1.19",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
- "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.4",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
- "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
- "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
- "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.3.0"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
- "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
- "dev": true
- },
- "node_modules/@types/fs-extra": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz",
- "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
- "dev": true,
- "dependencies": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/graceful-fs": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
- "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
- "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
- "dev": true
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
- "dev": true,
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
- "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
- "dev": true,
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/jest": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.1.tgz",
- "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==",
- "dev": true,
- "dependencies": {
- "expect": "^29.0.0",
- "pretty-format": "^29.0.0"
- }
- },
- "node_modules/@types/minimatch": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
- "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "17.0.22",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz",
- "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==",
- "dev": true
- },
- "node_modules/@types/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
- "dev": true
- },
- "node_modules/@types/resolve": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
- "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
- "dev": true
- },
- "node_modules/@types/stack-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
- "dev": true
- },
- "node_modules/@types/yargs": {
- "version": "17.0.13",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
- "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
- "dev": true,
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
- "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
- "dev": true
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "node_modules/acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/agentkeepalive": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
- "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "depd": "^1.1.2",
- "humanize-ms": "^1.2.1"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.1.0"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
- "dev": true
- },
- "node_modules/are-we-there-yet": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
- "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
- "dev": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
- "dev": true
- },
- "node_modules/babel-jest": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.2.tgz",
- "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==",
- "dev": true,
- "dependencies": {
- "@jest/transform": "^29.2.2",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.2.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
- }
- },
- "node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-jest-hoist": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
- "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/babel-preset-current-node-syntax": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
- "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
- "dev": true,
- "dependencies": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.8.3",
- "@babel/plugin-syntax-import-meta": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-top-level-await": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/babel-preset-jest": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
- "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
- "dev": true,
- "dependencies": {
- "babel-plugin-jest-hoist": "^29.2.0",
- "babel-preset-current-node-syntax": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/boxen": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
- "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
- "dev": true,
- "dependencies": {
- "ansi-align": "^3.0.0",
- "camelcase": "^6.2.0",
- "chalk": "^4.1.0",
- "cli-boxes": "^2.2.1",
- "string-width": "^4.2.2",
- "type-fest": "^0.20.2",
- "widest-line": "^3.1.0",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brotli-size": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz",
- "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==",
- "dev": true,
- "dependencies": {
- "duplexer": "0.1.1"
- },
- "engines": {
- "node": ">= 10.16.0"
- }
- },
- "node_modules/browserslist": {
- "version": "4.21.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
- "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001400",
- "electron-to-chromium": "^1.4.251",
- "node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.9"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/bs-logger": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
- "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
- "dev": true,
- "dependencies": {
- "fast-json-stable-stringify": "2.x"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "dev": true,
- "dependencies": {
- "node-int64": "^0.4.0"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/builtin-modules": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
- "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/builtins": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
- "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
- "dev": true
- },
- "node_modules/cacache": {
- "version": "15.3.0",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
- "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
- "dev": true,
- "dependencies": {
- "@npmcli/fs": "^1.0.0",
- "@npmcli/move-file": "^1.0.1",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "infer-owner": "^1.0.4",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.1",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^1.0.3",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.0.2",
- "unique-filename": "^1.1.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001429",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz",
- "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- }
- ]
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ci-info": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
- "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
- "dev": true
- },
- "node_modules/cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
- "dev": true
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
- "dev": true,
- "engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
- }
- },
- "node_modules/code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/collect-v8-coverage": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
- "dev": true
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/colorette": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
- "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "dev": true
- },
- "node_modules/colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true
- },
- "node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "dev": true
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
- },
- "node_modules/deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "dev": true
- },
- "node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/diff-sequences": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz",
- "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==",
- "dev": true,
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
- "dev": true
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.284",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
- "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
- "dev": true
- },
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/encoding": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
- "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "iconv-lite": "^0.6.2"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "dev": true
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/expect": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.2.tgz",
- "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==",
- "dev": true,
- "dependencies": {
- "@jest/expect-utils": "^29.2.2",
- "jest-get-type": "^29.2.0",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "dev": true,
- "dependencies": {
- "bser": "2.1.1"
- }
- },
- "node_modules/filesize": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz",
- "integrity": "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dev": true,
- "dependencies": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "node_modules/gauge/node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gauge/node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gauge/node_modules/string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gauge/node_modules/strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "dev": true,
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globby": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
- "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
- "dev": true,
- "dependencies": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
- "dev": true
- },
- "node_modules/gzip-size": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
- "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
- "dev": true,
- "dependencies": {
- "duplexer": "^0.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gzip-size/node_modules/duplexer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
- "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
- "dev": true
- },
- "node_modules/har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "deprecated": "this library is no longer supported",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
- "dev": true
- },
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "dev": true,
- "dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
- "dev": true,
- "dependencies": {
- "ms": "^2.0.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/ignore-walk": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
- "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
- "dev": true,
- "dependencies": {
- "minimatch": "^3.0.4"
- }
- },
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "dev": true
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-builtin-module": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
- "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
- "dev": true,
- "dependencies": {
- "builtin-modules": "^3.3.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-lambda": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
- "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
- "dev": true
- },
- "node_modules/is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-plain-object": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz",
- "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
- "dev": true,
- "dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/istanbul-reports": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
- "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
- "dev": true,
- "dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.2.tgz",
- "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==",
- "dev": true,
- "dependencies": {
- "@jest/core": "^29.2.2",
- "@jest/types": "^29.2.1",
- "import-local": "^3.0.2",
- "jest-cli": "^29.2.2"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-changed-files": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
- "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
- "dev": true,
- "dependencies": {
- "execa": "^5.0.0",
- "p-limit": "^3.1.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-circus": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.2.tgz",
- "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==",
- "dev": true,
- "dependencies": {
- "@jest/environment": "^29.2.2",
- "@jest/expect": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^0.7.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.2.1",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-runtime": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-cli": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.2.tgz",
- "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==",
- "dev": true,
- "dependencies": {
- "@jest/core": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "import-local": "^3.0.2",
- "jest-config": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "prompts": "^2.0.1",
- "yargs": "^17.3.1"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-config": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.2.tgz",
- "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.2.2",
- "@jest/types": "^29.2.1",
- "babel-jest": "^29.2.2",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.2.2",
- "jest-environment-node": "^29.2.2",
- "jest-get-type": "^29.2.0",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-runner": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/jest-diff": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz",
- "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.2.0",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-docblock": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
- "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
- "dev": true,
- "dependencies": {
- "detect-newline": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-each": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz",
- "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "jest-util": "^29.2.1",
- "pretty-format": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-environment-node": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.2.tgz",
- "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==",
- "dev": true,
- "dependencies": {
- "@jest/environment": "^29.2.2",
- "@jest/fake-timers": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-mock": "^29.2.2",
- "jest-util": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-get-type": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
- "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
- "dev": true,
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-haste-map": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz",
- "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.2.1",
- "jest-worker": "^29.2.1",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- }
- },
- "node_modules/jest-leak-detector": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz",
- "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==",
- "dev": true,
- "dependencies": {
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-matcher-utils": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz",
- "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.2.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-message-util": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.2.1.tgz",
- "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.2.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-mock": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.2.2.tgz",
- "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-util": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
- "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
- },
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
- }
- },
- "node_modules/jest-regex-util": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
- "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
- "dev": true,
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-resolve": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.2.tgz",
- "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "resolve": "^1.20.0",
- "resolve.exports": "^1.1.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-resolve-dependencies": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz",
- "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==",
- "dev": true,
- "dependencies": {
- "jest-regex-util": "^29.2.0",
- "jest-snapshot": "^29.2.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-runner": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.2.tgz",
- "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==",
- "dev": true,
- "dependencies": {
- "@jest/console": "^29.2.1",
- "@jest/environment": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.2.0",
- "jest-environment-node": "^29.2.2",
- "jest-haste-map": "^29.2.1",
- "jest-leak-detector": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-resolve": "^29.2.2",
- "jest-runtime": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-watcher": "^29.2.2",
- "jest-worker": "^29.2.1",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/jest-runtime": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.2.tgz",
- "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==",
- "dev": true,
- "dependencies": {
- "@jest/environment": "^29.2.2",
- "@jest/fake-timers": "^29.2.2",
- "@jest/globals": "^29.2.2",
- "@jest/source-map": "^29.2.0",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-mock": "^29.2.2",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-snapshot": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.2.tgz",
- "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/traverse": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.2.2",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/babel__traverse": "^7.0.6",
- "@types/prettier": "^2.1.5",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.2.2",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.2.1",
- "jest-get-type": "^29.2.0",
- "jest-haste-map": "^29.2.1",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.2.1",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/jest-util": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz",
- "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-validate": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.2.tgz",
- "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==",
- "dev": true,
- "dependencies": {
- "@jest/types": "^29.2.1",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "leven": "^3.1.0",
- "pretty-format": "^29.2.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-validate/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jest-watcher": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.2.tgz",
- "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==",
- "dev": true,
- "dependencies": {
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.2.1",
- "string-length": "^4.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz",
- "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.2.1",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "node_modules/json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
- "dev": true,
- "engines": [
- "node >= 0.2.0"
- ]
- },
- "node_modules/jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/magic-string": {
- "version": "0.26.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
- "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
- "dev": true,
- "dependencies": {
- "sourcemap-codec": "^1.4.8"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/make-fetch-happen": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
- "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
- "dev": true,
- "dependencies": {
- "agentkeepalive": "^4.1.3",
- "cacache": "^15.2.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.3",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^1.3.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.2",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^6.0.0",
- "ssri": "^8.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "dev": true,
- "dependencies": {
- "tmpl": "1.0.5"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minipass": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
- "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-fetch": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
- "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.0",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "optionalDependencies": {
- "encoding": "^0.1.12"
- }
- },
- "node_modules/minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-json-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
- "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
- "dev": true,
- "dependencies": {
- "jsonparse": "^1.3.1",
- "minipass": "^3.0.0"
- }
- },
- "node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-sized": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
- "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-gyp": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
- "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
- "dev": true,
- "dependencies": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.3",
- "nopt": "^5.0.0",
- "npmlog": "^4.1.2",
- "request": "^2.88.2",
- "rimraf": "^3.0.2",
- "semver": "^7.3.2",
- "tar": "^6.0.2",
- "which": "^2.0.2"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
- },
- "engines": {
- "node": ">= 10.12.0"
- }
- },
- "node_modules/node-gyp/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true
- },
- "node_modules/node-releases": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
- "dev": true
- },
- "node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm-bundled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
- "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
- "dev": true,
- "dependencies": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "node_modules/npm-install-checks": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
- "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
- "dev": true,
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-install-checks/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
- "dev": true
- },
- "node_modules/npm-package-arg": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
- "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "semver": "^7.3.4",
- "validate-npm-package-name": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-package-arg/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-packlist": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz",
- "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.6",
- "ignore-walk": "^3.0.3",
- "npm-bundled": "^1.1.1",
- "npm-normalize-package-bin": "^1.0.1"
- },
- "bin": {
- "npm-packlist": "bin/index.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-pick-manifest": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
- "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==",
- "dev": true,
- "dependencies": {
- "npm-install-checks": "^4.0.0",
- "npm-normalize-package-bin": "^1.0.1",
- "npm-package-arg": "^8.1.2",
- "semver": "^7.3.4"
- }
- },
- "node_modules/npm-pick-manifest/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-registry-fetch": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz",
- "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==",
- "dev": true,
- "dependencies": {
- "make-fetch-happen": "^9.0.1",
- "minipass": "^3.1.3",
- "minipass-fetch": "^1.3.0",
- "minipass-json-stream": "^1.0.1",
- "minizlib": "^2.0.0",
- "npm-package-arg": "^8.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "dev": true,
- "dependencies": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "node_modules/number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-locate/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pacote": {
- "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz",
- "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==",
- "dev": true,
- "dependencies": {
- "@npmcli/git": "^2.1.0",
- "@npmcli/installed-package-contents": "^1.0.6",
- "@npmcli/promise-spawn": "^1.2.0",
- "@npmcli/run-script": "^1.8.2",
- "cacache": "^15.0.5",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "infer-owner": "^1.0.4",
- "minipass": "^3.1.3",
- "mkdirp": "^1.0.3",
- "npm-package-arg": "^8.0.1",
- "npm-packlist": "^2.1.4",
- "npm-pick-manifest": "^6.0.0",
- "npm-registry-fetch": "^11.0.0",
- "promise-retry": "^2.0.1",
- "read-package-json-fast": "^2.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.1.0"
- },
- "bin": {
- "pacote": "lib/bin.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pretty-format": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.2.1.tgz",
- "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==",
- "dev": true,
- "dependencies": {
- "@jest/schemas": "^29.0.0",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
- "dev": true
- },
- "node_modules/promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
- "dev": true,
- "dependencies": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dev": true,
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
- "dev": true
- },
- "node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/react-is": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
- "dev": true
- },
- "node_modules/read-package-json-fast": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz",
- "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==",
- "dev": true,
- "dependencies": {
- "json-parse-even-better-errors": "^2.3.0",
- "npm-normalize-package-bin": "^1.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
- "dev": true
- },
- "node_modules/request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/request/node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/request/node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve.exports": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
- "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rollup": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.5.tgz",
- "integrity": "sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==",
- "dev": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=14.18.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup-plugin-base64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/rollup-plugin-base64/-/rollup-plugin-base64-1.0.1.tgz",
- "integrity": "sha512-IbdX8fjuXO/Op3hYmRPjVo0VwcSenwsQDaDTFdoe+70B5ZGoLMtr96L2yhHXCfxv7HwZVvxZqLsuWj6VwzRt3g==",
- "dev": true,
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0"
- }
- },
- "node_modules/rollup-plugin-base64/node_modules/@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "dependencies": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
- }
- },
- "node_modules/rollup-plugin-base64/node_modules/@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "node_modules/rollup-plugin-base64/node_modules/estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- },
- "node_modules/rollup-plugin-base64/node_modules/rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "dev": true,
- "peer": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup-plugin-copy": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz",
- "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==",
- "dev": true,
- "dependencies": {
- "@types/fs-extra": "^8.0.1",
- "colorette": "^1.1.0",
- "fs-extra": "^8.1.0",
- "globby": "10.0.1",
- "is-plain-object": "^3.0.0"
- },
- "engines": {
- "node": ">=8.3"
- }
- },
- "node_modules/rollup-plugin-filesize": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-9.1.2.tgz",
- "integrity": "sha512-m2fE9hFaKgWKisJzyWXctOFKlgMRelo/58HgeC0lXUK/qykxiqkr6bsrotlvo2bvrwPsjgT7scNdQSr6qtl37A==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.8",
- "boxen": "^5.0.0",
- "brotli-size": "4.0.0",
- "colors": "1.4.0",
- "filesize": "^6.1.0",
- "gzip-size": "^6.0.0",
- "pacote": "^11.2.7",
- "terser": "^5.6.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "dev": true,
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
- "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
- "dev": true,
- "dependencies": {
- "ip": "^1.1.5",
- "smart-buffer": "^4.2.0"
- },
- "engines": {
- "node": ">= 10.13.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks-proxy-agent": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
- "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
- "dev": true,
- "dependencies": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.1",
- "socks": "^2.6.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "node_modules/sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ssri": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
- "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/stack-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
- "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "dev": true,
- "dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tar": {
- "version": "6.1.11",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
- "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
- "dev": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/terser": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
- "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "dev": true,
- "dependencies": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-jest": {
- "version": "29.0.3",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz",
- "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==",
- "dev": true,
- "dependencies": {
- "bs-logger": "0.x",
- "fast-json-stable-stringify": "2.x",
- "jest-util": "^29.0.0",
- "json5": "^2.2.1",
- "lodash.memoize": "4.x",
- "make-error": "1.x",
- "semver": "7.x",
- "yargs-parser": "^21.0.1"
- },
- "bin": {
- "ts-jest": "cli.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": ">=7.0.0-beta.0 <8",
- "@jest/types": "^29.0.0",
- "babel-jest": "^29.0.0",
- "jest": "^29.0.0",
- "typescript": ">=4.3"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "@jest/types": {
- "optional": true
- },
- "babel-jest": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- }
- }
- },
- "node_modules/ts-jest/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
- "dev": true
- },
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "dev": true,
- "dependencies": {
- "unique-slug": "^2.0.0"
- }
- },
- "node_modules/unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4"
- }
- },
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist-lint": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "dev": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/v8-to-istanbul": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
- "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
- "dev": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^1.6.0"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/validate-npm-package-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
- "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
- "dev": true,
- "dependencies": {
- "builtins": "^1.0.3"
- }
- },
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/verror/node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "dev": true,
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
- }
- },
- "node_modules/widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/yargs": {
- "version": "17.6.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
- "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
- "dev": true,
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- },
- "dependencies": {
- "@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.1.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.18.6"
- }
- },
- "@babel/compat-data": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
- "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
- "dev": true
- },
- "@babel/core": {
- "version": "7.19.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
- "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
- "dev": true,
- "requires": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.6",
- "@babel/helper-compilation-targets": "^7.19.3",
- "@babel/helper-module-transforms": "^7.19.6",
- "@babel/helpers": "^7.19.4",
- "@babel/parser": "^7.19.6",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.6",
- "@babel/types": "^7.19.4",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
- "semver": "^6.3.0"
- }
- },
- "@babel/generator": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.1.tgz",
- "integrity": "sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.20.0",
- "@jridgewell/gen-mapping": "^0.3.2",
- "jsesc": "^2.5.1"
- },
- "dependencies": {
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- }
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
- "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.20.0",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.21.3",
- "semver": "^6.3.0"
- }
- },
- "@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
- "dev": true
- },
- "@babel/helper-function-name": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
- "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.18.10",
- "@babel/types": "^7.19.0"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.19.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
- "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
- "dev": true,
- "requires": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.19.4",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.6",
- "@babel/types": "^7.19.4"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz",
- "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==",
- "dev": true
- },
- "@babel/helper-simple-access": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
- "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.19.4"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
- "dev": true
- },
- "@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
- "dev": true
- },
- "@babel/helper-validator-option": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
- "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
- "dev": true
- },
- "@babel/helpers": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
- "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.1",
- "@babel/types": "^7.20.0"
- }
- },
- "@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@babel/parser": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.1.tgz",
- "integrity": "sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw==",
- "dev": true
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.12.13"
- }
- },
- "@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
- }
- },
- "@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.19.0"
- }
- },
- "@babel/runtime": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
- "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
- "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.10",
- "@babel/types": "^7.18.10"
- }
- },
- "@babel/traverse": {
- "version": "7.20.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
- "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.1",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.19.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.20.1",
- "@babel/types": "^7.20.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/types": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz",
- "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==",
- "dev": true,
- "requires": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true
- },
- "@gar/promisify": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
- "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
- "dev": true
- },
- "@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
- }
- },
- "@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true
- },
- "@jest/console": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.2.1.tgz",
- "integrity": "sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "slash": "^3.0.0"
- }
- },
- "@jest/core": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.2.2.tgz",
- "integrity": "sha512-susVl8o2KYLcZhhkvSB+b7xX575CX3TmSvxfeDjpRko7KmT89rHkXj6XkDkNpSeFMBzIENw5qIchO9HC9Sem+A==",
- "dev": true,
- "requires": {
- "@jest/console": "^29.2.1",
- "@jest/reporters": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.2.0",
- "jest-config": "^29.2.2",
- "jest-haste-map": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-resolve-dependencies": "^29.2.2",
- "jest-runner": "^29.2.2",
- "jest-runtime": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "jest-watcher": "^29.2.2",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "@jest/environment": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.2.2.tgz",
- "integrity": "sha512-OWn+Vhu0I1yxuGBJEFFekMYc8aGBGrY4rt47SOh/IFaI+D7ZHCk7pKRiSoZ2/Ml7b0Ony3ydmEHRx/tEOC7H1A==",
- "dev": true,
- "requires": {
- "@jest/fake-timers": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-mock": "^29.2.2"
- }
- },
- "@jest/expect": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.2.2.tgz",
- "integrity": "sha512-zwblIZnrIVt8z/SiEeJ7Q9wKKuB+/GS4yZe9zw7gMqfGf4C5hBLGrVyxu1SzDbVSqyMSlprKl3WL1r80cBNkgg==",
- "dev": true,
- "requires": {
- "expect": "^29.2.2",
- "jest-snapshot": "^29.2.2"
- }
- },
- "@jest/expect-utils": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.2.2.tgz",
- "integrity": "sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg==",
- "dev": true,
- "requires": {
- "jest-get-type": "^29.2.0"
- }
- },
- "@jest/fake-timers": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.2.2.tgz",
- "integrity": "sha512-nqaW3y2aSyZDl7zQ7t1XogsxeavNpH6kkdq+EpXncIDvAkjvFD7hmhcIs1nWloengEWUoWqkqSA6MSbf9w6DgA==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "@sinonjs/fake-timers": "^9.1.2",
- "@types/node": "*",
- "jest-message-util": "^29.2.1",
- "jest-mock": "^29.2.2",
- "jest-util": "^29.2.1"
- }
- },
- "@jest/globals": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.2.2.tgz",
- "integrity": "sha512-/nt+5YMh65kYcfBhj38B3Hm0Trk4IsuMXNDGKE/swp36yydBWfz3OXkLqkSvoAtPW8IJMSJDFCbTM2oj5SNprw==",
- "dev": true,
- "requires": {
- "@jest/environment": "^29.2.2",
- "@jest/expect": "^29.2.2",
- "@jest/types": "^29.2.1",
- "jest-mock": "^29.2.2"
- }
- },
- "@jest/reporters": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.2.2.tgz",
- "integrity": "sha512-AzjL2rl2zJC0njIzcooBvjA4sJjvdoq98sDuuNs4aNugtLPSQ+91nysGKRF0uY1to5k0MdGMdOBggUsPqvBcpA==",
- "dev": true,
- "requires": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.2.1",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@jridgewell/trace-mapping": "^0.3.15",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^5.1.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "jest-worker": "^29.2.1",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
- }
- },
- "@jest/schemas": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
- "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
- "dev": true,
- "requires": {
- "@sinclair/typebox": "^0.24.1"
- }
- },
- "@jest/source-map": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
- "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.15",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
- }
- },
- "@jest/test-result": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.2.1.tgz",
- "integrity": "sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA==",
- "dev": true,
- "requires": {
- "@jest/console": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- }
- },
- "@jest/test-sequencer": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.2.2.tgz",
- "integrity": "sha512-Cuc1znc1pl4v9REgmmLf0jBd3Y65UXJpioGYtMr/JNpQEIGEzkmHhy6W6DLbSsXeUA13TDzymPv0ZGZ9jH3eIw==",
- "dev": true,
- "requires": {
- "@jest/test-result": "^29.2.1",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "slash": "^3.0.0"
- }
- },
- "@jest/transform": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.2.2.tgz",
- "integrity": "sha512-aPe6rrletyuEIt2axxgdtxljmzH8O/nrov4byy6pDw9S8inIrTV+2PnjyP/oFHMSynzGxJ2s6OHowBNMXp/Jzg==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.2.1",
- "@jridgewell/trace-mapping": "^0.3.15",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^1.4.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.2.1",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.1"
- }
- },
- "@jest/types": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz",
- "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==",
- "dev": true,
- "requires": {
- "@jest/schemas": "^29.0.0",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- }
- },
- "@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true
- },
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true
- },
- "@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "dependencies": {
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- }
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
- "dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@npmcli/fs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
- "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
- "dev": true,
- "requires": {
- "@gar/promisify": "^1.0.1",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@npmcli/git": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
- "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==",
- "dev": true,
- "requires": {
- "@npmcli/promise-spawn": "^1.3.2",
- "lru-cache": "^6.0.0",
- "mkdirp": "^1.0.4",
- "npm-pick-manifest": "^6.1.1",
- "promise-inflight": "^1.0.1",
- "promise-retry": "^2.0.1",
- "semver": "^7.3.5",
- "which": "^2.0.2"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@npmcli/installed-package-contents": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz",
- "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==",
- "dev": true,
- "requires": {
- "npm-bundled": "^1.1.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "dev": true,
- "requires": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- }
- },
- "@npmcli/node-gyp": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz",
- "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==",
- "dev": true
- },
- "@npmcli/promise-spawn": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz",
- "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==",
- "dev": true,
- "requires": {
- "infer-owner": "^1.0.4"
- }
- },
- "@npmcli/run-script": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz",
- "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==",
- "dev": true,
- "requires": {
- "@npmcli/node-gyp": "^1.0.2",
- "@npmcli/promise-spawn": "^1.3.2",
- "node-gyp": "^7.1.0",
- "read-package-json-fast": "^2.0.1"
- }
- },
- "@rollup/plugin-commonjs": {
- "version": "23.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.2.tgz",
- "integrity": "sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^5.0.1",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.2",
- "glob": "^8.0.3",
- "is-reference": "1.2.1",
- "magic-string": "^0.26.4"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "glob": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
- "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- }
- },
- "minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- }
- }
- },
- "@rollup/plugin-node-resolve": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz",
- "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^5.0.1",
- "@types/resolve": "1.20.2",
- "deepmerge": "^4.2.2",
- "is-builtin-module": "^3.2.0",
- "is-module": "^1.0.0",
- "resolve": "^1.22.1"
- }
- },
- "@rollup/plugin-terser": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.1.0.tgz",
- "integrity": "sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==",
- "dev": true,
- "requires": {
- "terser": "^5.15.1"
- }
- },
- "@rollup/plugin-typescript": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-9.0.2.tgz",
- "integrity": "sha512-/sS93vmHUMjzDUsl5scNQr1mUlNE1QjBBvOhmRwJCH8k2RRhDIm3c977B3wdu3t3Ap17W6dDeXP3hj1P1Un1bA==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^5.0.1",
- "resolve": "^1.22.1"
- }
- },
- "@rollup/pluginutils": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
- "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
- "dev": true,
- "requires": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
- }
- },
- "@sinclair/typebox": {
- "version": "0.24.51",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
- "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
- "dev": true
- },
- "@sinonjs/commons": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
- "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
- "dev": true,
- "requires": {
- "type-detect": "4.0.8"
- }
- },
- "@sinonjs/fake-timers": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
- "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "dev": true
- },
- "@types/babel__core": {
- "version": "7.1.19",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
- "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "@types/babel__generator": {
- "version": "7.6.4",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
- "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__template": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
- "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__traverse": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
- "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.3.0"
- }
- },
- "@types/estree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
- "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
- "dev": true
- },
- "@types/fs-extra": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz",
- "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
- "dev": true,
- "requires": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/graceful-fs": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
- "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/istanbul-lib-coverage": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
- "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
- "dev": true
- },
- "@types/istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "@types/istanbul-reports": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
- "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "@types/jest": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.1.tgz",
- "integrity": "sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ==",
- "dev": true,
- "requires": {
- "expect": "^29.0.0",
- "pretty-format": "^29.0.0"
- }
- },
- "@types/minimatch": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
- "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
- "dev": true
- },
- "@types/node": {
- "version": "17.0.22",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz",
- "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==",
- "dev": true
- },
- "@types/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
- "dev": true
- },
- "@types/resolve": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
- "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
- "dev": true
- },
- "@types/stack-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
- "dev": true
- },
- "@types/yargs": {
- "version": "17.0.13",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
- "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "@types/yargs-parser": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
- "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
- "dev": true
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "dev": true
- },
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "requires": {
- "debug": "4"
- }
- },
- "agentkeepalive": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
- "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "depd": "^1.1.2",
- "humanize-ms": "^1.2.1"
- }
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "requires": {
- "string-width": "^4.1.0"
- }
- },
- "ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.21.3"
- }
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
- "dev": true
- },
- "are-we-there-yet": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
- "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
- "dev": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
- "dev": true
- },
- "babel-jest": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.2.2.tgz",
- "integrity": "sha512-kkq2QSDIuvpgfoac3WZ1OOcHsQQDU5xYk2Ql7tLdJ8BVAYbefEXal+NfS45Y5LVZA7cxC8KYcQMObpCt1J025w==",
- "dev": true,
- "requires": {
- "@jest/transform": "^29.2.2",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.2.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- }
- },
- "babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- }
- },
- "babel-plugin-jest-hoist": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
- "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- }
- },
- "babel-preset-current-node-syntax": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
- "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
- "dev": true,
- "requires": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.8.3",
- "@babel/plugin-syntax-import-meta": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-top-level-await": "^7.8.3"
- }
- },
- "babel-preset-jest": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
- "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
- "dev": true,
- "requires": {
- "babel-plugin-jest-hoist": "^29.2.0",
- "babel-preset-current-node-syntax": "^1.0.0"
- }
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "boxen": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
- "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
- "dev": true,
- "requires": {
- "ansi-align": "^3.0.0",
- "camelcase": "^6.2.0",
- "chalk": "^4.1.0",
- "cli-boxes": "^2.2.1",
- "string-width": "^4.2.2",
- "type-fest": "^0.20.2",
- "widest-line": "^3.1.0",
- "wrap-ansi": "^7.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
- }
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "brotli-size": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz",
- "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==",
- "dev": true,
- "requires": {
- "duplexer": "0.1.1"
- }
- },
- "browserslist": {
- "version": "4.21.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
- "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001400",
- "electron-to-chromium": "^1.4.251",
- "node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.9"
- }
- },
- "bs-logger": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
- "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
- "dev": true,
- "requires": {
- "fast-json-stable-stringify": "2.x"
- }
- },
- "bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "dev": true,
- "requires": {
- "node-int64": "^0.4.0"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "builtin-modules": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
- "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
- "dev": true
- },
- "builtins": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
- "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
- "dev": true
- },
- "cacache": {
- "version": "15.3.0",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
- "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
- "dev": true,
- "requires": {
- "@npmcli/fs": "^1.0.0",
- "@npmcli/move-file": "^1.0.1",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "infer-owner": "^1.0.4",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.1",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^1.0.3",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.0.2",
- "unique-filename": "^1.1.1"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30001429",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz",
- "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "dev": true
- },
- "chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true
- },
- "ci-info": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
- "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
- "dev": true
- },
- "cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
- "dev": true
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
- },
- "cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true
- },
- "cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- }
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
- "dev": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "collect-v8-coverage": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
- "dev": true
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "colorette": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
- "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "dev": true
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
- "dev": true
- },
- "diff-sequences": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.2.0.tgz",
- "integrity": "sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
- "dev": true
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "electron-to-chromium": {
- "version": "1.4.284",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
- "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
- "dev": true
- },
- "emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "encoding": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
- "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
- "dev": true,
- "optional": true,
- "requires": {
- "iconv-lite": "^0.6.2"
- }
- },
- "env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true
- },
- "err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "dev": true
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "dev": true
- },
- "expect": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.2.2.tgz",
- "integrity": "sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw==",
- "dev": true,
- "requires": {
- "@jest/expect-utils": "^29.2.2",
- "jest-get-type": "^29.2.0",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "dev": true,
- "requires": {
- "bser": "2.1.1"
- }
- },
- "filesize": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz",
- "integrity": "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==",
- "dev": true
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dev": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "dev": true
- },
- "get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
- "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
- "dev": true,
- "requires": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
- "dev": true
- },
- "gzip-size": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
- "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
- "dev": true,
- "requires": {
- "duplexer": "^0.1.2"
- },
- "dependencies": {
- "duplexer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
- "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
- "dev": true
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
- "dev": true
- },
- "hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "dev": true,
- "requires": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "requires": {
- "agent-base": "6",
- "debug": "4"
- }
- },
- "human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true
- },
- "humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
- "dev": true,
- "requires": {
- "ms": "^2.0.0"
- }
- },
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- },
- "ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true
- },
- "ignore-walk": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
- "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
- "dev": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "requires": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "is-builtin-module": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
- "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
- "dev": true,
- "requires": {
- "builtin-modules": "^3.3.0"
- }
- },
- "is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-lambda": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
- "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
- "dev": true
- },
- "is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-object": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz",
- "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==",
- "dev": true
- },
- "is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
- "dev": true,
- "requires": {
- "@types/estree": "*"
- }
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "istanbul-lib-coverage": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
- "dev": true
- },
- "istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- }
- },
- "istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
- "supports-color": "^7.1.0"
- }
- },
- "istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- }
- },
- "istanbul-reports": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
- "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
- "dev": true,
- "requires": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- }
- },
- "jest": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.2.2.tgz",
- "integrity": "sha512-r+0zCN9kUqoON6IjDdjbrsWobXM/09Nd45kIPRD8kloaRh1z5ZCMdVsgLXGxmlL7UpAJsvCYOQNO+NjvG/gqiQ==",
- "dev": true,
- "requires": {
- "@jest/core": "^29.2.2",
- "@jest/types": "^29.2.1",
- "import-local": "^3.0.2",
- "jest-cli": "^29.2.2"
- }
- },
- "jest-changed-files": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
- "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
- "dev": true,
- "requires": {
- "execa": "^5.0.0",
- "p-limit": "^3.1.0"
- }
- },
- "jest-circus": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.2.2.tgz",
- "integrity": "sha512-upSdWxx+Mh4DV7oueuZndJ1NVdgtTsqM4YgywHEx05UMH5nxxA2Qu9T9T9XVuR021XxqSoaKvSmmpAbjwwwxMw==",
- "dev": true,
- "requires": {
- "@jest/environment": "^29.2.2",
- "@jest/expect": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^0.7.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.2.1",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-runtime": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- }
- },
- "jest-cli": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.2.2.tgz",
- "integrity": "sha512-R45ygnnb2CQOfd8rTPFR+/fls0d+1zXS6JPYTBBrnLPrhr58SSuPTiA5Tplv8/PXpz4zXR/AYNxmwIj6J6nrvg==",
- "dev": true,
- "requires": {
- "@jest/core": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "import-local": "^3.0.2",
- "jest-config": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "prompts": "^2.0.1",
- "yargs": "^17.3.1"
- }
- },
- "jest-config": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.2.2.tgz",
- "integrity": "sha512-Q0JX54a5g1lP63keRfKR8EuC7n7wwny2HoTRDb8cx78IwQOiaYUVZAdjViY3WcTxpR02rPUpvNVmZ1fkIlZPcw==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.2.2",
- "@jest/types": "^29.2.1",
- "babel-jest": "^29.2.2",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.2.2",
- "jest-environment-node": "^29.2.2",
- "jest-get-type": "^29.2.0",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-runner": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- }
- },
- "jest-diff": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.2.1.tgz",
- "integrity": "sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.2.0",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- }
- },
- "jest-docblock": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
- "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
- "dev": true,
- "requires": {
- "detect-newline": "^3.0.0"
- }
- },
- "jest-each": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.2.1.tgz",
- "integrity": "sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "jest-util": "^29.2.1",
- "pretty-format": "^29.2.1"
- }
- },
- "jest-environment-node": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.2.2.tgz",
- "integrity": "sha512-B7qDxQjkIakQf+YyrqV5dICNs7tlCO55WJ4OMSXsqz1lpI/0PmeuXdx2F7eU8rnPbRkUR/fItSSUh0jvE2y/tw==",
- "dev": true,
- "requires": {
- "@jest/environment": "^29.2.2",
- "@jest/fake-timers": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-mock": "^29.2.2",
- "jest-util": "^29.2.1"
- }
- },
- "jest-get-type": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
- "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
- "dev": true
- },
- "jest-haste-map": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.2.1.tgz",
- "integrity": "sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "fsevents": "^2.3.2",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.2.1",
- "jest-worker": "^29.2.1",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- }
- },
- "jest-leak-detector": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz",
- "integrity": "sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug==",
- "dev": true,
- "requires": {
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- }
- },
- "jest-matcher-utils": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz",
- "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.2.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.2.1"
- }
- },
- "jest-message-util": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.2.1.tgz",
- "integrity": "sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.2.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.2.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- }
- },
- "jest-mock": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.2.2.tgz",
- "integrity": "sha512-1leySQxNAnivvbcx0sCB37itu8f4OX2S/+gxLAV4Z62shT4r4dTG9tACDywUAEZoLSr36aYUTsVp3WKwWt4PMQ==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "jest-util": "^29.2.1"
- }
- },
- "jest-pnp-resolver": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
- "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
- "dev": true,
- "requires": {}
- },
- "jest-regex-util": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
- "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
- "dev": true
- },
- "jest-resolve": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.2.2.tgz",
- "integrity": "sha512-3gaLpiC3kr14rJR3w7vWh0CBX2QAhfpfiQTwrFPvVrcHe5VUBtIXaR004aWE/X9B2CFrITOQAp5gxLONGrk6GA==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.2.1",
- "jest-validate": "^29.2.2",
- "resolve": "^1.20.0",
- "resolve.exports": "^1.1.0",
- "slash": "^3.0.0"
- }
- },
- "jest-resolve-dependencies": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.2.tgz",
- "integrity": "sha512-wWOmgbkbIC2NmFsq8Lb+3EkHuW5oZfctffTGvwsA4JcJ1IRk8b2tg+hz44f0lngvRTeHvp3Kyix9ACgudHH9aQ==",
- "dev": true,
- "requires": {
- "jest-regex-util": "^29.2.0",
- "jest-snapshot": "^29.2.2"
- }
- },
- "jest-runner": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.2.2.tgz",
- "integrity": "sha512-1CpUxXDrbsfy9Hr9/1zCUUhT813kGGK//58HeIw/t8fa/DmkecEwZSWlb1N/xDKXg3uCFHQp1GCvlSClfImMxg==",
- "dev": true,
- "requires": {
- "@jest/console": "^29.2.1",
- "@jest/environment": "^29.2.2",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.2.0",
- "jest-environment-node": "^29.2.2",
- "jest-haste-map": "^29.2.1",
- "jest-leak-detector": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-resolve": "^29.2.2",
- "jest-runtime": "^29.2.2",
- "jest-util": "^29.2.1",
- "jest-watcher": "^29.2.2",
- "jest-worker": "^29.2.1",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
- },
- "dependencies": {
- "source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- }
- }
- },
- "jest-runtime": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.2.2.tgz",
- "integrity": "sha512-TpR1V6zRdLynckKDIQaY41od4o0xWL+KOPUCZvJK2bu5P1UXhjobt5nJ2ICNeIxgyj9NGkO0aWgDqYPVhDNKjA==",
- "dev": true,
- "requires": {
- "@jest/environment": "^29.2.2",
- "@jest/fake-timers": "^29.2.2",
- "@jest/globals": "^29.2.2",
- "@jest/source-map": "^29.2.0",
- "@jest/test-result": "^29.2.1",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.2.1",
- "jest-message-util": "^29.2.1",
- "jest-mock": "^29.2.2",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.2.2",
- "jest-snapshot": "^29.2.2",
- "jest-util": "^29.2.1",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- }
- },
- "jest-snapshot": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.2.2.tgz",
- "integrity": "sha512-GfKJrpZ5SMqhli3NJ+mOspDqtZfJBryGA8RIBxF+G+WbDoC7HCqKaeAss4Z/Sab6bAW11ffasx8/vGsj83jyjA==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/traverse": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.2.2",
- "@jest/transform": "^29.2.2",
- "@jest/types": "^29.2.1",
- "@types/babel__traverse": "^7.0.6",
- "@types/prettier": "^2.1.5",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.2.2",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.2.1",
- "jest-get-type": "^29.2.0",
- "jest-haste-map": "^29.2.1",
- "jest-matcher-utils": "^29.2.2",
- "jest-message-util": "^29.2.1",
- "jest-util": "^29.2.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.2.1",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "jest-util": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz",
- "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- }
- },
- "jest-validate": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.2.2.tgz",
- "integrity": "sha512-eJXATaKaSnOuxNfs8CLHgdABFgUrd0TtWS8QckiJ4L/QVDF4KVbZFBBOwCBZHOS0Rc5fOxqngXeGXE3nGQkpQA==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.2.1",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "leven": "^3.1.0",
- "pretty-format": "^29.2.1"
- },
- "dependencies": {
- "camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true
- }
- }
- },
- "jest-watcher": {
- "version": "29.2.2",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.2.2.tgz",
- "integrity": "sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==",
- "dev": true,
- "requires": {
- "@jest/test-result": "^29.2.1",
- "@jest/types": "^29.2.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.2.1",
- "string-length": "^4.0.1"
- }
- },
- "jest-worker": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz",
- "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "jest-util": "^29.2.1",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
- "dev": true
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
- "kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true
- },
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
- },
- "lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "magic-string": {
- "version": "0.26.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
- "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
- "dev": true,
- "requires": {
- "sourcemap-codec": "^1.4.8"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- }
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "make-fetch-happen": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
- "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
- "dev": true,
- "requires": {
- "agentkeepalive": "^4.1.3",
- "cacache": "^15.2.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.3",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^1.3.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.2",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^6.0.0",
- "ssri": "^8.0.0"
- }
- },
- "makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "dev": true,
- "requires": {
- "tmpl": "1.0.5"
- }
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- }
- },
- "mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "requires": {
- "mime-db": "1.52.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minipass": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
- "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-fetch": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
- "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
- "dev": true,
- "requires": {
- "encoding": "^0.1.12",
- "minipass": "^3.1.0",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.0.0"
- }
- },
- "minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-json-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
- "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
- "dev": true,
- "requires": {
- "jsonparse": "^1.3.1",
- "minipass": "^3.0.0"
- }
- },
- "minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-sized": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
- "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "requires": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true
- },
- "node-gyp": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
- "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
- "dev": true,
- "requires": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.3",
- "nopt": "^5.0.0",
- "npmlog": "^4.1.2",
- "request": "^2.88.2",
- "rimraf": "^3.0.2",
- "semver": "^7.3.2",
- "tar": "^6.0.2",
- "which": "^2.0.2"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true
- },
- "node-releases": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
- "dev": true
- },
- "nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "npm-bundled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
- "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
- "dev": true,
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-install-checks": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
- "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
- "dev": true,
- "requires": {
- "semver": "^7.1.1"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
- "dev": true
- },
- "npm-package-arg": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
- "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^4.0.1",
- "semver": "^7.3.4",
- "validate-npm-package-name": "^3.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "npm-packlist": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz",
- "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==",
- "dev": true,
- "requires": {
- "glob": "^7.1.6",
- "ignore-walk": "^3.0.3",
- "npm-bundled": "^1.1.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-pick-manifest": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
- "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==",
- "dev": true,
- "requires": {
- "npm-install-checks": "^4.0.0",
- "npm-normalize-package-bin": "^1.0.1",
- "npm-package-arg": "^8.1.2",
- "semver": "^7.3.4"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "npm-registry-fetch": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz",
- "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==",
- "dev": true,
- "requires": {
- "make-fetch-happen": "^9.0.1",
- "minipass": "^3.1.3",
- "minipass-fetch": "^1.3.0",
- "minipass-json-stream": "^1.0.1",
- "minizlib": "^2.0.0",
- "npm-package-arg": "^8.0.0"
- }
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "dev": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- },
- "dependencies": {
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- }
- }
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "pacote": {
- "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz",
- "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==",
- "dev": true,
- "requires": {
- "@npmcli/git": "^2.1.0",
- "@npmcli/installed-package-contents": "^1.0.6",
- "@npmcli/promise-spawn": "^1.2.0",
- "@npmcli/run-script": "^1.8.2",
- "cacache": "^15.0.5",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "infer-owner": "^1.0.4",
- "minipass": "^3.1.3",
- "mkdirp": "^1.0.3",
- "npm-package-arg": "^8.0.1",
- "npm-packlist": "^2.1.4",
- "npm-pick-manifest": "^6.0.0",
- "npm-registry-fetch": "^11.0.0",
- "promise-retry": "^2.0.1",
- "read-package-json-fast": "^2.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.1.0"
- }
- },
- "parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
- "dev": true
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- }
- },
- "pretty-format": {
- "version": "29.2.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.2.1.tgz",
- "integrity": "sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==",
- "dev": true,
- "requires": {
- "@jest/schemas": "^29.0.0",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true
- }
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
- "dev": true
- },
- "promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
- "dev": true,
- "requires": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
- }
- },
- "prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dev": true,
- "requires": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- }
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
- "dev": true
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
- },
- "react-is": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
- "dev": true
- },
- "read-package-json-fast": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz",
- "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==",
- "dev": true,
- "requires": {
- "json-parse-even-better-errors": "^2.3.0",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
- "dev": true
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- }
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true
- },
- "resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "requires": {
- "resolve-from": "^5.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "resolve.exports": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
- "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
- "dev": true
- },
- "retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "rollup": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.5.tgz",
- "integrity": "sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==",
- "dev": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- },
- "rollup-plugin-base64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/rollup-plugin-base64/-/rollup-plugin-base64-1.0.1.tgz",
- "integrity": "sha512-IbdX8fjuXO/Op3hYmRPjVo0VwcSenwsQDaDTFdoe+70B5ZGoLMtr96L2yhHXCfxv7HwZVvxZqLsuWj6VwzRt3g==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.1.0"
- },
- "dependencies": {
- "@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- }
- },
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "dev": true
- },
- "estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- },
- "rollup": {
- "version": "2.79.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
- "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
- "dev": true,
- "peer": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- }
- }
- },
- "rollup-plugin-copy": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz",
- "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==",
- "dev": true,
- "requires": {
- "@types/fs-extra": "^8.0.1",
- "colorette": "^1.1.0",
- "fs-extra": "^8.1.0",
- "globby": "10.0.1",
- "is-plain-object": "^3.0.0"
- }
- },
- "rollup-plugin-filesize": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-9.1.2.tgz",
- "integrity": "sha512-m2fE9hFaKgWKisJzyWXctOFKlgMRelo/58HgeC0lXUK/qykxiqkr6bsrotlvo2bvrwPsjgT7scNdQSr6qtl37A==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.13.8",
- "boxen": "^5.0.0",
- "brotli-size": "4.0.0",
- "colors": "1.4.0",
- "filesize": "^6.1.0",
- "gzip-size": "^6.0.0",
- "pacote": "^11.2.7",
- "terser": "^5.6.0"
- }
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "dev": true
- },
- "socks": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
- "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
- "dev": true,
- "requires": {
- "ip": "^1.1.5",
- "smart-buffer": "^4.2.0"
- }
- },
- "socks-proxy-agent": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
- "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
- "dev": true,
- "requires": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.1",
- "socks": "^2.6.1"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "dev": true
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "ssri": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
- "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
- "dev": true,
- "requires": {
- "minipass": "^3.1.1"
- }
- },
- "stack-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
- "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^2.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "dev": true,
- "requires": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "tar": {
- "version": "6.1.11",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
- "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
- "dev": true,
- "requires": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- }
- },
- "terser": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
- "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
- "dev": true,
- "requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- }
- },
- "test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "dev": true,
- "requires": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- }
- },
- "tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "ts-jest": {
- "version": "29.0.3",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz",
- "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==",
- "dev": true,
- "requires": {
- "bs-logger": "0.x",
- "fast-json-stable-stringify": "2.x",
- "jest-util": "^29.0.0",
- "json5": "^2.2.1",
- "lodash.memoize": "4.x",
- "make-error": "1.x",
- "semver": "7.x",
- "yargs-parser": "^21.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true
- },
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
- "type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true
- },
- "typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true
- },
- "unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "dev": true,
- "requires": {
- "unique-slug": "^2.0.0"
- }
- },
- "unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
- },
- "update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
- "dev": true,
- "requires": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- }
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
- "v8-to-istanbul": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
- "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^1.6.0"
- }
- },
- "validate-npm-package-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
- "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
- "dev": true,
- "requires": {
- "builtins": "^1.0.3"
- }
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- },
- "dependencies": {
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- }
- }
- },
- "walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "dev": true,
- "requires": {
- "makeerror": "1.0.12"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
- }
- },
- "widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "requires": {
- "string-width": "^4.0.0"
- }
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- }
- },
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "yargs": {
- "version": "17.6.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
- "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
- "dev": true,
- "requires": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
- }
- },
- "yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
- }
- }
-}
diff --git a/rapier-compat/package.json b/rapier-compat/package.json
deleted file mode 100644
index f97e9cf4..00000000
--- a/rapier-compat/package.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "name": "build-rapier",
- "description": "Build scripts for compatibility package with inlined webassembly as base64.",
- "private": true,
- "scripts": {
- "build-rust-2d-non-deterministic": "./build-rust.sh -f non-deterministic -d 2",
- "build-rust-2d-deterministic": "./build-rust.sh -f deterministic -d 2",
- "build-rust-2d-simd": "./build-rust.sh -f simd -d 2",
- "build-rust-2d-all": "npm run build-rust-2d-non-deterministic && npm run build-rust-2d-deterministic && npm run build-rust-2d-simd",
- "build-rust-3d-non-deterministic": "./build-rust.sh -f non-deterministic -d 3",
- "build-rust-3d-deterministic": "./build-rust.sh -f deterministic -d 3",
- "build-rust-3d-simd": "./build-rust.sh -f simd -d 3",
- "build-rust-3d-all": "npm run build-rust-3d-non-deterministic && npm run build-rust-3d-deterministic && npm run build-rust-3d-simd",
- "build-rust-all": "npm run build-rust-2d-all && npm run build-rust-3d-all",
- "build-genjs": "sh ./gen_src.sh",
- "build-js": "rollup --config rollup.config.js --bundleConfigAsCjs",
- "fix-raw-file": "sh ./fix_raw_file.sh",
- "build": "npm run clean && npm run build-rust-all && npm run build-genjs && npm run build-js && npm run fix-raw-file",
- "clean": "rimraf gen2d gen3d builds",
- "test": "jest --detectOpenHandles",
- "all": "npm run build"
- },
- "dependencies": {
- "base64-js": "^1.5.1"
- },
- "devDependencies": {
- "@rollup/plugin-commonjs": "^23.0.2",
- "@rollup/plugin-node-resolve": "^15.0.1",
- "@rollup/plugin-typescript": "^9.0.2",
- "@rollup/plugin-terser": "0.1.0",
- "@types/jest": "^29.2.1",
- "jest": "^29.2.2",
- "rimraf": "^3.0.2",
- "rollup": "^3.2.5",
- "rollup-plugin-base64": "^1.0.1",
- "rollup-plugin-copy": "^3.4.0",
- "rollup-plugin-filesize": "^9.1.2",
- "ts-jest": "^29.0.3",
- "tslib": "^2.4.1",
- "typescript": "^4.8.4"
- },
- "jest": {
- "roots": [
- "/tests"
- ],
- "preset": "ts-jest",
- "collectCoverageFrom": [
- "builds/**/pkg/**/*.js"
- ],
- "transformIgnorePatterns": [
- "[/\\\\]node_modules[/\\\\].+\\.(js|ts)$",
- "builds/.*/[/\\\\]pkg[/\\\\].+\\.(js|ts)$"
- ],
- "moduleFileExtensions": [
- "ts",
- "js"
- ]
- }
-}
diff --git a/rapier-compat/rollup.config.js b/rapier-compat/rollup.config.js
deleted file mode 100644
index d127c671..00000000
--- a/rapier-compat/rollup.config.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import commonjs from "@rollup/plugin-commonjs";
-import {nodeResolve} from "@rollup/plugin-node-resolve";
-import typescript from "@rollup/plugin-typescript";
-import terser from "@rollup/plugin-terser";
-import path from "path";
-import {base64} from "rollup-plugin-base64";
-import copy from "rollup-plugin-copy";
-import filesize from "rollup-plugin-filesize";
-
-const config = (dim, features_postfix) => ({
- input: `builds/${features_postfix}/gen${dim}/rapier.ts`,
- output: [
- {
- file: `builds/${features_postfix}/pkg/rapier.mjs`,
- format: "es",
- sourcemap: true,
- exports: "named",
- },
- {
- file: `builds/${features_postfix}/pkg/rapier.cjs`,
- format: "cjs",
- sourcemap: true,
- exports: "named",
- },
- ],
- plugins: [
- copy({
- targets: [
- {
- src: `builds/${features_postfix}/wasm-build/package.json`,
- dest: `builds/${features_postfix}/pkg/`,
- transform(content) {
- let config = JSON.parse(content.toString());
- config.name = `@dimforge/rapier${features_postfix}-compat`;
- config.description +=
- " Compatibility package with inlined webassembly as base64.";
- config.types = "rapier.d.ts";
- config.main = "rapier.cjs";
- config.module = "rapier.mjs";
- config.exports = {
- ".": {
- types: "./rapier.d.ts",
- require: "./rapier.cjs",
- import: "./rapier.mjs",
- },
- };
- // delete config.module;
- config.files = ["*"];
- return JSON.stringify(config, undefined, 2);
- },
- },
- {
- src: `../rapier${features_postfix}/LICENSE`,
- dest: `builds/${features_postfix}/pkg`,
- },
- {
- src: `../rapier${features_postfix}/README.md`,
- dest: `builds/${features_postfix}/pkg`,
- },
- ],
- }),
- base64({include: "**/*.wasm"}),
- terser(),
- nodeResolve(),
- commonjs(),
- typescript({
- tsconfig: path.resolve(
- __dirname,
- `builds/${features_postfix}/tsconfig.pkg.json`,
- ),
- sourceMap: true,
- inlineSources: true,
- }),
- filesize(),
- ],
-});
-
-export default [
- config("2d", "2d"),
- config("2d", "2d-deterministic"),
- config("2d", "2d-simd"),
- config("3d", "3d"),
- config("3d", "3d-deterministic"),
- config("3d", "3d-simd"),
-];
diff --git a/rapier-compat/src2d/init.ts b/rapier-compat/src2d/init.ts
deleted file mode 100644
index 668bfe13..00000000
--- a/rapier-compat/src2d/init.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// @ts-ignore
-import wasmBase64 from "../pkg/rapier_wasm2d_bg.wasm";
-import wasmInit from "../pkg/rapier_wasm2d";
-import base64 from "base64-js";
-
-/**
- * Initializes RAPIER.
- * Has to be called and awaited before using any library methods.
- */
-export async function init() {
- await wasmInit(base64.toByteArray(wasmBase64 as unknown as string).buffer);
-}
diff --git a/rapier-compat/src2d/raw.ts b/rapier-compat/src2d/raw.ts
deleted file mode 100644
index 4eadaffa..00000000
--- a/rapier-compat/src2d/raw.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from "../pkg/rapier_wasm2d";
diff --git a/rapier-compat/src3d/init.ts b/rapier-compat/src3d/init.ts
deleted file mode 100644
index 15b14ada..00000000
--- a/rapier-compat/src3d/init.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// @ts-ignore
-import wasmBase64 from "../pkg/rapier_wasm3d_bg.wasm";
-import wasmInit from "../pkg/rapier_wasm3d";
-import base64 from "base64-js";
-
-/**
- * Initializes RAPIER.
- * Has to be called and awaited before using any library methods.
- */
-export async function init() {
- await wasmInit(base64.toByteArray(wasmBase64 as unknown as string).buffer);
-}
diff --git a/rapier-compat/src3d/raw.ts b/rapier-compat/src3d/raw.ts
deleted file mode 100644
index b123ae6b..00000000
--- a/rapier-compat/src3d/raw.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from "../pkg/rapier_wasm3d";
diff --git a/rapier-compat/tests/World2d.test.ts b/rapier-compat/tests/World2d.test.ts
deleted file mode 100644
index 45a3bb72..00000000
--- a/rapier-compat/tests/World2d.test.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import {init, Vector2, World} from "../builds/2d-deterministic/pkg";
-
-describe("2d/World", () => {
- let world: World;
-
- beforeAll(init);
-
- afterAll(async () => {
- await Promise.resolve();
- });
-
- beforeEach(() => {
- world = new World(new Vector2(0, 9.8));
- });
-
- afterEach(() => {
- world.free();
- });
-
- test("constructor", () => {
- expect(world.colliders.len()).toBe(0);
- });
-});
diff --git a/rapier-compat/tests/World3d.test.ts b/rapier-compat/tests/World3d.test.ts
deleted file mode 100644
index e0ddd546..00000000
--- a/rapier-compat/tests/World3d.test.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import {init, Vector3, World} from "../builds/3d-deterministic/pkg";
-
-describe("3d/World", () => {
- let world: World;
-
- beforeAll(init);
-
- afterAll(async () => {
- await Promise.resolve();
- });
-
- beforeEach(() => {
- world = new World(new Vector3(0, 9.8, 0));
- });
-
- afterEach(() => {
- world.free();
- });
-
- test("constructor", () => {
- expect(world.colliders.len()).toBe(0);
- });
-});
diff --git a/rapier-compat/tests/math2d.test.ts b/rapier-compat/tests/math2d.test.ts
deleted file mode 100644
index a7560565..00000000
--- a/rapier-compat/tests/math2d.test.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {Vector2, VectorOps} from "../builds/2d-deterministic/pkg";
-
-describe("2d/math", () => {
- test("Vector2", () => {
- const v = new Vector2(0, 1);
- expect(v.x).toBe(0);
- expect(v.y).toBe(1);
- });
-
- test("VectorOps", () => {
- const v = VectorOps.new(0, 1);
- expect(v.x).toBe(0);
- expect(v.y).toBe(1);
- });
-});
diff --git a/rapier-compat/tests/math3d.test.ts b/rapier-compat/tests/math3d.test.ts
deleted file mode 100644
index 2ff194cc..00000000
--- a/rapier-compat/tests/math3d.test.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {Vector3, VectorOps} from "../builds/3d-deterministic/pkg";
-
-describe("3d/math", () => {
- test("Vector3", () => {
- const v = new Vector3(0, 1, 2);
- expect(v.x).toBe(0);
- expect(v.y).toBe(1);
- expect(v.z).toBe(2);
- });
-
- test("VectorOps", () => {
- const v = VectorOps.new(0, 1, 2);
- expect(v.x).toBe(0);
- expect(v.y).toBe(1);
- expect(v.z).toBe(2);
- });
-});
diff --git a/rapier-compat/tsconfig.common.json b/rapier-compat/tsconfig.common.json
deleted file mode 100644
index 37bd7d7f..00000000
--- a/rapier-compat/tsconfig.common.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "compilerOptions": {
- "module": "ES6",
- "target": "es6",
- "noEmitOnError": true,
- "noImplicitAny": true,
- "noImplicitThis": true,
- "strictFunctionTypes": true,
- "lib": ["es6", "DOM"],
- "moduleResolution": "node",
- "esModuleInterop": true,
- "sourceMap": true,
- "declaration": true
- }
-}
diff --git a/rapier-compat/tsconfig.json b/rapier-compat/tsconfig.json
deleted file mode 100644
index beeca944..00000000
--- a/rapier-compat/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extends": "./tsconfig.common.json",
- "compilerOptions": {
- "lib": ["es6", "DOM"],
- "esModuleInterop": true,
- "types": ["jest"],
- "outDir": "./dist"
- },
- "include": ["./tests/**/*.test.ts"]
-}
diff --git a/rapier-compat/tsconfig.pkg2d.json b/rapier-compat/tsconfig.pkg2d.json
deleted file mode 100644
index 77349ed2..00000000
--- a/rapier-compat/tsconfig.pkg2d.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "./tsconfig.common.json",
- "compilerOptions": {
- "rootDir": "./gen2d",
- "outDir": "./2d"
- },
- "files": ["./gen2d/rapier.ts"]
-}
diff --git a/rapier-compat/tsconfig.pkg3d.json b/rapier-compat/tsconfig.pkg3d.json
deleted file mode 100644
index 3d7323e8..00000000
--- a/rapier-compat/tsconfig.pkg3d.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "./tsconfig.common.json",
- "compilerOptions": {
- "rootDir": "./gen3d",
- "outDir": "."
- },
- "files": ["./gen3d/rapier.ts"]
-}
diff --git a/src.ts/geometry/feature.ts b/src.ts/geometry/feature.ts
deleted file mode 100644
index bec9560d..00000000
--- a/src.ts/geometry/feature.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-// #if DIM2
-export enum FeatureType {
- Vertex,
- Face,
- Unknown,
-}
-// #endif
-
-// #if DIM3
-export enum FeatureType {
- Vertex,
- Edge,
- Face,
- Unknown,
-}
-// #endif
diff --git a/src.ts/init.ts b/src.ts/init.ts
deleted file mode 100644
index e9e66aad..00000000
--- a/src.ts/init.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-// Placeholder for the `init` function used in rapier-compat.
-export {};
diff --git a/src.ts/raw.ts b/src.ts/raw.ts
deleted file mode 100644
index 51f837b7..00000000
--- a/src.ts/raw.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from "../rapier3d/pkg/rapier_wasm3d";
diff --git a/src/control/character_controller.rs b/src/control/character_controller.rs
index 03cbdc5d..b2a7ba33 100644
--- a/src/control/character_controller.rs
+++ b/src/control/character_controller.rs
@@ -2,13 +2,12 @@ use crate::dynamics::RawRigidBodySet;
use crate::geometry::{RawBroadPhase, RawColliderSet, RawNarrowPhase};
use crate::math::RawVector;
use crate::utils::{self, FlatHandle};
-use na::{Isometry, Unit};
use rapier::control::{
CharacterAutostep, CharacterCollision, CharacterLength, EffectiveCharacterMovement,
KinematicCharacterController,
};
use rapier::geometry::{ColliderHandle, ShapeCastHit};
-use rapier::math::{Point, Real, Vector};
+use rapier::math::{Pose, Real, Vector};
use rapier::parry::query::ShapeCastStatus;
use rapier::pipeline::{QueryFilter, QueryFilterFlags};
use wasm_bindgen::prelude::*;
@@ -40,7 +39,7 @@ impl RawKinematicCharacterController {
Self {
controller,
result: EffectiveCharacterMovement {
- translation: Vector::zeros(),
+ translation: Vector::ZERO,
grounded: false,
is_sliding_down_slope: false,
},
@@ -49,11 +48,11 @@ impl RawKinematicCharacterController {
}
pub fn up(&self) -> RawVector {
- self.controller.up.into_inner().into()
+ self.controller.up.into()
}
pub fn setUp(&mut self, vector: &RawVector) {
- self.controller.up = Unit::new_normalize(vector.0);
+ self.controller.up = vector.0.normalize();
}
pub fn normalNudgeFactor(&self) -> Real {
@@ -208,7 +207,7 @@ impl RawKinematicCharacterController {
}
});
} else {
- self.result.translation.fill(0.0);
+ self.result.translation = Vector::ZERO;
}
}
@@ -242,15 +241,15 @@ impl RawCharacterCollision {
pub fn new() -> Self {
Self(CharacterCollision {
handle: ColliderHandle::invalid(),
- character_pos: Isometry::identity(),
- translation_applied: Vector::zeros(),
- translation_remaining: Vector::zeros(),
+ character_pos: Pose::IDENTITY,
+ translation_applied: Vector::ZERO,
+ translation_remaining: Vector::ZERO,
hit: ShapeCastHit {
time_of_impact: 0.0,
- witness1: Point::origin(),
- witness2: Point::origin(),
- normal1: Vector::y_axis(),
- normal2: Vector::y_axis(),
+ witness1: Vector::ZERO,
+ witness2: Vector::ZERO,
+ normal1: Vector::Y,
+ normal2: Vector::Y,
status: ShapeCastStatus::Failed,
},
})
@@ -273,18 +272,18 @@ impl RawCharacterCollision {
}
pub fn worldWitness1(&self) -> RawVector {
- self.0.hit.witness1.coords.into() // Already in world-space.
+ self.0.hit.witness1.into() // Already in world-space.
}
pub fn worldWitness2(&self) -> RawVector {
- (self.0.character_pos * self.0.hit.witness2).coords.into()
+ (self.0.character_pos * self.0.hit.witness2).into()
}
pub fn worldNormal1(&self) -> RawVector {
- self.0.hit.normal1.into_inner().into() // Already in world-space.
+ self.0.hit.normal1.into() // Already in world-space.
}
pub fn worldNormal2(&self) -> RawVector {
- (self.0.character_pos * self.0.hit.normal2.into_inner()).into()
+ (self.0.character_pos.rotation * self.0.hit.normal2).into()
}
}
diff --git a/src/control/pid_controller.rs b/src/control/pid_controller.rs
index 890e3391..67f8e45b 100644
--- a/src/control/pid_controller.rs
+++ b/src/control/pid_controller.rs
@@ -154,7 +154,7 @@ impl RawPidController {
target_translation.0.into(),
target_linvel.0,
);
- rb.set_linvel(*rb.linvel() + correction, true);
+ rb.set_linvel(rb.linvel() + correction, true);
}
#[cfg(feature = "dim2")]
@@ -213,7 +213,7 @@ impl RawPidController {
) -> RawVector {
let rb_handle = crate::utils::body_handle(rb_handle);
let Some(rb) = bodies.0.get(rb_handle) else {
- return RawVector(Vector::zeros());
+ return RawVector(Vector::ZERO);
};
self.controller
@@ -254,7 +254,7 @@ impl RawPidController {
) -> RawVector {
let rb_handle = crate::utils::body_handle(rb_handle);
let Some(rb) = bodies.0.get(rb_handle) else {
- return RawVector(Vector::zeros());
+ return RawVector(Vector::ZERO);
};
self.controller
diff --git a/src/dynamics/impulse_joint.rs b/src/dynamics/impulse_joint.rs
index bfbdf128..6ec7bc42 100644
--- a/src/dynamics/impulse_joint.rs
+++ b/src/dynamics/impulse_joint.rs
@@ -36,7 +36,7 @@ impl RawImpulseJointSet {
/// The first anchor gives the position of the points application point on the
/// local frame of the first rigid-body it is attached to.
pub fn jointAnchor1(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |j| j.data.local_frame1.translation.vector.into())
+ self.map(handle, |j| j.data.local_frame1.translation.into())
}
/// The position of the second anchor of this joint.
@@ -44,7 +44,7 @@ impl RawImpulseJointSet {
/// The second anchor gives the position of the points application point on the
/// local frame of the second rigid-body it is attached to.
pub fn jointAnchor2(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |j| j.data.local_frame2.translation.vector.into())
+ self.map(handle, |j| j.data.local_frame2.translation.into())
}
/// Sets the position of the first local anchor
diff --git a/src/dynamics/integration_parameters.rs b/src/dynamics/integration_parameters.rs
index b273e057..6aac0b51 100644
--- a/src/dynamics/integration_parameters.rs
+++ b/src/dynamics/integration_parameters.rs
@@ -18,7 +18,7 @@ impl RawIntegrationParameters {
#[wasm_bindgen(getter)]
pub fn contact_erp(&self) -> f32 {
- self.0.contact_erp()
+ self.0.contact_softness.erp(self.0.dt)
}
#[wasm_bindgen(getter)]
@@ -63,7 +63,7 @@ impl RawIntegrationParameters {
#[wasm_bindgen(setter)]
pub fn set_contact_natural_frequency(&mut self, value: f32) {
- self.0.contact_natural_frequency = value
+ self.0.contact_softness.natural_frequency = value
}
#[wasm_bindgen(setter)]
diff --git a/src/dynamics/joint.rs b/src/dynamics/joint.rs
index 74ab2b3d..05da350d 100644
--- a/src/dynamics/joint.rs
+++ b/src/dynamics/joint.rs
@@ -1,12 +1,11 @@
use crate::math::{RawRotation, RawVector};
-use na::Unit;
use rapier::dynamics::{
FixedJointBuilder, GenericJoint, JointAxesMask, JointAxis, MotorModel, PrismaticJointBuilder,
RevoluteJointBuilder, RopeJointBuilder, SpringJointBuilder,
};
#[cfg(feature = "dim3")]
use rapier::dynamics::{GenericJointBuilder, SphericalJointBuilder};
-use rapier::math::Isometry;
+use rapier::math::Pose;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
@@ -157,7 +156,7 @@ impl RawGenericJoint {
lockedAxes: u8,
) -> Option {
let axesMask: JointAxesMask = JointAxesMask::from_bits(lockedAxes)?;
- let axis = Unit::try_new(axis.0, 0.0)?;
+ let axis = axis.0.try_normalize()?;
let joint: GenericJoint = GenericJointBuilder::new(axesMask)
.local_anchor1(anchor1.0.into())
.local_anchor2(anchor2.0.into())
@@ -221,7 +220,7 @@ impl RawGenericJoint {
limitsMin: f32,
limitsMax: f32,
) -> Option {
- let axis = Unit::try_new(axis.0, 0.0)?;
+ let axis = axis.0.try_normalize()?;
let mut joint = PrismaticJointBuilder::new(axis)
.local_anchor1(anchor1.0.into())
.local_anchor2(anchor2.0.into());
@@ -248,7 +247,7 @@ impl RawGenericJoint {
limitsMin: f32,
limitsMax: f32,
) -> Option {
- let axis = Unit::try_new(axis.0, 0.0)?;
+ let axis = axis.0.try_normalize()?;
let mut joint = PrismaticJointBuilder::new(axis)
.local_anchor1(anchor1.0.into())
.local_anchor2(anchor2.0.into());
@@ -269,8 +268,8 @@ impl RawGenericJoint {
anchor2: &RawVector,
axes2: &RawRotation,
) -> RawGenericJoint {
- let pos1 = Isometry::from_parts(anchor1.0.into(), axes1.0);
- let pos2 = Isometry::from_parts(anchor2.0.into(), axes2.0);
+ let pos1 = Pose::from_parts(anchor1.0, axes1.0);
+ let pos2 = Pose::from_parts(anchor2.0, axes2.0);
Self(
FixedJointBuilder::new()
.local_frame1(pos1)
@@ -303,7 +302,7 @@ impl RawGenericJoint {
anchor2: &RawVector,
axis: &RawVector,
) -> Option {
- let axis = Unit::try_new(axis.0, 0.0)?;
+ let axis = axis.0.try_normalize()?;
Some(Self(
RevoluteJointBuilder::new(axis)
.local_anchor1(anchor1.0.into())
diff --git a/src/dynamics/multibody_joint.rs b/src/dynamics/multibody_joint.rs
index ff6e816e..9a95f0d5 100644
--- a/src/dynamics/multibody_joint.rs
+++ b/src/dynamics/multibody_joint.rs
@@ -36,7 +36,7 @@ impl RawMultibodyJointSet {
/// The first anchor gives the position of the points application point on the
/// local frame of the first rigid-body it is attached to.
pub fn jointAnchor1(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |j| j.data.local_frame1.translation.vector.into())
+ self.map(handle, |j| j.data.local_frame1.translation.into())
}
/// The position of the second anchor of this joint.
@@ -44,7 +44,7 @@ impl RawMultibodyJointSet {
/// The second anchor gives the position of the points application point on the
/// local frame of the second rigid-body it is attached to.
pub fn jointAnchor2(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |j| j.data.local_frame2.translation.vector.into())
+ self.map(handle, |j| j.data.local_frame2.translation.into())
}
/// Are contacts between the rigid-bodies attached by this joint enabled?
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs
index d7174d77..bb2cfb29 100644
--- a/src/dynamics/rigid_body.rs
+++ b/src/dynamics/rigid_body.rs
@@ -1,23 +1,55 @@
use crate::dynamics::{RawRigidBodySet, RawRigidBodyType};
use crate::geometry::RawColliderSet;
#[cfg(feature = "dim3")]
-use crate::math::RawSdpMatrix3;
-use crate::math::{RawRotation, RawVector};
+use crate::math::{RawRotation, RawSdpMatrix3};
+use crate::math::RawVector;
use crate::utils::{self, FlatHandle};
-use na::Point;
+use js_sys::Float32Array;
use rapier::dynamics::MassProperties;
+use rapier::math::{Rotation, Vector};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
impl RawRigidBodySet {
- /// The world-space translation of this rigid-body.
- pub fn rbTranslation(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |rb| RawVector(rb.position().translation.vector))
+ /// The world-space translation of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn rbTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let t = rb.position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ });
+ }
+
+ /// The world-space translation of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn rbTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let t = rb.position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ buffer.set_index(2, t.z);
+ });
+ }
+
+ /// The world-space orientation of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn rbRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ buffer.set_index(0, rb.position().rotation.angle());
+ });
}
- /// The world-space orientation of this rigid-body.
- pub fn rbRotation(&self, handle: FlatHandle) -> RawRotation {
- self.map(handle, |rb| RawRotation(rb.position().rotation))
+ /// The world-space orientation of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn rbRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let r = rb.position().rotation;
+ buffer.set_index(0, r.x);
+ buffer.set_index(1, r.y);
+ buffer.set_index(2, r.z);
+ buffer.set_index(3, r.w);
+ });
}
/// Put the given rigid-body to sleep.
@@ -35,24 +67,61 @@ impl RawRigidBodySet {
self.map(handle, |rb| rb.is_moving())
}
- /// The world-space predicted translation of this rigid-body.
+ /// The world-space next translation of this rigid-body, written to a buffer.
///
/// If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`
/// method and is used for estimating the kinematic body velocity at the next timestep.
/// For non-kinematic bodies, this value is currently unspecified.
- pub fn rbNextTranslation(&self, handle: FlatHandle) -> RawVector {
+ #[cfg(feature = "dim2")]
+ pub fn rbNextTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
self.map(handle, |rb| {
- RawVector(rb.next_position().translation.vector)
- })
+ let t = rb.next_position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ });
}
- /// The world-space predicted orientation of this rigid-body.
+ /// The world-space next translation of this rigid-body, written to a buffer.
+ ///
+ /// If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`
+ /// method and is used for estimating the kinematic body velocity at the next timestep.
+ /// For non-kinematic bodies, this value is currently unspecified.
+ #[cfg(feature = "dim3")]
+ pub fn rbNextTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let t = rb.next_position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ buffer.set_index(2, t.z);
+ });
+ }
+
+ /// The world-space next orientation of this rigid-body, written to a buffer.
///
/// If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`
/// method and is used for estimating the kinematic body velocity at the next timestep.
/// For non-kinematic bodies, this value is currently unspecified.
- pub fn rbNextRotation(&self, handle: FlatHandle) -> RawRotation {
- self.map(handle, |rb| RawRotation(rb.next_position().rotation))
+ #[cfg(feature = "dim2")]
+ pub fn rbNextRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ buffer.set_index(0, rb.next_position().rotation.angle());
+ });
+ }
+
+ /// The world-space next orientation of this rigid-body, written to a buffer.
+ ///
+ /// If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`
+ /// method and is used for estimating the kinematic body velocity at the next timestep.
+ /// For non-kinematic bodies, this value is currently unspecified.
+ #[cfg(feature = "dim3")]
+ pub fn rbNextRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let r = rb.next_position().rotation;
+ buffer.set_index(0, r.x);
+ buffer.set_index(1, r.y);
+ buffer.set_index(2, r.z);
+ buffer.set_index(3, r.w);
+ });
}
/// Sets the translation of this rigid-body.
@@ -66,7 +135,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim3")]
pub fn rbSetTranslation(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32, wakeUp: bool) {
self.map_mut(handle, |rb| {
- rb.set_translation(na::Vector3::new(x, y, z), wakeUp);
+ rb.set_translation(Vector::new(x, y, z), wakeUp);
})
}
@@ -80,7 +149,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim2")]
pub fn rbSetTranslation(&mut self, handle: FlatHandle, x: f32, y: f32, wakeUp: bool) {
self.map_mut(handle, |rb| {
- rb.set_translation(na::Vector2::new(x, y), wakeUp);
+ rb.set_translation(Vector::new(x, y), wakeUp);
})
}
@@ -105,7 +174,8 @@ impl RawRigidBodySet {
w: f32,
wakeUp: bool,
) {
- if let Some(q) = na::Unit::try_new(na::Quaternion::new(w, x, y, z), 0.0) {
+ let q = Rotation::from_xyzw(x, y, z, w);
+ if q.is_normalized() {
self.map_mut(handle, |rb| rb.set_rotation(q, wakeUp))
}
}
@@ -119,7 +189,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim2")]
pub fn rbSetRotation(&mut self, handle: FlatHandle, angle: f32, wakeUp: bool) {
self.map_mut(handle, |rb| {
- rb.set_rotation(na::UnitComplex::new(angle), wakeUp)
+ rb.set_rotation(Rotation::new(angle), wakeUp)
})
}
@@ -161,7 +231,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim3")]
pub fn rbSetNextKinematicTranslation(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32) {
self.map_mut(handle, |rb| {
- rb.set_next_kinematic_translation(na::Vector3::new(x, y, z));
+ rb.set_next_kinematic_translation(Vector::new(x, y, z));
})
}
@@ -179,7 +249,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim2")]
pub fn rbSetNextKinematicTranslation(&mut self, handle: FlatHandle, x: f32, y: f32) {
self.map_mut(handle, |rb| {
- rb.set_next_kinematic_translation(na::Vector2::new(x, y));
+ rb.set_next_kinematic_translation(Vector::new(x, y));
})
}
@@ -205,7 +275,8 @@ impl RawRigidBodySet {
z: f32,
w: f32,
) {
- if let Some(q) = na::Unit::try_new(na::Quaternion::new(w, x, y, z), 0.0) {
+ let q = Rotation::from_xyzw(x, y, z, w);
+ if q.is_normalized() {
self.map_mut(handle, |rb| {
rb.set_next_kinematic_rotation(q);
})
@@ -225,7 +296,7 @@ impl RawRigidBodySet {
#[cfg(feature = "dim2")]
pub fn rbSetNextKinematicRotation(&mut self, handle: FlatHandle, angle: f32) {
self.map_mut(handle, |rb| {
- rb.set_next_kinematic_rotation(na::UnitComplex::new(angle));
+ rb.set_next_kinematic_rotation(Rotation::new(angle));
})
}
@@ -281,9 +352,25 @@ impl RawRigidBodySet {
})
}
- /// The linear velocity of this rigid-body.
- pub fn rbLinvel(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |rb| RawVector(*rb.linvel()))
+ /// The linear velocity of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn rbLinvel(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let v = rb.linvel();
+ buffer.set_index(0, v.x);
+ buffer.set_index(1, v.y);
+ });
+ }
+
+ /// The linear velocity of this rigid-body, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn rbLinvel(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let v = rb.linvel();
+ buffer.set_index(0, v.x);
+ buffer.set_index(1, v.y);
+ buffer.set_index(2, v.z);
+ });
}
/// The angular velocity of this rigid-body.
@@ -292,17 +379,20 @@ impl RawRigidBodySet {
self.map(handle, |rb| rb.angvel())
}
- /// The angular velocity of this rigid-body.
+ /// The angular velocity of this rigid-body, written to a buffer.
#[cfg(feature = "dim3")]
- pub fn rbAngvel(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |rb| RawVector(*rb.angvel()))
+ pub fn rbAngvel(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let v = rb.angvel();
+ buffer.set_index(0, v.x);
+ buffer.set_index(1, v.y);
+ buffer.set_index(2, v.z);
+ });
}
/// The velocity of the given world-space point on this rigid-body.
pub fn rbVelocityAtPoint(&self, handle: FlatHandle, point: &RawVector) -> RawVector {
- self.map(handle, |rb| {
- rb.velocity_at_point(&Point::from(point.0)).into()
- })
+ self.map(handle, |rb| rb.velocity_at_point(point.0).into())
}
pub fn rbLockTranslations(&mut self, handle: FlatHandle, locked: bool, wake_up: bool) {
@@ -387,16 +477,46 @@ impl RawRigidBodySet {
self.map(handle, |rb| rb.mass_properties().effective_inv_mass.into())
}
- /// The center of mass of a rigid-body expressed in its local-space.
- pub fn rbLocalCom(&self, handle: FlatHandle) -> RawVector {
+ /// The center of mass of a rigid-body expressed in its local-space, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn rbLocalCom(&self, handle: FlatHandle, buffer: &Float32Array) {
self.map(handle, |rb| {
- rb.mass_properties().local_mprops.local_com.into()
- })
+ let c = rb.mass_properties().local_mprops.local_com;
+ buffer.set_index(0, c.x);
+ buffer.set_index(1, c.y);
+ });
+ }
+
+ /// The center of mass of a rigid-body expressed in its local-space, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn rbLocalCom(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let c = rb.mass_properties().local_mprops.local_com;
+ buffer.set_index(0, c.x);
+ buffer.set_index(1, c.y);
+ buffer.set_index(2, c.z);
+ });
}
- /// The world-space center of mass of the rigid-body.
- pub fn rbWorldCom(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |rb| rb.mass_properties().world_com.into())
+ /// The world-space center of mass of the rigid-body, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn rbWorldCom(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let c = rb.mass_properties().world_com;
+ buffer.set_index(0, c.x);
+ buffer.set_index(1, c.y);
+ });
+ }
+
+ /// The world-space center of mass of the rigid-body, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn rbWorldCom(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |rb| {
+ let c = rb.mass_properties().world_com;
+ buffer.set_index(0, c.x);
+ buffer.set_index(1, c.y);
+ buffer.set_index(2, c.z);
+ });
}
/// The inverse of the principal angular inertia of the rigid-body.
diff --git a/src/dynamics/rigid_body_set.rs b/src/dynamics/rigid_body_set.rs
index 83b963e3..d8fb74c3 100644
--- a/src/dynamics/rigid_body_set.rs
+++ b/src/dynamics/rigid_body_set.rs
@@ -3,6 +3,7 @@ use crate::geometry::RawColliderSet;
use crate::math::{RawRotation, RawVector};
use crate::utils::{self, FlatHandle};
use rapier::dynamics::{MassProperties, RigidBody, RigidBodyBuilder, RigidBodySet, RigidBodyType};
+use rapier::math::Pose;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
@@ -95,7 +96,7 @@ impl RawRigidBodySet {
dominanceGroup: i8,
additional_solver_iterations: usize,
) -> FlatHandle {
- let pos = na::Isometry3::from_parts(translation.0.into(), rotation.0);
+ let pos = Pose::from_parts(translation.0, rotation.0);
let mut rigid_body = RigidBodyBuilder::new(rb_type.into())
.enabled(enabled)
@@ -159,7 +160,7 @@ impl RawRigidBodySet {
dominanceGroup: i8,
additional_solver_iterations: usize,
) -> FlatHandle {
- let pos = na::Isometry2::from_parts(translation.0.into(), rotation.0);
+ let pos = Pose::from_parts(translation.0, rotation.0);
let mut rigid_body = RigidBodyBuilder::new(rb_type.into())
.enabled(enabled)
.pose(pos)
diff --git a/src/geometry/broad_phase.rs b/src/geometry/broad_phase.rs
index 6f81a862..7eaf9f3f 100644
--- a/src/geometry/broad_phase.rs
+++ b/src/geometry/broad_phase.rs
@@ -7,7 +7,7 @@ use crate::math::{RawRotation, RawVector};
use crate::utils::{self, FlatHandle};
use rapier::geometry::DefaultBroadPhase;
use rapier::geometry::{Aabb, ColliderHandle, Ray};
-use rapier::math::{Isometry, Point};
+use rapier::math::Pose;
use rapier::parry::query::ShapeCastOptions;
use rapier::pipeline::{QueryFilter, QueryFilterFlags};
use rapier::prelude::FeatureId;
@@ -23,13 +23,17 @@ impl RawBroadPhase {
RawBroadPhase(DefaultBroadPhase::new())
}
+ #[cfg(feature = "dim2")]
+ #[allow(clippy::too_many_arguments)]
pub fn castRay(
&self,
narrow_phase: &RawNarrowPhase,
bodies: &RawRigidBodySet,
colliders: &RawColliderSet,
- rayOrig: &RawVector,
- rayDir: &RawVector,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_dx: f32,
+ ray_dy: f32,
maxToi: f32,
solid: bool,
filter_flags: u32,
@@ -55,7 +59,7 @@ impl RawBroadPhase {
query_filter,
);
- let ray = Ray::new(rayOrig.0.into(), rayDir.0);
+ let ray = Ray::new([ray_ox, ray_oy].into(), [ray_dx, ray_dy].into());
query_pipeline.cast_ray(&ray, maxToi, solid)
})?;
@@ -65,13 +69,113 @@ impl RawBroadPhase {
})
}
+ #[cfg(feature = "dim3")]
+ #[allow(clippy::too_many_arguments)]
+ pub fn castRay(
+ &self,
+ narrow_phase: &RawNarrowPhase,
+ bodies: &RawRigidBodySet,
+ colliders: &RawColliderSet,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_oz: f32,
+ ray_dx: f32,
+ ray_dy: f32,
+ ray_dz: f32,
+ maxToi: f32,
+ solid: bool,
+ filter_flags: u32,
+ filter_groups: Option,
+ filter_exclude_collider: Option,
+ filter_exclude_rigid_body: Option,
+ filter_predicate: &js_sys::Function,
+ ) -> Option {
+ let (handle, timeOfImpact) = utils::with_filter(filter_predicate, |predicate| {
+ let query_filter = QueryFilter {
+ flags: QueryFilterFlags::from_bits(filter_flags)
+ .unwrap_or(QueryFilterFlags::empty()),
+ groups: filter_groups.map(crate::geometry::unpack_interaction_groups),
+ exclude_collider: filter_exclude_collider.map(crate::utils::collider_handle),
+ exclude_rigid_body: filter_exclude_rigid_body.map(crate::utils::body_handle),
+ predicate,
+ };
+
+ let query_pipeline = self.0.as_query_pipeline(
+ narrow_phase.0.query_dispatcher(),
+ &bodies.0,
+ &colliders.0,
+ query_filter,
+ );
+
+ let ray = Ray::new(
+ [ray_ox, ray_oy, ray_oz].into(),
+ [ray_dx, ray_dy, ray_dz].into(),
+ );
+ query_pipeline.cast_ray(&ray, maxToi, solid)
+ })?;
+
+ Some(RawRayColliderHit {
+ handle,
+ timeOfImpact,
+ })
+ }
+
+ #[cfg(feature = "dim2")]
+ #[allow(clippy::too_many_arguments)]
+ pub fn castRayAndGetNormal(
+ &self,
+ narrow_phase: &RawNarrowPhase,
+ bodies: &RawRigidBodySet,
+ colliders: &RawColliderSet,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_dx: f32,
+ ray_dy: f32,
+ maxToi: f32,
+ solid: bool,
+ filter_flags: u32,
+ filter_groups: Option,
+ filter_exclude_collider: Option,
+ filter_exclude_rigid_body: Option,
+ filter_predicate: &js_sys::Function,
+ ) -> Option {
+ let (handle, inter) = utils::with_filter(filter_predicate, |predicate| {
+ let query_filter = QueryFilter {
+ flags: QueryFilterFlags::from_bits(filter_flags)
+ .unwrap_or(QueryFilterFlags::empty()),
+ groups: filter_groups.map(crate::geometry::unpack_interaction_groups),
+ exclude_collider: filter_exclude_collider.map(crate::utils::collider_handle),
+ exclude_rigid_body: filter_exclude_rigid_body.map(crate::utils::body_handle),
+ predicate,
+ };
+
+ let query_pipeline = self.0.as_query_pipeline(
+ narrow_phase.0.query_dispatcher(),
+ &bodies.0,
+ &colliders.0,
+ query_filter,
+ );
+
+ let ray = Ray::new([ray_ox, ray_oy].into(), [ray_dx, ray_dy].into());
+ query_pipeline.cast_ray_and_get_normal(&ray, maxToi, solid)
+ })?;
+
+ Some(RawRayColliderIntersection { handle, inter })
+ }
+
+ #[cfg(feature = "dim3")]
+ #[allow(clippy::too_many_arguments)]
pub fn castRayAndGetNormal(
&self,
narrow_phase: &RawNarrowPhase,
bodies: &RawRigidBodySet,
colliders: &RawColliderSet,
- rayOrig: &RawVector,
- rayDir: &RawVector,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_oz: f32,
+ ray_dx: f32,
+ ray_dy: f32,
+ ray_dz: f32,
maxToi: f32,
solid: bool,
filter_flags: u32,
@@ -97,7 +201,10 @@ impl RawBroadPhase {
query_filter,
);
- let ray = Ray::new(rayOrig.0.into(), rayDir.0);
+ let ray = Ray::new(
+ [ray_ox, ray_oy, ray_oz].into(),
+ [ray_dx, ray_dy, ray_dz].into(),
+ );
query_pipeline.cast_ray_and_get_normal(&ray, maxToi, solid)
})?;
@@ -105,13 +212,17 @@ impl RawBroadPhase {
}
// The callback is of type (RawRayColliderIntersection) => bool
+ #[cfg(feature = "dim2")]
+ #[allow(clippy::too_many_arguments)]
pub fn intersectionsWithRay(
&self,
narrow_phase: &RawNarrowPhase,
bodies: &RawRigidBodySet,
colliders: &RawColliderSet,
- rayOrig: &RawVector,
- rayDir: &RawVector,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_dx: f32,
+ ray_dy: f32,
maxToi: f32,
solid: bool,
callback: &js_sys::Function,
@@ -131,7 +242,67 @@ impl RawBroadPhase {
predicate,
};
- let ray = Ray::new(rayOrig.0.into(), rayDir.0);
+ let ray = Ray::new([ray_ox, ray_oy].into(), [ray_dx, ray_dy].into());
+ let rcallback = |handle, inter| {
+ let result = RawRayColliderIntersection { handle, inter };
+ match callback.call1(&JsValue::null(), &JsValue::from(result)) {
+ Err(_) => true,
+ Ok(val) => val.as_bool().unwrap_or(true),
+ }
+ };
+
+ let query_pipeline = self.0.as_query_pipeline(
+ narrow_phase.0.query_dispatcher(),
+ &bodies.0,
+ &colliders.0,
+ query_filter,
+ );
+
+ for (handle, _, inter) in query_pipeline.intersect_ray(ray, maxToi, solid) {
+ if !rcallback(handle, inter) {
+ break;
+ }
+ }
+ });
+ }
+
+ // The callback is of type (RawRayColliderIntersection) => bool
+ #[cfg(feature = "dim3")]
+ #[allow(clippy::too_many_arguments)]
+ pub fn intersectionsWithRay(
+ &self,
+ narrow_phase: &RawNarrowPhase,
+ bodies: &RawRigidBodySet,
+ colliders: &RawColliderSet,
+ ray_ox: f32,
+ ray_oy: f32,
+ ray_oz: f32,
+ ray_dx: f32,
+ ray_dy: f32,
+ ray_dz: f32,
+ maxToi: f32,
+ solid: bool,
+ callback: &js_sys::Function,
+ filter_flags: u32,
+ filter_groups: Option,
+ filter_exclude_collider: Option,
+ filter_exclude_rigid_body: Option,
+ filter_predicate: &js_sys::Function,
+ ) {
+ utils::with_filter(filter_predicate, |predicate| {
+ let query_filter = QueryFilter {
+ flags: QueryFilterFlags::from_bits(filter_flags)
+ .unwrap_or(QueryFilterFlags::empty()),
+ groups: filter_groups.map(crate::geometry::unpack_interaction_groups),
+ exclude_collider: filter_exclude_collider.map(crate::utils::collider_handle),
+ exclude_rigid_body: filter_exclude_rigid_body.map(crate::utils::body_handle),
+ predicate,
+ };
+
+ let ray = Ray::new(
+ [ray_ox, ray_oy, ray_oz].into(),
+ [ray_dx, ray_dy, ray_dz].into(),
+ );
let rcallback = |handle, inter| {
let result = RawRayColliderIntersection { handle, inter };
match callback.call1(&JsValue::null(), &JsValue::from(result)) {
@@ -186,7 +357,7 @@ impl RawBroadPhase {
query_filter,
);
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
// TODO: take a callback as argument so we can yield all the intersecting shapes?
for (handle, _) in query_pipeline.intersect_shape(pos, &*shape.0) {
@@ -229,7 +400,7 @@ impl RawBroadPhase {
);
query_pipeline
- .project_point(&point.0.into(), f32::MAX, solid)
+ .project_point(point.0, f32::MAX, solid)
.map(|(handle, proj)| RawPointColliderProjection {
handle,
proj,
@@ -268,7 +439,7 @@ impl RawBroadPhase {
);
query_pipeline
- .project_point_and_get_feature(&point.0.into())
+ .project_point_and_get_feature(point.0)
.map(|(handle, proj, feature)| RawPointColliderProjection {
handle,
proj,
@@ -359,11 +530,11 @@ impl RawBroadPhase {
query_filter,
);
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
query_pipeline
.cast_shape(
&pos,
- &shapeVel.0,
+ shapeVel.0,
&*shape.0,
ShapeCastOptions {
max_time_of_impact: maxToi,
@@ -417,7 +588,7 @@ impl RawBroadPhase {
Ok(val) => val.as_bool().unwrap_or(true),
};
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
for (handle, _) in query_pipeline.intersect_shape(pos, &*shape.0) {
if !rcallback(handle) {
break;
@@ -450,7 +621,7 @@ impl RawBroadPhase {
Default::default(),
);
- let center = Point::from(aabbCenter.0);
+ let center = aabbCenter.0;
let aabb = Aabb::new(center - aabbHalfExtents.0, center + aabbHalfExtents.0);
for (handle, _) in query_pipeline.intersect_aabb_conservative(aabb) {
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index e8019044..f3ac61f2 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -5,9 +5,10 @@ use crate::geometry::{
};
use crate::math::{RawRotation, RawVector};
use crate::utils::{self, FlatHandle};
+use js_sys::Float32Array;
use rapier::dynamics::MassProperties;
use rapier::geometry::{ActiveCollisionTypes, ShapeType};
-use rapier::math::{Isometry, Point, Real, Vector};
+use rapier::math::{IVector, Pose, Real, Rotation, Vector};
use rapier::parry::query;
use rapier::parry::query::ShapeCastOptions;
use rapier::pipeline::{ActiveEvents, ActiveHooks};
@@ -15,32 +16,106 @@ use wasm_bindgen::prelude::*;
#[wasm_bindgen]
impl RawColliderSet {
- /// The world-space translation of this collider.
- pub fn coTranslation(&self, handle: FlatHandle) -> RawVector {
- self.map(handle, |co| co.position().translation.vector.into())
+ /// The world-space translation of this collider, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn coTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |co| {
+ let t = co.position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ });
+ }
+
+ /// The world-space translation of this collider, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn coTranslation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |co| {
+ let t = co.position().translation;
+ buffer.set_index(0, t.x);
+ buffer.set_index(1, t.y);
+ buffer.set_index(2, t.z);
+ });
}
- /// The world-space orientation of this collider.
- pub fn coRotation(&self, handle: FlatHandle) -> RawRotation {
- self.map(handle, |co| co.position().rotation.into())
+ /// The world-space orientation of this collider, written to a buffer.
+ #[cfg(feature = "dim2")]
+ pub fn coRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |co| {
+ buffer.set_index(0, co.position().rotation.angle());
+ });
}
- /// The translation of this collider relative to its parent rigid-body.
- ///
- /// Returns the `None` if it doesn’t have a parent.
- pub fn coTranslationWrtParent(&self, handle: FlatHandle) -> Option {
+ /// The world-space orientation of this collider, written to a buffer.
+ #[cfg(feature = "dim3")]
+ pub fn coRotation(&self, handle: FlatHandle, buffer: &Float32Array) {
+ self.map(handle, |co| {
+ let r = co.position().rotation;
+ buffer.set_index(0, r.x);
+ buffer.set_index(1, r.y);
+ buffer.set_index(2, r.z);
+ buffer.set_index(3, r.w);
+ });
+ }
+
+ /// The translation of this collider relative to its parent rigid-body, written to a buffer.
+ /// Returns false if it doesn't have a parent.
+ #[cfg(feature = "dim2")]
+ pub fn coTranslationWrtParent(&self, handle: FlatHandle, buffer: &Float32Array) -> bool {
self.map(handle, |co| {
- co.position_wrt_parent()
- .map(|pose| pose.translation.vector.into())
+ if let Some(pose) = co.position_wrt_parent() {
+ buffer.set_index(0, pose.translation.x);
+ buffer.set_index(1, pose.translation.y);
+ true
+ } else {
+ false
+ }
})
}
- /// The orientation of this collider relative to its parent rigid-body.
- ///
- /// Returns the `None` if it doesn’t have a parent.
- pub fn coRotationWrtParent(&self, handle: FlatHandle) -> Option {
+ /// The translation of this collider relative to its parent rigid-body, written to a buffer.
+ /// Returns false if it doesn't have a parent.
+ #[cfg(feature = "dim3")]
+ pub fn coTranslationWrtParent(&self, handle: FlatHandle, buffer: &Float32Array) -> bool {
+ self.map(handle, |co| {
+ if let Some(pose) = co.position_wrt_parent() {
+ buffer.set_index(0, pose.translation.x);
+ buffer.set_index(1, pose.translation.y);
+ buffer.set_index(2, pose.translation.z);
+ true
+ } else {
+ false
+ }
+ })
+ }
+
+ /// The orientation of this collider relative to its parent rigid-body, written to a buffer.
+ /// Returns false if it doesn't have a parent.
+ #[cfg(feature = "dim2")]
+ pub fn coRotationWrtParent(&self, handle: FlatHandle, buffer: &Float32Array) -> bool {
+ self.map(handle, |co| {
+ if let Some(pose) = co.position_wrt_parent() {
+ buffer.set_index(0, pose.rotation.angle());
+ true
+ } else {
+ false
+ }
+ })
+ }
+
+ /// The orientation of this collider relative to its parent rigid-body, written to a buffer.
+ /// Returns false if it doesn't have a parent.
+ #[cfg(feature = "dim3")]
+ pub fn coRotationWrtParent(&self, handle: FlatHandle, buffer: &Float32Array) -> bool {
self.map(handle, |co| {
- co.position_wrt_parent().map(|pose| pose.rotation.into())
+ if let Some(pose) = co.position_wrt_parent() {
+ buffer.set_index(0, pose.rotation.x);
+ buffer.set_index(1, pose.rotation.y);
+ buffer.set_index(2, pose.rotation.z);
+ buffer.set_index(3, pose.rotation.w);
+ true
+ } else {
+ false
+ }
})
}
@@ -55,7 +130,7 @@ impl RawColliderSet {
#[cfg(feature = "dim3")]
pub fn coSetTranslation(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32) {
self.map_mut(handle, |co| {
- co.set_translation(na::Vector3::new(x, y, z));
+ co.set_translation(Vector::new(x, y, z));
})
}
@@ -69,21 +144,21 @@ impl RawColliderSet {
#[cfg(feature = "dim2")]
pub fn coSetTranslation(&mut self, handle: FlatHandle, x: f32, y: f32) {
self.map_mut(handle, |co| {
- co.set_translation(na::Vector2::new(x, y));
+ co.set_translation(Vector::new(x, y));
})
}
#[cfg(feature = "dim3")]
pub fn coSetTranslationWrtParent(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32) {
self.map_mut(handle, |co| {
- co.set_translation_wrt_parent(na::Vector3::new(x, y, z));
+ co.set_translation_wrt_parent(Vector::new(x, y, z));
})
}
#[cfg(feature = "dim2")]
pub fn coSetTranslationWrtParent(&mut self, handle: FlatHandle, x: f32, y: f32) {
self.map_mut(handle, |co| {
- co.set_translation_wrt_parent(na::Vector2::new(x, y));
+ co.set_translation_wrt_parent(Vector::new(x, y));
})
}
@@ -100,7 +175,8 @@ impl RawColliderSet {
/// wasn't moving before modifying its position.
#[cfg(feature = "dim3")]
pub fn coSetRotation(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32, w: f32) {
- if let Some(q) = na::Unit::try_new(na::Quaternion::new(w, x, y, z), 0.0) {
+ let q = Rotation::from_xyzw(x, y, z, w);
+ if q.is_normalized() {
self.map_mut(handle, |co| co.set_rotation(q))
}
}
@@ -113,13 +189,16 @@ impl RawColliderSet {
/// wasn't moving before modifying its position.
#[cfg(feature = "dim2")]
pub fn coSetRotation(&mut self, handle: FlatHandle, angle: f32) {
- self.map_mut(handle, |co| co.set_rotation(na::UnitComplex::new(angle)))
+ self.map_mut(handle, |co| co.set_rotation(Rotation::new(angle)))
}
#[cfg(feature = "dim3")]
pub fn coSetRotationWrtParent(&mut self, handle: FlatHandle, x: f32, y: f32, z: f32, w: f32) {
- if let Some(q) = na::Unit::try_new(na::Quaternion::new(w, x, y, z), 0.0) {
- self.map_mut(handle, |co| co.set_rotation_wrt_parent(q.scaled_axis()))
+ let q = Rotation::from_xyzw(x, y, z, w);
+ if q.is_normalized() {
+ // Extract the axis-angle representation for rotation_wrt_parent
+ let (axis, angle) = q.to_axis_angle();
+ self.map_mut(handle, |co| co.set_rotation_wrt_parent(axis * angle))
}
}
@@ -173,7 +252,7 @@ impl RawColliderSet {
self.map(handle, |co| {
co.shape()
.as_halfspace()
- .map(|h| h.normal.into_inner().into())
+ .map(|h| h.normal.into())
})
}
@@ -268,7 +347,7 @@ impl RawColliderSet {
pub fn coSetHalfHeight(&mut self, handle: FlatHandle, newHalfheight: Real) {
self.map_mut(handle, |co| match co.shape().shape_type() {
ShapeType::Capsule => {
- let point = Point::from(Vector::y() * newHalfheight);
+ let point = Vector::Y * newHalfheight;
co.shape_mut().as_capsule_mut().map(|b| {
b.segment.a = -point;
b.segment.b = point;
@@ -357,7 +436,7 @@ impl RawColliderSet {
let coords = vox
.voxels()
.filter_map(|vox| (!vox.state.is_empty()).then_some(vox.grid_coords))
- .flat_map(|ids| ids.coords.data.0[0])
+ .flat_map(|ids| ids.to_array())
.collect();
Some(coords)
})
@@ -374,7 +453,7 @@ impl RawColliderSet {
pub fn coSetVoxel(&mut self, handle: FlatHandle, ix: i32, iy: i32, filled: bool) {
self.map_mut(handle, |co| {
if let Some(vox) = co.shape_mut().as_voxels_mut() {
- vox.set_voxel(Point::new(ix, iy), filled);
+ vox.set_voxel(IVector::new(ix, iy), filled);
}
})
}
@@ -383,7 +462,7 @@ impl RawColliderSet {
pub fn coSetVoxel(&mut self, handle: FlatHandle, ix: i32, iy: i32, iz: i32, filled: bool) {
self.map_mut(handle, |co| {
if let Some(vox) = co.shape_mut().as_voxels_mut() {
- vox.set_voxel(Point::new(ix, iy, iz), filled);
+ vox.set_voxel(IVector::new(ix, iy, iz), filled);
}
})
}
@@ -406,8 +485,8 @@ impl RawColliderSet {
) {
vox1.propagate_voxel_change(
vox2,
- Point::new(ix, iy),
- Vector::new(shift_x, shift_y),
+ IVector::new(ix, iy),
+ IVector::new(shift_x, shift_y),
);
}
}
@@ -434,8 +513,8 @@ impl RawColliderSet {
) {
vox1.propagate_voxel_change(
vox2,
- Point::new(ix, iy, iz),
- Vector::new(shift_x, shift_y, shift_z),
+ IVector::new(ix, iy, iz),
+ IVector::new(shift_x, shift_y, shift_z),
);
}
}
@@ -456,7 +535,7 @@ impl RawColliderSet {
co1.shape_mut().as_voxels_mut(),
co2.shape_mut().as_voxels_mut(),
) {
- vox1.combine_voxel_states(vox2, Vector::new(shift_x, shift_y));
+ vox1.combine_voxel_states(vox2, IVector::new(shift_x, shift_y));
}
}
})
@@ -477,7 +556,7 @@ impl RawColliderSet {
co1.shape_mut().as_voxels_mut(),
co2.shape_mut().as_voxels_mut(),
) {
- vox1.combine_voxel_states(vox2, Vector::new(shift_x, shift_y, shift_z));
+ vox1.combine_voxel_states(vox2, IVector::new(shift_x, shift_y, shift_z));
}
}
})
@@ -486,7 +565,7 @@ impl RawColliderSet {
/// The vertices of this triangle mesh, polyline, convex polyhedron, segment, triangle or convex polyhedron, if it is one.
pub fn coVertices(&self, handle: FlatHandle) -> Option> {
let flatten =
- |vertices: &[Point]| vertices.iter().flat_map(|p| p.iter()).copied().collect();
+ |vertices: &[Vector]| vertices.iter().flat_map(|p| p.as_ref().iter()).copied().collect();
self.map(handle, |co| match co.shape().shape_type() {
ShapeType::TriMesh => co.shape().as_trimesh().map(|t| flatten(t.vertices())),
#[cfg(feature = "dim2")]
@@ -570,12 +649,25 @@ impl RawColliderSet {
}
/// The height of this heightfield if it is one.
+ #[cfg(feature = "dim2")]
+ pub fn coHeightfieldHeights(&self, handle: FlatHandle) -> Option> {
+ self.map(handle, |co| match co.shape().shape_type() {
+ ShapeType::HeightField => co
+ .shape()
+ .as_heightfield()
+ .map(|h| h.heights().to_vec()),
+ _ => None,
+ })
+ }
+
+ /// The height of this heightfield if it is one.
+ #[cfg(feature = "dim3")]
pub fn coHeightfieldHeights(&self, handle: FlatHandle) -> Option> {
self.map(handle, |co| match co.shape().shape_type() {
ShapeType::HeightField => co
.shape()
.as_heightfield()
- .map(|h| h.heights().as_slice().to_vec()),
+ .map(|h| h.heights().data().to_vec()),
_ => None,
})
}
@@ -583,7 +675,7 @@ impl RawColliderSet {
/// The scaling factor applied of this heightfield if it is one.
pub fn coHeightfieldScale(&self, handle: FlatHandle) -> Option {
self.map(handle, |co| match co.shape().shape_type() {
- ShapeType::HeightField => co.shape().as_heightfield().map(|h| RawVector(*h.scale())),
+ ShapeType::HeightField => co.shape().as_heightfield().map(|h| RawVector(h.scale())),
_ => None,
})
}
@@ -688,7 +780,7 @@ impl RawColliderSet {
pub fn coContainsPoint(&self, handle: FlatHandle, point: &RawVector) -> bool {
self.map(handle, |co| {
co.shared_shape()
- .containsPoint(co.position(), &point.0.into())
+ .containsPoint(co.position(), point.0)
})
}
@@ -704,16 +796,16 @@ impl RawColliderSet {
maxToi: f32,
stop_at_penetration: bool,
) -> Option {
- let pos2 = Isometry::from_parts(shape2Pos.0.into(), shape2Rot.0);
+ let pos2 = Pose::from_parts(shape2Pos.0, shape2Rot.0);
self.map(handle, |co| {
let pos1 = co.position();
co.shared_shape().castShape(
pos1,
- &colliderVel.0.into(),
+ &colliderVel.0,
&*shape2.0,
&pos2,
- &shape2Vel.0.into(),
+ &shape2Vel.0,
target_distance,
maxToi,
stop_at_penetration,
@@ -740,10 +832,10 @@ impl RawColliderSet {
self.map(handle, |co| {
query::cast_shapes(
co.position(),
- &collider1Vel.0,
+ collider1Vel.0,
co.shape(),
co2.position(),
- &collider2Vel.0,
+ collider2Vel.0,
co2.shape(),
ShapeCastOptions {
max_time_of_impact: max_toi,
@@ -769,7 +861,7 @@ impl RawColliderSet {
shapePos2: &RawVector,
shapeRot2: &RawRotation,
) -> bool {
- let pos2 = Isometry::from_parts(shapePos2.0.into(), shapeRot2.0);
+ let pos2 = Pose::from_parts(shapePos2.0, shapeRot2.0);
self.map(handle, |co| {
co.shared_shape()
@@ -785,7 +877,7 @@ impl RawColliderSet {
shapeRot2: &RawRotation,
prediction: f32,
) -> Option {
- let pos2 = Isometry::from_parts(shapePos2.0.into(), shapeRot2.0);
+ let pos2 = Pose::from_parts(shapePos2.0, shapeRot2.0);
self.map(handle, |co| {
co.shared_shape()
@@ -826,7 +918,7 @@ impl RawColliderSet {
) -> RawPointProjection {
self.map(handle, |co| {
co.shared_shape()
- .projectPoint(co.position(), &point.0.into(), solid)
+ .projectPoint(co.position(), point.0, solid)
})
}
@@ -840,8 +932,8 @@ impl RawColliderSet {
self.map(handle, |co| {
co.shared_shape().intersectsRay(
co.position(),
- rayOrig.0.into(),
- rayDir.0.into(),
+ rayOrig.0,
+ rayDir.0,
maxToi,
)
})
diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs
index 6e31d8eb..79c5bc0c 100644
--- a/src/geometry/collider_set.rs
+++ b/src/geometry/collider_set.rs
@@ -2,6 +2,7 @@ use crate::dynamics::{RawIslandManager, RawRigidBodySet};
use crate::geometry::RawShape;
use crate::math::{RawRotation, RawVector};
use crate::utils::{self, FlatHandle};
+use rapier::math::Pose;
use rapier::prelude::*;
use wasm_bindgen::prelude::*;
@@ -82,7 +83,7 @@ impl RawColliderSet {
parent: FlatHandle,
bodies: &mut RawRigidBodySet,
) -> Option {
- let pos = Isometry::from_parts(translation.0.into(), rotation.0);
+ let pos = Pose::from_parts(translation.0, rotation.0);
let mut builder = ColliderBuilder::new(shape.0.clone())
.enabled(enabled)
.position(pos)
diff --git a/src/geometry/contact.rs b/src/geometry/contact.rs
index 47043a27..68eaa4a7 100644
--- a/src/geometry/contact.rs
+++ b/src/geometry/contact.rs
@@ -14,18 +14,18 @@ impl RawShapeContact {
}
pub fn point1(&self) -> RawVector {
- self.contact.point1.coords.into()
+ self.contact.point1.into()
}
pub fn point2(&self) -> RawVector {
- self.contact.point2.coords.into()
+ self.contact.point2.into()
}
pub fn normal1(&self) -> RawVector {
- self.contact.normal1.into_inner().into()
+ self.contact.normal1.into()
}
pub fn normal2(&self) -> RawVector {
- self.contact.normal2.into_inner().into()
+ self.contact.normal2.into()
}
}
diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs
index 08918b88..4f398d92 100644
--- a/src/geometry/mod.rs
+++ b/src/geometry/mod.rs
@@ -22,13 +22,14 @@ mod shape;
mod toi;
use rapier::dynamics::CoefficientCombineRule;
-use rapier::geometry::InteractionGroups;
+use rapier::geometry::{InteractionGroups, InteractionTestMode};
use rapier::prelude::Group;
pub const fn unpack_interaction_groups(memberships_filter: u32) -> InteractionGroups {
InteractionGroups::new(
Group::from_bits_retain((memberships_filter >> 16) as u32),
Group::from_bits_retain((memberships_filter & 0x0000_ffff) as u32),
+ InteractionTestMode::And,
)
}
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs
index be3fee25..ed97a676 100644
--- a/src/geometry/narrow_phase.rs
+++ b/src/geometry/narrow_phase.rs
@@ -122,11 +122,11 @@ impl RawContactManifold {
}
pub fn contact_local_p1(&self, i: usize) -> Option {
- unsafe { (&(*self.0).points).get(i).map(|c| c.local_p1.coords.into()) }
+ unsafe { (&(*self.0).points).get(i).map(|c| c.local_p1.into()) }
}
pub fn contact_local_p2(&self, i: usize) -> Option {
- unsafe { (&(*self.0).points).get(i).map(|c| c.local_p2.coords.into()) }
+ unsafe { (&(*self.0).points).get(i).map(|c| c.local_p2.into()) }
}
pub fn contact_dist(&self, i: usize) -> Real {
@@ -189,7 +189,7 @@ impl RawContactManifold {
(&(*self.0).data)
.solver_contacts
.get(i)
- .map(|c| c.point.coords.into())
+ .map(|c| c.point.into())
}
}
diff --git a/src/geometry/point.rs b/src/geometry/point.rs
index e7bb4a93..996d573e 100644
--- a/src/geometry/point.rs
+++ b/src/geometry/point.rs
@@ -14,7 +14,7 @@ pub struct RawPointProjection(pub(crate) PointProjection);
#[wasm_bindgen]
impl RawPointProjection {
pub fn point(&self) -> RawVector {
- self.0.point.coords.into()
+ self.0.point.into()
}
pub fn isInside(&self) -> bool {
@@ -36,7 +36,7 @@ impl RawPointColliderProjection {
}
pub fn point(&self) -> RawVector {
- self.proj.point.coords.into()
+ self.proj.point.into()
}
pub fn isInside(&self) -> bool {
diff --git a/src/geometry/shape.rs b/src/geometry/shape.rs
index 5f01d9f5..c73808eb 100644
--- a/src/geometry/shape.rs
+++ b/src/geometry/shape.rs
@@ -1,12 +1,7 @@
use crate::geometry::{RawPointProjection, RawRayIntersection, RawShapeCastHit, RawShapeContact};
use crate::math::{RawRotation, RawVector};
-#[cfg(feature = "dim3")]
-use na::DMatrix;
-#[cfg(feature = "dim2")]
-use na::DVector;
-use na::Unit;
use rapier::geometry::{Shape, SharedShape, TriMeshFlags};
-use rapier::math::{Isometry, Point, Real, Vector, DIM};
+use rapier::math::{IVector, Pose, Vector, DIM};
use rapier::parry::query;
use rapier::parry::query::{Ray, ShapeCastOptions};
use wasm_bindgen::prelude::*;
@@ -14,11 +9,11 @@ use wasm_bindgen::prelude::*;
pub trait SharedShapeUtility {
fn castShape(
&self,
- shapePos1: &Isometry,
- shapeVel1: &Vector,
+ shapePos1: &Pose,
+ shapeVel1: &Vector,
shape2: &dyn Shape,
- shapePos2: &Isometry,
- shapeVel2: &Vector,
+ shapePos2: &Pose,
+ shapeVel2: &Vector,
target_distance: f32,
maxToi: f32,
stop_at_penetration: bool,
@@ -26,50 +21,50 @@ pub trait SharedShapeUtility {
fn intersectsShape(
&self,
- shapePos1: &Isometry,
+ shapePos1: &Pose,
shape2: &dyn Shape,
- shapePos2: &Isometry,
+ shapePos2: &Pose,
) -> bool;
fn contactShape(
&self,
- shapePos1: &Isometry,
+ shapePos1: &Pose,
shape2: &dyn Shape,
- shapePos2: &Isometry,
+ shapePos2: &Pose,
prediction: f32,
) -> Option;
- fn containsPoint(&self, shapePos: &Isometry, point: &Point) -> bool;
+ fn containsPoint(&self, shapePos: &Pose, point: Vector) -> bool;
fn projectPoint(
&self,
- shapePos: &Isometry,
- point: &Point,
+ shapePos: &Pose,
+ point: Vector,
solid: bool,
) -> RawPointProjection;
fn intersectsRay(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
) -> bool;
fn castRay(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
solid: bool,
) -> f32;
fn castRayAndGetNormal(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
solid: bool,
) -> Option;
@@ -79,21 +74,21 @@ pub trait SharedShapeUtility {
impl SharedShapeUtility for SharedShape {
fn castShape(
&self,
- shapePos1: &Isometry,
- shapeVel1: &Vector,
+ shapePos1: &Pose,
+ shapeVel1: &Vector,
shape2: &dyn Shape,
- shapePos2: &Isometry,
- shapeVel2: &Vector,
+ shapePos2: &Pose,
+ shapeVel2: &Vector,
target_distance: f32,
maxToi: f32,
stop_at_penetration: bool,
) -> Option {
query::cast_shapes(
shapePos1,
- shapeVel1,
+ *shapeVel1,
&*self.0,
shapePos2,
- &shapeVel2,
+ *shapeVel2,
shape2,
ShapeCastOptions {
max_time_of_impact: maxToi,
@@ -109,18 +104,18 @@ impl SharedShapeUtility for SharedShape {
fn intersectsShape(
&self,
- shapePos1: &Isometry,
+ shapePos1: &Pose,
shape2: &dyn Shape,
- shapePos2: &Isometry,
+ shapePos2: &Pose,
) -> bool {
query::intersection_test(shapePos1, &*self.0, shapePos2, shape2).unwrap_or(false)
}
fn contactShape(
&self,
- shapePos1: &Isometry,
+ shapePos1: &Pose,
shape2: &dyn Shape,
- shapePos2: &Isometry,
+ shapePos2: &Pose,
prediction: f32,
) -> Option {
query::contact(shapePos1, &*self.0, shapePos2, shape2, prediction)
@@ -129,14 +124,14 @@ impl SharedShapeUtility for SharedShape {
.map(|contact| RawShapeContact { contact })
}
- fn containsPoint(&self, shapePos: &Isometry, point: &Point) -> bool {
+ fn containsPoint(&self, shapePos: &Pose, point: Vector) -> bool {
self.as_ref().contains_point(shapePos, point)
}
fn projectPoint(
&self,
- shapePos: &Isometry,
- point: &Point,
+ shapePos: &Pose,
+ point: Vector,
solid: bool,
) -> RawPointProjection {
RawPointProjection(self.as_ref().project_point(shapePos, point, solid))
@@ -144,9 +139,9 @@ impl SharedShapeUtility for SharedShape {
fn intersectsRay(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
) -> bool {
self.as_ref()
@@ -155,9 +150,9 @@ impl SharedShapeUtility for SharedShape {
fn castRay(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
solid: bool,
) -> f32 {
@@ -168,9 +163,9 @@ impl SharedShapeUtility for SharedShape {
fn castRayAndGetNormal(
&self,
- shapePos: &Isometry,
- rayOrig: Point,
- rayDir: Vector,
+ shapePos: &Pose,
+ rayOrig: Vector,
+ rayDir: Vector,
maxToi: f32,
solid: bool,
) -> Option {
@@ -254,11 +249,11 @@ impl RawShape {
}
pub fn halfspace(normal: &RawVector) -> Self {
- Self(SharedShape::halfspace(Unit::new_normalize(normal.0)))
+ Self(SharedShape::halfspace(normal.0.normalize()))
}
pub fn capsule(halfHeight: f32, radius: f32) -> Self {
- let p2 = Point::from(Vector::y() * halfHeight);
+ let p2 = Vector::Y * halfHeight;
let p1 = -p2;
Self(SharedShape::capsule(p1, p2, radius))
}
@@ -290,18 +285,18 @@ impl RawShape {
pub fn voxels(voxel_size: &RawVector, grid_coords: Vec) -> Self {
let grid_coords: Vec<_> = grid_coords
.chunks_exact(DIM)
- .map(Point::from_slice)
+ .map(IVector::from_slice)
.collect();
Self(SharedShape::voxels(voxel_size.0, &grid_coords))
}
pub fn voxelsFromPoints(voxel_size: &RawVector, points: Vec) -> Self {
- let points: Vec<_> = points.chunks_exact(DIM).map(Point::from_slice).collect();
+ let points: Vec<_> = points.chunks_exact(DIM).map(Vector::from_slice).collect();
Self(SharedShape::voxels_from_points(voxel_size.0, &points))
}
pub fn polyline(vertices: Vec, indices: Vec) -> Self {
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
let indices: Vec<_> = indices.chunks(2).map(|v| [v[0], v[1]]).collect();
if indices.is_empty() {
Self(SharedShape::polyline(vertices, None))
@@ -312,7 +307,7 @@ impl RawShape {
pub fn trimesh(vertices: Vec, indices: Vec, flags: u32) -> Option {
let flags = TriMeshFlags::from_bits(flags as u16).unwrap_or_default();
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
let indices = indices.chunks(3).map(|v| [v[0], v[1], v[2]]).collect();
SharedShape::trimesh_with_flags(vertices, indices, flags)
.ok()
@@ -321,7 +316,6 @@ impl RawShape {
#[cfg(feature = "dim2")]
pub fn heightfield(heights: Vec, scale: &RawVector) -> Self {
- let heights = DVector::from_vec(heights);
Self(SharedShape::heightfield(heights, scale.0))
}
@@ -333,9 +327,10 @@ impl RawShape {
scale: &RawVector,
flags: u32,
) -> Self {
+ use rapier::parry::utils::Array2;
let flags =
rapier::parry::shape::HeightFieldFlags::from_bits(flags as u8).unwrap_or_default();
- let heights = DMatrix::from_vec(nrows as usize + 1, ncols as usize + 1, heights);
+ let heights = Array2::new(nrows as usize + 1, ncols as usize + 1, heights);
Self(SharedShape::heightfield_with_flags(heights, scale.0, flags))
}
@@ -362,30 +357,30 @@ impl RawShape {
}
pub fn convexHull(points: Vec) -> Option {
- let points: Vec<_> = points.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let points: Vec<_> = points.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
SharedShape::convex_hull(&points).map(|s| Self(s))
}
pub fn roundConvexHull(points: Vec, borderRadius: f32) -> Option {
- let points: Vec<_> = points.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let points: Vec<_> = points.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
SharedShape::round_convex_hull(&points, borderRadius).map(|s| Self(s))
}
#[cfg(feature = "dim2")]
pub fn convexPolyline(vertices: Vec) -> Option {
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
SharedShape::convex_polyline(vertices).map(|s| Self(s))
}
#[cfg(feature = "dim2")]
pub fn roundConvexPolyline(vertices: Vec, borderRadius: f32) -> Option {
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
SharedShape::round_convex_polyline(vertices, borderRadius).map(|s| Self(s))
}
#[cfg(feature = "dim3")]
pub fn convexMesh(vertices: Vec, indices: Vec) -> Option {
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
let indices: Vec<_> = indices.chunks(3).map(|v| [v[0], v[1], v[2]]).collect();
SharedShape::convex_mesh(vertices, &indices).map(|s| Self(s))
}
@@ -396,7 +391,7 @@ impl RawShape {
indices: Vec,
borderRadius: f32,
) -> Option {
- let vertices = vertices.chunks(DIM).map(|v| Point::from_slice(v)).collect();
+ let vertices = vertices.chunks(DIM).map(|v| Vector::from_slice(v)).collect();
let indices: Vec<_> = indices.chunks(3).map(|v| [v[0], v[1], v[2]]).collect();
SharedShape::round_convex_mesh(vertices, &indices, borderRadius).map(|s| Self(s))
}
@@ -414,8 +409,8 @@ impl RawShape {
maxToi: f32,
stop_at_penetration: bool,
) -> Option {
- let pos1 = Isometry::from_parts(shapePos1.0.into(), shapeRot1.0);
- let pos2 = Isometry::from_parts(shapePos2.0.into(), shapeRot2.0);
+ let pos1 = Pose::from_parts(shapePos1.0, shapeRot1.0);
+ let pos2 = Pose::from_parts(shapePos2.0, shapeRot2.0);
self.0.castShape(
&pos1,
@@ -437,8 +432,8 @@ impl RawShape {
shapePos2: &RawVector,
shapeRot2: &RawRotation,
) -> bool {
- let pos1 = Isometry::from_parts(shapePos1.0.into(), shapeRot1.0);
- let pos2 = Isometry::from_parts(shapePos2.0.into(), shapeRot2.0);
+ let pos1 = Pose::from_parts(shapePos1.0, shapeRot1.0);
+ let pos2 = Pose::from_parts(shapePos2.0, shapeRot2.0);
self.0.intersectsShape(&pos1, &*shape2.0, &pos2)
}
@@ -452,8 +447,8 @@ impl RawShape {
shapeRot2: &RawRotation,
prediction: f32,
) -> Option {
- let pos1 = Isometry::from_parts(shapePos1.0.into(), shapeRot1.0);
- let pos2 = Isometry::from_parts(shapePos2.0.into(), shapeRot2.0);
+ let pos1 = Pose::from_parts(shapePos1.0, shapeRot1.0);
+ let pos2 = Pose::from_parts(shapePos2.0, shapeRot2.0);
self.0.contactShape(&pos1, &*shape2.0, &pos2, prediction)
}
@@ -464,9 +459,9 @@ impl RawShape {
shapeRot: &RawRotation,
point: &RawVector,
) -> bool {
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
- self.0.containsPoint(&pos, &point.0.into())
+ self.0.containsPoint(&pos, point.0)
}
pub fn projectPoint(
@@ -476,9 +471,9 @@ impl RawShape {
point: &RawVector,
solid: bool,
) -> RawPointProjection {
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
- self.0.projectPoint(&pos, &point.0.into(), solid)
+ self.0.projectPoint(&pos, point.0, solid)
}
pub fn intersectsRay(
@@ -489,10 +484,10 @@ impl RawShape {
rayDir: &RawVector,
maxToi: f32,
) -> bool {
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
self.0
- .intersectsRay(&pos, rayOrig.0.into(), rayDir.0.into(), maxToi)
+ .intersectsRay(&pos, rayOrig.0, rayDir.0, maxToi)
}
pub fn castRay(
@@ -504,10 +499,10 @@ impl RawShape {
maxToi: f32,
solid: bool,
) -> f32 {
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
self.0
- .castRay(&pos, rayOrig.0.into(), rayDir.0.into(), maxToi, solid)
+ .castRay(&pos, rayOrig.0, rayDir.0, maxToi, solid)
}
pub fn castRayAndGetNormal(
@@ -519,9 +514,9 @@ impl RawShape {
maxToi: f32,
solid: bool,
) -> Option {
- let pos = Isometry::from_parts(shapePos.0.into(), shapeRot.0);
+ let pos = Pose::from_parts(shapePos.0, shapeRot.0);
self.0
- .castRayAndGetNormal(&pos, rayOrig.0.into(), rayDir.0.into(), maxToi, solid)
+ .castRayAndGetNormal(&pos, rayOrig.0, rayDir.0, maxToi, solid)
}
}
diff --git a/src/geometry/toi.rs b/src/geometry/toi.rs
index 1e00675d..116da342 100644
--- a/src/geometry/toi.rs
+++ b/src/geometry/toi.rs
@@ -15,19 +15,19 @@ impl RawShapeCastHit {
}
pub fn witness1(&self) -> RawVector {
- self.hit.witness1.coords.into()
+ self.hit.witness1.into()
}
pub fn witness2(&self) -> RawVector {
- self.hit.witness2.coords.into()
+ self.hit.witness2.into()
}
pub fn normal1(&self) -> RawVector {
- self.hit.normal1.into_inner().into()
+ self.hit.normal1.into()
}
pub fn normal2(&self) -> RawVector {
- self.hit.normal2.into_inner().into()
+ self.hit.normal2.into()
}
}
@@ -48,18 +48,18 @@ impl RawColliderShapeCastHit {
}
pub fn witness1(&self) -> RawVector {
- self.hit.witness1.coords.into()
+ self.hit.witness1.into()
}
pub fn witness2(&self) -> RawVector {
- self.hit.witness2.coords.into()
+ self.hit.witness2.into()
}
pub fn normal1(&self) -> RawVector {
- self.hit.normal1.into_inner().into()
+ self.hit.normal1.into()
}
pub fn normal2(&self) -> RawVector {
- self.hit.normal2.into_inner().into()
+ self.hit.normal2.into()
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 132809dc..840c6a01 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,7 +4,6 @@
#![allow(non_snake_case)] // JS uses camelCase, so we will follow its convention for the generated bindings.
// #![deny(missing_docs)]
-extern crate nalgebra as na;
#[cfg(feature = "dim2")]
extern crate rapier2d as rapier;
#[cfg(feature = "dim3")]
diff --git a/src/math.rs b/src/math.rs
index 5c50c142..e32127cc 100644
--- a/src/math.rs
+++ b/src/math.rs
@@ -3,10 +3,8 @@
#[cfg(feature = "dim3")]
use js_sys::Float32Array;
#[cfg(feature = "dim3")]
-use na::{Quaternion, Unit};
-#[cfg(feature = "dim3")]
use rapier::math::Real;
-use rapier::math::{Point, Rotation, Vector};
+use rapier::math::{Rotation, Vector};
#[cfg(feature = "dim3")]
use rapier::parry::utils::SdpMatrix3;
use wasm_bindgen::prelude::*;
@@ -15,10 +13,10 @@ use wasm_bindgen::prelude::*;
#[repr(transparent)]
#[derive(Copy, Clone)]
/// A rotation quaternion.
-pub struct RawRotation(pub(crate) Rotation);
+pub struct RawRotation(pub(crate) Rotation);
-impl From> for RawRotation {
- fn from(v: Rotation) -> Self {
+impl From for RawRotation {
+ fn from(v: Rotation) -> Self {
RawRotation(v)
}
}
@@ -29,10 +27,10 @@ impl From> for RawRotation {
impl RawRotation {
/// The identity rotation.
pub fn identity() -> Self {
- Self(Rotation::identity())
+ Self(Rotation::IDENTITY)
}
- /// The rotation with thegiven angle.
+ /// The rotation with the given angle.
pub fn fromAngle(angle: f32) -> Self {
Self(Rotation::new(angle))
}
@@ -40,13 +38,13 @@ impl RawRotation {
/// The imaginary part of this complex number.
#[wasm_bindgen(getter)]
pub fn im(&self) -> f32 {
- self.0.im
+ self.0.sin()
}
/// The real part of this complex number.
#[wasm_bindgen(getter)]
pub fn re(&self) -> f32 {
- self.0.re
+ self.0.cos()
}
/// The rotation angle in radians.
@@ -62,30 +60,30 @@ impl RawRotation {
impl RawRotation {
#[wasm_bindgen(constructor)]
pub fn new(x: f32, y: f32, z: f32, w: f32) -> Self {
- RawRotation(Unit::new_unchecked(Quaternion::new(w, x, y, z)))
+ RawRotation(Rotation::from_xyzw(x, y, z, w))
}
/// The identity quaternion.
pub fn identity() -> Self {
- Self(Rotation::identity())
+ Self(Rotation::IDENTITY)
}
/// The `x` component of this quaternion.
#[wasm_bindgen(getter)]
pub fn x(&self) -> f32 {
- self.0.i
+ self.0.x
}
/// The `y` component of this quaternion.
#[wasm_bindgen(getter)]
pub fn y(&self) -> f32 {
- self.0.j
+ self.0.y
}
/// The `z` component of this quaternion.
#[wasm_bindgen(getter)]
pub fn z(&self) -> f32 {
- self.0.k
+ self.0.z
}
/// The `w` component of this quaternion.
@@ -99,25 +97,19 @@ impl RawRotation {
#[repr(transparent)]
#[derive(Copy, Clone)]
/// A vector.
-pub struct RawVector(pub(crate) Vector);
+pub struct RawVector(pub(crate) Vector);
-impl From> for RawVector {
- fn from(v: Vector) -> Self {
+impl From for RawVector {
+ fn from(v: Vector) -> Self {
RawVector(v)
}
}
-impl From> for RawVector {
- fn from(pt: Point) -> Self {
- pt.coords.into()
- }
-}
-
#[wasm_bindgen]
impl RawVector {
/// Creates a new vector filled with zeros.
pub fn zero() -> Self {
- Self(Vector::zeros())
+ Self(Vector::ZERO)
}
/// Creates a new 2D vector from its two components.
@@ -184,13 +176,13 @@ impl RawVector {
/// Create a new 2D vector from this vector with its components rearranged as `{x, y}`.
#[cfg(feature = "dim2")]
pub fn xy(&self) -> Self {
- Self(self.0.xy())
+ Self(Vector::new(self.0.x, self.0.y))
}
/// Create a new 2D vector from this vector with its components rearranged as `{y, x}`.
#[cfg(feature = "dim2")]
pub fn yx(&self) -> Self {
- Self(self.0.yx())
+ Self(Vector::new(self.0.y, self.0.x))
}
/// Create a new 2D vector from this vector with its components rearranged as `{z, y}`.
@@ -206,37 +198,37 @@ impl RawVector {
/// other swizzling functions.
#[cfg(feature = "dim3")]
pub fn xyz(&self) -> Self {
- Self(self.0.xyz())
+ Self(Vector::new(self.0.x, self.0.y, self.0.z))
}
/// Create a new 3D vector from this vector with its components rearranged as `{y, x, z}`.
#[cfg(feature = "dim3")]
pub fn yxz(&self) -> Self {
- Self(self.0.yxz())
+ Self(Vector::new(self.0.y, self.0.x, self.0.z))
}
/// Create a new 3D vector from this vector with its components rearranged as `{z, x, y}`.
#[cfg(feature = "dim3")]
pub fn zxy(&self) -> Self {
- Self(self.0.zxy())
+ Self(Vector::new(self.0.z, self.0.x, self.0.y))
}
/// Create a new 3D vector from this vector with its components rearranged as `{x, z, y}`.
#[cfg(feature = "dim3")]
pub fn xzy(&self) -> Self {
- Self(self.0.xzy())
+ Self(Vector::new(self.0.x, self.0.z, self.0.y))
}
/// Create a new 3D vector from this vector with its components rearranged as `{y, z, x}`.
#[cfg(feature = "dim3")]
pub fn yzx(&self) -> Self {
- Self(self.0.yzx())
+ Self(Vector::new(self.0.y, self.0.z, self.0.x))
}
/// Create a new 3D vector from this vector with its components rearranged as `{z, y, x}`.
#[cfg(feature = "dim3")]
pub fn zyx(&self) -> Self {
- Self(self.0.zyx())
+ Self(Vector::new(self.0.z, self.0.y, self.0.x))
}
}
diff --git a/src/pipeline/debug_render_pipeline.rs b/src/pipeline/debug_render_pipeline.rs
index 1676e59b..e8973ba7 100644
--- a/src/pipeline/debug_render_pipeline.rs
+++ b/src/pipeline/debug_render_pipeline.rs
@@ -6,7 +6,7 @@ use palette::rgb::Rgba;
use palette::Hsla;
use rapier::dynamics::{RigidBody, RigidBodySet};
use rapier::geometry::ColliderSet;
-use rapier::math::{Point, Real};
+use rapier::math::Vector;
use rapier::pipeline::{DebugRenderBackend, DebugRenderObject, DebugRenderPipeline};
use rapier::prelude::{QueryFilter, QueryFilterFlags};
use wasm_bindgen::prelude::*;
@@ -135,12 +135,12 @@ impl<'a> DebugRenderBackend for CopyToBuffersBackend<'a> {
fn draw_line(
&mut self,
_object: DebugRenderObject,
- a: Point,
- b: Point,
+ a: Vector,
+ b: Vector,
color: [f32; 4],
) {
- self.vertices.extend_from_slice(a.coords.as_slice());
- self.vertices.extend_from_slice(b.coords.as_slice());
+ self.vertices.extend_from_slice(a.as_ref());
+ self.vertices.extend_from_slice(b.as_ref());
// Convert to RGB which will be easier to handle in JS.
let hsl = Hsla::new(color[0], color[1], color[2], color[3]);
diff --git a/src/pipeline/physics_hooks.rs b/src/pipeline/physics_hooks.rs
index 2bbc8034..b354f818 100644
--- a/src/pipeline/physics_hooks.rs
+++ b/src/pipeline/physics_hooks.rs
@@ -36,14 +36,12 @@ impl PhysicsHooks for RawPhysicsHooks {
.map(|rb| JsValue::from(utils::flat_handle(rb.0)))
.unwrap_or(JsValue::NULL);
+ let collider1 = JsValue::from(utils::flat_handle(ctxt.collider1.0));
+ let collider2 = JsValue::from(utils::flat_handle(ctxt.collider2.0));
+
let result = self
.filter_contact_pair
- .bind2(
- &self.this,
- &JsValue::from(utils::flat_handle(ctxt.collider1.0)),
- &JsValue::from(utils::flat_handle(ctxt.collider2.0)),
- )
- .call2(&self.this, &rb1, &rb2)
+ .call4(&self.this, &collider1, &collider2, &rb1, &rb2)
.ok()?;
let flags = result.as_f64()?;
// TODO: not sure exactly why we have to do `flags as u32` instead
@@ -61,13 +59,11 @@ impl PhysicsHooks for RawPhysicsHooks {
.map(|rb| JsValue::from(utils::flat_handle(rb.0)))
.unwrap_or(JsValue::NULL);
+ let collider1 = JsValue::from(utils::flat_handle(ctxt.collider1.0));
+ let collider2 = JsValue::from(utils::flat_handle(ctxt.collider2.0));
+
self.filter_intersection_pair
- .bind2(
- &self.this,
- &JsValue::from(utils::flat_handle(ctxt.collider1.0)),
- &JsValue::from(utils::flat_handle(ctxt.collider2.0)),
- )
- .call2(&self.this, &rb1, &rb2)
+ .call4(&self.this, &collider1, &collider2, &rb1, &rb2)
.ok()
.and_then(|res| res.as_bool())
.unwrap_or(false)
@@ -91,7 +87,7 @@ pub struct RawContactModificationContext {
pub rigid_body2: Option,
pub manifold: *const ContactManifold,
pub solver_contacts: *mut Vec,
- normal: *mut Vector,
+ normal: *mut Vector,
user_data: *mut u32,
}
@@ -149,7 +145,7 @@ impl RawContactModificationContext {
unsafe {
(*self.solver_contacts)
.get(i)
- .map(|c| c.point.coords.into())
+ .map(|c| c.point.into())
}
}
diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs
index 287cfeea..e844ed99 100644
--- a/src/pipeline/physics_pipeline.rs
+++ b/src/pipeline/physics_pipeline.rs
@@ -110,7 +110,7 @@ impl RawPhysicsPipeline {
ccd_solver: &mut RawCCDSolver,
) {
self.0.step(
- &gravity.0,
+ gravity.0,
&integrationParameters.0,
&mut islands.0,
&mut broadPhase.0,
@@ -153,7 +153,7 @@ impl RawPhysicsPipeline {
};
self.0.step(
- &gravity.0,
+ gravity.0,
&integrationParameters.0,
&mut islands.0,
&mut broadPhase.0,
diff --git a/src/pipeline/serialization_pipeline.rs b/src/pipeline/serialization_pipeline.rs
index 97076f63..8d2e841a 100644
--- a/src/pipeline/serialization_pipeline.rs
+++ b/src/pipeline/serialization_pipeline.rs
@@ -14,7 +14,7 @@ use wasm_bindgen::prelude::*;
#[derive(Serialize)]
struct SerializableWorld<'a> {
- gravity: &'a Vector,
+ gravity: &'a Vector,
integration_parameters: &'a IntegrationParameters,
islands: &'a IslandManager,
broad_phase: &'a DefaultBroadPhase,
@@ -27,7 +27,7 @@ struct SerializableWorld<'a> {
#[derive(Deserialize)]
struct DeserializableWorld {
- gravity: Vector,
+ gravity: Vector,
integration_parameters: IntegrationParameters,
islands: IslandManager,
broad_phase: DefaultBroadPhase,
diff --git a/testbed2d/package-lock.json b/testbed2d/package-lock.json
deleted file mode 100644
index 4777a9ac..00000000
--- a/testbed2d/package-lock.json
+++ /dev/null
@@ -1,7435 +0,0 @@
-{
- "name": "rapier-testbed2d",
- "version": "0.1.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "rapier-testbed2d",
- "version": "0.1.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@dimforge/rapier2d": "file:../builds/rapier2d",
- "hash-wasm": "^4.12.0",
- "lil-gui": "^0.17.0",
- "pixi-viewport": "^4.37.0",
- "pixi.js": "^6.3.2",
- "seedrandom": "^3.0.5",
- "stats.js": "^0.17.0"
- },
- "devDependencies": {
- "@types/seedrandom": "^3.0.2",
- "@types/stats.js": "^0.17.0",
- "copy-webpack-plugin": "^11.0.0",
- "rimraf": "^3.0.2",
- "ts-loader": "^9.4.1",
- "typescript": "^4.8.4",
- "webpack": "^5.74.0",
- "webpack-cli": "^4.10.0",
- "webpack-dev-server": "^4.11.1"
- }
- },
- "../builds/rapier2d": {
- "name": "@dimforge/rapier2d",
- "dependencies": {
- "wasm-pack": "^0.12.1"
- },
- "devDependencies": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13"
- }
- },
- "../rapier2d": {
- "name": "@dimforge/rapier2d",
- "extraneous": true,
- "dependencies": {
- "wasm-pack": "^0.12.1"
- },
- "devDependencies": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13"
- }
- },
- "node_modules/@dimforge/rapier2d": {
- "resolved": "../builds/rapier2d",
- "link": true
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
- "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
- "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
- "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
- "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
- "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
- "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
- "dev": true
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pixi/accessibility": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-6.5.8.tgz",
- "integrity": "sha512-3q1YaZeZKOoblgbxTQg2L0RAp9jtNtGcl/7kce+XelqxwIMS3p8411nwo90YO53XCqc/eQW2SoZ+hSXqcL0qOw==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/app": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/app/-/app-6.5.8.tgz",
- "integrity": "sha512-pDPkamtYDaPhscNxack+bHNqazCwrqw6cAotKyoz1mvLXeGhxqTntOcfgGLZR2fNbnY8EBmdduLvH7n2jI/LTg==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/compressed-textures": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-6.5.8.tgz",
- "integrity": "sha512-nW74kcvdEoe4a2U7Ekx4egqdH1tYKC2kCOZxKWYcUARqz26tS0ddwSRyIs05In6EChmXHXGy/MtShdueMH38TA==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/loaders": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/constants": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.8.tgz",
- "integrity": "sha512-yYRCebBPqajm1kn5f8QQTTvl7oDRDk1nppfO+JpqbrFXg0W7oqIMurec3KeG9RdZW5foOiXDoz1Gw+VtolYIEw=="
- },
- "node_modules/@pixi/core": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.8.tgz",
- "integrity": "sha512-Gconik7/PpFPMpCpOddXVIPx5C2StWKw7lQ4YX19yQ+cRRmecCea2cV0xTBtpEjjx0ilX7nBfIEuZ4zIlMmlbA==",
- "dependencies": {
- "@types/offscreencanvas": "^2019.6.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/pixijs"
- },
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/extensions": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/runner": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/ticker": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/display": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.8.tgz",
- "integrity": "sha512-2K8YOG8s0iF8x/k2Q0RTFmoMJ9biI6PXEh76nH3EqUFdpyrIIgrG5aOMnCkVDvOxlgVRrKG8Q3JBHlSievTmuw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/extensions": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.8.tgz",
- "integrity": "sha512-6vEV801Vn/EkU/qjFiZ76OZWPq5KsBR2r+P5gfKv4YLnaDc3A+0IpUOJ7sLBAJqmr0iw68g6xV6MnuqVjNGjFg=="
- },
- "node_modules/@pixi/extract": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-6.5.8.tgz",
- "integrity": "sha512-qbuuD/iBA4J+TCBgrbMe8oDUFbCriyy9LTKEtQp+pghKD5MEMvJ3nO6Osumxqiqta2kYU6WldFLTldKyHEiQ7Q==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-alpha": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-6.5.8.tgz",
- "integrity": "sha512-W4IkFTLTP84H+DS9XIdBGunAEpaXLrasDc4CQBeyp4c4hBlGlzriUZp30vkmqm7GPmFhzPe7aiJtNYgUpxKQBQ==",
- "peerDependencies": {
- "@pixi/core": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-blur": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-6.5.8.tgz",
- "integrity": "sha512-1UOfVthFBnavzTBkR6R+1tWhOOymtWvcpuJILhxf3mryLj9eqYbQubAG0gV8Da6Ibsgk+v73ORnOJyWR3POFvw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/settings": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-color-matrix": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-6.5.8.tgz",
- "integrity": "sha512-iix+a/KEi6HAwZwkUH3nkIzyLu0ln3HBuHEFLUUhug7xrQgQgGrTQZ32iWlfpJD/BZuKphIGfzlxMFfvyQmkVw==",
- "peerDependencies": {
- "@pixi/core": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-displacement": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-6.5.8.tgz",
- "integrity": "sha512-qLRka5cQbeH6667A+ViYoemsXGGe2tOBt92vM91+slMt9OBGtR0ymlpGU7VxBggWUlu5PE10zYed/xw78uSpig==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/math": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-fxaa": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-6.5.8.tgz",
- "integrity": "sha512-TxsBH2z2RMj0mqr13VPi18/EJ/Kn38J2u65HonJmhbvTaoK9HWMExTvl38Xjg0k7TlepwhoayxMhQ1uCw9xudQ==",
- "peerDependencies": {
- "@pixi/core": "6.5.8"
- }
- },
- "node_modules/@pixi/filter-noise": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-6.5.8.tgz",
- "integrity": "sha512-BZHKuzV5Mdn+EpC52lFYpd6jUcrL+YQHdq0v0yJfVtpW2ripseQxMGxxXr6Yxp2P4F3g2aY2JrfX2VztosmGLA==",
- "peerDependencies": {
- "@pixi/core": "6.5.8"
- }
- },
- "node_modules/@pixi/graphics": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.8.tgz",
- "integrity": "sha512-DUuUXHO4t5fg+n+srMkHX38QEH3WtS1IMXtovBGFJkkopG0Z0xjxSp5XvsPPw1J//4fzkHZI5OBrlN613p9+sg==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/interaction": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-6.5.8.tgz",
- "integrity": "sha512-uP247r0f47vo9WSpEnsUfeD1izxVGpjtg4iAyGT/02ezWse2vD1aEL8AbxFa65TL0IXOKsHEQudCVL+wjnbSKQ==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/ticker": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/loaders": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-6.5.8.tgz",
- "integrity": "sha512-mj11UPKsqWaTEPMpCnFugr6heKkQeNFuVSddSwE8crg19l46zcMhk3ucpQX15RDpAdDJjtl3OraevQCHHbNENw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/math": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.8.tgz",
- "integrity": "sha512-9493KEH5ITnjOZvQZbaU22lD0kcg/XhNh+309KYfwFX787zA1BN/7is06oHEgHBDb2NemqioYi6sw1WnECgQig=="
- },
- "node_modules/@pixi/mesh": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-6.5.8.tgz",
- "integrity": "sha512-iZZGkh8QBhnfMEgpJsuwemFZZVatodckCgj7N8t1hyHEf0aOWEA6wp5N0Osa3mhltokl7BGnZZLxaR8NtjaiEQ==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/mesh-extras": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-6.5.8.tgz",
- "integrity": "sha512-eU2I53yZUFxKbTYZvyRfUcdina3WOl87fyqYwAoaHosU9VgbFl16YADKTGV+NflNp6RCTwU/UIPZ1T19W/iysw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/mesh": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/mixin-cache-as-bitmap": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-6.5.8.tgz",
- "integrity": "sha512-5TTv4w8v7guI6z3gKz5ppUCbNMRw+8RRNru/aq65qUl6kcUaJiYwQdBFJ/vJwpI9ePEScWrCuLVEc8QtX6xjNw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/mixin-get-child-by-name": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-6.5.8.tgz",
- "integrity": "sha512-b15HTdHpW4ErDBpf7wm1vvWHrTv5kQzElXrwAPBCnLgvronfSL9mL7npOUkZOybUorCoEBq/7oNVjkimsQc5gw==",
- "peerDependencies": {
- "@pixi/display": "6.5.8"
- }
- },
- "node_modules/@pixi/mixin-get-global-position": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-6.5.8.tgz",
- "integrity": "sha512-Y5epEW5mRrgpDOHvfc92t0PaBgboBKXR4n/AzOOFt0h9GRNTmVKYBpUQPp/HO+r1Bxq+XbaGm1CyfkjUUxnORA==",
- "peerDependencies": {
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8"
- }
- },
- "node_modules/@pixi/particle-container": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-6.5.8.tgz",
- "integrity": "sha512-wc4j84PssPWmZLpOJTLLC7MftCULzkQMAfVlwOERhNTZ+6E1LIKw91wDWZe9LQ/20iarzQwQXo0a4uNlJlhnVQ==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/polyfill": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-6.5.8.tgz",
- "integrity": "sha512-z2klHelxTZExMyO4oiLdxJMGzzXnToEIDn7Dwfy3FY+98LbxSa2dVFCgzDsYeiiS8fSMsni2Ru7aZT/DFsRDcA==",
- "dependencies": {
- "object-assign": "^4.1.1",
- "promise-polyfill": "^8.2.0"
- }
- },
- "node_modules/@pixi/prepare": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-6.5.8.tgz",
- "integrity": "sha512-anrAcjX3r9ZzK/L6Fw7GhE1pCkjhSfBsxUTlVhuRKJPFC+A3BNpZCwy3GzyvHP4ocl8wvUMzuz5BB5l0AoBCFw==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/graphics": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/text": "6.5.8",
- "@pixi/ticker": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/runner": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.8.tgz",
- "integrity": "sha512-/9KVgQjTKiBa1qHdNmhP9I+AHgC/Eu9QiKcc+oakLCJtpYi79lx+nDFrpLUamIi2c7lP0hDWVe0XqlQeYmSwag=="
- },
- "node_modules/@pixi/settings": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.8.tgz",
- "integrity": "sha512-gmnwHkg9+tlQRuFNOdimzl73Dup2fdEo/VYaF7spT+8womE4KWAvARCBMqY/10aAx1iYeYuo5av/RfqrePB5Hg==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8"
- }
- },
- "node_modules/@pixi/sprite": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.8.tgz",
- "integrity": "sha512-ywvbrNgjK+K93X9cvHtDCnsBtU7B9JD/3wg+1G6v1Ktrr2E1gwVIQK1NANBrjzt6cYGphz5EqGAW68d0rMBliw==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/sprite-animated": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-6.5.8.tgz",
- "integrity": "sha512-woPT2cF1BaC0PDWdDrqJ0+DYcyIeXzZLq6bVx2YYia3+jJao1Zjmz1ns5e7YMUTEG7DoVFfhO6CC81YimsMG5w==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/ticker": "6.5.8"
- }
- },
- "node_modules/@pixi/sprite-tiling": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-6.5.8.tgz",
- "integrity": "sha512-PG3tiWI6uUest/d7HAz4/3I8NjpYyeMUL2WDy86nMXCJ6bLdTs/s9Nq3DLckaUsyIMTGsVbj/BXjE8LP1WDTog==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/spritesheet": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-6.5.8.tgz",
- "integrity": "sha512-WiJd4fKpSitD3A+/u5q8IPoHXMFT8++bsluhuJvDwzo//s0PHb9qExlF2xos7zUmekmydEFMkDnrl4+lWn2cyg==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/loaders": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/text": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/text/-/text-6.5.8.tgz",
- "integrity": "sha512-7AZPj5+vWcUjK0QzQ3ehiEwEqywiWR8NhDmnnN5nRNHR9u5IOOnqCQtBTdDffYPN0uMgCi8MzUPwTJhGuyOeww==",
- "peerDependencies": {
- "@pixi/core": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/text-bitmap": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-6.5.8.tgz",
- "integrity": "sha512-6VxejDc0gOu5HFN06m6i94xBZHdZ728iao8q+hEOjavGR5i2Pv3xseuke1qY0iN4q6Z+wTkcmoK5BfEVi2ujdQ==",
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/loaders": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/mesh": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/text": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "node_modules/@pixi/ticker": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.8.tgz",
- "integrity": "sha512-7VKq5hfnRDSv6a16pATqZAmpQfEu4G171iUTloy3QZfbnPw0s3JervZSih1yJJD84GXEF4VzYB26pJ/x3arGjQ==",
- "peerDependencies": {
- "@pixi/extensions": "6.5.8",
- "@pixi/settings": "6.5.8"
- }
- },
- "node_modules/@pixi/utils": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.8.tgz",
- "integrity": "sha512-zLnvmVQBWPDnwkfvrSpBBF2XpWSMt+kQAsX562eqjuME63ic9M6fK4u/IaA8csdlG2wtcjBvSYWrpWmPq0bWag==",
- "dependencies": {
- "@types/earcut": "^2.1.0",
- "earcut": "^2.2.4",
- "eventemitter3": "^3.1.0",
- "url": "^0.11.0"
- },
- "peerDependencies": {
- "@pixi/constants": "6.5.8",
- "@pixi/settings": "6.5.8"
- }
- },
- "node_modules/@pixi/utils/node_modules/eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dev": true,
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "dev": true,
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/earcut": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.1.tgz",
- "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ=="
- },
- "node_modules/@types/eslint": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz",
- "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
- "dev": true,
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
- "dev": true
- },
- "node_modules/@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dev": true,
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.9",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
- "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
- "dev": true
- },
- "node_modules/@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "17.0.38",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz",
- "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==",
- "dev": true
- },
- "node_modules/@types/offscreencanvas": {
- "version": "2019.7.0",
- "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz",
- "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg=="
- },
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
- "dev": true
- },
- "node_modules/@types/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
- "dev": true
- },
- "node_modules/@types/seedrandom": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.2.tgz",
- "integrity": "sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ==",
- "dev": true
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "dev": true,
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dev": true,
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/stats.js": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz",
- "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==",
- "dev": true
- },
- "node_modules/@types/ws": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
- "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
- "dev": true
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
- "dev": true,
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
- "dev": true,
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
- "dev": true
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webpack-cli/configtest": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x",
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/info": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
- "dev": true,
- "dependencies": {
- "envinfo": "^7.7.3"
- },
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/serve": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- },
- "peerDependenciesMeta": {
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
- "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-assertions": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
- "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true,
- "engines": [
- "node >= 0.8.0"
- ],
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
- "dev": true
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.10.3",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/bonjour-service": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz",
- "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==",
- "dev": true,
- "dependencies": {
- "array-flatten": "^2.1.2",
- "dns-equal": "^1.0.0",
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.4"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.20.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
- "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001332",
- "electron-to-chromium": "^1.4.118",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.3",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001344",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz",
- "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- }
- ]
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true,
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
- "dev": true
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/compression/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true
- },
- "node_modules/copy-webpack-plugin": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
- "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
- "dev": true,
- "dependencies": {
- "fast-glob": "^3.2.11",
- "glob-parent": "^6.0.1",
- "globby": "^13.1.1",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
- "dev": true
- },
- "node_modules/dns-packet": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
- "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
- "dev": true,
- "dependencies": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/earcut": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
- "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.143",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz",
- "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==",
- "dev": true
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
- "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true,
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
- "dev": true
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.0",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.10.3",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
- "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
- },
- "node_modules/globby": {
- "version": "13.1.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz",
- "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==",
- "dev": true,
- "dependencies": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hash-wasm": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz",
- "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==",
- "license": "MIT"
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/html-entities": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
- "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
- "dev": true
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
- "dev": true
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-parser-js": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz",
- "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==",
- "dev": true
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
- "dev": true,
- "dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
- },
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
- "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/lil-gui": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz",
- "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ=="
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "dev": true,
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memfs": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz",
- "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==",
- "dev": true,
- "dependencies": {
- "fs-monkey": "1.0.3"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
- "dev": true
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "dev": true,
- "dependencies": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node_modules/node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "dev": true,
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
- "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
- "dev": true
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dev": true,
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
- "dev": true,
- "dependencies": {
- "@types/retry": "0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pixi-viewport": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/pixi-viewport/-/pixi-viewport-4.37.0.tgz",
- "integrity": "sha512-bF22o1WbWeQ3TTHnxh5MYPzjXiKAG2ezAV6rm1oaEbA66hZAAU6lCs7BgwmEBiZKgHNGko1bIJQUSe7cXWJVCw==",
- "peerDependencies": {
- "@pixi/display": "^6.5.7",
- "@pixi/interaction": "^6.5.7",
- "@pixi/math": "^6.5.7",
- "@pixi/ticker": "^6.5.7"
- }
- },
- "node_modules/pixi.js": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-6.5.8.tgz",
- "integrity": "sha512-TAovIMCvKiWlonyAEbStOSq2+GZliRgs+Pqlavffa/D0Rmvmb78bytWRxgonGx1qkg7G8W7eIbF55tFP4a5Krw==",
- "dependencies": {
- "@pixi/accessibility": "6.5.8",
- "@pixi/app": "6.5.8",
- "@pixi/compressed-textures": "6.5.8",
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/extensions": "6.5.8",
- "@pixi/extract": "6.5.8",
- "@pixi/filter-alpha": "6.5.8",
- "@pixi/filter-blur": "6.5.8",
- "@pixi/filter-color-matrix": "6.5.8",
- "@pixi/filter-displacement": "6.5.8",
- "@pixi/filter-fxaa": "6.5.8",
- "@pixi/filter-noise": "6.5.8",
- "@pixi/graphics": "6.5.8",
- "@pixi/interaction": "6.5.8",
- "@pixi/loaders": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/mesh": "6.5.8",
- "@pixi/mesh-extras": "6.5.8",
- "@pixi/mixin-cache-as-bitmap": "6.5.8",
- "@pixi/mixin-get-child-by-name": "6.5.8",
- "@pixi/mixin-get-global-position": "6.5.8",
- "@pixi/particle-container": "6.5.8",
- "@pixi/polyfill": "6.5.8",
- "@pixi/prepare": "6.5.8",
- "@pixi/runner": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/sprite-animated": "6.5.8",
- "@pixi/sprite-tiling": "6.5.8",
- "@pixi/spritesheet": "6.5.8",
- "@pixi/text": "6.5.8",
- "@pixi/text-bitmap": "6.5.8",
- "@pixi/ticker": "6.5.8",
- "@pixi/utils": "6.5.8"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/pixijs"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/promise-polyfill": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz",
- "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg=="
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
- "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/raw-body/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dev": true,
- "dependencies": {
- "resolve": "^1.9.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "node_modules/resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.8.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "node_modules/selfsigned": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
- "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
- "dev": true,
- "dependencies": {
- "node-forge": "^1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
- "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
- "dev": true,
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
- },
- "node_modules/serve-index/node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dev": true,
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/spdy-transport/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy-transport/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/spdy/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/stats.js": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
- "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0="
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/terser": {
- "version": "5.14.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz",
- "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==",
- "dev": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
- "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
- "dev": true,
- "dependencies": {
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ts-loader": {
- "version": "9.4.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz",
- "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.0",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "typescript": "*",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
- "dependencies": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- }
- },
- "node_modules/url/node_modules/punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dev": true,
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.74.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
- "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
- "dev": true,
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.1.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
- "dev": true,
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.2.0",
- "@webpack-cli/info": "^1.5.0",
- "@webpack-cli/serve": "^1.7.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "cross-spawn": "^7.0.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x"
- },
- "peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "@webpack-cli/migrate": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
- "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
- "dev": true,
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
- "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
- "dev": true,
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.1",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.1",
- "ws": "^8.4.2"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "dev": true,
- "dependencies": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true,
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/webpack/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
- "dev": true
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "node_modules/ws": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz",
- "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- },
- "dependencies": {
- "@dimforge/rapier2d": {
- "version": "file:../builds/rapier2d",
- "requires": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13",
- "wasm-pack": "^0.12.1"
- }
- },
- "@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
- "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
- "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
- "dev": true
- },
- "@jridgewell/set-array": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
- "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
- "dev": true
- },
- "@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
- "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
- "dev": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
- "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
- "dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@leichtgewicht/ip-codec": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
- "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
- "dev": true
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@pixi/accessibility": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-6.5.8.tgz",
- "integrity": "sha512-3q1YaZeZKOoblgbxTQg2L0RAp9jtNtGcl/7kce+XelqxwIMS3p8411nwo90YO53XCqc/eQW2SoZ+hSXqcL0qOw==",
- "requires": {}
- },
- "@pixi/app": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/app/-/app-6.5.8.tgz",
- "integrity": "sha512-pDPkamtYDaPhscNxack+bHNqazCwrqw6cAotKyoz1mvLXeGhxqTntOcfgGLZR2fNbnY8EBmdduLvH7n2jI/LTg==",
- "requires": {}
- },
- "@pixi/compressed-textures": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-6.5.8.tgz",
- "integrity": "sha512-nW74kcvdEoe4a2U7Ekx4egqdH1tYKC2kCOZxKWYcUARqz26tS0ddwSRyIs05In6EChmXHXGy/MtShdueMH38TA==",
- "requires": {}
- },
- "@pixi/constants": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.8.tgz",
- "integrity": "sha512-yYRCebBPqajm1kn5f8QQTTvl7oDRDk1nppfO+JpqbrFXg0W7oqIMurec3KeG9RdZW5foOiXDoz1Gw+VtolYIEw=="
- },
- "@pixi/core": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.8.tgz",
- "integrity": "sha512-Gconik7/PpFPMpCpOddXVIPx5C2StWKw7lQ4YX19yQ+cRRmecCea2cV0xTBtpEjjx0ilX7nBfIEuZ4zIlMmlbA==",
- "requires": {
- "@types/offscreencanvas": "^2019.6.4"
- }
- },
- "@pixi/display": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.8.tgz",
- "integrity": "sha512-2K8YOG8s0iF8x/k2Q0RTFmoMJ9biI6PXEh76nH3EqUFdpyrIIgrG5aOMnCkVDvOxlgVRrKG8Q3JBHlSievTmuw==",
- "requires": {}
- },
- "@pixi/extensions": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.8.tgz",
- "integrity": "sha512-6vEV801Vn/EkU/qjFiZ76OZWPq5KsBR2r+P5gfKv4YLnaDc3A+0IpUOJ7sLBAJqmr0iw68g6xV6MnuqVjNGjFg=="
- },
- "@pixi/extract": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-6.5.8.tgz",
- "integrity": "sha512-qbuuD/iBA4J+TCBgrbMe8oDUFbCriyy9LTKEtQp+pghKD5MEMvJ3nO6Osumxqiqta2kYU6WldFLTldKyHEiQ7Q==",
- "requires": {}
- },
- "@pixi/filter-alpha": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-6.5.8.tgz",
- "integrity": "sha512-W4IkFTLTP84H+DS9XIdBGunAEpaXLrasDc4CQBeyp4c4hBlGlzriUZp30vkmqm7GPmFhzPe7aiJtNYgUpxKQBQ==",
- "requires": {}
- },
- "@pixi/filter-blur": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-6.5.8.tgz",
- "integrity": "sha512-1UOfVthFBnavzTBkR6R+1tWhOOymtWvcpuJILhxf3mryLj9eqYbQubAG0gV8Da6Ibsgk+v73ORnOJyWR3POFvw==",
- "requires": {}
- },
- "@pixi/filter-color-matrix": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-6.5.8.tgz",
- "integrity": "sha512-iix+a/KEi6HAwZwkUH3nkIzyLu0ln3HBuHEFLUUhug7xrQgQgGrTQZ32iWlfpJD/BZuKphIGfzlxMFfvyQmkVw==",
- "requires": {}
- },
- "@pixi/filter-displacement": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-6.5.8.tgz",
- "integrity": "sha512-qLRka5cQbeH6667A+ViYoemsXGGe2tOBt92vM91+slMt9OBGtR0ymlpGU7VxBggWUlu5PE10zYed/xw78uSpig==",
- "requires": {}
- },
- "@pixi/filter-fxaa": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-6.5.8.tgz",
- "integrity": "sha512-TxsBH2z2RMj0mqr13VPi18/EJ/Kn38J2u65HonJmhbvTaoK9HWMExTvl38Xjg0k7TlepwhoayxMhQ1uCw9xudQ==",
- "requires": {}
- },
- "@pixi/filter-noise": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-6.5.8.tgz",
- "integrity": "sha512-BZHKuzV5Mdn+EpC52lFYpd6jUcrL+YQHdq0v0yJfVtpW2ripseQxMGxxXr6Yxp2P4F3g2aY2JrfX2VztosmGLA==",
- "requires": {}
- },
- "@pixi/graphics": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.8.tgz",
- "integrity": "sha512-DUuUXHO4t5fg+n+srMkHX38QEH3WtS1IMXtovBGFJkkopG0Z0xjxSp5XvsPPw1J//4fzkHZI5OBrlN613p9+sg==",
- "requires": {}
- },
- "@pixi/interaction": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-6.5.8.tgz",
- "integrity": "sha512-uP247r0f47vo9WSpEnsUfeD1izxVGpjtg4iAyGT/02ezWse2vD1aEL8AbxFa65TL0IXOKsHEQudCVL+wjnbSKQ==",
- "requires": {}
- },
- "@pixi/loaders": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-6.5.8.tgz",
- "integrity": "sha512-mj11UPKsqWaTEPMpCnFugr6heKkQeNFuVSddSwE8crg19l46zcMhk3ucpQX15RDpAdDJjtl3OraevQCHHbNENw==",
- "requires": {}
- },
- "@pixi/math": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.8.tgz",
- "integrity": "sha512-9493KEH5ITnjOZvQZbaU22lD0kcg/XhNh+309KYfwFX787zA1BN/7is06oHEgHBDb2NemqioYi6sw1WnECgQig=="
- },
- "@pixi/mesh": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-6.5.8.tgz",
- "integrity": "sha512-iZZGkh8QBhnfMEgpJsuwemFZZVatodckCgj7N8t1hyHEf0aOWEA6wp5N0Osa3mhltokl7BGnZZLxaR8NtjaiEQ==",
- "requires": {}
- },
- "@pixi/mesh-extras": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-6.5.8.tgz",
- "integrity": "sha512-eU2I53yZUFxKbTYZvyRfUcdina3WOl87fyqYwAoaHosU9VgbFl16YADKTGV+NflNp6RCTwU/UIPZ1T19W/iysw==",
- "requires": {}
- },
- "@pixi/mixin-cache-as-bitmap": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-6.5.8.tgz",
- "integrity": "sha512-5TTv4w8v7guI6z3gKz5ppUCbNMRw+8RRNru/aq65qUl6kcUaJiYwQdBFJ/vJwpI9ePEScWrCuLVEc8QtX6xjNw==",
- "requires": {}
- },
- "@pixi/mixin-get-child-by-name": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-6.5.8.tgz",
- "integrity": "sha512-b15HTdHpW4ErDBpf7wm1vvWHrTv5kQzElXrwAPBCnLgvronfSL9mL7npOUkZOybUorCoEBq/7oNVjkimsQc5gw==",
- "requires": {}
- },
- "@pixi/mixin-get-global-position": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-6.5.8.tgz",
- "integrity": "sha512-Y5epEW5mRrgpDOHvfc92t0PaBgboBKXR4n/AzOOFt0h9GRNTmVKYBpUQPp/HO+r1Bxq+XbaGm1CyfkjUUxnORA==",
- "requires": {}
- },
- "@pixi/particle-container": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-6.5.8.tgz",
- "integrity": "sha512-wc4j84PssPWmZLpOJTLLC7MftCULzkQMAfVlwOERhNTZ+6E1LIKw91wDWZe9LQ/20iarzQwQXo0a4uNlJlhnVQ==",
- "requires": {}
- },
- "@pixi/polyfill": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-6.5.8.tgz",
- "integrity": "sha512-z2klHelxTZExMyO4oiLdxJMGzzXnToEIDn7Dwfy3FY+98LbxSa2dVFCgzDsYeiiS8fSMsni2Ru7aZT/DFsRDcA==",
- "requires": {
- "object-assign": "^4.1.1",
- "promise-polyfill": "^8.2.0"
- }
- },
- "@pixi/prepare": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-6.5.8.tgz",
- "integrity": "sha512-anrAcjX3r9ZzK/L6Fw7GhE1pCkjhSfBsxUTlVhuRKJPFC+A3BNpZCwy3GzyvHP4ocl8wvUMzuz5BB5l0AoBCFw==",
- "requires": {}
- },
- "@pixi/runner": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.8.tgz",
- "integrity": "sha512-/9KVgQjTKiBa1qHdNmhP9I+AHgC/Eu9QiKcc+oakLCJtpYi79lx+nDFrpLUamIi2c7lP0hDWVe0XqlQeYmSwag=="
- },
- "@pixi/settings": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.8.tgz",
- "integrity": "sha512-gmnwHkg9+tlQRuFNOdimzl73Dup2fdEo/VYaF7spT+8womE4KWAvARCBMqY/10aAx1iYeYuo5av/RfqrePB5Hg==",
- "requires": {}
- },
- "@pixi/sprite": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.8.tgz",
- "integrity": "sha512-ywvbrNgjK+K93X9cvHtDCnsBtU7B9JD/3wg+1G6v1Ktrr2E1gwVIQK1NANBrjzt6cYGphz5EqGAW68d0rMBliw==",
- "requires": {}
- },
- "@pixi/sprite-animated": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-6.5.8.tgz",
- "integrity": "sha512-woPT2cF1BaC0PDWdDrqJ0+DYcyIeXzZLq6bVx2YYia3+jJao1Zjmz1ns5e7YMUTEG7DoVFfhO6CC81YimsMG5w==",
- "requires": {}
- },
- "@pixi/sprite-tiling": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-6.5.8.tgz",
- "integrity": "sha512-PG3tiWI6uUest/d7HAz4/3I8NjpYyeMUL2WDy86nMXCJ6bLdTs/s9Nq3DLckaUsyIMTGsVbj/BXjE8LP1WDTog==",
- "requires": {}
- },
- "@pixi/spritesheet": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-6.5.8.tgz",
- "integrity": "sha512-WiJd4fKpSitD3A+/u5q8IPoHXMFT8++bsluhuJvDwzo//s0PHb9qExlF2xos7zUmekmydEFMkDnrl4+lWn2cyg==",
- "requires": {}
- },
- "@pixi/text": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/text/-/text-6.5.8.tgz",
- "integrity": "sha512-7AZPj5+vWcUjK0QzQ3ehiEwEqywiWR8NhDmnnN5nRNHR9u5IOOnqCQtBTdDffYPN0uMgCi8MzUPwTJhGuyOeww==",
- "requires": {}
- },
- "@pixi/text-bitmap": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-6.5.8.tgz",
- "integrity": "sha512-6VxejDc0gOu5HFN06m6i94xBZHdZ728iao8q+hEOjavGR5i2Pv3xseuke1qY0iN4q6Z+wTkcmoK5BfEVi2ujdQ==",
- "requires": {}
- },
- "@pixi/ticker": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.8.tgz",
- "integrity": "sha512-7VKq5hfnRDSv6a16pATqZAmpQfEu4G171iUTloy3QZfbnPw0s3JervZSih1yJJD84GXEF4VzYB26pJ/x3arGjQ==",
- "requires": {}
- },
- "@pixi/utils": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.8.tgz",
- "integrity": "sha512-zLnvmVQBWPDnwkfvrSpBBF2XpWSMt+kQAsX562eqjuME63ic9M6fK4u/IaA8csdlG2wtcjBvSYWrpWmPq0bWag==",
- "requires": {
- "@types/earcut": "^2.1.0",
- "earcut": "^2.2.4",
- "eventemitter3": "^3.1.0",
- "url": "^0.11.0"
- },
- "dependencies": {
- "eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- }
- }
- },
- "@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dev": true,
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "dev": true,
- "requires": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "@types/earcut": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.1.tgz",
- "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ=="
- },
- "@types/eslint": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz",
- "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==",
- "dev": true,
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
- "dev": true,
- "requires": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
- "dev": true
- },
- "@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dev": true,
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "@types/http-proxy": {
- "version": "1.17.9",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
- "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
- "dev": true
- },
- "@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
- "dev": true
- },
- "@types/node": {
- "version": "17.0.38",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz",
- "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==",
- "dev": true
- },
- "@types/offscreencanvas": {
- "version": "2019.7.0",
- "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz",
- "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg=="
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true
- },
- "@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
- "dev": true
- },
- "@types/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
- "dev": true
- },
- "@types/seedrandom": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.2.tgz",
- "integrity": "sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ==",
- "dev": true
- },
- "@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "dev": true,
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dev": true,
- "requires": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/stats.js": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz",
- "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==",
- "dev": true
- },
- "@types/ws": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
- "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
- "dev": true,
- "requires": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
- "dev": true
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
- "dev": true
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
- "dev": true
- },
- "@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
- "dev": true
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
- "dev": true,
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
- "dev": true,
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
- "dev": true
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webpack-cli/configtest": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "requires": {}
- },
- "@webpack-cli/info": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
- "dev": true,
- "requires": {
- "envinfo": "^7.7.3"
- }
- },
- "@webpack-cli/serve": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "requires": {}
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "acorn": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
- "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
- "dev": true
- },
- "acorn-import-assertions": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
- "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
- "dev": true,
- "requires": {}
- },
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "requires": {
- "ajv": "^8.0.0"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
- "dev": true
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
- "dev": true,
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.10.3",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true
- }
- }
- },
- "bonjour-service": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz",
- "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==",
- "dev": true,
- "requires": {
- "array-flatten": "^2.1.2",
- "dns-equal": "^1.0.0",
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.4"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browserslist": {
- "version": "4.20.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
- "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001332",
- "electron-to-chromium": "^1.4.118",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.3",
- "picocolors": "^1.0.0"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
- "dev": true
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001344",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz",
- "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==",
- "dev": true
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true
- },
- "clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
- "dev": true
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.2.1"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "dev": true
- },
- "cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "dev": true
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true
- },
- "copy-webpack-plugin": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
- "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
- "dev": true,
- "requires": {
- "fast-glob": "^3.2.11",
- "glob-parent": "^6.0.1",
- "globby": "^13.1.1",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0"
- }
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "requires": {
- "execa": "^5.0.0"
- }
- },
- "define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true
- },
- "destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true
- },
- "detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
- "dev": true
- },
- "dns-packet": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
- "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
- "dev": true,
- "requires": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- }
- },
- "earcut": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
- "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true
- },
- "electron-to-chromium": {
- "version": "1.4.143",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz",
- "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true
- },
- "enhanced-resolve": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
- "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- }
- },
- "envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true
- },
- "es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
- "dev": true
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
- },
- "eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- }
- },
- "express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.0",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.10.3",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true
- }
- }
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
- "dev": true
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "follow-redirects": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
- "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
- "dev": true
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true
- },
- "fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- }
- },
- "get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
- },
- "globby": {
- "version": "13.1.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz",
- "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==",
- "dev": true,
- "requires": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true
- },
- "handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true
- },
- "hash-wasm": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz",
- "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ=="
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "html-entities": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
- "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
- "dev": true
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
- "dev": true
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- }
- },
- "http-parser-js": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz",
- "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==",
- "dev": true
- },
- "http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
- "dev": true,
- "requires": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- }
- },
- "human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true
- },
- "import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "requires": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true
- },
- "ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "dev": true
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
- "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true
- },
- "is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "requires": {
- "is-docker": "^2.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "dev": true
- },
- "jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "lil-gui": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz",
- "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ=="
- },
- "loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "dev": true
- },
- "memfs": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz",
- "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==",
- "dev": true,
- "requires": {
- "fs-monkey": "1.0.3"
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
- "dev": true
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "requires": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true
- },
- "mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "requires": {
- "mime-db": "1.52.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "dev": true,
- "requires": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- }
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "dev": true
- },
- "node-releases": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
- "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
- "dev": true
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
- },
- "object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dev": true,
- "requires": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-retry": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
- "dev": true,
- "requires": {
- "@types/retry": "0.12.0",
- "retry": "^0.13.1"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pixi-viewport": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/pixi-viewport/-/pixi-viewport-4.37.0.tgz",
- "integrity": "sha512-bF22o1WbWeQ3TTHnxh5MYPzjXiKAG2ezAV6rm1oaEbA66hZAAU6lCs7BgwmEBiZKgHNGko1bIJQUSe7cXWJVCw==",
- "requires": {}
- },
- "pixi.js": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-6.5.8.tgz",
- "integrity": "sha512-TAovIMCvKiWlonyAEbStOSq2+GZliRgs+Pqlavffa/D0Rmvmb78bytWRxgonGx1qkg7G8W7eIbF55tFP4a5Krw==",
- "requires": {
- "@pixi/accessibility": "6.5.8",
- "@pixi/app": "6.5.8",
- "@pixi/compressed-textures": "6.5.8",
- "@pixi/constants": "6.5.8",
- "@pixi/core": "6.5.8",
- "@pixi/display": "6.5.8",
- "@pixi/extensions": "6.5.8",
- "@pixi/extract": "6.5.8",
- "@pixi/filter-alpha": "6.5.8",
- "@pixi/filter-blur": "6.5.8",
- "@pixi/filter-color-matrix": "6.5.8",
- "@pixi/filter-displacement": "6.5.8",
- "@pixi/filter-fxaa": "6.5.8",
- "@pixi/filter-noise": "6.5.8",
- "@pixi/graphics": "6.5.8",
- "@pixi/interaction": "6.5.8",
- "@pixi/loaders": "6.5.8",
- "@pixi/math": "6.5.8",
- "@pixi/mesh": "6.5.8",
- "@pixi/mesh-extras": "6.5.8",
- "@pixi/mixin-cache-as-bitmap": "6.5.8",
- "@pixi/mixin-get-child-by-name": "6.5.8",
- "@pixi/mixin-get-global-position": "6.5.8",
- "@pixi/particle-container": "6.5.8",
- "@pixi/polyfill": "6.5.8",
- "@pixi/prepare": "6.5.8",
- "@pixi/runner": "6.5.8",
- "@pixi/settings": "6.5.8",
- "@pixi/sprite": "6.5.8",
- "@pixi/sprite-animated": "6.5.8",
- "@pixi/sprite-tiling": "6.5.8",
- "@pixi/spritesheet": "6.5.8",
- "@pixi/text": "6.5.8",
- "@pixi/text-bitmap": "6.5.8",
- "@pixi/ticker": "6.5.8",
- "@pixi/utils": "6.5.8"
- }
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "promise-polyfill": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz",
- "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg=="
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "dependencies": {
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true
- }
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
- "dev": true,
- "requires": {
- "side-channel": "^1.0.4"
- }
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true
- },
- "raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dev": true,
- "requires": {
- "resolve": "^1.9.0"
- }
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.8.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "requires": {
- "resolve-from": "^5.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- },
- "seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "selfsigned": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
- "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
- "dev": true,
- "requires": {
- "node-forge": "^1"
- }
- },
- "semver": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
- "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
- }
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "dev": true
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true
- },
- "sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "requires": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "stats.js": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
- "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true
- },
- "terser": {
- "version": "5.14.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz",
- "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==",
- "dev": true,
- "requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- }
- },
- "terser-webpack-plugin": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
- "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
- "dev": true,
- "requires": {
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
- },
- "dependencies": {
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true
- },
- "ts-loader": {
- "version": "9.4.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz",
- "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4"
- }
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typescript": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
- "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
- "dev": true
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true
- },
- "watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dev": true,
- "requires": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "webpack": {
- "version": "5.74.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
- "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
- "dev": true,
- "requires": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.1.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "dependencies": {
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
- },
- "webpack-cli": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
- "dev": true,
- "requires": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.2.0",
- "@webpack-cli/info": "^1.5.0",
- "@webpack-cli/serve": "^1.7.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "cross-spawn": "^7.0.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
- "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
- "dev": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- }
- },
- "webpack-dev-server": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
- "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
- "dev": true,
- "requires": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.1",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.1",
- "ws": "^8.4.2"
- }
- },
- "webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "dev": true,
- "requires": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- }
- },
- "webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true
- },
- "websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "ws": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz",
- "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==",
- "dev": true,
- "requires": {}
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
-}
diff --git a/testbed2d/package.json b/testbed2d/package.json
deleted file mode 100644
index 9152daa0..00000000
--- a/testbed2d/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "author": "sebcrozet ",
- "name": "rapier-testbed2d",
- "version": "0.1.0",
- "description": "JavaScript testbed for rapier.",
- "license": "Apache-2.0",
- "main": "dist/rapier-testbed2d.js",
- "scripts": {
- "build": "rimraf dist pkg && webpack",
- "start": "rimraf dist pkg && webpack serve --open --node-env development"
- },
- "dependencies": {
- "@dimforge/rapier2d": "file:../builds/rapier2d",
- "hash-wasm": "^4.12.0",
- "lil-gui": "^0.17.0",
- "pixi-viewport": "^4.37.0",
- "pixi.js": "^6.3.2",
- "seedrandom": "^3.0.5",
- "stats.js": "^0.17.0"
- },
- "devDependencies": {
- "@types/seedrandom": "^3.0.2",
- "@types/stats.js": "^0.17.0",
- "copy-webpack-plugin": "^11.0.0",
- "rimraf": "^3.0.2",
- "ts-loader": "^9.4.1",
- "typescript": "^4.8.4",
- "webpack": "^5.74.0",
- "webpack-cli": "^4.10.0",
- "webpack-dev-server": "^4.11.1"
- }
-}
diff --git a/testbed2d/webpack.config.js b/testbed2d/webpack.config.js
deleted file mode 100644
index 0e5c9839..00000000
--- a/testbed2d/webpack.config.js
+++ /dev/null
@@ -1,55 +0,0 @@
-const webpack = require("webpack");
-const path = require("path");
-const CopyPlugin = require("copy-webpack-plugin");
-
-const isDev = process.env.NODE_ENV === "development";
-const dist = path.resolve(__dirname, "dist");
-
-/**
- * @type {import('webpack-dev-server').Configuration}
- */
-const devServer = {
- static: {
- directory: dist,
- },
- allowedHosts: "all",
- compress: true,
-};
-
-/**
- * @type {import('webpack').Configuration}
- */
-const webpackConfig = {
- mode: isDev ? "development" : "production",
- entry: "./src/index.ts",
- devtool: "inline-source-map",
- output: {
- path: dist,
- filename: "index.js",
- },
- resolve: {
- extensions: [".ts", ".js"],
- },
- devServer,
- performance: false,
- experiments: {
- asyncWebAssembly: true,
- syncWebAssembly: true,
- },
- module: {
- rules: [
- {
- test: /\.tsx?$/,
- use: "ts-loader",
- exclude: /node_modules/,
- },
- ],
- },
- plugins: [
- new CopyPlugin({
- patterns: [{from: "static", to: dist}],
- }),
- ],
-};
-
-module.exports = webpackConfig;
diff --git a/testbed3d/package-lock.json b/testbed3d/package-lock.json
deleted file mode 100644
index 95727a7e..00000000
--- a/testbed3d/package-lock.json
+++ /dev/null
@@ -1,4373 +0,0 @@
-{
- "name": "rapier-testbed3d",
- "version": "0.1.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "rapier-testbed3d",
- "version": "0.1.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@dimforge/rapier3d": "file:../builds/rapier3d",
- "hash-wasm": "^4.12.0",
- "lil-gui": "^0.17.0",
- "seedrandom": "^3.0.5",
- "stats.js": "^0.17.0",
- "three": "^0.146.0"
- },
- "devDependencies": {
- "@types/seedrandom": "^3.0.2",
- "@types/stats.js": "^0.17.0",
- "@types/three": "^0.144.0",
- "copy-webpack-plugin": "^11.0.0",
- "rimraf": "^3.0.2",
- "ts-loader": "^9.4.1",
- "typescript": "^4.8.4",
- "webpack": "^5.74.0",
- "webpack-cli": "^4.10.0",
- "webpack-dev-server": "^4.11.1"
- }
- },
- "../builds/rapier3d": {
- "name": "@dimforge/rapier3d",
- "dependencies": {
- "wasm-pack": "^0.12.1"
- },
- "devDependencies": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13"
- }
- },
- "../rapier3d": {
- "name": "@dimforge/rapier3d",
- "extraneous": true,
- "dependencies": {
- "typescript": "^5.7.2",
- "wasm-pack": "^0.12.1"
- },
- "devDependencies": {
- "rimraf": "^3.0.2",
- "typedoc": "^0.25.13"
- }
- },
- "node_modules/@dimforge/rapier3d": {
- "resolved": "../builds/rapier3d",
- "link": true
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
- "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
- "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
- "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
- "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
- "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz",
- "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
- "version": "4.19.6",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
- "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/http-errors": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.15",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
- "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/mime": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "22.10.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz",
- "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.20.0"
- }
- },
- "node_modules/@types/node-forge": {
- "version": "1.3.11",
- "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
- "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/qs": {
- "version": "6.9.17",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
- "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/seedrandom": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz",
- "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/send": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
- "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.15.7",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
- "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/http-errors": "*",
- "@types/node": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.36",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
- "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/stats.js": {
- "version": "0.17.3",
- "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz",
- "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/three": {
- "version": "0.144.0",
- "resolved": "https://registry.npmjs.org/@types/three/-/three-0.144.0.tgz",
- "integrity": "sha512-psvEs6q5rLN50jUYZ3D4pZMfxTbdt3A243blt0my7/NcL6chaCZpHe2csbCtx0SOD9fI/XnF3wnVUAYZGqCSYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/webxr": "*"
- }
- },
- "node_modules/@types/webxr": {
- "version": "0.5.20",
- "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz",
- "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/ws": {
- "version": "8.5.13",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
- "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
- "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.13.2",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
- "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
- "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
- "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
- "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.13.2",
- "@webassemblyjs/helper-api-error": "1.13.2",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
- "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
- "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/wasm-gen": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
- "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
- "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
- "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
- "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/helper-wasm-section": "1.14.1",
- "@webassemblyjs/wasm-gen": "1.14.1",
- "@webassemblyjs/wasm-opt": "1.14.1",
- "@webassemblyjs/wasm-parser": "1.14.1",
- "@webassemblyjs/wast-printer": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
- "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/ieee754": "1.13.2",
- "@webassemblyjs/leb128": "1.13.2",
- "@webassemblyjs/utf8": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
- "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/wasm-gen": "1.14.1",
- "@webassemblyjs/wasm-parser": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
- "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-api-error": "1.13.2",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/ieee754": "1.13.2",
- "@webassemblyjs/leb128": "1.13.2",
- "@webassemblyjs/utf8": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
- "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webpack-cli/configtest": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x",
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/info": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "envinfo": "^7.7.3"
- },
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/serve": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- },
- "peerDependenciesMeta": {
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accepts/node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true,
- "engines": [
- "node >= 0.8.0"
- ],
- "license": "Apache-2.0",
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/bonjour-service": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
- "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.5"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.24.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
- "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "caniuse-lite": "^1.0.30001669",
- "electron-to-chromium": "^1.5.41",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001686",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz",
- "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
- "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
- "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/copy-webpack-plugin": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
- "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-glob": "^3.2.11",
- "glob-parent": "^6.0.1",
- "globby": "^13.1.1",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dns-packet": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
- "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.68",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz",
- "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.17.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
- "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/envinfo": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz",
- "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
- "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/express": {
- "version": "4.21.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
- "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-uri": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
- "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4.9.1"
- }
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-monkey": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
- "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/globby": {
- "version": "13.2.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
- "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.3.0",
- "ignore": "^5.2.4",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz",
- "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hash-wasm": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz",
- "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==",
- "license": "MIT"
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/html-entities": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
- "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/mdevils"
- },
- {
- "type": "patreon",
- "url": "https://patreon.com/mdevils"
- }
- ],
- "license": "MIT"
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-parser-js": {
- "version": "0.5.8",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
- "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-middleware": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
- "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
- },
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
- "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
- "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/launch-editor": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
- "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picocolors": "^1.0.0",
- "shell-quote": "^1.8.1"
- }
- },
- "node_modules/lil-gui": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz",
- "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==",
- "license": "MIT"
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memfs": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
- "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
- "dev": true,
- "license": "Unlicense",
- "dependencies": {
- "fs-monkey": "^1.0.4"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "dev": true,
- "license": "(BSD-3-Clause OR GPL-2.0)",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
- "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/retry": "0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve": "^1.9.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
- "license": "MIT"
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/selfsigned": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
- "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node-forge": "^1.3.0",
- "node-forge": "^1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/serve-index/node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
- "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/spdy-transport/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy-transport/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/spdy/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/spdy/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/stats.js": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
- "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==",
- "license": "MIT"
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/terser": {
- "version": "5.36.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
- "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.20",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/three": {
- "version": "0.146.0",
- "resolved": "https://registry.npmjs.org/three/-/three-0.146.0.tgz",
- "integrity": "sha512-1lvNfLezN6OJ9NaFAhfX4sm5e9YCzHtaRgZ1+B4C+Hv6TibRMsuBAM5/wVKzxjpYIlMymvgsHEFrrigEfXnb2A==",
- "license": "MIT"
- },
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ts-loader": {
- "version": "9.5.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz",
- "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.1.0",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4",
- "source-map": "^0.7.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "typescript": "*",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/undici-types": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
- "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
- "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
- "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.97.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.0.tgz",
- "integrity": "sha512-CWT8v7ShSfj7tGs4TLRtaOLmOCPWhoKEvp+eA7FVx8Xrjb3XfT0aXdxDItnRZmE8sHcH+a8ayDrJCOjXKxVFfQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/eslint-scope": "^3.7.7",
- "@types/estree": "^1.0.6",
- "@webassemblyjs/ast": "^1.14.1",
- "@webassemblyjs/wasm-edit": "^1.14.1",
- "@webassemblyjs/wasm-parser": "^1.14.1",
- "acorn": "^8.14.0",
- "browserslist": "^4.24.0",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.1",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.11",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.10",
- "watchpack": "^2.4.1",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.2.0",
- "@webpack-cli/info": "^1.5.0",
- "@webpack-cli/serve": "^1.7.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "cross-spawn": "^7.0.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x"
- },
- "peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "@webpack-cli/migrate": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
- "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.15.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
- "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.4",
- "ws": "^8.13.0"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- },
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
- "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/webpack/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
- "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ws": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
- "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/testbed3d/package.json b/testbed3d/package.json
deleted file mode 100644
index 516ee275..00000000
--- a/testbed3d/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "author": "sebcrozet ",
- "name": "rapier-testbed3d",
- "version": "0.1.0",
- "description": "JavaScript testbed for rapier.",
- "license": "Apache-2.0",
- "main": "dist/rapier-testbed3d.js",
- "scripts": {
- "build": "rimraf dist pkg && webpack",
- "start": "rimraf dist pkg && webpack serve --open --node-env development"
- },
- "dependencies": {
- "@dimforge/rapier3d": "file:../builds/rapier3d",
- "hash-wasm": "^4.12.0",
- "lil-gui": "^0.17.0",
- "seedrandom": "^3.0.5",
- "stats.js": "^0.17.0",
- "three": "^0.146.0"
- },
- "devDependencies": {
- "@types/seedrandom": "^3.0.2",
- "@types/stats.js": "^0.17.0",
- "@types/three": "^0.144.0",
- "copy-webpack-plugin": "^11.0.0",
- "rimraf": "^3.0.2",
- "ts-loader": "^9.4.1",
- "typescript": "^4.8.4",
- "webpack": "^5.74.0",
- "webpack-cli": "^4.10.0",
- "webpack-dev-server": "^4.11.1"
- }
-}
diff --git a/testbed3d/webpack.config.js b/testbed3d/webpack.config.js
deleted file mode 100644
index 0e5c9839..00000000
--- a/testbed3d/webpack.config.js
+++ /dev/null
@@ -1,55 +0,0 @@
-const webpack = require("webpack");
-const path = require("path");
-const CopyPlugin = require("copy-webpack-plugin");
-
-const isDev = process.env.NODE_ENV === "development";
-const dist = path.resolve(__dirname, "dist");
-
-/**
- * @type {import('webpack-dev-server').Configuration}
- */
-const devServer = {
- static: {
- directory: dist,
- },
- allowedHosts: "all",
- compress: true,
-};
-
-/**
- * @type {import('webpack').Configuration}
- */
-const webpackConfig = {
- mode: isDev ? "development" : "production",
- entry: "./src/index.ts",
- devtool: "inline-source-map",
- output: {
- path: dist,
- filename: "index.js",
- },
- resolve: {
- extensions: [".ts", ".js"],
- },
- devServer,
- performance: false,
- experiments: {
- asyncWebAssembly: true,
- syncWebAssembly: true,
- },
- module: {
- rules: [
- {
- test: /\.tsx?$/,
- use: "ts-loader",
- exclude: /node_modules/,
- },
- ],
- },
- plugins: [
- new CopyPlugin({
- patterns: [{from: "static", to: dist}],
- }),
- ],
-};
-
-module.exports = webpackConfig;