diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 57500eea7..1e435a667 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -14,7 +14,7 @@ jobs: security_audit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: rustsec/audit-check@v1.4.1 with: token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/cargo-machete.yml b/.github/workflows/cargo-machete.yml index bf864b94c..31bae44a1 100644 --- a/.github/workflows/cargo-machete.yml +++ b/.github/workflows/cargo-machete.yml @@ -15,6 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Machete uses: bnjbvr/cargo-machete@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1fcd219a5..d271dfd31 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,7 +62,7 @@ jobs: # we specify bash to get pipefail; it guards against the `curl` command # failing. otherwise `sh` won't catch that `curl` returned non-0 shell: bash - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.7.2/cargo-dist-installer.sh | sh" + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.11.1/cargo-dist-installer.sh | sh" # sure would be cool if github gave us proper conditionals... # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible # functionality based on whether this is a pull_request, and whether it's from a fork. @@ -70,15 +70,15 @@ jobs: # but also really annoying to build CI around when it needs secrets to work right.) - id: plan run: | - cargo dist ${{ !github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name) || (github.event.pull_request.head.repo.fork && 'plan' || 'host --steps=check') }} --output-format=json > dist-manifest.json + cargo dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json echo "cargo dist ran successfully" - cat dist-manifest.json - echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" + cat plan-dist-manifest.json + echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: artifacts - path: dist-manifest.json + name: artifacts-plan-dist-manifest + path: plan-dist-manifest.json # Build and packages all the platform-specific things build-local-artifacts: @@ -113,10 +113,11 @@ jobs: run: ${{ matrix.install_dist }} # Get the dist-manifest - name: Fetch local artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: artifacts + pattern: artifacts-* path: target/distrib/ + merge-multiple: true - name: Install dependencies run: | ${{ matrix.packages_install }} @@ -139,9 +140,9 @@ jobs: cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: artifacts + name: artifacts-build-local-${{ join(matrix.targets, '_') }} path: | ${{ steps.cargo-dist.outputs.paths }} ${{ env.BUILD_MANIFEST_NAME }} @@ -160,13 +161,15 @@ jobs: with: submodules: recursive - name: Install cargo-dist - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.7.2/cargo-dist-installer.sh | sh" + shell: bash + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.11.1/cargo-dist-installer.sh | sh" # Get all the local artifacts for the global tasks to use (for e.g. checksums) - name: Fetch local artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: artifacts + pattern: artifacts-* path: target/distrib/ + merge-multiple: true - id: cargo-dist shell: bash run: | @@ -180,9 +183,9 @@ jobs: cp dist-manifest.json "$BUILD_MANIFEST_NAME" - name: "Upload artifacts" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: artifacts + name: artifacts-build-global path: | ${{ steps.cargo-dist.outputs.paths }} ${{ env.BUILD_MANIFEST_NAME }} @@ -204,13 +207,14 @@ jobs: with: submodules: recursive - name: Install cargo-dist - run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.7.2/cargo-dist-installer.sh | sh" + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.11.1/cargo-dist-installer.sh | sh" # Fetch artifacts from scratch-storage - name: Fetch artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: artifacts + pattern: artifacts-* path: target/distrib/ + merge-multiple: true # This is a harmless no-op for Github Releases, hosting for that happens in "announce" - id: host shell: bash @@ -220,9 +224,10 @@ jobs: cat dist-manifest.json echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" - name: "Upload dist-manifest.json" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: artifacts + # Overwrite the previous copy + name: artifacts-dist-manifest path: dist-manifest.json # Create a Github Release while uploading all files to it @@ -242,10 +247,11 @@ jobs: with: submodules: recursive - name: "Download Github Artifacts" - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: artifacts + pattern: artifacts-* path: artifacts + merge-multiple: true - name: Cleanup run: | # Remove the granular manifests diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 3b4b6d3d4..34fb44d82 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -17,7 +17,7 @@ jobs: name: Clippy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: DeterminateSystems/nix-installer-action@v4 - uses: DeterminateSystems/magic-nix-cache-action@main - uses: taiki-e/install-action@cargo-hack @@ -29,11 +29,11 @@ jobs: name: Formatting runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: DeterminateSystems/nix-installer-action@v4 - uses: DeterminateSystems/magic-nix-cache-action@main - run: nix develop --impure -c cargo fmt --all -- --check - + test: name: Test runs-on: ubuntu-latest @@ -61,7 +61,7 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: DeterminateSystems/nix-installer-action@v4 - uses: DeterminateSystems/magic-nix-cache-action@main - uses: Swatinem/rust-cache@v2 diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 5c5d3d9a6..7cf72ade5 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -54,7 +54,7 @@ jobs: runs-on: ubuntu-latest steps: # Setup - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: dtolnay/rust-toolchain@stable diff --git a/.gitignore b/.gitignore index 62b353681..e21b772ff 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ target-analyzer # Production configuration file /config.toml +# MRF directory +/mrf-modules + # Devenv stuff /result /.devenv diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..1892572dc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "crates/kitsune-wasm-mrf/wit/wasi-logging"] + path = crates/kitsune-wasm-mrf/wit/wasi-logging + url = https://github.com/WebAssembly/wasi-logging.git diff --git a/Cargo.lock b/Cargo.lock index a5aa1cc15..86e819d44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,13 +40,14 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom 0.2.12", "once_cell", + "serde", "version_check", "zerocopy", ] @@ -77,7 +78,7 @@ checksum = "d1eb7c4fcde1858a6796c18a729b661346d38e05a207e2d9028bce822fc20283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -101,6 +102,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -124,9 +131,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -176,6 +183,12 @@ version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + [[package]] name = "arc-swap" version = "1.7.0" @@ -201,7 +214,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -246,7 +259,7 @@ dependencies = [ "askama_derive", "askama_escape", "humansize", - "num-traits 0.2.18", + "num-traits", "percent-encoding", ] @@ -258,7 +271,7 @@ checksum = "a41603f7cdbf5ac4af60760f17253eb6adf6ec5b6f14a7ed830cf687d375f163" dependencies = [ "askama", "axum-core 0.4.3", - "http 1.0.0", + "http 1.1.0", ] [[package]] @@ -274,7 +287,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -310,7 +323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 5.1.0", + "event-listener 5.2.0", "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", @@ -346,11 +359,11 @@ dependencies = [ "bytes", "fnv", "futures-util", - "http 1.0.0", - "indexmap 2.2.3", + "http 1.1.0", + "indexmap 2.2.5", "mime", "multer", - "num-traits 0.2.18", + "num-traits", "once_cell", "pin-project-lite", "regex", @@ -397,7 +410,7 @@ dependencies = [ "proc-macro2", "quote", "strum 0.25.0", - "syn 2.0.50", + "syn 2.0.52", "thiserror", ] @@ -420,11 +433,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53ff1287a1283ea772b4099dd556ba4577d35f069ea4a93f337a525beefcfacf" dependencies = [ "bytes", - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_json", ] +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + [[package]] name = "async-lock" version = "3.3.0" @@ -455,7 +477,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -472,29 +494,29 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] name = "athena" version = "0.0.1-pre.5" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "either", "futures-util", "iso8601-timestamp", - "kitsune-retry-policies", + "just-retry", "multiplex-pool", "once_cell", "rand 0.8.5", "redis", - "retry-policies", "serde", "simd-json", "smol_str", "speedy-uuid", "thiserror", "tokio", + "tokio-util", "tracing", "tracing-subscriber", "typed-builder", @@ -548,7 +570,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -562,7 +584,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "itoa 1.0.10", @@ -591,7 +613,7 @@ dependencies = [ "base64 0.21.7", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "hyper 1.2.0", @@ -627,7 +649,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "mime", "rustversion", @@ -644,7 +666,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "mime", @@ -668,7 +690,7 @@ dependencies = [ "cookie", "futures-util", "headers", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "mime", @@ -691,7 +713,7 @@ dependencies = [ "axum-extra", "base64 0.21.7", "cookie", - "http 1.0.0", + "http 1.1.0", "serde", "serde_json", "tower-layer", @@ -707,7 +729,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -786,7 +808,7 @@ dependencies = [ "async-trait", "futures-channel", "futures-util", - "parking_lot", + "parking_lot 0.12.1", "tokio", ] @@ -806,6 +828,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -835,11 +866,10 @@ checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bitflags_serde_shim" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e678d043c18557c001a9f81be1c04e09339f9c990b8d5e20801e7ca4a1c6f244" +checksum = "df031780c32b0f93cecaf883fa9e351e74679e24380c534aeef94556cfd80ac9" dependencies = [ - "bitflags 1.3.2", "serde", ] @@ -904,7 +934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel 2.2.0", - "async-lock", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", @@ -947,9 +977,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", "serde", @@ -961,7 +991,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488a3c0921ff5891445f88552efc3ff82347d443ad906f5385539d48555f1a76" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "bytecount", "lol_html", "once_cell", @@ -971,9 +1001,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytecheck" @@ -1027,6 +1057,83 @@ dependencies = [ "serde", ] +[[package]] +name = "cap-fs-ext" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e341d15ac1029aadce600be764a1a1edafe40e03cde23285bc1d261b3a4866" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.52.0", +] + +[[package]] +name = "cap-net-ext" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434168fe6533055f0f4204039abe3ff6d7db338ef46872a5fa39e9d5ad5ab7a9" +dependencies = [ + "cap-primitives", + "cap-std", + "rustix", + "smallvec", +] + +[[package]] +name = "cap-primitives" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe16767ed8eee6d3f1f00d6a7576b81c226ab917eb54b96e5f77a5216ef67abb" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "windows-sys 0.52.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20e5695565f0cd7106bc3c7170323597540e772bb73e0be2cd2c662a0f8fa4ca" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "593db20e4c51f62d3284bae7ee718849c3214f93a3b94ea1899ad85ba119d330" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03261630f291f425430a36f38c847828265bc928f517cdd2004c56f4b02f002b" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix", + "winx", +] + [[package]] name = "cargo-platform" version = "0.1.7" @@ -1072,9 +1179,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.86" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -1090,17 +1197,17 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", - "num-traits 0.2.18", + "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.3", + "windows-targets 0.52.4", ] [[package]] @@ -1142,9 +1249,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" dependencies = [ "clap_builder", "clap_derive", @@ -1152,9 +1259,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -1172,7 +1279,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1184,11 +1291,11 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "client-sdk-common" version = "0.1.0" -source = "git+https://github.com/Lantern-chat/client-sdk-rs#7b05d015cb79ab2efe2f4f222ef5910f3b8e2b31" +source = "git+https://github.com/Lantern-chat/client-sdk-rs#27e8019054c8b93bad674b9419c53802f8775842" dependencies = [ + "bitflags_serde_shim", "rkyv", "serde", - "serde_shims", ] [[package]] @@ -1334,6 +1441,115 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9515fcc42b6cb5137f76b84c1a6f819782d0cf12473d145d3bc5cd67eedc8bc2" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad827c6071bfe6d22de1bc331296a29f9ddc506ff926d8415b435ec6a6efce0" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.14.3", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10e6b36237a9ca2ce2fb4cc7741d418a080afa1327402138412ef85d5367bef1" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36bf4bfb86898a94ccfa773a1f86e8a5346b1983ff72059bdd2db4600325251" + +[[package]] +name = "cranelift-control" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cbf36560e7a6bd1409ca91e7b43b2cc7ed8429f343d7605eadf9046e8fac0d0" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a71e11061a75b1184c09bea97c026a88f08b59ade96a7bb1f259d4ea0df2e942" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5d4da63143ee3485c7bcedde0a818727d737d1083484a0ceedb8950c89e495" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457a9832b089e26f5eea70dcf49bed8ec6edafed630ce7c83161f24d46ab8085" + +[[package]] +name = "cranelift-native" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b490d579df1ce365e1ea359e24ed86d82289fa785153327c2f6a69a59a731e4" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.105.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd747ed7f9a461dda9c388415392f6bb95d1a6ef3b7694d17e0817eb74b7798" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools 0.10.5", + "log", + "smallvec", + "wasmparser 0.121.2", + "wasmtime-types", +] + [[package]] name = "crc32fast" version = "1.4.0" @@ -1357,7 +1573,7 @@ dependencies = [ "futures", "is-terminal", "itertools 0.10.5", - "num-traits 0.2.18", + "num-traits", "once_cell", "oorandom", "plotters", @@ -1382,9 +1598,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -1479,7 +1695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1524,7 +1740,7 @@ dependencies = [ "cookie", "futures", "hex-simd", - "http 1.0.0", + "http 1.1.0", "pin-project-lite", "rand 0.8.5", "tower", @@ -1556,7 +1772,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1580,7 +1796,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1591,7 +1807,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1604,7 +1820,7 @@ dependencies = [ "hashbrown 0.14.3", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.9", ] [[package]] @@ -1652,7 +1868,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1662,7 +1878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1695,7 +1911,7 @@ checksum = "2bba3e9872d7c58ce7ef0fcf1844fcc3e23ef2a58377b50df35dd98e42a5726e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1735,7 +1951,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1764,7 +1980,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1808,9 +2024,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ecdsa" @@ -1944,26 +2160,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.50", -] - -[[package]] -name = "enum_primitive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" -dependencies = [ - "num-traits 0.1.43", -] - -[[package]] -name = "enum_primitive_serde_shim" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68631e7cce50bbb4316b625580060c3bfe75e4ef013c6e3552ede0f6071f8f1c" -dependencies = [ - "enum_primitive", - "serde", + "syn 2.0.52", ] [[package]] @@ -2019,9 +2216,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ad6fd685ce13acd6d9541a30f6db6567a7a24c9ffd4ba2955d29e3f22c8b27" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" dependencies = [ "concurrent-queue", "parking", @@ -2044,16 +2241,30 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" dependencies = [ - "event-listener 5.1.0", + "event-listener 5.2.0", "pin-project-lite", ] +[[package]] +name = "example-mrf" +version = "0.0.1-pre.5" +dependencies = [ + "rand 0.8.5", + "wit-bindgen", +] + [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fancy-regex" version = "0.11.0" @@ -2079,6 +2290,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fd-lock" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "ff" version = "0.13.0" @@ -2117,7 +2339,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" dependencies = [ - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -2135,6 +2357,27 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs-set-times" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "fs_extra" version = "1.3.0" @@ -2238,29 +2481,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", -] - -[[package]] -name = "futures-retry-policies" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6deb4087bf085042b95438ac07d98b85976f22549c4ae8dee6b44a1ff094b049" -dependencies = [ - "chrono", - "futures-retry-policies-core", - "retry-policies", - "tokio", - "tracing", -] - -[[package]] -name = "futures-retry-policies-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222776451f4c0381948cc6ab590f674e0216e99738c436e4f09bc9754d7f9933" -dependencies = [ - "pin-project", + "syn 2.0.52", ] [[package]] @@ -2326,7 +2547,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -2378,6 +2599,11 @@ name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "fallible-iterator 0.3.0", + "indexmap 2.2.5", + "stable_deref_trait", +] [[package]] name = "glob" @@ -2420,8 +2646,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 0.2.11", - "indexmap 2.2.3", + "http 0.2.12", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -2439,8 +2665,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 1.0.0", - "indexmap 2.2.3", + "http 1.1.0", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -2449,9 +2675,9 @@ dependencies = [ [[package]] name = "half" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" dependencies = [ "cfg-if", "crunchy", @@ -2459,11 +2685,11 @@ dependencies = [ [[package]] name = "halfbrown" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5681137554ddff44396e5f149892c769d45301dd9aa19c51602a89ee214cb0ec" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.14.3", "serde", ] @@ -2482,7 +2708,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", ] [[package]] @@ -2491,7 +2717,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "allocator-api2", ] @@ -2504,7 +2730,7 @@ dependencies = [ "base64 0.21.7", "bytes", "headers-core", - "http 1.0.0", + "http 1.1.0", "httpdate", "mime", "sha1", @@ -2516,7 +2742,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.0.0", + "http 1.1.0", ] [[package]] @@ -2524,12 +2750,15 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2592,9 +2821,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2603,9 +2832,9 @@ dependencies = [ [[package]] name = "http" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -2619,7 +2848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http 0.2.11", + "http 0.2.12", "pin-project-lite", ] @@ -2630,7 +2859,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.0.0", + "http 1.1.0", ] [[package]] @@ -2641,7 +2870,7 @@ checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" dependencies = [ "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "pin-project-lite", ] @@ -2650,8 +2879,8 @@ dependencies = [ name = "http-compat" version = "0.0.1-pre.5" dependencies = [ - "http 0.2.11", - "http 1.0.0", + "http 0.2.12", + "http 1.1.0", ] [[package]] @@ -2670,7 +2899,7 @@ dependencies = [ "const-oid", "criterion", "derive_builder", - "http 1.0.0", + "http 1.1.0", "httpdate", "itertools 0.12.1", "logos", @@ -2717,7 +2946,7 @@ dependencies = [ "futures-core", "futures-util", "h2 0.3.24", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", @@ -2740,7 +2969,7 @@ dependencies = [ "futures-channel", "futures-util", "h2 0.4.2", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "httparse", "httpdate", @@ -2758,7 +2987,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 1.0.0", + "http 1.1.0", "hyper 1.2.0", "hyper-util", "log", @@ -2791,7 +3020,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "hyper 1.2.0", "pin-project-lite", @@ -2825,6 +3054,12 @@ dependencies = [ "cc", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "ident_case" version = "1.0.1" @@ -2875,9 +3110,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2886,14 +3121,15 @@ dependencies = [ [[package]] name = "insta" -version = "1.35.1" +version = "1.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c985c1bef99cf13c58fade470483d81a2bfe846ebde60ed28cc2dddec2df9e2" +checksum = "0a7c22c4d34ef4788c351e971c52bfdfe7ea2766f8c5466bc175dd46e52ac22e" dependencies = [ "console", "globset", "lazy_static", "linked-hash-map", + "serde", "similar", "walkdir", "yaml-rust", @@ -2908,6 +3144,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-extras" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c301e73fb90e8a29e600a9f402d095765f74310d582916a952f618836a1bd1ed" +dependencies = [ + "io-lifetimes", + "windows-sys 0.52.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "iri-string" version = "0.7.0" @@ -2949,7 +3207,7 @@ dependencies = [ "encoding_rs", "event-listener 2.5.3", "futures-lite 1.13.0", - "http 0.2.11", + "http 0.2.12", "log", "mime", "once_cell", @@ -3002,6 +3260,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -3025,9 +3292,9 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -3044,6 +3311,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "just-retry" +version = "0.0.1-pre.5" +dependencies = [ + "chrono", + "retry-policies", + "tokio", + "tracing", +] + [[package]] name = "kitsune" version = "0.0.1-pre.5" @@ -3070,7 +3347,7 @@ dependencies = [ "fs_extra", "futures-util", "headers", - "http 1.0.0", + "http 1.1.0", "http-body-util", "http-signatures", "iso8601-timestamp", @@ -3101,6 +3378,7 @@ dependencies = [ "kitsune-type", "kitsune-url", "kitsune-util", + "kitsune-wasm-mrf", "kitsune-webfinger", "metrics", "miette", @@ -3119,6 +3397,7 @@ dependencies = [ "serde_urlencoded", "serial_test", "simd-json", + "simdutf8", "speedy-uuid", "strum 0.26.1", "tempfile", @@ -3149,7 +3428,7 @@ dependencies = [ "diesel-async", "futures-util", "headers", - "http 1.0.0", + "http 1.1.0", "http-body-util", "hyper 1.2.0", "iso8601-timestamp", @@ -3167,6 +3446,7 @@ dependencies = [ "kitsune-type", "kitsune-url", "kitsune-util", + "kitsune-wasm-mrf", "kitsune-webfinger", "mime", "mime_guess", @@ -3207,7 +3487,7 @@ name = "kitsune-captcha" version = "0.0.1-pre.5" dependencies = [ "enum_dispatch", - "http 1.0.0", + "http 1.1.0", "kitsune-http-client", "serde", "serde_urlencoded", @@ -3254,7 +3534,7 @@ version = "0.0.1-pre.5" dependencies = [ "async-trait", "const_format", - "http 1.0.0", + "http 1.1.0", "kitsune-db", "kitsune-messaging", "serde", @@ -3281,7 +3561,7 @@ dependencies = [ "kitsune-type", "miette", "num-derive", - "num-traits 0.2.18", + "num-traits", "rustls 0.22.2", "rustls-native-certs 0.7.0", "serde", @@ -3323,7 +3603,7 @@ dependencies = [ "diesel", "diesel-async", "embed-sdk", - "http 1.0.0", + "http 1.1.0", "iso8601-timestamp", "kitsune-db", "kitsune-http-client", @@ -3348,6 +3628,7 @@ dependencies = [ "kitsune-search", "kitsune-service", "kitsune-url", + "kitsune-wasm-mrf", "kitsune-webfinger", "typed-builder", ] @@ -3381,6 +3662,7 @@ dependencies = [ "pin-project", "serde", "simd-json", + "simdutf8", "tokio", "tower", "tower-http", @@ -3392,6 +3674,7 @@ version = "0.0.1-pre.5" dependencies = [ "athena", "clap", + "just-retry", "kitsune-config", "kitsune-core", "kitsune-db", @@ -3400,9 +3683,9 @@ dependencies = [ "kitsune-federation-filter", "kitsune-jobs", "kitsune-observability", - "kitsune-retry-policies", "kitsune-service", "kitsune-url", + "kitsune-wasm-mrf", "miette", "mimalloc", "multiplex-pool", @@ -3478,10 +3761,10 @@ dependencies = [ name = "kitsune-messaging" version = "0.0.1-pre.5" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "derive_more 1.0.0-beta.6", "futures-util", - "kitsune-retry-policies", + "just-retry", "pin-project-lite", "redis", "serde", @@ -3521,7 +3804,7 @@ name = "kitsune-oidc" version = "0.0.1-pre.5" dependencies = [ "enum_dispatch", - "http 1.0.0", + "http 1.1.0", "http-compat", "kitsune-config", "kitsune-http-client", @@ -3538,14 +3821,6 @@ dependencies = [ "url", ] -[[package]] -name = "kitsune-retry-policies" -version = "0.0.1-pre.5" -dependencies = [ - "futures-retry-policies", - "retry-policies", -] - [[package]] name = "kitsune-scss-compiler" version = "0.0.1-pre.5" @@ -3583,7 +3858,7 @@ dependencies = [ name = "kitsune-service" version = "0.0.1-pre.5" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "argon2", "async-stream", "athena", @@ -3595,7 +3870,7 @@ dependencies = [ "futures-util", "garde", "hex-simd", - "http 1.0.0", + "http 1.1.0", "http-body-util", "hyper 1.2.0", "img-parts", @@ -3653,7 +3928,7 @@ dependencies = [ "bytes", "derive_more 1.0.0-beta.6", "futures-util", - "http 1.0.0", + "http 1.1.0", "kitsune-http-client", "rusty-s3", "tempfile", @@ -3669,7 +3944,7 @@ dependencies = [ "diesel", "diesel-async", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body-util", "isolang", "kitsune-config", @@ -3691,6 +3966,7 @@ dependencies = [ "simd-json", "smol_str", "speedy-uuid", + "strum 0.26.1", "utoipa", ] @@ -3717,6 +3993,35 @@ dependencies = [ "tokio", ] +[[package]] +name = "kitsune-wasm-mrf" +version = "0.0.1-pre.5" +dependencies = [ + "async-trait", + "derive_more 1.0.0-beta.6", + "enum_dispatch", + "futures-util", + "kitsune-config", + "kitsune-type", + "miette", + "mrf-manifest", + "multiplex-pool", + "redis", + "simd-json", + "slab", + "sled", + "smol_str", + "tempfile", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", + "typed-builder", + "walkdir", + "wasmtime", + "wasmtime-wasi", +] + [[package]] name = "kitsune-webfinger" version = "0.0.1-pre.5" @@ -3724,7 +4029,7 @@ dependencies = [ "async-trait", "autometrics", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body-util", "hyper 1.2.0", "kitsune-cache", @@ -3739,6 +4044,7 @@ dependencies = [ "tokio", "tower", "tracing", + "urlencoding", ] [[package]] @@ -3756,6 +4062,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "lettre" version = "0.11.4" @@ -3778,7 +4090,7 @@ dependencies = [ "percent-encoding", "quoted_printable", "rustls 0.22.2", - "rustls-pemfile 2.1.0", + "rustls-pemfile 2.1.1", "socket2 0.5.6", "tokio", "tokio-rustls 0.25.0", @@ -3903,22 +4215,22 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linkme" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a78816ac097580aa7fd9d2e9cc7395dda34367c07267a8657516d4ad5e2e3d3" +checksum = "bb2cfee0de9bd869589fb9a015e155946d1be5ff415cb844c2caccc6cc4b5db9" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee9023a564f8bf7fe3da285a50c3e70de0df3e2bf277ff7c4e76d66008ef93b0" +checksum = "adf157a4dc5a29b7b464aa8fe7edeff30076e07e13646a1c3874f58477dc99f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3945,9 +4257,9 @@ checksum = "3a69c0481fc2424cb55795de7da41add33372ea75a94f9b6588ab6a2826dfebc" [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "logos" @@ -3970,7 +4282,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4008,6 +4320,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "markup5ever" version = "0.11.0" @@ -4051,6 +4372,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.6" @@ -4106,20 +4433,38 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77b9e10a211c839210fd7f99954bda26e5f8e26ec686ad68da6a32df7c80e782" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "portable-atomic", ] [[package]] name = "metrics-opentelemetry" version = "0.1.0" -source = "git+https://github.com/aumetra/metrics-opentelemetry.git?rev=b2e2586da553ebd62abdcd3bfd04b5f41a32449a#b2e2586da553ebd62abdcd3bfd04b5f41a32449a" +source = "git+https://github.com/aumetra/metrics-opentelemetry.git?rev=95537b16370e595981e195be52f98ea5983a7a8e#95537b16370e595981e195be52f98ea5983a7a8e" dependencies = [ "metrics", "opentelemetry", @@ -4132,7 +4477,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb791d015f8947acf5a7f62bd28d00f289bb7ea98cfbe3ffec1d061eee12df12" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "itoa 1.0.10", "lockfree-object-pool", "metrics", @@ -4153,7 +4498,7 @@ dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.14.3", - "indexmap 2.2.3", + "indexmap 2.2.5", "metrics", "num_cpus", "ordered-float 4.2.0", @@ -4164,12 +4509,13 @@ dependencies = [ [[package]] name = "miette" -version = "7.1.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baed61d13cc3723ee6dbed730a82bfacedc60a85d81da2d77e9c3e8ebc0b504a" +checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" dependencies = [ "backtrace", "backtrace-ext", + "cfg-if", "miette-derive", "owo-colors", "supports-color", @@ -4183,13 +4529,13 @@ dependencies = [ [[package]] name = "miette-derive" -version = "7.1.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301c3f54f98abc6c212ee722f5e5c62e472a334415840669e356f04850051ec" +checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4279,11 +4625,14 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1911e88d5831f748a4097a43862d129e3c6fca831eecac9b8db6d01d93c9de2" dependencies = [ + "async-lock 2.8.0", + "async-trait", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "futures-util", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "quanta", "rustc_version", "skeptic", @@ -4294,13 +4643,42 @@ dependencies = [ "uuid", ] +[[package]] +name = "mrf-manifest" +version = "0.0.1-pre.5" +dependencies = [ + "ahash 0.8.11", + "insta", + "leb128", + "miette", + "olpc-cjson", + "schemars", + "semver", + "serde", + "serde_json", + "thiserror", + "wasm-encoder 0.201.0", + "wasmparser 0.201.0", +] + +[[package]] +name = "mrf-tool" +version = "0.0.1-pre.5" +dependencies = [ + "clap", + "miette", + "mrf-manifest", + "serde_json", + "wasmparser 0.201.0", +] + [[package]] name = "mrml" -version = "3.0.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "decd52ecd768d703ded059629ed131ba38b012aa1abff3fd226ba89b7f0e734c" +checksum = "11090cceb14c2eaf9d10c1503937b3a53323f322c475f409c1e51a0d86949a8d" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "mrml-macros", "rustc-hash", "thiserror", @@ -4313,7 +4691,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c141a78933cb6151e19b1d3daacfd5d2903bc1caf96f6424b6eccc48ca8ce00f" dependencies = [ - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4326,7 +4704,7 @@ dependencies = [ "mrml-common-macros", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4338,7 +4716,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.0.0", + "http 1.1.0", "httparse", "log", "memchr", @@ -4406,7 +4784,7 @@ checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4420,7 +4798,7 @@ dependencies = [ "libm", "num-integer", "num-iter", - "num-traits 0.2.18", + "num-traits", "rand 0.8.5", "smallvec", "zeroize", @@ -4440,7 +4818,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4449,7 +4827,7 @@ version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4460,7 +4838,7 @@ checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4472,16 +4850,7 @@ dependencies = [ "autocfg", "num-bigint", "num-integer", - "num-traits 0.2.18", -] - -[[package]] -name = "num-traits" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -dependencies = [ - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4522,7 +4891,7 @@ dependencies = [ "base64 0.13.1", "chrono", "getrandom 0.2.12", - "http 0.2.11", + "http 0.2.12", "rand 0.8.5", "serde", "serde_json", @@ -4538,9 +4907,23 @@ version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ + "crc32fast", + "hashbrown 0.14.3", + "indexmap 2.2.5", "memchr", ] +[[package]] +name = "olpc-cjson" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d637c9c15b639ccff597da8f4fa968300651ad2f1e968aefc3b4927a6fb2027a" +dependencies = [ + "serde", + "serde_json", + "unicode-normalization", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -4564,7 +4947,7 @@ dependencies = [ "dyn-clone", "ed25519-dalek", "hmac", - "http 0.2.11", + "http 0.2.12", "itertools 0.10.5", "log", "oauth2", @@ -4615,13 +4998,12 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" +checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.2.3", "js-sys", "once_cell", "pin-project-lite", @@ -4631,25 +5013,25 @@ dependencies = [ [[package]] name = "opentelemetry-http" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f51189ce8be654f9b5f7e70e49967ed894e84a06fc35c6c042e64ac1fc5399e" +checksum = "7cbfa5308166ca861434f0b0913569579b8e587430a3d6bcd7fd671921ec145a" dependencies = [ "async-trait", "bytes", - "http 0.2.11", + "http 0.2.12", "opentelemetry", ] [[package]] name = "opentelemetry-otlp" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" dependencies = [ "async-trait", "futures-core", - "http 0.2.11", + "http 0.2.12", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", @@ -4663,9 +5045,9 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -4675,18 +5057,15 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" -dependencies = [ - "opentelemetry", -] +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" [[package]] name = "opentelemetry_sdk" -version = "0.21.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" +checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" dependencies = [ "async-trait", "crossbeam-channel", @@ -4710,7 +5089,7 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4719,7 +5098,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" dependencies = [ - "num-traits 0.2.18", + "num-traits", ] [[package]] @@ -4814,6 +5193,17 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -4821,7 +5211,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -4832,7 +5236,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "smallvec", "windows-targets 0.48.5", ] @@ -4881,9 +5285,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.7" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", "thiserror", @@ -5010,7 +5414,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5042,22 +5446,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5122,7 +5526,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ - "num-traits 0.2.18", + "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", @@ -5186,7 +5590,7 @@ dependencies = [ "base64 0.21.7", "byteorder", "bytes", - "fallible-iterator", + "fallible-iterator 0.2.0", "hmac", "md-5", "memchr", @@ -5202,7 +5606,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" dependencies = [ "bytes", - "fallible-iterator", + "fallible-iterator 0.2.0", "postgres-protocol", ] @@ -5300,7 +5704,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bitflags 2.4.2", "lazy_static", - "num-traits 0.2.18", + "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", @@ -5310,9 +5714,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.9" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", "prost-derive", @@ -5320,15 +5724,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.52", ] [[package]] @@ -5542,9 +5946,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -5566,7 +5970,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "arc-swap", "async-trait", "bytes", @@ -5590,6 +5994,15 @@ dependencies = [ "url", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -5616,7 +6029,20 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", +] + +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", ] [[package]] @@ -5633,9 +6059,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -5659,9 +6085,9 @@ dependencies = [ [[package]] name = "retry-policies" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17dd00bff1d737c40dbcd47d4375281bf4c17933f9eef0a185fc7bacca23ecbd" +checksum = "493b4243e32d6eedd29f9a398896e35c6943a123b55eec97dcaee98310d25810" dependencies = [ "anyhow", "chrono", @@ -5744,7 +6170,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" dependencies = [ "byteorder", - "num-traits 0.2.18", + "num-traits", "paste", ] @@ -5769,7 +6195,7 @@ dependencies = [ "digest", "num-bigint-dig", "num-integer", - "num-traits 0.2.18", + "num-traits", "pkcs1", "pkcs8", "rand_core 0.6.4", @@ -5792,7 +6218,7 @@ dependencies = [ "num-bigint", "num-integer", "num-rational", - "num-traits 0.2.18", + "num-traits", "tracing", ] @@ -5810,9 +6236,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.2.0" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f" +checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -5821,22 +6247,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.2.0" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16" +checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.50", + "syn 2.0.52", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.2.0" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665" +checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" dependencies = [ "globset", "sha2", @@ -5872,8 +6298,10 @@ checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", + "itoa 1.0.10", "libc", "linux-raw-sys", + "once_cell", "windows-sys 0.52.0", ] @@ -5922,7 +6350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.0", + "rustls-pemfile 2.1.1", "rustls-pki-types", "schannel", "security-framework", @@ -5939,9 +6367,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c333bb734fcdedcea57de1602543590f545f127dc8b533324318fd492c5c70b" +checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" dependencies = [ "base64 0.21.7", "rustls-pki-types", @@ -5949,9 +6377,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" +checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" [[package]] name = "rustls-webpki" @@ -6024,6 +6452,31 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "schemars_derive", + "semver", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scoped-futures" version = "0.1.3" @@ -6042,11 +6495,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scraper" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585480e3719b311b78a573db1c9d9c4c1f8010c2dee4cc59c2efe58ea4dbc3e1" +checksum = "5b80b33679ff7a0ea53d37f3b39de77ea0c75b12c5805ac43ec0c33b3051af1b" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.11", "cssparser 0.31.2", "ego-tree", "html5ever", @@ -6183,7 +6636,18 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -6193,7 +6657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20e1066e1cfa6692a722cf40386a2caec36da5ddc4a2c16df592f0f609677e8c" dependencies = [ "form_urlencoded", - "indexmap 2.2.3", + "indexmap 2.2.5", "itoa 1.0.10", "ryu", "serde", @@ -6229,17 +6693,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_shims" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec8d7b88060168307fe47a70340bfa5f540426d70097246cbbda5687880941" -dependencies = [ - "bitflags_serde_shim", - "enum_primitive_serde_shim", - "std_serde_shims", -] - [[package]] name = "serde_spanned" version = "0.6.5" @@ -6280,7 +6733,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_derive", "serde_json", @@ -6297,7 +6750,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6310,7 +6763,7 @@ dependencies = [ "futures", "lazy_static", "log", - "parking_lot", + "parking_lot 0.12.1", "serial_test_derive", ] @@ -6322,7 +6775,7 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6474,6 +6927,28 @@ dependencies = [ "autocfg", ] +[[package]] +name = "sled" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" +dependencies = [ + "crc32fast", + "crossbeam-epoch", + "crossbeam-utils", + "fs2", + "fxhash", + "libc", + "log", + "parking_lot 0.11.2", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + [[package]] name = "sluice" version = "0.5.5" @@ -6529,6 +7004,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spdx" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ef1a0fa1e39ac22972c8db23ff89aea700ab96aa87114e1fb55937a631a0c9" +dependencies = [ + "smallvec", +] + [[package]] name = "speedy-uuid" version = "0.0.1-pre.5" @@ -6550,7 +7034,7 @@ checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6575,6 +7059,12 @@ dependencies = [ "der", ] +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -6606,15 +7096,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7beae5182595e9a8b683fa98c4317f956c9a2dec3b9716990d20023cc60c766" -[[package]] -name = "std_serde_shims" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdefaf56944a0545315551d6920803b75a8725f36d61793200ee3931dd7a297" -dependencies = [ - "serde", -] - [[package]] name = "string_cache" version = "0.8.7" @@ -6623,7 +7104,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -6693,7 +7174,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6706,7 +7187,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6749,9 +7230,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -6764,6 +7245,22 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-interface" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0682e006dd35771e392a6623ac180999a9a854b1d4a6c12fb2e804941c2b1f58" +dependencies = [ + "bitflags 2.4.2", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix", + "windows-sys 0.52.0", + "winx", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -6776,11 +7273,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand 2.0.1", @@ -6843,7 +7346,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6932,7 +7435,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2 0.5.6", @@ -6958,7 +7461,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6970,11 +7473,11 @@ dependencies = [ "async-trait", "byteorder", "bytes", - "fallible-iterator", + "fallible-iterator 0.2.0", "futures-channel", "futures-util", "log", - "parking_lot", + "parking_lot 0.12.1", "percent-encoding", "phf 0.11.2", "pin-project-lite", @@ -7068,6 +7571,8 @@ dependencies = [ "futures-core", "futures-io", "futures-sink", + "futures-util", + "hashbrown 0.14.3", "pin-project-lite", "tokio", "tracing", @@ -7112,7 +7617,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", @@ -7125,38 +7630,37 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.2", + "winnow 0.6.5", ] [[package]] name = "tonic" -version = "0.9.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" dependencies = [ "async-stream", "async-trait", "axum 0.6.20", "base64 0.21.7", "bytes", - "futures-core", - "futures-util", "h2 0.3.24", - "http 0.2.11", + "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", "prost", - "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.4", + "rustls-native-certs 0.7.0", + "rustls-pemfile 2.1.1", + "rustls-pki-types", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.25.0", "tokio-stream", "tower", "tower-layer", @@ -7195,7 +7699,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "http-range-header", @@ -7221,7 +7725,7 @@ dependencies = [ "bytes", "either", "futures", - "http 1.0.0", + "http 1.1.0", "http-body 1.0.0", "http-body-util", "memchr", @@ -7252,7 +7756,7 @@ version = "0.0.1-pre.5" dependencies = [ "either", "futures", - "http 1.0.0", + "http 1.1.0", "once_cell", "regex", "tower", @@ -7265,7 +7769,7 @@ name = "tower-x-clacks-overhead" version = "0.0.1-pre.5" dependencies = [ "futures", - "http 1.0.0", + "http 1.1.0", "itertools 0.12.1", "pin-project-lite", "tower", @@ -7293,7 +7797,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -7341,9 +7845,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" +checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" dependencies = [ "js-sys", "once_cell", @@ -7390,7 +7894,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.0.0", + "http 1.1.0", "httparse", "log", "rand 0.8.5", @@ -7417,7 +7921,7 @@ checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -7540,7 +8044,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_json", "utoipa-gen", @@ -7556,7 +8060,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.50", + "syn 2.0.52", "uuid", ] @@ -7655,9 +8159,9 @@ checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -7684,11 +8188,17 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -7696,24 +8206,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -7723,9 +8233,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7733,28 +8243,372 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-encoder" +version = "0.41.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c7d2731df60006819b013f64ccc2019691deccf6e11a1804bc850cd6748f1a" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-metadata" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fd83062c17b9f4985d438603cde0a5e8c5c8198201a6937f778b607924c7da2" +dependencies = [ + "anyhow", + "indexmap 2.2.5", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.201.0", + "wasmparser 0.201.0", +] + +[[package]] +name = "wasmparser" +version = "0.121.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" +dependencies = [ + "bitflags 2.4.2", + "indexmap 2.2.5", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708" +dependencies = [ + "bitflags 2.4.2", + "indexmap 2.2.5", + "semver", +] + +[[package]] +name = "wasmprinter" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "60e73986a6b7fdfedb7c5bf9e7eb71135486507c8fbc4c0c42cffcb6532988b7" +dependencies = [ + "anyhow", + "wasmparser 0.121.2", +] + +[[package]] +name = "wasmtime" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c843b8bc4dd4f3a76173ba93405c71111d570af0d90ea5f6299c705d0c2add2" +dependencies = [ + "addr2line", + "anyhow", + "async-trait", + "bincode", + "bumpalo", + "cfg-if", + "encoding_rs", + "gimli", + "indexmap 2.2.5", + "libc", + "log", + "object", + "once_cell", + "paste", + "rayon", + "rustix", + "serde", + "serde_derive", + "serde_json", + "target-lexicon", + "wasmparser 0.121.2", + "wasmtime-component-macro", + "wasmtime-component-util", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "wasmtime-winch", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b9d329c718b3a18412a6a017c912b539baa8fe1210d21b651f6b4dbafed743" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-component-macro" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d55ddfd02898885c39638eae9631cd430c83a368f5996ed0f7bfb181d02157" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.52", + "wasmtime-component-util", + "wasmtime-wit-bindgen", + "wit-parser 0.13.2", +] + +[[package]] +name = "wasmtime-component-util" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d69c430cddc70ec42159506962c66983ce0192ebde4eb125b7aabc49cff88" + +[[package]] +name = "wasmtime-cranelift" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ca62f519225492bd555d0ec85a2dacb0c10315db3418c8b9aeb3824bf54a24" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object", + "target-lexicon", + "thiserror", + "wasmparser 0.121.2", + "wasmtime-cranelift-shared", + "wasmtime-environ", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd5f2071f42e61490bf7cb95b9acdbe6a29dd577a398019304a960585f28b844" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-control", + "cranelift-native", + "gimli", + "object", + "target-lexicon", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82bf1a47f384610da19f58b0fd392ca6a3b720974315c08afb0392c0f3951fed" +dependencies = [ + "anyhow", + "bincode", + "cranelift-entity", + "gimli", + "indexmap 2.2.5", + "log", + "object", + "serde", + "serde_derive", + "target-lexicon", + "thiserror", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", + "wasmprinter", + "wasmtime-component-util", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-fiber" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e31aecada2831e067ebfe93faa3001cc153d506f8af40bbea58aa1d20fe4820" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "rustix", + "wasmtime-asm-macros", + "wasmtime-versioned-export-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4121cb29dda08139b2824a734dd095d83ce843f2d613a84eb580b9cfc17ac" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e517f2b996bb3b0e34a82a2bce194f850d9bcfc25c08328ef5fb71b071066b8" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "encoding_rs", + "indexmap 2.2.5", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "psm", + "rustix", + "sptr", + "wasm-encoder 0.41.2", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-versioned-export-macros", + "wasmtime-wmemcheck", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-types" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a327d7a0ef57bd52a507d28b4561a74126c7a8535a2fc6f2025716bc6a52e8" +dependencies = [ + "cranelift-entity", + "serde", + "serde_derive", + "thiserror", + "wasmparser 0.121.2", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ef32eea9fc7035a55159a679d1e89b43ece5ae45d24eed4808e6a92c99a0da4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + +[[package]] +name = "wasmtime-wasi" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d04d2fb2257245aa05ff799ded40520ae4d8cd31b0d14972afac89061f12fe12" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.4.2", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "futures", + "io-extras", + "io-lifetimes", + "log", + "once_cell", + "rustix", + "system-interface", + "thiserror", + "tokio", + "tracing", + "url", + "wasmtime", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasmtime-winch" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3378c0e808a744b5d4df2a9a9d2746a53b151811926731f04fc401707f7d54" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "object", + "target-lexicon", + "wasmparser 0.121.2", + "wasmtime-cranelift-shared", + "wasmtime-environ", + "winch-codegen", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca677c36869e45602617b25a9968ec0d895ad9a0aee3756d9dee1ddd89456f91" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.2.5", + "wit-parser 0.13.2", +] + +[[package]] +name = "wasmtime-wmemcheck" +version = "18.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4cbfb052d66f03603a9b77f18171ea245c7805714caad370a549a6344bf86b" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -7762,9 +8616,9 @@ dependencies = [ [[package]] name = "web-time" -version = "0.2.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -7797,11 +8651,12 @@ checksum = "213a57fbc76ff74e9dec77cf62e47fa4e4e01dec898dc09cc6873d992eed2ef9" [[package]] name = "whoami" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" dependencies = [ - "wasm-bindgen", + "redox_syscall 0.4.1", + "wasite", "web-sys", ] @@ -7836,13 +8691,29 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winch-codegen" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197ed4a2ebf612f0624ddda10de71f8cd2d3a4ecf8ffac0586a264599708d63" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec", + "target-lexicon", + "wasmparser 0.121.2", + "wasmtime-environ", +] + [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.3", + "windows-targets 0.52.4", ] [[package]] @@ -7860,7 +8731,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.3", + "windows-targets 0.52.4", ] [[package]] @@ -7880,17 +8751,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.3", - "windows_aarch64_msvc 0.52.3", - "windows_i686_gnu 0.52.3", - "windows_i686_msvc 0.52.3", - "windows_x86_64_gnu 0.52.3", - "windows_x86_64_gnullvm 0.52.3", - "windows_x86_64_msvc 0.52.3", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -7901,9 +8772,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -7913,9 +8784,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -7925,9 +8796,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -7937,9 +8808,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -7949,9 +8820,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -7961,9 +8832,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -7973,9 +8844,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" @@ -7988,13 +8859,132 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] +[[package]] +name = "winx" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +dependencies = [ + "bitflags 2.4.2", + "windows-sys 0.52.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbdedb8dd38c89c2cfa71e7450515f1c17f94cc2853881652d005b10f3f2559c" +dependencies = [ + "bitflags 2.4.2", + "wit-bindgen-rt", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebcbf07363368a9e6e8b89c18bff176c4f35ed2dd2f2f5f9c473bb56813369b" +dependencies = [ + "anyhow", + "wit-parser 0.201.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "026d24a27f6712541fa534f2954bd9e0eb66172f033c2157c0f31d106255c497" + +[[package]] +name = "wit-bindgen-rust" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a4d36bf13b5ef534599d24dae792b1ae2b40fe1248c2754fd3f7343fb2ca70" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.2.5", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4bf1b15b5227d1ca9ba7fc6a7850c72f9df0fbac3c46a0855763cc454ff11a" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.52", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421c0c848a0660a8c22e2fd217929a0191f14476b68962afd2af89fd22e39825" +dependencies = [ + "anyhow", + "bitflags 2.4.2", + "indexmap 2.2.5", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.201.0", + "wasm-metadata", + "wasmparser 0.201.0", + "wit-parser 0.201.0", +] + +[[package]] +name = "wit-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "316b36a9f0005f5aa4b03c39bc3728d045df136f8c13a73b7db4510dec725e08" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.2.5", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", +] + +[[package]] +name = "wit-parser" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196d3ecfc4b759a8573bf86a9b3f8996b304b3732e4c7de81655f875f6efdca6" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.2.5", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.201.0", +] + [[package]] name = "wyz" version = "0.5.1" @@ -8082,7 +9072,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -8102,7 +9092,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index af84f3b9f..cdf492b5d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,8 @@ members = [ "crates/kitsune-type", "crates/kitsune-url", "crates/kitsune-util", + "crates/kitsune-wasm-mrf", + "crates/kitsune-wasm-mrf/example-mrf", "crates/kitsune-webfinger", "kitsune", "kitsune-cli", @@ -49,8 +51,10 @@ members = [ "lib/cursiv", "lib/http-compat", "lib/http-signatures", - "lib/kitsune-retry-policies", + "lib/just-retry", "lib/masto-id-convert", + "lib/mrf-manifest", + "lib/mrf-tool", "lib/multiplex-pool", "lib/post-process", "lib/speedy-uuid", @@ -81,7 +85,7 @@ rust_2018_idioms = "forbid" unsafe_code = "deny" [workspace.package] -authors = ["Kitsune developers"] +authors = ["The Kitsune authors"] edition = "2021" version = "0.0.1-pre.5" license = "AGPL-3.0-or-later" @@ -91,7 +95,7 @@ license = "AGPL-3.0-or-later" # Whether to pass --all-features to cargo build all-features = true # The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax) -cargo-dist-version = "0.7.2" +cargo-dist-version = "0.11.1" # CI backends to support ci = ["github"] # The installers to generate for each app diff --git a/_typos.toml b/_typos.toml index 58db2395b..da646b9d2 100644 --- a/_typos.toml +++ b/_typos.toml @@ -2,6 +2,12 @@ extend-exclude = [ "crates/kitsune-language/examples/basic.rs", "crates/kitsune-language/src/map.rs", + + # Exclude all WIT dependencies since we don't really have control over that + "crates/kitsune-wasm-mrf/wit/deps/*", + "crates/kitsune-wasm-mrf/wit/wasi-keyvalue", + "crates/kitsune-wasm-mrf/wit/wasi-logging", + "lib/http-signatures/tests/data.rs", "lib/post-process/tests/input/*", ] diff --git a/config.example.toml b/config.example.toml index 61d06e9f2..10f2be03c 100644 --- a/config.example.toml +++ b/config.example.toml @@ -136,6 +136,9 @@ default-language = "en" [messaging] type = "in-process" +[mrf] +module-dir = "mrf-modules" + # OIDC configuration # # Kitsune can use an OIDC service to manage logins diff --git a/crates/kitsune-activitypub/Cargo.toml b/crates/kitsune-activitypub/Cargo.toml index e7c275bba..fbb8a4a7a 100644 --- a/crates/kitsune-activitypub/Cargo.toml +++ b/crates/kitsune-activitypub/Cargo.toml @@ -13,7 +13,7 @@ diesel = "2.1.4" diesel-async = "0.4.1" futures-util = "0.3.30" headers = "0.4.0" -http = "1.0.0" +http = "1.1.0" iso8601-timestamp = "0.2.17" kitsune-cache = { path = "../kitsune-cache" } kitsune-config = { path = "../kitsune-config" } @@ -28,6 +28,7 @@ kitsune-service = { path = "../kitsune-service" } kitsune-type = { path = "../kitsune-type" } kitsune-url = { path = "../kitsune-url" } kitsune-util = { path = "../kitsune-util" } +kitsune-wasm-mrf = { path = "../kitsune-wasm-mrf" } mime = "0.3.17" mime_guess = { version = "2.0.4", default-features = false } rsa = "0.9.6" diff --git a/crates/kitsune-activitypub/src/deliverer/core.rs b/crates/kitsune-activitypub/src/deliverer/core.rs index 9c01b7b45..e2c56ad33 100644 --- a/crates/kitsune-activitypub/src/deliverer/core.rs +++ b/crates/kitsune-activitypub/src/deliverer/core.rs @@ -7,6 +7,7 @@ use kitsune_db::model::{account::Account, user::User}; use kitsune_federation_filter::FederationFilter; use kitsune_http_client::Client; use kitsune_type::ap::Activity; +use kitsune_wasm_mrf::{MrfService, Outcome}; use sha2::{Digest, Sha256}; use std::pin::pin; use typed_builder::TypedBuilder; @@ -20,6 +21,7 @@ pub struct Deliverer { #[builder(default = Client::builder().user_agent(USER_AGENT).unwrap().build())] client: Client, federation_filter: FederationFilter, + mrf_service: MrfService, } impl Deliverer { @@ -40,7 +42,11 @@ impl Deliverer { return Ok(()); } - let body = simd_json::to_string(&activity)?; + let body = match self.mrf_service.handle_outgoing(activity).await? { + Outcome::Accept(body) => body, + Outcome::Reject => todo!(), + }; + let body_digest = base64_simd::STANDARD.encode_to_string(Sha256::digest(body.as_bytes())); let digest_header = format!("sha-256={body_digest}"); diff --git a/crates/kitsune-activitypub/src/error.rs b/crates/kitsune-activitypub/src/error.rs index 19dd52242..c03f70c2c 100644 --- a/crates/kitsune-activitypub/src/error.rs +++ b/crates/kitsune-activitypub/src/error.rs @@ -59,6 +59,9 @@ pub enum Error { #[error("Missing host")] MissingHost, + #[error(transparent)] + Mrf(#[from] kitsune_wasm_mrf::Error), + #[error("Not found")] NotFound, diff --git a/crates/kitsune-cache/Cargo.toml b/crates/kitsune-cache/Cargo.toml index b110cf45d..12afa6cba 100644 --- a/crates/kitsune-cache/Cargo.toml +++ b/crates/kitsune-cache/Cargo.toml @@ -7,7 +7,7 @@ license.workspace = true [dependencies] enum_dispatch = "0.3.12" -moka = { version = "0.12.5", features = ["sync"] } +moka = { version = "0.12.5", features = ["future"] } multiplex-pool = { path = "../../lib/multiplex-pool" } redis = { version = "0.24.0", default-features = false, features = [ "connection-manager", diff --git a/crates/kitsune-cache/src/in_memory.rs b/crates/kitsune-cache/src/in_memory.rs index b913fc9d4..55cde709c 100644 --- a/crates/kitsune-cache/src/in_memory.rs +++ b/crates/kitsune-cache/src/in_memory.rs @@ -1,5 +1,5 @@ use crate::{CacheBackend, CacheResult}; -use moka::sync::Cache; +use moka::future::Cache; use std::{fmt::Display, marker::PhantomData, time::Duration}; pub struct InMemory @@ -35,16 +35,16 @@ where V: Clone + Send + Sync + 'static, { async fn delete(&self, key: &K) -> CacheResult<()> { - self.inner.remove(&key.to_string()); + self.inner.remove(&key.to_string()).await; Ok(()) } async fn get(&self, key: &K) -> CacheResult> { - Ok(self.inner.get(&key.to_string())) + Ok(self.inner.get(&key.to_string()).await) } async fn set(&self, key: &K, value: &V) -> CacheResult<()> { - self.inner.insert(key.to_string(), value.clone()); + self.inner.insert(key.to_string(), value.clone()).await; Ok(()) } } @@ -69,7 +69,7 @@ mod test { cache.set(&"hello", &"world").await.unwrap(); cache.set(&"another", &"pair").await.unwrap(); - cache.inner.run_pending_tasks(); + cache.inner.run_pending_tasks().await; assert_eq!(cache.inner.entry_count(), 1); } diff --git a/crates/kitsune-captcha/Cargo.toml b/crates/kitsune-captcha/Cargo.toml index 0d303b0fb..a5b720a0c 100644 --- a/crates/kitsune-captcha/Cargo.toml +++ b/crates/kitsune-captcha/Cargo.toml @@ -7,7 +7,7 @@ license.workspace = true [dependencies] enum_dispatch = "0.3.12" -http = "1.0.0" +http = "1.1.0" kitsune-http-client = { path = "../kitsune-http-client" } serde = { version = "1.0.197", features = ["derive"] } serde_urlencoded = "0.7.1" diff --git a/crates/kitsune-config/Cargo.toml b/crates/kitsune-config/Cargo.toml index 54512a2cb..42ecc0a25 100644 --- a/crates/kitsune-config/Cargo.toml +++ b/crates/kitsune-config/Cargo.toml @@ -7,7 +7,7 @@ license.workspace = true [dependencies] isolang = { version = "2.4.0", features = ["serde"] } -miette = "7.1.0" +miette = "7.2.0" serde = { version = "1.0.197", features = ["derive"] } smol_str = { version = "0.2.1", features = ["serde"] } tokio = { version = "1.36.0", features = ["fs"] } diff --git a/crates/kitsune-config/src/lib.rs b/crates/kitsune-config/src/lib.rs index 99ecd57c0..1b6100026 100644 --- a/crates/kitsune-config/src/lib.rs +++ b/crates/kitsune-config/src/lib.rs @@ -7,6 +7,7 @@ pub mod instance; pub mod job_queue; pub mod language_detection; pub mod messaging; +pub mod mrf; pub mod oidc; pub mod open_telemetry; pub mod search; @@ -31,6 +32,7 @@ pub struct Configuration { pub job_queue: job_queue::Configuration, pub language_detection: language_detection::Configuration, pub messaging: messaging::Configuration, + pub mrf: mrf::Configuration, pub opentelemetry: Option, pub server: server::Configuration, pub search: search::Configuration, diff --git a/crates/kitsune-config/src/mrf.rs b/crates/kitsune-config/src/mrf.rs new file mode 100644 index 000000000..be7188f74 --- /dev/null +++ b/crates/kitsune-config/src/mrf.rs @@ -0,0 +1,31 @@ +use serde::{Deserialize, Serialize}; +use smol_str::SmolStr; +use std::{collections::HashMap, num::NonZeroUsize}; + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct FsKvStorage { + pub path: SmolStr, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct RedisKvStorage { + pub url: SmolStr, + pub pool_size: NonZeroUsize, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case", tag = "type")] +pub enum KvStorage { + Fs(FsKvStorage), + Redis(RedisKvStorage), +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct Configuration { + pub module_dir: SmolStr, + pub module_config: HashMap, + pub storage: KvStorage, +} diff --git a/crates/kitsune-core/Cargo.toml b/crates/kitsune-core/Cargo.toml index f9ac5cfe9..173fb4e35 100644 --- a/crates/kitsune-core/Cargo.toml +++ b/crates/kitsune-core/Cargo.toml @@ -9,7 +9,7 @@ build = "build.rs" [dependencies] async-trait = "0.1.77" const_format = "0.2.32" -http = "1.0.0" +http = "1.1.0" kitsune-db = { path = "../kitsune-db" } kitsune-messaging = { path = "../kitsune-messaging" } serde = { version = "1.0.197", features = ["derive"] } diff --git a/crates/kitsune-db/Cargo.toml b/crates/kitsune-db/Cargo.toml index 8f82372d0..9ff9a3660 100644 --- a/crates/kitsune-db/Cargo.toml +++ b/crates/kitsune-db/Cargo.toml @@ -24,10 +24,10 @@ iso8601-timestamp = { version = "0.2.17", features = ["diesel-pg"] } kitsune-config = { path = "../kitsune-config" } kitsune-language = { path = "../kitsune-language" } kitsune-type = { path = "../kitsune-type" } -miette = "7.1.0" +miette = "7.2.0" num-derive = "0.4.2" num-traits = "0.2.18" -rustls = "0.22.2" +rustls = "=0.22.2" rustls-native-certs = "0.7.0" serde = { version = "1.0.197", features = ["derive"] } simd-json = "0.13.8" diff --git a/crates/kitsune-email/Cargo.toml b/crates/kitsune-email/Cargo.toml index 3a61db18e..09ffb0c16 100644 --- a/crates/kitsune-email/Cargo.toml +++ b/crates/kitsune-email/Cargo.toml @@ -24,8 +24,8 @@ lettre = { version = "0.11.4", default-features = false, features = [ "tokio1-rustls-tls", "tracing", ] } -miette = "7.1.0" -mrml = { version = "3.0.1", default-features = false, features = [ +miette = "7.2.0" +mrml = { version = "3.0.4", default-features = false, features = [ "orderedmap", "parse", "render", diff --git a/crates/kitsune-embed/Cargo.toml b/crates/kitsune-embed/Cargo.toml index 5b3d5caa8..ef99bc8bf 100644 --- a/crates/kitsune-embed/Cargo.toml +++ b/crates/kitsune-embed/Cargo.toml @@ -9,12 +9,12 @@ license.workspace = true diesel = "2.1.4" diesel-async = "0.4.1" embed-sdk = { git = "https://github.com/Lantern-chat/embed-service.git", rev = "0d43394bb2514f57edc402a83f69b171705c3650" } -http = "1.0.0" +http = "1.1.0" iso8601-timestamp = "0.2.17" kitsune-db = { path = "../kitsune-db" } kitsune-http-client = { path = "../kitsune-http-client" } once_cell = "1.19.0" -scraper = { version = "0.18.1", default-features = false } +scraper = { version = "0.19.0", default-features = false } smol_str = "0.2.1" thiserror = "1.0.57" typed-builder = "0.18.1" diff --git a/crates/kitsune-federation-filter/Cargo.toml b/crates/kitsune-federation-filter/Cargo.toml index 57d3b753d..18eaf5f1b 100644 --- a/crates/kitsune-federation-filter/Cargo.toml +++ b/crates/kitsune-federation-filter/Cargo.toml @@ -9,7 +9,7 @@ license.workspace = true globset = "0.4.14" kitsune-config = { path = "../kitsune-config" } kitsune-type = { path = "../kitsune-type" } -miette = "7.1.0" +miette = "7.2.0" thiserror = "1.0.57" url = "2.5.0" diff --git a/crates/kitsune-federation/Cargo.toml b/crates/kitsune-federation/Cargo.toml index b7bc25a96..2340ddb47 100644 --- a/crates/kitsune-federation/Cargo.toml +++ b/crates/kitsune-federation/Cargo.toml @@ -16,6 +16,7 @@ kitsune-federation-filter = { path = "../kitsune-federation-filter" } kitsune-search = { path = "../kitsune-search" } kitsune-service = { path = "../kitsune-service" } kitsune-url = { path = "../kitsune-url" } +kitsune-wasm-mrf = { path = "../kitsune-wasm-mrf" } kitsune-webfinger = { path = "../kitsune-webfinger" } typed-builder = "0.18.1" diff --git a/crates/kitsune-federation/src/activitypub.rs b/crates/kitsune-federation/src/activitypub.rs index 6132c93dc..9d6974742 100644 --- a/crates/kitsune-federation/src/activitypub.rs +++ b/crates/kitsune-federation/src/activitypub.rs @@ -13,6 +13,7 @@ use kitsune_federation_filter::FederationFilter; use kitsune_search::AnySearchBackend; use kitsune_service::attachment::AttachmentService; use kitsune_url::UrlService; +use kitsune_wasm_mrf::MrfService; use kitsune_webfinger::Webfinger; use std::sync::Arc; use typed_builder::TypedBuilder; @@ -22,6 +23,7 @@ pub struct PrepareDeliverer { attachment_service: AttachmentService, db_pool: PgPool, federation_filter: FederationFilter, + mrf_service: MrfService, url_service: UrlService, } @@ -41,6 +43,7 @@ pub struct PrepareFetcher { pub(crate) fn prepare_deliverer(prepare: PrepareDeliverer) -> Arc { let core_deliverer = kitsune_activitypub::CoreDeliverer::builder() .federation_filter(prepare.federation_filter) + .mrf_service(prepare.mrf_service) .build(); let inbox_resolver = InboxResolver::new(prepare.db_pool.clone()); diff --git a/crates/kitsune-http-client/Cargo.toml b/crates/kitsune-http-client/Cargo.toml index 70cceb2ff..dbe03be24 100644 --- a/crates/kitsune-http-client/Cargo.toml +++ b/crates/kitsune-http-client/Cargo.toml @@ -23,8 +23,9 @@ hyper-util = { version = "0.1.3", features = [ ] } hyper-rustls = { version = "0.26.0", features = ["http2"] } kitsune-type = { path = "../kitsune-type" } -pin-project = "1.1.4" +pin-project = "1.1.5" serde = "1.0.197" +simdutf8 = { version = "0.1.4", features = ["aarch64_neon"] } simd-json = "0.13.8" tower = { version = "0.4.13", features = ["util"] } tower-http = { version = "0.5.2", features = [ diff --git a/crates/kitsune-http-client/src/body.rs b/crates/kitsune-http-client/src/body.rs index 58e32f993..6487fcc93 100644 --- a/crates/kitsune-http-client/src/body.rs +++ b/crates/kitsune-http-client/src/body.rs @@ -4,6 +4,7 @@ use http_body::Frame; use http_body_util::StreamBody; use pin_project::pin_project; use std::{ + borrow::Cow, fmt::{self, Debug}, pin::Pin, task::{self, Poll}, @@ -69,6 +70,12 @@ impl From for Body { } } +impl From> for Body { + fn from(value: Cow<'_, str>) -> Self { + Self::data(value.into_owned()) + } +} + impl From for Body { fn from(value: String) -> Self { Self::data(value) diff --git a/crates/kitsune-http-client/src/lib.rs b/crates/kitsune-http-client/src/lib.rs index 8c410bbeb..d1985ae18 100644 --- a/crates/kitsune-http-client/src/lib.rs +++ b/crates/kitsune-http-client/src/lib.rs @@ -337,7 +337,11 @@ impl Response { /// - The body isn't a UTF-8 encoded string pub async fn text(self) -> Result { let body = self.bytes().await?; - String::from_utf8(body.to_vec()).map_err(Error::new) + // `.to_owned()` as the same performance overhead as calling `.to_vec()` on the `Bytes` body. + // Therefore we can circumvent unsafe usage here by simply calling `.to_owned()` on the string slice at no extra cost. + simdutf8::basic::from_utf8(&body) + .map(ToOwned::to_owned) + .map_err(Error::new) } /// Read the body and deserialise it as JSON into a `serde` enabled structure diff --git a/crates/kitsune-jobs/Cargo.toml b/crates/kitsune-jobs/Cargo.toml index 1c5da3cb9..07f1f09ce 100644 --- a/crates/kitsune-jobs/Cargo.toml +++ b/crates/kitsune-jobs/Cargo.toml @@ -14,7 +14,7 @@ futures-util = "0.3.30" kitsune-core = { path = "../kitsune-core" } kitsune-db = { path = "../kitsune-db" } kitsune-email = { path = "../kitsune-email" } -miette = "7.1.0" +miette = "7.2.0" scoped-futures = "0.1.3" serde = { version = "1.0.197", features = ["derive"] } speedy-uuid = { path = "../../lib/speedy-uuid" } diff --git a/crates/kitsune-messaging/Cargo.toml b/crates/kitsune-messaging/Cargo.toml index 0babcc497..15654cdb2 100644 --- a/crates/kitsune-messaging/Cargo.toml +++ b/crates/kitsune-messaging/Cargo.toml @@ -6,10 +6,10 @@ edition.workspace = true license.workspace = true [dependencies] -ahash = "0.8.9" +ahash = "0.8.11" derive_more = { version = "1.0.0-beta.6", features = ["from"] } futures-util = "0.3.30" -kitsune-retry-policies = { path = "../../lib/kitsune-retry-policies" } +just-retry = { path = "../../lib/just-retry" } pin-project-lite = "0.2.13" redis = { version = "0.24.0", features = ["connection-manager", "tokio-comp"] } serde = "1.0.197" diff --git a/crates/kitsune-messaging/src/redis.rs b/crates/kitsune-messaging/src/redis.rs index 0cdb626df..c5bd5f93d 100644 --- a/crates/kitsune-messaging/src/redis.rs +++ b/crates/kitsune-messaging/src/redis.rs @@ -5,7 +5,7 @@ use crate::{util::TransparentDebug, MessagingBackend, Result}; use ahash::AHashMap; use futures_util::{future, Stream, StreamExt, TryStreamExt}; -use kitsune_retry_policies::{futures_backoff_policy, RetryFutureExt}; +use just_retry::RetryExt; use redis::{ aio::{ConnectionManager, PubSub}, AsyncCommands, RedisError, @@ -87,7 +87,7 @@ impl MultiplexActor { .map(|conn| TransparentDebug(conn.into_pubsub())) } }) - .retry(futures_backoff_policy()) + .retry(just_retry::backoff_policy()) .await .map(|conn| conn.0) .unwrap(); diff --git a/crates/kitsune-observability/Cargo.toml b/crates/kitsune-observability/Cargo.toml index 0dc808aca..38020d62f 100644 --- a/crates/kitsune-observability/Cargo.toml +++ b/crates/kitsune-observability/Cargo.toml @@ -13,15 +13,15 @@ hyper = { version = "1.2.0", default-features = false } kitsune-config = { path = "../kitsune-config" } kitsune-http-client = { path = "../kitsune-http-client" } metrics = "=0.22.0" -metrics-opentelemetry = { git = "https://github.com/aumetra/metrics-opentelemetry.git", rev = "b2e2586da553ebd62abdcd3bfd04b5f41a32449a" } +metrics-opentelemetry = { git = "https://github.com/aumetra/metrics-opentelemetry.git", rev = "95537b16370e595981e195be52f98ea5983a7a8e" } metrics-tracing-context = "0.15.0" metrics-util = "0.16.2" -miette = "7.1.0" -opentelemetry = { version = "0.21.0", default-features = false, features = [ +miette = "7.2.0" +opentelemetry = { version = "0.22.0", default-features = false, features = [ "trace", ] } -opentelemetry-http = "0.10.0" -opentelemetry-otlp = { version = "0.14.0", default-features = false, features = [ +opentelemetry-http = "0.11.0" +opentelemetry-otlp = { version = "0.15.0", default-features = false, features = [ "grpc-tonic", "http-proto", "metrics", @@ -29,12 +29,12 @@ opentelemetry-otlp = { version = "0.14.0", default-features = false, features = "tls-roots", "trace", ] } -opentelemetry_sdk = { version = "0.21.2", default-features = false, features = [ +opentelemetry_sdk = { version = "0.22.1", default-features = false, features = [ "rt-tokio", ] } tracing = "0.1.40" tracing-error = "0.2.0" -tracing-opentelemetry = { version = "0.22.0", default-features = false } +tracing-opentelemetry = { version = "0.23.0", default-features = false } tracing-subscriber = "0.3.18" [lints] diff --git a/crates/kitsune-oidc/Cargo.toml b/crates/kitsune-oidc/Cargo.toml index 41c0ded6d..ad846209f 100644 --- a/crates/kitsune-oidc/Cargo.toml +++ b/crates/kitsune-oidc/Cargo.toml @@ -7,12 +7,12 @@ license.workspace = true [dependencies] enum_dispatch = "0.3.12" -http = "1.0.0" +http = "1.1.0" http-compat = { path = "../../lib/http-compat" } kitsune-config = { path = "../kitsune-config" } kitsune-http-client = { path = "../kitsune-http-client" } -miette = "7.1.0" -moka = { version = "0.12.5", features = ["sync"] } +miette = "7.2.0" +moka = { version = "0.12.5", features = ["future"] } multiplex-pool = { path = "../../lib/multiplex-pool" } once_cell = "1.19.0" openidconnect = { version = "3.5.0", default-features = false, features = [ diff --git a/crates/kitsune-oidc/src/state/store/in_memory.rs b/crates/kitsune-oidc/src/state/store/in_memory.rs index 4e7a26a79..18731c94d 100644 --- a/crates/kitsune-oidc/src/state/store/in_memory.rs +++ b/crates/kitsune-oidc/src/state/store/in_memory.rs @@ -3,7 +3,7 @@ use crate::{ error::{Error, Result}, state::LoginState, }; -use moka::sync::Cache; +use moka::future::Cache; #[derive(Clone)] pub struct InMemory { @@ -20,11 +20,11 @@ impl InMemory { impl Store for InMemory { async fn get_and_remove(&self, key: &str) -> Result { - self.inner.remove(key).ok_or(Error::MissingLoginState) + self.inner.remove(key).await.ok_or(Error::MissingLoginState) } async fn set(&self, key: &str, value: LoginState) -> Result<()> { - self.inner.insert(key.to_string(), value); + self.inner.insert(key.to_string(), value).await; Ok(()) } } diff --git a/crates/kitsune-search/Cargo.toml b/crates/kitsune-search/Cargo.toml index 26b11a6f3..518d447f5 100644 --- a/crates/kitsune-search/Cargo.toml +++ b/crates/kitsune-search/Cargo.toml @@ -17,7 +17,7 @@ futures-util = "0.3.30" kitsune-config = { path = "../kitsune-config" } kitsune-db = { path = "../kitsune-db" } kitsune-language = { path = "../kitsune-language" } -miette = "7.1.0" +miette = "7.2.0" serde = { version = "1.0.197", features = ["derive"] } speedy-uuid = { path = "../../lib/speedy-uuid" } strum = { version = "0.26.1", features = ["derive"] } diff --git a/crates/kitsune-service/Cargo.toml b/crates/kitsune-service/Cargo.toml index 7a4eae62a..fac3b5aef 100644 --- a/crates/kitsune-service/Cargo.toml +++ b/crates/kitsune-service/Cargo.toml @@ -6,7 +6,7 @@ version.workspace = true license.workspace = true [dependencies] -ahash = "0.8.9" +ahash = "0.8.11" argon2 = "0.5.3" async-stream = "0.3.5" athena = { path = "../../lib/athena" } @@ -23,7 +23,7 @@ garde = { version = "0.18.0", default-features = false, features = [ "regex", "serde", ] } -http = "1.0.0" +http = "1.1.0" img-parts = "0.3.0" iso8601-timestamp = "0.2.17" kitsune-cache = { path = "../kitsune-cache" } @@ -41,7 +41,7 @@ kitsune-search = { path = "../kitsune-search" } kitsune-storage = { path = "../kitsune-storage" } kitsune-url = { path = "../kitsune-url" } kitsune-util = { path = "../kitsune-util" } -miette = "7.1.0" +miette = "7.2.0" mime = "0.3.17" multiplex-pool = { path = "../../lib/multiplex-pool" } password-hash = { version = "0.5.0", features = ["std"] } @@ -81,7 +81,7 @@ kitsune-test = { path = "../kitsune-test" } kitsune-webfinger = { path = "../kitsune-webfinger" } pretty_assertions = "1.4.0" serial_test = "3.0.0" -tempfile = "3.10.0" +tempfile = "3.10.1" tower = { version = "0.4.13", default-features = false, features = ["util"] } [lints] diff --git a/crates/kitsune-storage/Cargo.toml b/crates/kitsune-storage/Cargo.toml index 5f6e60e51..380242d38 100644 --- a/crates/kitsune-storage/Cargo.toml +++ b/crates/kitsune-storage/Cargo.toml @@ -9,14 +9,14 @@ license.workspace = true bytes = "1.5.0" derive_more = { version = "1.0.0-beta.6", features = ["from"] } futures-util = "0.3.30" -http = "1.0.0" +http = "1.1.0" kitsune-http-client = { path = "../kitsune-http-client" } rusty-s3 = { version = "0.5.0", default-features = false } tokio = { version = "1.36.0", features = ["fs", "io-util"] } tokio-util = { version = "0.7.10", features = ["io"] } [dev-dependencies] -tempfile = "3.10.0" +tempfile = "3.10.1" tokio = { version = "1.36.0", features = ["macros", "rt"] } [lints] diff --git a/crates/kitsune-test/Cargo.toml b/crates/kitsune-test/Cargo.toml index 4ab089c0b..af772d861 100644 --- a/crates/kitsune-test/Cargo.toml +++ b/crates/kitsune-test/Cargo.toml @@ -10,7 +10,7 @@ bytes = "1.5.0" diesel = "2.1.4" diesel-async = "0.4.1" futures-util = "0.3.30" -http = "1.0.0" +http = "1.1.0" http-body-util = "0.1.0" isolang = "2.4.0" kitsune-config = { path = "../kitsune-config" } diff --git a/crates/kitsune-type/Cargo.toml b/crates/kitsune-type/Cargo.toml index ec0373287..ca8b18b87 100644 --- a/crates/kitsune-type/Cargo.toml +++ b/crates/kitsune-type/Cargo.toml @@ -11,6 +11,7 @@ serde = { version = "1.0.197", features = ["derive"] } simd-json = "0.13.8" smol_str = { version = "0.2.1", features = ["serde"] } speedy-uuid = { path = "../../lib/speedy-uuid", features = ["serde"] } +strum = { version = "0.26.1", features = ["derive"] } utoipa = { version = "4.2.0", features = ["chrono", "uuid"] } [dev-dependencies] diff --git a/crates/kitsune-type/src/ap/mod.rs b/crates/kitsune-type/src/ap/mod.rs index a42d9513e..eeaa03294 100644 --- a/crates/kitsune-type/src/ap/mod.rs +++ b/crates/kitsune-type/src/ap/mod.rs @@ -3,6 +3,7 @@ use crate::jsonld::{self, RdfNode}; use iso8601_timestamp::Timestamp; use serde::{Deserialize, Serialize}; use simd_json::{json, OwnedValue}; +use strum::AsRefStr; pub const PUBLIC_IDENTIFIER: &str = "https://www.w3.org/ns/activitystreams#Public"; @@ -33,7 +34,7 @@ pub fn ap_context() -> OwnedValue { ]) } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(AsRefStr, Clone, Debug, Deserialize, Serialize)] pub enum ActivityType { Accept, Announce, diff --git a/crates/kitsune-type/src/jsonld/serde/set.rs b/crates/kitsune-type/src/jsonld/serde/set.rs index 4659d1836..3bc5ffe85 100644 --- a/crates/kitsune-type/src/jsonld/serde/set.rs +++ b/crates/kitsune-type/src/jsonld/serde/set.rs @@ -213,7 +213,9 @@ mod tests { #[test] fn unit() { + #[allow(clippy::let_unit_value)] let data = (); + assert_eq!( Set::deserialize(into_deserializer(data)), Ok(Vec::::new()) diff --git a/crates/kitsune-wasm-mrf/Cargo.toml b/crates/kitsune-wasm-mrf/Cargo.toml new file mode 100644 index 000000000..9dcd3daf7 --- /dev/null +++ b/crates/kitsune-wasm-mrf/Cargo.toml @@ -0,0 +1,53 @@ +[package] +name = "kitsune-wasm-mrf" +authors.workspace = true +edition.workspace = true +version.workspace = true +license.workspace = true +build = "build.rs" + +[dependencies] +async-trait = "0.1.77" +derive_more = { version = "1.0.0-beta.6", features = ["from"] } +enum_dispatch = "0.3.12" +futures-util = { version = "0.3.30", default-features = false, features = [ + "alloc", +] } +kitsune-config = { path = "../kitsune-config" } +kitsune-type = { path = "../kitsune-type" } +miette = "7.2.0" +mrf-manifest = { path = "../../lib/mrf-manifest", features = ["parse"] } +multiplex-pool = { path = "../../lib/multiplex-pool" } +redis = { version = "0.24.0", default-features = false, features = [ + "connection-manager", + "tokio-rustls-comp", +] } +simd-json = "0.13.8" +slab = "0.4.9" +sled = "0.34.7" +smol_str = "0.2.1" +thiserror = "1.0.57" +tokio = { version = "1.36.0", features = ["fs"] } +tracing = "0.1.40" +typed-builder = "0.18.1" +walkdir = "2.5.0" +wasmtime = { version = "18.0.2", default-features = false, features = [ + "addr2line", + "async", + "component-model", + "cranelift", + "parallel-compilation", + "pooling-allocator", + "runtime", +] } +wasmtime-wasi = { version = "18.0.2", default-features = false, features = [ + "preview2", +] } + +[dev-dependencies] +tempfile = "3.10.1" +tokio = { version = "1.36.0", features = ["macros", "rt"] } +tracing-subscriber = "0.3.18" + +[lints] +workspace = true diff --git a/crates/kitsune-wasm-mrf/LICENSE-AGPL-3.0 b/crates/kitsune-wasm-mrf/LICENSE-AGPL-3.0 new file mode 120000 index 000000000..43db21b4c --- /dev/null +++ b/crates/kitsune-wasm-mrf/LICENSE-AGPL-3.0 @@ -0,0 +1 @@ +../../LICENSE-AGPL-3.0 \ No newline at end of file diff --git a/crates/kitsune-wasm-mrf/README.md b/crates/kitsune-wasm-mrf/README.md new file mode 100644 index 000000000..e99c86371 --- /dev/null +++ b/crates/kitsune-wasm-mrf/README.md @@ -0,0 +1,13 @@ +# kitsune-wasm-mrf + +Kitsune's implementation of the FEP draft for WASM-based MRFs + +## Note on the WASM binary inside the `tests/` directory + +The binary is used to verify whether the library can run MRF modules. +To reproduce the binary (or rather the function of the binary, codegen might differ), compile the `example-mrf` project like so: + +- Download `wasi_snapshot_preview1.reactor.wasm` from the latest release page of wasmtime +- Install `wasm-tools` +- Compile the project with `cargo build --target wasm32-wasi --profile=dist` +- Link the snapshot to the build artifact with `wasm-tools component new example_mrf.wasm -o example_mrf.component.wasm --adapt wasi_snapshot_preview1.reactor.wasm` diff --git a/crates/kitsune-wasm-mrf/build.rs b/crates/kitsune-wasm-mrf/build.rs new file mode 100644 index 000000000..66d2cb2b0 --- /dev/null +++ b/crates/kitsune-wasm-mrf/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=wit"); +} diff --git a/crates/kitsune-wasm-mrf/example-mrf/Cargo.toml b/crates/kitsune-wasm-mrf/example-mrf/Cargo.toml new file mode 100644 index 000000000..dbe5ebbdb --- /dev/null +++ b/crates/kitsune-wasm-mrf/example-mrf/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "example-mrf" +authors.workspace = true +edition.workspace = true +version.workspace = true +license.workspace = true +build = "build.rs" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rand = "0.8.5" +wit-bindgen = "0.21.0" + +[lints] +workspace = true diff --git a/crates/kitsune-wasm-mrf/example-mrf/build.rs b/crates/kitsune-wasm-mrf/example-mrf/build.rs new file mode 100644 index 000000000..66d2cb2b0 --- /dev/null +++ b/crates/kitsune-wasm-mrf/example-mrf/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=wit"); +} diff --git a/crates/kitsune-wasm-mrf/example-mrf/manifest.json b/crates/kitsune-wasm-mrf/example-mrf/manifest.json new file mode 100644 index 000000000..5a3d0ac81 --- /dev/null +++ b/crates/kitsune-wasm-mrf/example-mrf/manifest.json @@ -0,0 +1,7 @@ +{ + "manifestVersion": "v1", + "apiVersion": "v1", + "name": "example-mrf", + "version": "1.0.0", + "activityTypes": ["*"] +} diff --git a/crates/kitsune-wasm-mrf/example-mrf/src/lib.rs b/crates/kitsune-wasm-mrf/example-mrf/src/lib.rs new file mode 100644 index 000000000..cd166d156 --- /dev/null +++ b/crates/kitsune-wasm-mrf/example-mrf/src/lib.rs @@ -0,0 +1,45 @@ +#![allow(clippy::missing_safety_doc, clippy::transmute_int_to_bool, unsafe_code)] + +use self::{ + fep::mrf::keyvalue::{self, Bucket}, + wasi::logging::logging::{self, Level}, +}; +use rand::{distributions::Alphanumeric, Rng}; + +wit_bindgen::generate!(); + +fn generate_random_key() -> String { + rand::thread_rng() + .sample_iter(Alphanumeric) + .take(50) + .map(|byte| byte as char) + .collect() +} + +struct Mrf; + +impl Guest for Mrf { + fn transform( + _config: String, + _direction: Direction, + activity: String, + ) -> Result { + logging::log( + Level::Debug, + "example-mrf", + "we got an activity! that's cool!", + ); + + // We even have a key-value store! Check this out: + let key = generate_random_key(); + let bucket = Bucket::open_bucket("example-bucket").unwrap(); + + keyvalue::set(&bucket, &key, b"world").unwrap(); + assert!(keyvalue::exists(&bucket, &key).unwrap()); + keyvalue::delete(&bucket, &key).unwrap(); + + Ok(activity) + } +} + +export!(Mrf); diff --git a/crates/kitsune-wasm-mrf/example-mrf/wit b/crates/kitsune-wasm-mrf/example-mrf/wit new file mode 120000 index 000000000..8c60207dd --- /dev/null +++ b/crates/kitsune-wasm-mrf/example-mrf/wit @@ -0,0 +1 @@ +../wit \ No newline at end of file diff --git a/crates/kitsune-wasm-mrf/src/ctx.rs b/crates/kitsune-wasm-mrf/src/ctx.rs new file mode 100644 index 000000000..d59b90ac2 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/ctx.rs @@ -0,0 +1,52 @@ +use crate::kv_storage; +use slab::Slab; +use std::sync::Arc; +use wasmtime::{component::ResourceTable, Engine, Store}; +use wasmtime_wasi::preview2::{WasiCtx, WasiCtxBuilder, WasiView}; + +pub struct KvContext { + pub module_name: Option, + pub storage: Arc, + pub buckets: Slab, +} + +pub struct Context { + pub kv_ctx: KvContext, + pub resource_table: ResourceTable, + pub wasi_ctx: WasiCtx, +} + +impl WasiView for Context { + fn ctx(&mut self) -> &mut WasiCtx { + &mut self.wasi_ctx + } + + fn table(&mut self) -> &mut ResourceTable { + &mut self.resource_table + } +} + +#[inline] +pub fn construct_store( + engine: &Engine, + storage: Arc, +) -> Store { + let wasi_ctx = WasiCtxBuilder::new() + .allow_ip_name_lookup(false) + .allow_tcp(false) + .allow_udp(false) + .build(); + + Store::new( + engine, + Context { + kv_ctx: KvContext { + module_name: None, + storage, + buckets: Slab::new(), + }, + resource_table: ResourceTable::new(), + wasi_ctx, + }, + ) +} diff --git a/crates/kitsune-wasm-mrf/src/error.rs b/crates/kitsune-wasm-mrf/src/error.rs new file mode 100644 index 000000000..ff670a613 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/error.rs @@ -0,0 +1,14 @@ +use miette::Diagnostic; +use thiserror::Error; + +#[derive(Debug, Diagnostic, Error)] +pub enum Error { + #[error(transparent)] + Json(#[from] simd_json::Error), + + #[error(transparent)] + ManifestParse(#[from] mrf_manifest::DecodeError), + + #[error(transparent)] + Runtime(wasmtime::Error), +} diff --git a/crates/kitsune-wasm-mrf/src/kv_storage/fs.rs b/crates/kitsune-wasm-mrf/src/kv_storage/fs.rs new file mode 100644 index 000000000..bd098e0f6 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/kv_storage/fs.rs @@ -0,0 +1,56 @@ +use super::{Backend, BoxError, BucketBackend}; +use miette::IntoDiagnostic; +use std::path::Path; + +pub struct FsBackend { + inner: sled::Db, +} + +impl FsBackend { + pub fn from_path

(path: P) -> miette::Result + where + P: AsRef, + { + Ok(Self { + inner: sled::open(path).into_diagnostic()?, + }) + } +} + +impl Backend for FsBackend { + type Bucket = FsBucketBackend; + + async fn open(&self, module_name: &str, name: &str) -> Result { + self.inner + .open_tree(format!("{module_name}:{name}")) + .map(|tree| FsBucketBackend { inner: tree }) + .map_err(Into::into) + } +} + +pub struct FsBucketBackend { + inner: sled::Tree, +} + +impl BucketBackend for FsBucketBackend { + async fn exists(&self, key: &str) -> Result { + self.inner.contains_key(key).map_err(Into::into) + } + + async fn delete(&self, key: &str) -> Result<(), BoxError> { + self.inner.remove(key)?; + Ok(()) + } + + async fn get(&self, key: &str) -> Result>, BoxError> { + self.inner + .get(key) + .map(|maybe_val| maybe_val.map(|val| val.to_vec())) + .map_err(Into::into) + } + + async fn set(&self, key: &str, value: &[u8]) -> Result<(), BoxError> { + self.inner.insert(key, value)?; + Ok(()) + } +} diff --git a/crates/kitsune-wasm-mrf/src/kv_storage/mod.rs b/crates/kitsune-wasm-mrf/src/kv_storage/mod.rs new file mode 100644 index 000000000..75e7847a7 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/kv_storage/mod.rs @@ -0,0 +1,159 @@ +use crate::mrf_wit::v1::fep::mrf::keyvalue; +use async_trait::async_trait; +use derive_more::From; +use enum_dispatch::enum_dispatch; +use std::{error::Error, future::Future}; +use wasmtime::component::Resource; + +pub use self::{ + fs::{FsBackend, FsBucketBackend}, + redis::{RedisBackend, RedisBucketBackend}, +}; + +mod fs; +mod redis; + +type BoxError = Box; + +pub trait Backend { + type Bucket: BucketBackend; + + fn open( + &self, + module_name: &str, + name: &str, + ) -> impl Future> + Send; +} + +#[enum_dispatch] +#[allow(async_fn_in_trait)] +pub trait BucketBackend { + async fn exists(&self, key: &str) -> Result; + async fn delete(&self, key: &str) -> Result<(), BoxError>; + async fn get(&self, key: &str) -> Result>, BoxError>; + async fn set(&self, key: &str, value: &[u8]) -> Result<(), BoxError>; +} + +#[derive(From)] +pub enum BackendDispatch { + Fs(FsBackend), + Redis(RedisBackend), +} + +impl Backend for BackendDispatch { + type Bucket = BucketBackendDispatch; + + async fn open(&self, module_name: &str, name: &str) -> Result { + match self { + Self::Fs(fs) => fs.open(module_name, name).await.map(Into::into), + Self::Redis(redis) => redis.open(module_name, name).await.map(Into::into), + } + } +} + +#[enum_dispatch(BucketBackend)] +pub enum BucketBackendDispatch { + Fs(FsBucketBackend), + Redis(RedisBucketBackend), +} + +#[async_trait] +impl keyvalue::HostBucket for crate::ctx::Context { + async fn open_bucket( + &mut self, + name: String, + ) -> wasmtime::Result, Resource>> { + let module_name = self + .kv_ctx + .module_name + .as_ref() + .expect("[Bug] Module name not set"); + + let bucket = match self.kv_ctx.storage.open(&name, module_name).await { + Ok(bucket) => bucket, + Err(error) => { + error!(?error, "failed to open bucket"); + return Ok(Err(Resource::new_own(0))); + } + }; + + let idx = self.kv_ctx.buckets.insert(bucket); + Ok(Ok(Resource::new_own(idx as u32))) + } + + fn drop(&mut self, rep: Resource) -> wasmtime::Result<()> { + self.kv_ctx.buckets.remove(rep.rep() as usize); + Ok(()) + } +} + +#[async_trait] +impl keyvalue::HostError for crate::ctx::Context { + fn drop(&mut self, _rep: Resource) -> wasmtime::Result<()> { + Ok(()) + } +} + +#[async_trait] +impl keyvalue::Host for crate::ctx::Context { + async fn get( + &mut self, + bucket: Resource, + key: String, + ) -> wasmtime::Result>, Resource>> { + let bucket = &self.kv_ctx.buckets[bucket.rep() as usize]; + match bucket.get(&key).await { + Ok(val) => Ok(Ok(val)), + Err(error) => { + error!(?error, %key, "failed to get key from storage"); + Ok(Err(Resource::new_own(0))) + } + } + } + + async fn set( + &mut self, + bucket: Resource, + key: String, + value: Vec, + ) -> wasmtime::Result>> { + let bucket = &self.kv_ctx.buckets[bucket.rep() as usize]; + match bucket.set(&key, &value).await { + Ok(()) => Ok(Ok(())), + Err(error) => { + error!(?error, %key, "failed to set key in storage"); + Ok(Err(Resource::new_own(0))) + } + } + } + + async fn delete( + &mut self, + bucket: Resource, + key: String, + ) -> wasmtime::Result>> { + let bucket = &self.kv_ctx.buckets[bucket.rep() as usize]; + match bucket.delete(&key).await { + Ok(()) => Ok(Ok(())), + Err(error) => { + error!(?error, %key, "failed to delete key from storage"); + Ok(Err(Resource::new_own(0))) + } + } + } + + async fn exists( + &mut self, + bucket: Resource, + key: String, + ) -> wasmtime::Result>> { + let bucket = &self.kv_ctx.buckets[bucket.rep() as usize]; + match bucket.exists(&key).await { + Ok(exists) => Ok(Ok(exists)), + Err(error) => { + error!(?error, %key, "failed to check existence of key in storage"); + Ok(Err(Resource::new_own(0))) + } + } + } +} diff --git a/crates/kitsune-wasm-mrf/src/kv_storage/redis.rs b/crates/kitsune-wasm-mrf/src/kv_storage/redis.rs new file mode 100644 index 000000000..b4b66fc3f --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/kv_storage/redis.rs @@ -0,0 +1,73 @@ +use super::BoxError; +use miette::IntoDiagnostic; +use redis::{aio::ConnectionManager, AsyncCommands}; + +const REDIS_NAMESPACE: &str = "MRF-KV-STORE"; + +pub struct RedisBackend { + pool: multiplex_pool::Pool, +} + +impl RedisBackend { + pub async fn from_client(client: redis::Client, pool_size: usize) -> miette::Result { + let pool = multiplex_pool::Pool::from_producer( + || client.get_connection_manager(), + pool_size, + multiplex_pool::RoundRobinStrategy::default(), + ) + .await + .into_diagnostic()?; + + Ok(Self { pool }) + } +} + +impl super::Backend for RedisBackend { + type Bucket = RedisBucketBackend; + + async fn open(&self, module_name: &str, name: &str) -> Result { + Ok(RedisBucketBackend { + name: format!("{REDIS_NAMESPACE}:{module_name}:{name}"), + pool: self.pool.clone(), + }) + } +} + +pub struct RedisBucketBackend { + name: String, + pool: multiplex_pool::Pool, +} + +impl super::BucketBackend for RedisBucketBackend { + async fn exists(&self, key: &str) -> Result { + self.pool + .get() + .hexists(&self.name, key) + .await + .map_err(Into::into) + } + + async fn delete(&self, key: &str) -> Result<(), BoxError> { + self.pool + .get() + .hdel(&self.name, key) + .await + .map_err(Into::into) + } + + async fn get(&self, key: &str) -> Result>, BoxError> { + self.pool + .get() + .hget(&self.name, key) + .await + .map_err(Into::into) + } + + async fn set(&self, key: &str, value: &[u8]) -> Result<(), BoxError> { + self.pool + .get() + .hset(&self.name, key, value) + .await + .map_err(Into::into) + } +} diff --git a/crates/kitsune-wasm-mrf/src/lib.rs b/crates/kitsune-wasm-mrf/src/lib.rs new file mode 100644 index 000000000..228161db5 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/lib.rs @@ -0,0 +1,287 @@ +#[macro_use] +extern crate tracing; + +use self::{ + ctx::{construct_store, Context}, + mrf_wit::v1::fep::mrf::types::{Direction, Error as MrfError}, +}; +use futures_util::{stream::FuturesUnordered, Stream, StreamExt, TryFutureExt, TryStreamExt}; +use kitsune_config::mrf::{ + Configuration as MrfConfiguration, FsKvStorage, KvStorage, RedisKvStorage, +}; +use kitsune_type::ap::Activity; +use miette::{Diagnostic, IntoDiagnostic}; +use mrf_manifest::{Manifest, ManifestV1}; +use smol_str::SmolStr; +use std::{ + borrow::Cow, + fmt::Debug, + io, + path::{Path, PathBuf}, + sync::Arc, +}; +use thiserror::Error; +use tokio::fs; +use typed_builder::TypedBuilder; +use walkdir::WalkDir; +use wasmtime::{ + component::{Component, Linker}, + Config, Engine, InstanceAllocationStrategy, +}; + +pub use self::error::Error; + +mod ctx; +mod error; +mod logging; +mod mrf_wit; + +pub mod kv_storage; + +#[inline] +fn find_mrf_modules

(dir: P) -> impl Stream), io::Error>> +where + P: AsRef, +{ + // Read all the `.wasm` files from the disk + // Recursively traverse the entire directory tree doing so and follow all symlinks + // Also run the I/O operations inside a `FuturesUnordered` to enable concurrent reading + WalkDir::new(dir) + .follow_links(true) + .into_iter() + .filter_map(|entry| { + let entry = entry.ok()?; + (entry.path().is_file() && entry.path().extension() == Some("wasm".as_ref())) + .then(|| entry.into_path()) + }) + .inspect(|path| debug!(?path, "discovered WASM module")) + .map(|path| fs::read(path.clone()).map_ok(|data| (path, data))) + .collect::>() +} + +#[inline] +fn load_mrf_module( + engine: &Engine, + module_path: &Path, + bytes: &[u8], +) -> miette::Result, Component)>> { + let component = Component::new(engine, bytes).map_err(|err| { + miette::Report::new(ComponentParseError { + path_help: format!("path to the module: {}", module_path.display()), + advice: "Did you make the WASM file a component via `wasm-tools`?", + }) + .wrap_err(err) + })?; + + let Some((manifest, _section_range)) = mrf_manifest::decode(bytes)? else { + error!("missing manifest. skipping load."); + return Ok(None); + }; + let Manifest::V1(ref manifest_v1) = manifest else { + error!("invalid manifest version. expected v1"); + return Ok(None); + }; + + info!(name = %manifest_v1.name, version = %manifest_v1.version, "loaded MRF module"); + + Ok(Some((manifest_v1.to_owned(), component))) +} + +#[derive(Debug, Eq, PartialEq, PartialOrd, Ord)] +pub enum Outcome<'a> { + Accept(Cow<'a, str>), + Reject, +} + +#[derive(Debug, Diagnostic, Error)] +#[error("{path_help}")] +struct ComponentParseError { + path_help: String, + #[help] + advice: &'static str, +} + +pub struct MrfModule { + pub component: Component, + pub config: SmolStr, + pub manifest: ManifestV1<'static>, +} + +#[derive(Clone, TypedBuilder)] +pub struct MrfService { + engine: Engine, + linker: Arc>, + modules: Arc<[MrfModule]>, + storage: Arc, +} + +impl MrfService { + #[inline] + pub fn from_components( + engine: Engine, + modules: Vec, + storage: kv_storage::BackendDispatch, + ) -> miette::Result { + let mut linker = Linker::::new(&engine); + + mrf_wit::v1::Mrf::add_to_linker(&mut linker, |ctx| ctx).map_err(miette::Report::msg)?; + wasmtime_wasi::preview2::command::add_to_linker(&mut linker) + .map_err(miette::Report::msg)?; + + Ok(Self { + engine, + linker: Arc::new(linker), + modules: modules.into(), + storage: Arc::new(storage), + }) + } + + #[instrument(skip_all, fields(module_dir = %config.module_dir))] + pub async fn from_config(config: &MrfConfiguration) -> miette::Result { + let storage = match config.storage { + KvStorage::Fs(FsKvStorage { ref path }) => { + kv_storage::FsBackend::from_path(path.as_str())?.into() + } + KvStorage::Redis(RedisKvStorage { ref url, pool_size }) => { + let client = redis::Client::open(url.as_str()).into_diagnostic()?; + kv_storage::RedisBackend::from_client(client, pool_size.get()) + .await? + .into() + } + }; + + let mut engine_config = Config::new(); + engine_config + .allocation_strategy(InstanceAllocationStrategy::pooling()) + .async_support(true) + .wasm_component_model(true); + + let engine = Engine::new(&engine_config).map_err(miette::Report::msg)?; + let wasm_data_stream = find_mrf_modules(config.module_dir.as_str()) + .map(IntoDiagnostic::into_diagnostic) + .and_then(|(module_path, wasm_data)| { + let engine = &engine; + + async move { load_mrf_module(engine, &module_path, &wasm_data) } + }); + tokio::pin!(wasm_data_stream); + + let mut modules = Vec::new(); + while let Some((manifest, component)) = wasm_data_stream.try_next().await?.flatten() { + // TODO: permission grants, etc. + + let span = info_span!( + "load_mrf_module_config", + name = %manifest.name, + version = %manifest.version, + ); + + let config = span.in_scope(|| { + config + .module_config + .get(&*manifest.name) + .cloned() + .inspect(|_| debug!("found configuration")) + .unwrap_or_else(|| { + debug!("didn't find configuration. defaulting to empty string"); + SmolStr::default() + }) + }); + + let module = MrfModule { + component, + config, + manifest, + }; + + modules.push(module); + } + + Self::from_components(engine, modules, storage) + } + + #[must_use] + pub fn module_count(&self) -> usize { + self.modules.len() + } + + async fn handle<'a>( + &self, + direction: Direction, + activity_type: &str, + activity: &'a str, + ) -> Result, Error> { + let mut store = construct_store(&self.engine, self.storage.clone()); + let mut activity = Cow::Borrowed(activity); + + for module in self.modules.iter() { + let activity_types = &module.manifest.activity_types; + if !activity_types.all_activities() && !activity_types.contains(activity_type) { + continue; + } + + let (mrf, _) = + mrf_wit::v1::Mrf::instantiate_async(&mut store, &module.component, &self.linker) + .await + .map_err(Error::Runtime)?; + + store.data_mut().kv_ctx.module_name = Some(module.manifest.name.to_string()); + + let result = mrf + .call_transform(&mut store, &module.config, direction, &activity) + .await + .map_err(Error::Runtime)?; + + match result { + Ok(transformed) => { + activity = Cow::Owned(transformed); + } + Err(MrfError::ErrorContinue(msg)) => { + error!(%msg, "MRF errored out. Continuing."); + } + Err(MrfError::ErrorReject(msg)) => { + error!(%msg, "MRF errored out. Aborting."); + return Ok(Outcome::Reject); + } + Err(MrfError::Reject) => { + error!("MRF rejected activity. Aborting."); + return Ok(Outcome::Reject); + } + } + } + + Ok(Outcome::Accept(activity)) + } + + #[inline] + pub async fn handle_incoming<'a>( + &self, + activity_type: &str, + activity: &'a str, + ) -> Result, Error> { + self.handle(Direction::Incoming, activity_type, activity) + .await + } + + #[inline] + pub async fn handle_outgoing(&self, activity: &Activity) -> Result, Error> { + let serialised = simd_json::to_string(activity)?; + let outcome = self + .handle(Direction::Outgoing, activity.r#type.as_ref(), &serialised) + .await?; + + let outcome: Outcome<'static> = match outcome { + Outcome::Accept(Cow::Borrowed(..)) => { + // As per the logic in the previous function, we can assume that if the Cow is owned, it has been modified + // If it hasn't been modified it is in its borrowed state + // + // Therefore we don't need to allocate again here, simply reconstruct a new `Outcome` with an owned Cow. + Outcome::Accept(Cow::Owned(serialised)) + } + Outcome::Accept(Cow::Owned(owned)) => Outcome::Accept(Cow::Owned(owned)), + Outcome::Reject => Outcome::Reject, + }; + + Ok(outcome) + } +} diff --git a/crates/kitsune-wasm-mrf/src/logging.rs b/crates/kitsune-wasm-mrf/src/logging.rs new file mode 100644 index 000000000..82ca56eea --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/logging.rs @@ -0,0 +1,35 @@ +use crate::mrf_wit::v1::wasi::logging::logging::{self, Level}; +use async_trait::async_trait; + +macro_rules! event_dispatch { + ($level:ident, $context:ident, $message:ident, { + $($left:path => $right:path),+$(,)? + }) => {{ + match $level { + $( + $left => event!($right, %$context, "{}", $message), + )+ + } + }}; +} + +#[async_trait] +impl logging::Host for crate::ctx::Context { + async fn log( + &mut self, + level: Level, + context: String, + message: String, + ) -> wasmtime::Result<()> { + event_dispatch!(level, context, message, { + Level::Trace => tracing::Level::TRACE, + Level::Debug => tracing::Level::DEBUG, + Level::Info => tracing::Level::INFO, + Level::Warn => tracing::Level::WARN, + Level::Error => tracing::Level::ERROR, + Level::Critical => tracing::Level::ERROR, + }); + + Ok(()) + } +} diff --git a/crates/kitsune-wasm-mrf/src/mrf_wit.rs b/crates/kitsune-wasm-mrf/src/mrf_wit.rs new file mode 100644 index 000000000..0eb1828f7 --- /dev/null +++ b/crates/kitsune-wasm-mrf/src/mrf_wit.rs @@ -0,0 +1,8 @@ +pub mod v1 { + wasmtime::component::bindgen!({ + async: true, + world: "mrf", + }); +} + +impl v1::fep::mrf::types::Host for crate::ctx::Context {} diff --git a/crates/kitsune-wasm-mrf/tests/example_mrf.component.wasm b/crates/kitsune-wasm-mrf/tests/example_mrf.component.wasm new file mode 100755 index 000000000..f976d17d4 Binary files /dev/null and b/crates/kitsune-wasm-mrf/tests/example_mrf.component.wasm differ diff --git a/crates/kitsune-wasm-mrf/tests/load_and_run.rs b/crates/kitsune-wasm-mrf/tests/load_and_run.rs new file mode 100644 index 000000000..535279518 --- /dev/null +++ b/crates/kitsune-wasm-mrf/tests/load_and_run.rs @@ -0,0 +1,52 @@ +use kitsune_wasm_mrf::{MrfModule, MrfService, Outcome}; +use mrf_manifest::{ActivitySet, ApiVersion, ManifestV1}; +use smol_str::SmolStr; +use std::{borrow::Cow, collections::HashSet}; +use wasmtime::{component::Component, Config, Engine}; + +const WASM_COMPONENT: &[u8] = include_bytes!("example_mrf.component.wasm"); + +fn dummy_manifest() -> ManifestV1<'static> { + ManifestV1 { + api_version: ApiVersion::V1, + name: "dummy".into(), + version: "1.0.0".parse().unwrap(), + activity_types: ActivitySet::from( + [Cow::Borrowed("*")].into_iter().collect::>(), + ), + config_schema: None, + } +} + +#[tokio::test] +async fn basic() { + tracing_subscriber::fmt::init(); + + let dir = tempfile::tempdir().unwrap(); + let fs_backend = kitsune_wasm_mrf::kv_storage::FsBackend::from_path(dir.path()).unwrap(); + + let mut config = Config::new(); + config.async_support(true).wasm_component_model(true); + let engine = Engine::new(&config).unwrap(); + let component = Component::new(&engine, WASM_COMPONENT).unwrap(); + + let service = MrfService::from_components( + engine, + vec![MrfModule { + component, + config: SmolStr::default(), + manifest: dummy_manifest(), + }], + fs_backend.into(), + ) + .unwrap(); + let result = service + .handle_incoming("[anything]", "[imagine activity here]") + .await + .unwrap(); + + assert_eq!( + result, + Outcome::Accept(Cow::Borrowed("[imagine activity here]")) + ); +} diff --git a/crates/kitsune-wasm-mrf/wit/README.md b/crates/kitsune-wasm-mrf/wit/README.md new file mode 100644 index 000000000..78ccca6b6 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/README.md @@ -0,0 +1,4 @@ +# WIT + +Dependencies here are managed using [`wit-deps`](https://github.com/bytecodealliance/wit-deps). +Make sure to `wit-deps lock` after updating the submodules. diff --git a/crates/kitsune-wasm-mrf/wit/deps.lock b/crates/kitsune-wasm-mrf/wit/deps.lock new file mode 100644 index 000000000..870fb1537 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/deps.lock @@ -0,0 +1,4 @@ +[logging] +path = "wasi-logging/wit" +sha256 = "9676b482485bb0fd2751a390374c1108865a096b7037f4b5dbe524f066bfb06e" +sha512 = "30a621a6d48a0175e8047c062e618523a85f69c45a7c31918da2b888f7527fce1aca67fa132552222725d0f6cdcaed95be7f16c28488d9468c0fad00cb7450b9" diff --git a/crates/kitsune-wasm-mrf/wit/deps.toml b/crates/kitsune-wasm-mrf/wit/deps.toml new file mode 100644 index 000000000..b1124b662 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/deps.toml @@ -0,0 +1 @@ +logging = "wasi-logging/wit" diff --git a/crates/kitsune-wasm-mrf/wit/deps/logging/logging.wit b/crates/kitsune-wasm-mrf/wit/deps/logging/logging.wit new file mode 100644 index 000000000..8c0bdf821 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/deps/logging/logging.wit @@ -0,0 +1,35 @@ +/// WASI Logging is a logging API intended to let users emit log messages with +/// simple priority levels and context values. +interface logging { + /// A log level, describing a kind of message. + enum level { + /// Describes messages about the values of variables and the flow of + /// control within a program. + trace, + + /// Describes messages likely to be of interest to someone debugging a + /// program. + debug, + + /// Describes messages likely to be of interest to someone monitoring a + /// program. + info, + + /// Describes messages indicating hazardous situations. + warn, + + /// Describes messages indicating serious errors. + error, + + /// Describes messages indicating fatal errors. + critical, + } + + /// Emit a log message. + /// + /// A log message has a `level` describing what kind of message is being + /// sent, a context, which is an uninterpreted string meant to help + /// consumers group similar messages, and a string containing the message + /// text. + log: func(level: level, context: string, message: string); +} diff --git a/crates/kitsune-wasm-mrf/wit/deps/logging/world.wit b/crates/kitsune-wasm-mrf/wit/deps/logging/world.wit new file mode 100644 index 000000000..ede628643 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/deps/logging/world.wit @@ -0,0 +1,5 @@ +package wasi:logging; + +world imports { + import logging; +} diff --git a/crates/kitsune-wasm-mrf/wit/mrf.wit b/crates/kitsune-wasm-mrf/wit/mrf.wit new file mode 100644 index 000000000..f365f1922 --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/mrf.wit @@ -0,0 +1,62 @@ +package fep:mrf@1.0.0; + +/// Home-grown version of wasi-keyvalue +/// +/// Built around a synchronous interface since MRFs are synchronous in their current representation +interface keyvalue { + /// Opaque representation of some error + resource error {} + + /// Logical collection of Key-Value pairs + resource bucket { + /// Open or create a new bucket + open-bucket: static func(name: string) -> result; + } + + /// Get a value from a bucket + get: func(bucket: borrow, key: string) -> result>, error>; + + /// Set the value inside a bucket + /// + /// Overwrites existing values + set: func(bucket: borrow, key: string, value: list) -> result<_, error>; + + /// Delete the value from a bucket + delete: func(bucket: borrow, key: string) -> result<_, error>; + + /// Check if a key exists in the bucket + exists: func(bucket: borrow, key: string) -> result; +} + +interface types { + /// The direction the activity is going + enum direction { + /// The activity is being received + incoming, + + /// The activity is being sent out + outgoing, + } + + /// Error types + variant error { + /// Reject the activity + reject, + + /// An error occurred but the processing can continue + error-continue(string), + + /// An error occurred and the processing should not continue + error-reject(string), + } +} + +world mrf { + use types.{direction, error}; + + import keyvalue; + import wasi:logging/logging; + + /// Transform an ActivityPub activity + export transform: func(configuration: string, direction: direction, activity: string) -> result; +} diff --git a/crates/kitsune-wasm-mrf/wit/wasi-logging b/crates/kitsune-wasm-mrf/wit/wasi-logging new file mode 160000 index 000000000..3293e84de --- /dev/null +++ b/crates/kitsune-wasm-mrf/wit/wasi-logging @@ -0,0 +1 @@ +Subproject commit 3293e84de91a1ead98a1b4362f95ac8af5a16ddd diff --git a/crates/kitsune-webfinger/Cargo.toml b/crates/kitsune-webfinger/Cargo.toml index 5cb913089..44d21bcfc 100644 --- a/crates/kitsune-webfinger/Cargo.toml +++ b/crates/kitsune-webfinger/Cargo.toml @@ -9,7 +9,7 @@ license.workspace = true async-trait = "0.1.77" autometrics = { version = "1.0.1", default-features = false } futures-util = "0.3.30" -http = "1.0.0" +http = "1.1.0" kitsune-cache = { path = "../kitsune-cache" } kitsune-core = { path = "../kitsune-core" } kitsune-http-client = { path = "../kitsune-http-client" } @@ -21,6 +21,7 @@ redis = { version = "0.24.0", default-features = false, features = [ "tokio-comp", ] } tracing = "0.1.40" +urlencoding = "2.1.3" [dev-dependencies] http-body-util = "0.1.0" diff --git a/crates/kitsune-webfinger/src/lib.rs b/crates/kitsune-webfinger/src/lib.rs index 79a0cc5da..581fad62f 100644 --- a/crates/kitsune-webfinger/src/lib.rs +++ b/crates/kitsune-webfinger/src/lib.rs @@ -81,7 +81,7 @@ impl Resolver for Webfinger { let mut username = username; let mut domain = domain; - let original_acct = format!("acct:{username}@{domain}"); + let original_acct = format!("acct:{}@{domain}", urlencoding::encode(username)); let mut acct_buf: String; let mut acct = original_acct.as_str(); diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index ce44d1584..6cd933e56 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -16,6 +16,7 @@ - [Job Scheduler](./configuring/job-scheduler.md) - [Language Detection](./configuring/language-detection.md) - [Link embedding](./configuring/link-embedding.md) + - [MRF (Message Rewrite Facility)](./configuring/mrf.md) - [Messaging](./configuring/messaging.md) - [OIDC (OpenID Connect)](./configuring/oidc.md) - [OpenTelemetry](./configuring/opentelemetry.md) diff --git a/docs/src/configuring/mrf.md b/docs/src/configuring/mrf.md new file mode 100644 index 000000000..7f35706ab --- /dev/null +++ b/docs/src/configuring/mrf.md @@ -0,0 +1,24 @@ +# MRF (Message Rewrite Facility) + +The idea of a message rewrite facility was originally popularized by Pleroma/Akkoma. +Essentially it enables you to add small filters/transformers into your ActivityPub federation. + +The MRF module sits at the very beginning of processing an incoming activity. +In this position, the MRF can transform and reject activities based on criteria defined by the developers of the module. + +For example, you can use it to: + +- detect spam +- mark media attachments as sensitive +- nya-ify every incoming post + +## Configuration + +### `module-dir` + +This configuration option tells Kitsune where to scan for WASM modules to load and compile. + +```toml +[mrf] +module-dir = "mrf-modules" +``` diff --git a/flake.lock b/flake.lock index caf0f1d17..066d0d23c 100644 --- a/flake.lock +++ b/flake.lock @@ -10,11 +10,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1707817777, - "narHash": "sha256-vHyIs1OULQ3/91wD6xOiuayfI71JXALGA5KLnDKAcy0=", + "lastModified": 1709596918, + "narHash": "sha256-X8tp7nYunRZds8GdSEp+ZBMPf3ym9e6VjZWN8fmzBrc=", "owner": "cachix", "repo": "devenv", - "rev": "5a30b9e5ac7c6167e61b1f4193d5130bb9f8defa", + "rev": "4eccee9a19ad9be42a7859211b456b281d704313", "type": "github" }, "original": { @@ -62,11 +62,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1709126324, + "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "d465f4819400de7c8d874d50b982301f28a84605", "type": "github" }, "original": { @@ -139,11 +139,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1707956935, - "narHash": "sha256-ZL2TrjVsiFNKOYwYQozpbvQSwvtV/3Me7Zwhmdsfyu4=", + "lastModified": 1709479366, + "narHash": "sha256-n6F0n8UV6lnTZbYPl1A9q1BS0p4hduAv1mGAP17CVd0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a4d4fe8c5002202493e87ec8dbc91335ff55552c", + "rev": "b8697e57f10292a6165a20f03d2f42920dfaf973", "type": "github" }, "original": { @@ -231,11 +231,11 @@ ] }, "locked": { - "lastModified": 1708049456, - "narHash": "sha256-8qGWZTQPPBhcF5dsl1KSWF+H7RX8C3BZGvqYWKBtLjQ=", + "lastModified": 1709604635, + "narHash": "sha256-le4fwmWmjGRYWwkho0Gr7mnnZndOOe4XGbLw68OvF40=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "4ee92bf124fbc4e157cbce1bc2a35499866989fc", + "rev": "e86c0fb5d3a22a5f30d7f64ecad88643fe26449d", "type": "github" }, "original": { diff --git a/kitsune-cli/Cargo.toml b/kitsune-cli/Cargo.toml index 42b823c2d..8fd62121d 100644 --- a/kitsune-cli/Cargo.toml +++ b/kitsune-cli/Cargo.toml @@ -13,14 +13,14 @@ license = false eula = false [dependencies] -clap = { version = "4.5.1", features = ["derive", "wrap_help"] } +clap = { version = "4.5.2", features = ["derive", "wrap_help"] } diesel = "2.1.4" diesel-async = "0.4.1" dotenvy = "0.15.7" envy = "0.4.2" kitsune-config = { path = "../crates/kitsune-config" } kitsune-db = { path = "../crates/kitsune-db" } -miette = { version = "7.1.0", features = ["fancy"] } +miette = { version = "7.2.0", features = ["fancy"] } serde = { version = "1.0.197", features = ["derive"] } speedy-uuid = { path = "../lib/speedy-uuid" } tokio = { version = "1.36.0", features = ["full"] } diff --git a/kitsune-fe/package.json b/kitsune-fe/package.json index 5618174aa..04ff46bd8 100644 --- a/kitsune-fe/package.json +++ b/kitsune-fe/package.json @@ -21,12 +21,12 @@ "@fortawesome/vue-fontawesome": "^3.0.6", "@hcaptcha/vue3-hcaptcha": "^1.3.0", "@mcaptcha/vanilla-glue": "^0.1.0-alpha-3", - "@tiptap/pm": "^2.2.3", - "@tiptap/starter-kit": "^2.2.3", - "@tiptap/vue-3": "^2.2.3", - "@urql/exchange-graphcache": "^6.4.1", + "@tiptap/pm": "^2.2.4", + "@tiptap/starter-kit": "^2.2.4", + "@tiptap/vue-3": "^2.2.4", + "@urql/exchange-graphcache": "^6.5.0", "@urql/vue": "^1.1.2", - "@vueuse/core": "^10.7.2", + "@vueuse/core": "^10.9.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", @@ -38,34 +38,34 @@ "pinia-plugin-persistedstate": "^3.2.1", "rollup": "npm:@rollup/wasm-node", "tiptap-markdown": "^0.8.9", - "unhead": "^1.8.10", - "vue": "^3.4.19", + "unhead": "^1.8.11", + "vue": "^3.4.21", "vue-powerglitch": "^1.0.0", - "vue-router": "^4.2.5", + "vue-router": "^4.3.0", "vue-virtual-scroller": "^2.0.0-beta.8" }, "devDependencies": { "@graphql-codegen/cli": "^5.0.2", - "@graphql-codegen/client-preset": "^4.2.2", - "@parcel/watcher": "^2.4.0", + "@graphql-codegen/client-preset": "^4.2.4", + "@parcel/watcher": "^2.4.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/lodash": "^4.14.202", - "@typescript-eslint/eslint-plugin": "^7.0.1", - "@typescript-eslint/parser": "^7.0.1", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-prettier": "^9.0.0", "@vue/eslint-config-typescript": "^12.0.0", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-vue": "^9.21.1", + "eslint-plugin-vue": "^9.22.0", "prettier": "^3.2.5", "prettier-plugin-css-order": "^2.0.1", - "sass": "^1.71.0", + "sass": "^1.71.1", "typescript": "^5.3.3", - "unplugin-fluent-vue": "^1.1.4", - "vite": "^5.1.3", - "vue-tsc": "^1.8.27" + "unplugin-fluent-vue": "^1.2.0", + "vite": "^5.1.5", + "vue-tsc": "^2.0.5" }, "resolutions": { "rollup": "npm:@rollup/wasm-node" diff --git a/kitsune-fe/yarn.lock b/kitsune-fe/yarn.lock index b51368172..79fa084e0 100644 --- a/kitsune-fe/yarn.lock +++ b/kitsune-fe/yarn.lock @@ -13,12 +13,12 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@ardatan/relay-compiler@12.0.0": version "12.0.0" @@ -64,20 +64,20 @@ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.14.0", "@babel/core@^7.22.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -122,9 +122,9 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.18.6": - version "7.23.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" - integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz#fc7554141bdbfa2d17f7b4b80153b9b090e5d158" + integrity sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -189,9 +189,9 @@ "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-replace-supers@^7.22.20": version "7.22.20" @@ -238,14 +238,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/highlight@^7.23.4": version "7.23.4" @@ -256,10 +256,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== "@babel/plugin-proposal-class-properties@^7.0.0": version "7.18.6" @@ -476,20 +476,20 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/runtime@^7.0.0": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" - integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/traverse@7.23.2": version "7.23.2" @@ -507,10 +507,10 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -518,8 +518,8 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" @@ -531,10 +531,10 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.13", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.13", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -682,10 +682,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@floating-ui/core@^1.1.0": version "1.6.0" @@ -880,20 +880,20 @@ yaml "^2.3.1" yargs "^17.0.0" -"@graphql-codegen/client-preset@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.2.tgz#545c62789a5687bee5df8b4738b4911e72ea8051" - integrity sha512-DF9pNWj3TEdA90E9FH5SsUIqiZfr872vqaQOspLVuVXGsaDx8F/JLLzaN+7ucmoo0ff/bLW8munVXYXTmgwwEA== +"@graphql-codegen/client-preset@^4.2.2", "@graphql-codegen/client-preset@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.4.tgz#a20e85b07b77282bb27b2e8e014bed5d491443e7" + integrity sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" "@graphql-codegen/add" "^5.0.2" - "@graphql-codegen/gql-tag-operations" "4.0.4" + "@graphql-codegen/gql-tag-operations" "4.0.6" "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typed-document-node" "^5.0.4" - "@graphql-codegen/typescript" "^4.0.4" - "@graphql-codegen/typescript-operations" "^4.1.2" - "@graphql-codegen/visitor-plugin-common" "^4.1.2" + "@graphql-codegen/typed-document-node" "^5.0.6" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/typescript-operations" "^4.2.0" + "@graphql-codegen/visitor-plugin-common" "^5.1.0" "@graphql-tools/documents" "^1.0.0" "@graphql-tools/utils" "^10.0.0" "@graphql-typed-document-node/core" "3.2.0" @@ -909,13 +909,13 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/gql-tag-operations@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.4.tgz#572be5db804af5efdc3ca24e4bcac815448730c5" - integrity sha512-dypul0iDLjb07yv+/cRb6qPbn42cFPcwlsJertVl9G6qkS4+3V4806WwSfUht4QVMWnvGfgDkJJqG0yUVKOHwA== +"@graphql-codegen/gql-tag-operations@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz#d16ee0306cfdea60217c025a1bc21649452d7da3" + integrity sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" "@graphql-tools/utils" "^10.0.0" auto-bind "~4.0.0" tslib "~2.6.0" @@ -941,43 +941,43 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/typed-document-node@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.4.tgz#06e286caacdd66c3566f98433dcb8f1a9c9a9f1d" - integrity sha512-t66Z6erQ4Dh1j6f9pRZmc8uYtHoUI3A49tLmJAlg9/3IV0kCmwrWKJut/G8SeOefDLG8cXBTVtI/YuZOe1Te+w== +"@graphql-codegen/typed-document-node@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz#54750f4a7c6e963defeb6c27a9ea280a2a8bc2a3" + integrity sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" change-case-all "1.0.15" tslib "~2.6.0" -"@graphql-codegen/typescript-operations@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.1.2.tgz#a0f455ae19e16961e5870420ca7515bbe51b5568" - integrity sha512-CtCWK+gW7hS+Ely3lohr8CL1HVLswQzMcaUk3k1sxdWCWKTNq7abMsWa31rTVwRCJ+WNEkM/7S8sIBTpEG683A== +"@graphql-codegen/typescript-operations@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz#0c6bbaf41cb325809b7e9e2b9d85ab01f11d142f" + integrity sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typescript" "^4.0.4" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/typescript@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.4.tgz#e791c61f675ae454951ea077b0ae519ae352cc3e" - integrity sha512-x79CKLfP9UQCX+/I78qxQlMs2Mmq3pF1lKafZo7lAno0f/fvJ+qWUduzdgjRNz+YL+5blGeWcC0pWEDxniO7hw== +"@graphql-codegen/typescript@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.6.tgz#2c9b70dc1eafda912de5e31c119c757b1aa5fca1" + integrity sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" "@graphql-codegen/schema-ast" "^4.0.2" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/visitor-plugin-common@4.1.2", "@graphql-codegen/visitor-plugin-common@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.1.2.tgz#674c5d5813f6c00dd65e1ee148a62536879e65e2" - integrity sha512-yk7iEAL1kYZ2Gi/pvVjdsZhul5WsYEM4Zcgh2Ev15VicMdJmPHsMhNUsZWyVJV0CaQCYpNOFlGD/11Ea3pn4GA== +"@graphql-codegen/visitor-plugin-common@5.1.0", "@graphql-codegen/visitor-plugin-common@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz#4edf7edb53460e71762a5fd8bbf5269bc3d9200b" + integrity sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" "@graphql-tools/optimize" "^2.0.0" @@ -991,45 +991,45 @@ tslib "~2.6.0" "@graphql-tools/apollo-engine-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489" - integrity sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg== + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz#1ec8718af6130ff8039cd653991412472cdd7e55" + integrity sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA== dependencies: "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" "@whatwg-node/fetch" "^0.9.0" tslib "^2.4.0" -"@graphql-tools/batch-execute@^9.0.1": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz#5ac3257501e7941fad40661bb5e1110d6312f58b" - integrity sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ== +"@graphql-tools/batch-execute@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz#11601409c0c33491971fc82592de12390ec58be2" + integrity sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w== dependencies: - "@graphql-tools/utils" "^10.0.5" + "@graphql-tools/utils" "^10.0.13" dataloader "^2.2.2" tslib "^2.4.0" value-or-promise "^1.0.12" "@graphql-tools/code-file-loader@^8.0.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.1.0.tgz#1092594f02f2c54fc1dd8b997921ccb8db642272" - integrity sha512-HKWW/B2z15ves8N9+xnVbGmFEVGyHEK80a4ghrjeTa6nwNZaKDVfq5CoYFfF0xpfjtH6gOVUExo2XCOEz4B8mQ== + version "8.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.1.1.tgz#517c37d4f8a20b2c6558b10cbe9a6f9bcfe98918" + integrity sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ== dependencies: - "@graphql-tools/graphql-tag-pluck" "8.2.0" + "@graphql-tools/graphql-tag-pluck" "8.3.0" "@graphql-tools/utils" "^10.0.13" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/delegate@^10.0.0", "@graphql-tools/delegate@^10.0.3": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.3.tgz#2d0e133da94ca92c24e0c7360414e5592321cf2d" - integrity sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw== +"@graphql-tools/delegate@^10.0.4": + version "10.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.4.tgz#7c38240f11e42ec2dd45d0a569ca6433ce4cb8dc" + integrity sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q== dependencies: - "@graphql-tools/batch-execute" "^9.0.1" - "@graphql-tools/executor" "^1.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.5" + "@graphql-tools/batch-execute" "^9.0.4" + "@graphql-tools/executor" "^1.2.1" + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" dataloader "^2.2.2" tslib "^2.5.0" @@ -1041,24 +1041,24 @@ lodash.sortby "^4.7.0" tslib "^2.4.0" -"@graphql-tools/executor-graphql-ws@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz#7727159ebaa9df4dc793d0d02e74dd1ca4a7cc60" - integrity sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg== +"@graphql-tools/executor-graphql-ws@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz#2bf959d2319692460b39400c0fe1515dfbb9f034" + integrity sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg== dependencies: - "@graphql-tools/utils" "^10.0.2" + "@graphql-tools/utils" "^10.0.13" "@types/ws" "^8.0.0" graphql-ws "^5.14.0" isomorphic-ws "^5.0.0" tslib "^2.4.0" ws "^8.13.0" -"@graphql-tools/executor-http@^1.0.0", "@graphql-tools/executor-http@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.8.tgz#01e01915634acb65385a6cc0c60f0acdd5989026" - integrity sha512-tBHT4aRkMCeyo+tcfEz7znqdd4QqoYF9vY1YTSo2+FV00usBB+R1YL3YaINBQNVkSVpZ41elffoF/fjI+QE8ZQ== +"@graphql-tools/executor-http@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz#87ca8b99a32241eb0cc30a9c500d2672e92d58b7" + integrity sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q== dependencies: - "@graphql-tools/utils" "^10.0.2" + "@graphql-tools/utils" "^10.0.13" "@repeaterjs/repeater" "^3.0.4" "@whatwg-node/fetch" "^0.9.0" extract-files "^11.0.0" @@ -1066,34 +1066,34 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/executor-legacy-ws@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.5.tgz#07de9d6e0e49febbcb87d6558bbeebf3940ff25a" - integrity sha512-w54AZ7zkNuvpyV09FH+eGHnnAmaxhBVHg4Yh2ICcsMfRg0brkLt77PlbjBuxZ4HY8XZnKJaYWf+tKazQZtkQtg== +"@graphql-tools/executor-legacy-ws@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz#4ed311b731db8fd5c99e66a66361afbf9c2109fc" + integrity sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" "@types/ws" "^8.0.0" isomorphic-ws "^5.0.0" tslib "^2.4.0" ws "^8.15.0" -"@graphql-tools/executor@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.2.0.tgz#6c45f4add765769d9820c4c4405b76957ba39c79" - integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== +"@graphql-tools/executor@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.2.1.tgz#9aa132ac1839679fbd14810f7ad8a65e82c0db44" + integrity sha512-BP5UI1etbNOXmTSt7q4NL1+zsURFgh2pG+Hyt9K/xO0LlsfbSx59L5dHLerqZP7Js0xI6GYqrUQ4m29rUwUHJg== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" "@graphql-typed-document-node/core" "3.2.0" "@repeaterjs/repeater" "^3.0.4" tslib "^2.4.0" value-or-promise "^1.0.12" "@graphql-tools/git-loader@^8.0.0": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.4.tgz#663a42e28f1705ba29c0e41ac2f89e7436751608" - integrity sha512-fBmKtnOVqzMT2N8L6nggM4skPq3y2t0eBITZJXCOuxeIlIRAeCOdjNLPKgyGb0rezIyGsn55DKMua5101VN0Sg== + version "8.0.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.5.tgz#77f9c2a35fdb3a403d33660ed11702720d4b016e" + integrity sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA== dependencies: - "@graphql-tools/graphql-tag-pluck" "8.2.0" + "@graphql-tools/graphql-tag-pluck" "8.3.0" "@graphql-tools/utils" "^10.0.13" is-glob "4.0.3" micromatch "^4.0.4" @@ -1101,33 +1101,33 @@ unixify "^1.0.0" "@graphql-tools/github-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz#683195800618364701cfea9bc6f88674486f053b" - integrity sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz#011e1f9495d42a55139a12f576cc6bb04943ecf4" + integrity sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg== dependencies: "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/executor-http" "^1.0.0" + "@graphql-tools/executor-http" "^1.0.9" "@graphql-tools/graphql-tag-pluck" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" "@whatwg-node/fetch" "^0.9.0" tslib "^2.4.0" value-or-promise "^1.0.12" "@graphql-tools/graphql-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz#a2026405bce86d974000455647511bf65df4f211" - integrity sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg== + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz#03869b14cb91d0ef539df8195101279bb2df9c9e" + integrity sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA== dependencies: - "@graphql-tools/import" "7.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/import" "7.0.1" + "@graphql-tools/utils" "^10.0.13" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" -"@graphql-tools/graphql-tag-pluck@8.2.0", "@graphql-tools/graphql-tag-pluck@^8.0.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.2.0.tgz#958e07d3bdd94c2a7ac958364b7383c17d009ce2" - integrity sha512-aGIuHxyrJB+LlUfXrH73NVlQTA6LkFbLKQzHojFuwXZJpf7wPkxceN2yp7VjMedARkLJg589IoXgZeMb1EztGQ== +"@graphql-tools/graphql-tag-pluck@8.3.0", "@graphql-tools/graphql-tag-pluck@^8.0.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz#11bb8c627253137b39b34fb765cd6ebe506388b9" + integrity sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw== dependencies: "@babel/core" "^7.22.9" "@babel/parser" "^7.16.8" @@ -1137,41 +1137,41 @@ "@graphql-tools/utils" "^10.0.13" tslib "^2.4.0" -"@graphql-tools/import@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.0.tgz#a6a91a90a707d5f46bad0fd3fde2f407b548b2be" - integrity sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw== +"@graphql-tools/import@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.1.tgz#4e0d181c63350b1c926ae91b84a4cbaf03713c2c" + integrity sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" resolve-from "5.0.0" tslib "^2.4.0" "@graphql-tools/json-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz#9b1b62902f766ef3f1c9cd1c192813ea4f48109c" - integrity sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg== + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz#3fcfe869f22d8129a74369da69bf491c0bff7c2d" + integrity sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" "@graphql-tools/load@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.1.tgz#498f2230448601cb87894b8a93df7867daef69ea" - integrity sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw== + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.2.tgz#47d9916bf96dea05df27f11b53812f4327d9b6d2" + integrity sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA== dependencies: - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.11" + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" p-limit "3.1.0" tslib "^2.4.0" -"@graphql-tools/merge@^9.0.0", "@graphql-tools/merge@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.1.tgz#693f15da152339284469b1ce5c6827e3ae350a29" - integrity sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw== +"@graphql-tools/merge@^9.0.0", "@graphql-tools/merge@^9.0.3": + version "9.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.3.tgz#4d0b467132e6f788b69fab803d31480b8ce4b61a" + integrity sha512-FeKv9lKLMwqDu0pQjPpF59GY3HReUkWXKsMIuMuJQOKh9BETu7zPEFUELvcw8w+lwZkl4ileJsHXC9+AnsT2Lw== dependencies: - "@graphql-tools/utils" "^10.0.10" + "@graphql-tools/utils" "^10.0.13" tslib "^2.4.0" "@graphql-tools/optimize@^2.0.0": @@ -1182,12 +1182,12 @@ tslib "^2.4.0" "@graphql-tools/prisma-loader@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.2.tgz#3a7126ec2389a7aa7846bd0e441629ac5a1934fc" - integrity sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w== + version "8.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.3.tgz#a41acb41629cf5327834bedd259939024cf774ba" + integrity sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q== dependencies: - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.8" + "@graphql-tools/url-loader" "^8.0.2" + "@graphql-tools/utils" "^10.0.13" "@types/js-yaml" "^4.0.0" "@types/json-stable-stringify" "^1.0.32" "@whatwg-node/fetch" "^0.9.0" @@ -1206,36 +1206,36 @@ yaml-ast-parser "^0.0.43" "@graphql-tools/relay-operation-optimizer@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz#24367666af87bc5a81748de5e8e9b3c523fd4207" - integrity sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz#8ac33e1d2626b6816d9283769c4a05c062b8065a" + integrity sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A== dependencies: "@ardatan/relay-compiler" "12.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.0.13" tslib "^2.4.0" -"@graphql-tools/schema@^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.2.tgz#21bc2ee25a65fb4890d2e5f9f22ef1f733aa81da" - integrity sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w== +"@graphql-tools/schema@^10.0.0", "@graphql-tools/schema@^10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.3.tgz#48c14be84cc617c19c4c929258672b6ab01768de" + integrity sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog== dependencies: - "@graphql-tools/merge" "^9.0.1" - "@graphql-tools/utils" "^10.0.10" + "@graphql-tools/merge" "^9.0.3" + "@graphql-tools/utils" "^10.0.13" tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/url-loader@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.1.tgz#91247247d253c538c4c28376ca74d944fa8cfb82" - integrity sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ== +"@graphql-tools/url-loader@^8.0.0", "@graphql-tools/url-loader@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz#ee8e10a85d82c72662f6bc6bbc7b408510a36ebd" + integrity sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ== dependencies: "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/delegate" "^10.0.0" - "@graphql-tools/executor-graphql-ws" "^1.0.0" - "@graphql-tools/executor-http" "^1.0.5" - "@graphql-tools/executor-legacy-ws" "^1.0.0" - "@graphql-tools/utils" "^10.0.0" - "@graphql-tools/wrap" "^10.0.0" + "@graphql-tools/delegate" "^10.0.4" + "@graphql-tools/executor-graphql-ws" "^1.1.2" + "@graphql-tools/executor-http" "^1.0.9" + "@graphql-tools/executor-legacy-ws" "^1.0.6" + "@graphql-tools/utils" "^10.0.13" + "@graphql-tools/wrap" "^10.0.2" "@types/ws" "^8.0.0" "@whatwg-node/fetch" "^0.9.0" isomorphic-ws "^5.0.0" @@ -1243,24 +1243,24 @@ value-or-promise "^1.0.11" ws "^8.12.0" -"@graphql-tools/utils@^10.0.0", "@graphql-tools/utils@^10.0.10", "@graphql-tools/utils@^10.0.11", "@graphql-tools/utils@^10.0.13", "@graphql-tools/utils@^10.0.2", "@graphql-tools/utils@^10.0.5", "@graphql-tools/utils@^10.0.8": - version "10.0.13" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.13.tgz#d0ab7a4dd02a8405f5ef62dd140b7579ba69f8cb" - integrity sha512-fMILwGr5Dm2zefNItjQ6C2rauigklv69LIwppccICuGTnGaOp3DspLt/6Lxj72cbg5d9z60Sr+Egco3CJKLsNg== +"@graphql-tools/utils@^10.0.0", "@graphql-tools/utils@^10.0.13": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.1.0.tgz#d8c23a8b8636a5df59b14991bf25eae5ac15d314" + integrity sha512-wLPqhgeZ9BZJPRoaQbsDN/CtJDPd/L4qmmtPkjI3NuYJ39x+Eqz1Sh34EAGMuDh+xlOHqBwHczkZUpoK9tvzjw== dependencies: "@graphql-typed-document-node/core" "^3.1.1" cross-inspect "1.0.0" dset "^3.1.2" tslib "^2.4.0" -"@graphql-tools/wrap@^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.1.tgz#9e3d27d2723962c26c4377d5d7ab0d3038bf728c" - integrity sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg== +"@graphql-tools/wrap@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.2.tgz#87f510b5f35db2771e7743bc3d71059ee4adaf09" + integrity sha512-nb/YjBcyF02KBCy3hiyw0nBKIC+qkiDY/tGMCcIe4pM6BPEcnreaPhXA28Rdge7lKtySF4Mhbc86XafFH5bIkQ== dependencies: - "@graphql-tools/delegate" "^10.0.3" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/delegate" "^10.0.4" + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" tslib "^2.4.0" value-or-promise "^1.0.12" @@ -1276,7 +1276,7 @@ dependencies: vue "^3.2.19" -"@humanwhocodes/config-array@^0.11.13": +"@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== @@ -1295,34 +1295,34 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1365,88 +1365,88 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@parcel/watcher-android-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz#9c93763794153e4f76920994a423b6ea3257059d" - integrity sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA== +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== -"@parcel/watcher-darwin-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz#2c79c2abde16aa24cac67e555b60802fd13fe210" - integrity sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA== +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== -"@parcel/watcher-darwin-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz#23d82f198c5d033f047467c68d7c335f3df49b46" - integrity sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q== +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== -"@parcel/watcher-freebsd-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz#7310cc86abc27dacd57624bcdba1f0ba092e76df" - integrity sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA== +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== -"@parcel/watcher-linux-arm-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz#c31b76e695027eeb1078d3d6f1d641d0b900c335" - integrity sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ== +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== -"@parcel/watcher-linux-arm64-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz#56e09b86e9d8a4096f606be118b588da6e965080" - integrity sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg== +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== -"@parcel/watcher-linux-arm64-musl@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz#27ffd5ca5f510ecd638f9ad22e2e813049db54e7" - integrity sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng== +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== -"@parcel/watcher-linux-x64-glibc@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz#44cbbb1e5884a1ca900655f47a0775218318f934" - integrity sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ== +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== -"@parcel/watcher-linux-x64-musl@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz#4c33993618c8d5113722852806239cb80360494b" - integrity sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA== +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== -"@parcel/watcher-win32-arm64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz#2a172fd2fda95fe5389298ca3e70b5a96316162a" - integrity sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg== +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== -"@parcel/watcher-win32-ia32@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz#279225b2ebe1fadd3c5137c9b2365ad422656904" - integrity sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA== +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== -"@parcel/watcher-win32-x64@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz#93e0bd0ad1bda2c9a688764b9b30b71dc5b72a71" - integrity sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA== +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== -"@parcel/watcher@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.0.tgz#2d3c4ef8832a5cdfdbb76b914f022489933e664f" - integrity sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg== +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" optionalDependencies: - "@parcel/watcher-android-arm64" "2.4.0" - "@parcel/watcher-darwin-arm64" "2.4.0" - "@parcel/watcher-darwin-x64" "2.4.0" - "@parcel/watcher-freebsd-x64" "2.4.0" - "@parcel/watcher-linux-arm-glibc" "2.4.0" - "@parcel/watcher-linux-arm64-glibc" "2.4.0" - "@parcel/watcher-linux-arm64-musl" "2.4.0" - "@parcel/watcher-linux-x64-glibc" "2.4.0" - "@parcel/watcher-linux-x64-musl" "2.4.0" - "@parcel/watcher-win32-arm64" "2.4.0" - "@parcel/watcher-win32-ia32" "2.4.0" - "@parcel/watcher-win32-x64" "2.4.0" + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" "@peculiar/asn1-schema@^2.3.8": version "2.3.8" @@ -1490,32 +1490,6 @@ resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== -"@remirror/core-helpers@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@remirror/core-helpers/-/core-helpers-3.0.0.tgz#3a35c2346bc23ebc3cee585b7840b5567755c5f1" - integrity sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A== - dependencies: - "@remirror/core-constants" "^2.0.2" - "@remirror/types" "^1.0.1" - "@types/object.omit" "^3.0.0" - "@types/object.pick" "^1.3.2" - "@types/throttle-debounce" "^2.1.0" - case-anything "^2.1.13" - dash-get "^1.0.2" - deepmerge "^4.3.1" - fast-deep-equal "^3.1.3" - make-error "^1.3.6" - object.omit "^3.0.0" - object.pick "^1.3.0" - throttle-debounce "^3.0.1" - -"@remirror/types@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@remirror/types/-/types-1.0.1.tgz#768502497a0fbbc23338a1586b893f729310cf70" - integrity sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA== - dependencies: - type-fest "^2.19.0" - "@repeaterjs/repeater@^3.0.4": version "3.0.5" resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.5.tgz#b77571685410217a548a9c753aa3cdfc215bfc78" @@ -1530,119 +1504,119 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@tiptap/core@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.2.3.tgz#54375c27bcca81901e5316e056147ce0cbc89ba6" - integrity sha512-0l3p1/cuaQk8XFf+Ft/ExbUjReGes5Iep7y4nuL/Fzi2S92DZzozY6cosXBHC/Xsqzn6zIkl/gnQTgmTvlmhCQ== +"@tiptap/core@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.2.4.tgz#6f957678eb733e70b9282fb5098d284a77bd09a3" + integrity sha512-cRrI8IlLIhCE1hacBQzXIC8dsRvGq6a4lYWQK/BaHuZg21CG7szp3Vd8Ix+ra1f5v0xPOT+Hy+QFNQooRMKMCw== -"@tiptap/extension-blockquote@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.2.3.tgz#0951a321f56c70b3f276e11bd17fa1ff109042e7" - integrity sha512-gN23d/ADhTOB0YIM4lR0VrVczdyaXpmIVYYWZ45tQEVJzFWRSIScE9m9NaVqtqwEMpYHyTHxLth0OQutZ91sog== +"@tiptap/extension-blockquote@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.2.4.tgz#d733bea016986c0017e308a2540378c9551c7f10" + integrity sha512-FrfPnn0VgVrUwWLwja1afX99JGLp6PE9ThVcmri+tLwUZQvTTVcCvHoCdOakav3/nge1+aV4iE3tQdyq1tWI9Q== -"@tiptap/extension-bold@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.2.3.tgz#e4cd91de4e8dbdabd915bbc10c86eda321e91d17" - integrity sha512-bHeFkRY5+Nf2DKupstV8EIVn359tw/9MFwDEDoF9F+Sn/vjuS35vm0OqjXYg/Ya9CQvwl/2oym/fKv5kO+Q6og== +"@tiptap/extension-bold@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.2.4.tgz#3690eea1ebef49f8d30043fdcfc7bf2866a9b887" + integrity sha512-v3tTLc8YESFZPOGj5ByFr8VbmQ/PTo49T1vsK50VubxIN/5r9cXlKH8kb3dZlZxCxJa3FrXNO/M8rdGBSWQvSg== -"@tiptap/extension-bubble-menu@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.2.3.tgz#e3b603324726aa2f96b2500855622ace625117df" - integrity sha512-6ybColxLznGilzOY/yk3KcpV4JQy+QDDW6Za6zWV6OEs9D8I8VUeMAS77isMMc1dffvHfmgZpVZm/lsva8UuCw== +"@tiptap/extension-bubble-menu@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.2.4.tgz#2477901c78a18c629f7ae828394ff1f91a500c60" + integrity sha512-Nx1fS9jcFlhxaTDYlnayz2UulhK6CMaePc36+7PQIVI+u20RhgTCRNr25zKNemvsiM0RPZZVUjlHkxC0l5as1Q== dependencies: tippy.js "^6.3.7" -"@tiptap/extension-bullet-list@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.2.3.tgz#98b82afd9a6c553278d4b613b29dbed99da063f9" - integrity sha512-BpYg1pIfLE+2LTC90ts53deEWGSmAojhM/jJ84U19qfbfXt/7/KHrZJ4SAMxJSW3pLpy0bIq2XuOuvppOYVR5g== +"@tiptap/extension-bullet-list@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.2.4.tgz#1763ae7686bc3f209c1662d571e738280d190ff8" + integrity sha512-z/MPmW8bhRougMuorl6MAQBXeK4rhlP+jBWlNwT+CT8h5IkXqPnDbM1sZeagp2nYfVV6Yc4RWpzimqHHtGnYTA== -"@tiptap/extension-code-block@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.2.3.tgz#caeaad4f4ccf92963e73ddf1b90265edd94c7af3" - integrity sha512-1xFM2Aj/JEWAT1PWjQ/7hEVmo1Av6JHxTANxMIjXUcmrMJkXDA+BQ7yItlwrrHxY0SJdxBbR/WWFn4dWIxd7iA== +"@tiptap/extension-code-block@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.2.4.tgz#6d72f3e458cf417a4be6b9cc1f9409ad89f55b78" + integrity sha512-h6WV9TmaBEZmvqe1ezMR83DhCPUap6P2mSR5pwVk0WVq6rvZjfgU0iF3EetBJOeDgPlz7cNe2NMDfVb1nGTM/g== -"@tiptap/extension-code@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.2.3.tgz#183847b126496f9d4d473a72b7e1d2ab2a90da68" - integrity sha512-ZMp3CrbAV+PVOnPbGmruvlxFENLc+J/Fos8Y4mWvS1nDbrGuu19OKgKimwdzfDBpZVFVnHpEUnDTMBDzDe0hkg== +"@tiptap/extension-code@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.2.4.tgz#ba77dc56daac75bdf83a2aaecff896e9301c2cdf" + integrity sha512-JB4SJ2mUU/9qXFUf+K5K9szvovnN9AIcCb0f0UlcVBuddKHSqCl3wO3QJgYt44BfQTLMNuyzr+zVqfFd6BNt/g== -"@tiptap/extension-document@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.2.3.tgz#40e4faac7369d0fea31ea4eb57716ed7393f24b7" - integrity sha512-60Egd9yKb5SzpQlstQAP2A/2a/Qr+A+TblMRKZugrT+NENUhAj6Tx1HxWlblqGu2MsS1iXvQLZ6BQO1jHkL2IQ== +"@tiptap/extension-document@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.2.4.tgz#d46c1fdd1ea5b7191112fae4e9f8a63a46309afc" + integrity sha512-z+05xGK0OFoXV1GL+/8bzcZuWMdMA3+EKwk5c+iziG60VZcvGTF7jBRsZidlu9Oaj0cDwWHCeeo6L9SgSh6i2A== -"@tiptap/extension-dropcursor@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.2.3.tgz#f58f37b41cc6b41ae047c9b3ce25db58b1c06bb7" - integrity sha512-SFvxgVX8/l3H+fV1q6dwmVEwlHuGbaKp1pkQb16/cDiWke/AWOBFTGOIVDfulLI5IiRIL7u3uc+Fy7BXrGDqQw== +"@tiptap/extension-dropcursor@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.2.4.tgz#df39861159a022029f733924e9a3977a76dfed17" + integrity sha512-IHwkEKmqpqXyJi16h7871NrcIqeyN7I6XRE2qdqi+MhGigVWI8nWHoYbjRKa7K/1uhs5zeRYyDlq5EuZyL6mgA== -"@tiptap/extension-floating-menu@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.2.3.tgz#3e200f51760fd1d48cb572223dcaf54c70f244a6" - integrity sha512-ZeQGmIFNImhu/zzn//Xzupwa82j2vIwiMoviX2zd+2DutoFnm4qRIAU6qpjzV+ZOSHAq3aBMGnYwEAY6vl4f3g== +"@tiptap/extension-floating-menu@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.2.4.tgz#a97becec8cedfa1fb282a7a52caed35a80098581" + integrity sha512-U25l7PEzOmlAPugNRl8t8lqyhQZS6W/+3f92+FdwW9qXju3i62iX/3OGCC3Gv+vybmQ4fbZmMjvl+VDfenNi3A== dependencies: tippy.js "^6.3.7" -"@tiptap/extension-gapcursor@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.2.3.tgz#d6e064bea103433d6a365a06f9f78acc33b27971" - integrity sha512-zPVpxembkuOQL/eJ5oAjvZ9Tyv480OpViKrNtOsQh+0nZctmWKnfDntMoWBZiSeW1vsGjkeFIckdeEAQ1KbIxA== +"@tiptap/extension-gapcursor@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.2.4.tgz#607b2682376c5ced086258f8329eb080e8047627" + integrity sha512-Y6htT/RDSqkQ1UwG2Ia+rNVRvxrKPOs3RbqKHPaWr3vbFWwhHyKhMCvi/FqfI3d5pViVHOZQ7jhb5hT/a0BmNw== -"@tiptap/extension-hard-break@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.2.3.tgz#7d7b8e7bcf99be5f518a705c65ebcc1dacaaa514" - integrity sha512-P7sP4WBEaQyiiFAswy9lKvaUWUAUwnfTSN3svTAgx0fpU3/ZeVWg+SDi5ve474Ym2oz2eRAr09mNTdWEUsL32Q== +"@tiptap/extension-hard-break@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.2.4.tgz#2be463b2f23fc8f57004f3481829aa0b236c17f6" + integrity sha512-FPvS57GcqHIeLbPKGJa3gnH30Xw+YB1PXXnAWG2MpnMtc2Vtj1l5xaYYBZB+ADdXLAlU0YMbKhFLQO4+pg1Isg== -"@tiptap/extension-heading@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.2.3.tgz#4934e3a887d8843f85706a809fd6293b2b42b2b5" - integrity sha512-7atctuvtwPqIAdnBPOhAMsJZd41UPnWN3CktzgzfsfEoplq/86QR1hGIE4JXVB2wAZDmbnKP9Fe8PCNr7Q8JCQ== +"@tiptap/extension-heading@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.2.4.tgz#a90469a879713dc074ce45e3d7d8cf7a02ae6a1f" + integrity sha512-gkq7Ns2FcrOCRq7Q+VRYt5saMt2R9g4REAtWy/jEevJ5UV5vA2AiGnYDmxwAkHutoYU0sAUkjqx37wE0wpamNw== -"@tiptap/extension-history@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.2.3.tgz#5df2f5bb7f082e13db72583c1236e7c2f41b901f" - integrity sha512-S1TUfLtrasyv4zFNlBL302uYaR4wxqR/T36a4d71c0ozr0PsdVc6/f9lfH4aYw4PmS3fzDwJj0PAJ9bb+qDbPw== +"@tiptap/extension-history@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.2.4.tgz#2d37ccfce9a8b7997bb4d46ebb19e986c5eb6f39" + integrity sha512-FDM32XYF5NU4mzh+fJ8w2CyUqv0l2Nl15sd6fOhQkVxSj8t57z+DUXc9ZR3zkH+1RAagYJo/2Gu3e99KpMr0tg== -"@tiptap/extension-horizontal-rule@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.2.3.tgz#ff76b7627b6fea3ba5397fbfccd818f0f2e6efbd" - integrity sha512-pc0J0hBcvj9ymJkFau1W/3L+OhB1PQzMjsx4ZWJvxURL8U7zdDqvYvJjfCA0i5Qw2ZuSVXFACGbEVr6NoCMRAw== +"@tiptap/extension-horizontal-rule@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.2.4.tgz#e1fc33a05d337c2871180f569a7af1774c74658a" + integrity sha512-iCRHjFQQHApWg3R4fkKkJQhWEOdu1Fdc4YEAukdOXPSg3fg36IwjvsMXjt9SYBtVZ+iio3rORCZGXyMvgCH9uw== -"@tiptap/extension-italic@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.2.3.tgz#d01e075bf0db5ac01113a19ab80cc39af39033fc" - integrity sha512-SSsFuRnm4Y4Qnc6EuvmA4iarLCt/sg8qkqCKiNPjDUP5JR8HGESeoYVjQzprLHY8jusT9qoC26TP1Sin5vZmWQ== +"@tiptap/extension-italic@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.2.4.tgz#67403ec3aed630062c7063b7e9e7699d07db683e" + integrity sha512-qIhGNvWnsQswSgEMRA8jQQjxfkOGNAuNWKEVQX9DPoqAUgknT41hQcAMP8L2+OdACpb2jbVMOO5Cy5Dof2L8/w== -"@tiptap/extension-list-item@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.2.3.tgz#dfdc268cc2063947dc46749464d6d91afc0842a4" - integrity sha512-eyfk4f1jOioj+mkIN2m6XQK61MpV0fi17utt8VNx893Td8kS0g7HHuuYMwyjIRtG35ENUaAt7c216JQwnLsrAw== +"@tiptap/extension-list-item@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.2.4.tgz#2412dd92e51c3cbc4f2abc3c38ec2ab8348c1af9" + integrity sha512-lPLKGKsHpM9ClUa8n7GEUn8pG6HCYU0vFruIy3l2t6jZdHkrgBnYtVGMZ13K8UDnj/hlAlccxku0D0P4mA1Vrg== -"@tiptap/extension-ordered-list@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.2.3.tgz#07588d9091076e0577f5e4873e2e65c27d69a7be" - integrity sha512-YIWpjkHAJN74tY185ZqatlG4+KbXQOdkJpc5cKWqO89gVWLi7+4xwdeeXbTEG64/LOOWS4Q6r1/EJmDy2FCbyA== +"@tiptap/extension-ordered-list@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.2.4.tgz#dfa6c6869a3d16fe5b2a10749ffe5b999346efd2" + integrity sha512-TpFy140O9Af1JciXt+xwqYUXxcJ6YG8zi/B5UDJujp+FH5sCmlYYBBnWxiFMhVaj6yEmA2eafu1qUkic/1X5Aw== -"@tiptap/extension-paragraph@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.2.3.tgz#39e705198eba640a57f58276044950d3d77067ff" - integrity sha512-4dP+Ecb2iEWW33ckFKjXRnSfEygaFUN19qzc7mUYD8e61ZA8caWL6//uL7DFIz4Q1rchyefbU52gCwTh2P42kQ== +"@tiptap/extension-paragraph@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.2.4.tgz#9126fafbf984e324bfb3fab34deb689def7eb98d" + integrity sha512-m1KwyvTNJxsq7StbspbcOhxO4Wk4YpElDbqOouWi+H4c8azdpI5Pn96ZqhFeE9bSyjByg6OcB/wqoJsLbeFWdQ== -"@tiptap/extension-strike@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.2.3.tgz#9caaca60d4f717863b03a8ade71af22a1579096c" - integrity sha512-3wwFk01ociZajRzD08hp4j/4isFUeD6BIkKPDnZeGD5HKPdTOaDciE3dJ3JaZZrRZPPdPV3yMt5hkBOapqEKzQ== +"@tiptap/extension-strike@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.2.4.tgz#f987a6fe7b85e3179b413792ae3f33dd9c086e01" + integrity sha512-/a2EwQgA+PpG17V2tVRspcrIY0SN3blwcgM7lxdW4aucGkqSKnf7+91dkhQEwCZ//o8kv9mBCyRoCUcGy6S5Xg== -"@tiptap/extension-text@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.2.3.tgz#3adc14b6f5956f2fb6102702beb0adbfe1f86131" - integrity sha512-BrWGCkmuzVcsNy7dSCfJyVwedPzeNz6BR/OUNzM8Mqt2KSxfoIRy7cg16HvFB4YW+ijrM9XUqDIFvqYI0TY+Jg== +"@tiptap/extension-text@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.2.4.tgz#aa101c568aa78a4ddc06a944eefcd3ac944987d4" + integrity sha512-NlKHMPnRJXB+0AGtDlU0P2Pg+SdesA2lMMd7JzDUgJgL7pX2jOb8eUqSeOjFKuSzFSqYfH6C3o6mQiNhuQMv+g== -"@tiptap/pm@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.2.3.tgz#88c8547015098ebd438211e839de64b043b655f3" - integrity sha512-jYZX+0fjN+a1J8qY72Poz1LK6X6oHVQkJIq6qzcx3rm0voYZNVRzP2GIfzstncZiEqRXABHY3mWfOi2I4K9tQA== +"@tiptap/pm@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.2.4.tgz#701975e3221ac40b1bfba52d89e1345024212411" + integrity sha512-Po0klR165zgtinhVp1nwMubjyKx6gAY9kH3IzcniYLCkqhPgiqnAcCr61TBpp4hfK8YURBS4ihvCB1dyfCyY8A== dependencies: prosemirror-changeset "^2.2.1" prosemirror-collab "^1.3.1" @@ -1663,38 +1637,38 @@ prosemirror-transform "^1.8.0" prosemirror-view "^1.32.7" -"@tiptap/starter-kit@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.2.3.tgz#d7583bf518147f0561981372a6410b083fd47a6d" - integrity sha512-Jx+QXz0SE1y+j498TqYEJcjbIV9YSMwcuIJQ04q8KqHuSmZrq9B22Qa4d0fpcM7uL7dLI4AcRrcqaOuIahCJYQ== - dependencies: - "@tiptap/core" "^2.2.3" - "@tiptap/extension-blockquote" "^2.2.3" - "@tiptap/extension-bold" "^2.2.3" - "@tiptap/extension-bullet-list" "^2.2.3" - "@tiptap/extension-code" "^2.2.3" - "@tiptap/extension-code-block" "^2.2.3" - "@tiptap/extension-document" "^2.2.3" - "@tiptap/extension-dropcursor" "^2.2.3" - "@tiptap/extension-gapcursor" "^2.2.3" - "@tiptap/extension-hard-break" "^2.2.3" - "@tiptap/extension-heading" "^2.2.3" - "@tiptap/extension-history" "^2.2.3" - "@tiptap/extension-horizontal-rule" "^2.2.3" - "@tiptap/extension-italic" "^2.2.3" - "@tiptap/extension-list-item" "^2.2.3" - "@tiptap/extension-ordered-list" "^2.2.3" - "@tiptap/extension-paragraph" "^2.2.3" - "@tiptap/extension-strike" "^2.2.3" - "@tiptap/extension-text" "^2.2.3" - -"@tiptap/vue-3@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.2.3.tgz#f9e9892a12785a8998c3e3934d4c2614b38de0e4" - integrity sha512-TC+pncpxP6GHgM+qvX/1mfT+Xl3OlEekZqjetNJC/MfFM55OL5dIEu5kVjOiRsGQ/TWgwBGPrRYEE0Y1D6FuBA== +"@tiptap/starter-kit@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.2.4.tgz#7d9c35fc423bb0bb6a9b2e660c41a080d8caa7e7" + integrity sha512-Kbk7qUfIZg3+bNa3e/wBeDQt4jJB46uQgM+xy5NSY6H8NZP6gdmmap3aIrn9S/W/hGpxJl4RcXAeaT0CQji9XA== + dependencies: + "@tiptap/core" "^2.2.4" + "@tiptap/extension-blockquote" "^2.2.4" + "@tiptap/extension-bold" "^2.2.4" + "@tiptap/extension-bullet-list" "^2.2.4" + "@tiptap/extension-code" "^2.2.4" + "@tiptap/extension-code-block" "^2.2.4" + "@tiptap/extension-document" "^2.2.4" + "@tiptap/extension-dropcursor" "^2.2.4" + "@tiptap/extension-gapcursor" "^2.2.4" + "@tiptap/extension-hard-break" "^2.2.4" + "@tiptap/extension-heading" "^2.2.4" + "@tiptap/extension-history" "^2.2.4" + "@tiptap/extension-horizontal-rule" "^2.2.4" + "@tiptap/extension-italic" "^2.2.4" + "@tiptap/extension-list-item" "^2.2.4" + "@tiptap/extension-ordered-list" "^2.2.4" + "@tiptap/extension-paragraph" "^2.2.4" + "@tiptap/extension-strike" "^2.2.4" + "@tiptap/extension-text" "^2.2.4" + +"@tiptap/vue-3@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.2.4.tgz#e253f32cb9a70736b6c345967879c5fcf2ac4ab5" + integrity sha512-6Rue56OUmDl/OT07QcLsH1UvYGUmV8OFSDCrLrUyku/2lAYHwHz6+KhAB5paZt70nEGIw03G1KCT074negj6NQ== dependencies: - "@tiptap/extension-bubble-menu" "^2.2.3" - "@tiptap/extension-floating-menu" "^2.2.3" + "@tiptap/extension-bubble-menu" "^2.2.4" + "@tiptap/extension-floating-menu" "^2.2.4" "@trivago/prettier-plugin-sort-imports@^4.3.0": version "4.3.0" @@ -1752,31 +1726,16 @@ integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== "@types/node@*": - version "20.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" - integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + version "20.11.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" + integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== dependencies: undici-types "~5.26.4" -"@types/object.omit@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/object.omit/-/object.omit-3.0.3.tgz#cc52b1d9774c1619b5c6fc50229d087f01eabd68" - integrity sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew== - -"@types/object.pick@^1.3.2": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/object.pick/-/object.pick-1.3.4.tgz#1a38b6e69a35f36ec2dcc8b9f5ffd555c1c4d7fc" - integrity sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA== - "@types/semver@^7.5.0": - version "7.5.7" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" - integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== - -"@types/throttle-debounce@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" - integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/web-bluetooth@^0.0.20": version "0.0.20" @@ -1807,16 +1766,16 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/eslint-plugin@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz#407daffe09d964d57aceaf3ac51846359fbe61b0" - integrity sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ== +"@typescript-eslint/eslint-plugin@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz#dd71fc5c7ecec745ca26ece506d84d203a205c0e" + integrity sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.0.1" - "@typescript-eslint/type-utils" "7.0.1" - "@typescript-eslint/utils" "7.0.1" - "@typescript-eslint/visitor-keys" "7.0.1" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/type-utils" "7.1.1" + "@typescript-eslint/utils" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -1835,15 +1794,15 @@ "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/parser@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.0.1.tgz#e9c61d9a5e32242477d92756d36086dc40322eed" - integrity sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ== +"@typescript-eslint/parser@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.1.tgz#6a9d0a5c9ccdf5dbd3cb8c949728c64e24e07d1f" + integrity sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ== dependencies: - "@typescript-eslint/scope-manager" "7.0.1" - "@typescript-eslint/types" "7.0.1" - "@typescript-eslint/typescript-estree" "7.0.1" - "@typescript-eslint/visitor-keys" "7.0.1" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/typescript-estree" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" "@typescript-eslint/scope-manager@6.21.0": @@ -1854,13 +1813,13 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/scope-manager@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.0.1.tgz#611ec8e78c70439b152a805e1b10aaac36de7c00" - integrity sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w== +"@typescript-eslint/scope-manager@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz#9e301803ff8e21a74f50c6f89a4baccad9a48f93" + integrity sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA== dependencies: - "@typescript-eslint/types" "7.0.1" - "@typescript-eslint/visitor-keys" "7.0.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" "@typescript-eslint/type-utils@6.21.0": version "6.21.0" @@ -1872,13 +1831,13 @@ debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.0.1.tgz#0fba92c1f81cad561d7b3adc812aa1cc0e35cdae" - integrity sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw== +"@typescript-eslint/type-utils@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz#aee820d5bedd39b83c18585a526cc520ddb7a226" + integrity sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g== dependencies: - "@typescript-eslint/typescript-estree" "7.0.1" - "@typescript-eslint/utils" "7.0.1" + "@typescript-eslint/typescript-estree" "7.1.1" + "@typescript-eslint/utils" "7.1.1" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -1887,10 +1846,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.0.1.tgz#dcfabce192db5b8bf77ea3c82cfaabe6e6a3c901" - integrity sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg== +"@typescript-eslint/types@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.1.tgz#ca33ba7cf58224fb46a84fea62593c2c53cd795f" + integrity sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -1906,13 +1865,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.1.tgz#1d52ac03da541693fa5bcdc13ad655def5046faf" - integrity sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig== +"@typescript-eslint/typescript-estree@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz#09c54af0151a1b05d0875c0fc7fe2ec7a2476ece" + integrity sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw== dependencies: - "@typescript-eslint/types" "7.0.1" - "@typescript-eslint/visitor-keys" "7.0.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/visitor-keys" "7.1.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1933,17 +1892,17 @@ "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" -"@typescript-eslint/utils@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.0.1.tgz#b8ceac0ba5fef362b4a03a33c0e1fedeea3734ed" - integrity sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA== +"@typescript-eslint/utils@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.1.tgz#bdeeb789eee4af5d3fb5400a69566d4dbf97ff3b" + integrity sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.0.1" - "@typescript-eslint/types" "7.0.1" - "@typescript-eslint/typescript-estree" "7.0.1" + "@typescript-eslint/scope-manager" "7.1.1" + "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/typescript-estree" "7.1.1" semver "^7.5.4" "@typescript-eslint/visitor-keys@6.21.0": @@ -1954,12 +1913,12 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.1.tgz#864680ac5a8010ec4814f8a818e57595f79f464e" - integrity sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw== +"@typescript-eslint/visitor-keys@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz#e6538a58c9b157f03bcbb29e3b6a92fe39a6ab0d" + integrity sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ== dependencies: - "@typescript-eslint/types" "7.0.1" + "@typescript-eslint/types" "7.1.1" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -1967,44 +1926,44 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@unhead/dom@1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@unhead/dom/-/dom-1.8.10.tgz#18505665a021d924645fedda18deb8fc8b2e81c3" - integrity sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw== +"@unhead/dom@1.8.11": + version "1.8.11" + resolved "https://registry.yarnpkg.com/@unhead/dom/-/dom-1.8.11.tgz#217c0d70a5659554f1cb589cbad65a950c48e084" + integrity sha512-B5Bae4Y+6/2oDlfNJwEuf1kApyM4pmZ01VReWcVDYAdZpkD7eZZoVZnF945MluaMb6SMvGIXejcSUXTH/BOWaQ== dependencies: - "@unhead/schema" "1.8.10" - "@unhead/shared" "1.8.10" + "@unhead/schema" "1.8.11" + "@unhead/shared" "1.8.11" -"@unhead/schema@1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@unhead/schema/-/schema-1.8.10.tgz#40e2578a006ae212b5afe7a44bd556846c32ea2e" - integrity sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA== +"@unhead/schema@1.8.11": + version "1.8.11" + resolved "https://registry.yarnpkg.com/@unhead/schema/-/schema-1.8.11.tgz#87600f4afd9059679cd7f9eee3ae1c1627669a53" + integrity sha512-Aok9sZcVznJxjBRF/v2LKaeoqgYU/9kuyknYhf3M13byrdp3dLD6qcUvnLC98PrPVy7CMfOov4kXHoI/DRY5MQ== dependencies: hookable "^5.5.3" zhead "^2.2.4" -"@unhead/shared@1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@unhead/shared/-/shared-1.8.10.tgz#86e02d7961fb7d523238a21c3532e5042aceb399" - integrity sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw== +"@unhead/shared@1.8.11": + version "1.8.11" + resolved "https://registry.yarnpkg.com/@unhead/shared/-/shared-1.8.11.tgz#1b5e6703e6920f6979fe69dea153d90c43814622" + integrity sha512-Mz3pAJUq160mPXYFNUalfyEDQ0a6eRIbMlJFQ7HNy8shM+4kbeKgInoaa2EaFF8zRrhYvuLJZhyLk5kFINSmBg== dependencies: - "@unhead/schema" "1.8.10" + "@unhead/schema" "1.8.11" -"@urql/core@>=4.2.0", "@urql/core@^4.0.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-4.2.3.tgz#f956e8a33c4bd055c0c5151491843dd46d737f0f" - integrity sha512-DJ9q9+lcs5JL8DcU2J3NqsgeXYJva+1+Qt8HU94kzTPqVOIRRA7ouvy4ksUfPY+B5G2PQ+vLh+JJGyZCNXv0cg== +"@urql/core@>=4.3.0", "@urql/core@^4.0.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-4.3.0.tgz#5e150412ed08d167861b05ceed417abbd048553f" + integrity sha512-wT+FeL8DG4x5o6RfHEnONNFVDM3616ouzATMYUClB6CB+iIu2mwfBKd7xSUxYOZmwtxna5/hDRQdMl3nbQZlnw== dependencies: "@0no-co/graphql.web" "^1.0.1" wonka "^6.3.2" -"@urql/exchange-graphcache@^6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@urql/exchange-graphcache/-/exchange-graphcache-6.4.1.tgz#56c705979cd56abe9ce3ced5a708fd1063134720" - integrity sha512-hWa4/5B7Op93oA6yWvffPU3L0XH55tlluEaq6aoFE9zsiNhktFjhp/SU2CKvSD8iD0Tfreoo63drv64Ad0+Gxw== +"@urql/exchange-graphcache@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@urql/exchange-graphcache/-/exchange-graphcache-6.5.0.tgz#718cdc421bbfbcfa661c53acb8d288e58ddd27be" + integrity sha512-+eR9ErKwmmrBjPXgV6TJqAAxmIcuc87s8dbMv962xsRzmyDI6lTDZ5FfGwJs3Jl6LEPEWx40en8/Qm8awK03LA== dependencies: "@0no-co/graphql.web" "^1.0.1" - "@urql/core" ">=4.2.0" + "@urql/core" ">=4.3.0" wonka "^6.3.2" "@urql/vue@^1.1.2": @@ -2020,71 +1979,71 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz#508d6a0f2440f86945835d903fcc0d95d1bb8a37" integrity sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ== -"@volar/language-core@1.11.1", "@volar/language-core@~1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.11.1.tgz#ecdf12ea8dc35fb8549e517991abcbf449a5ad4f" - integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw== +"@volar/language-core@2.1.1", "@volar/language-core@~2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.1.1.tgz#ea7c2448ac5bdb2dd2ed202e5ff57929cb8ef191" + integrity sha512-oVbZcj97+5zlowkHMSJMt3aaAFuFyhXeXoOEHcqGECxFvw1TPCNnMM9vxhqNpoiNeWKHvggoq9WCk/HzJHtP8A== dependencies: - "@volar/source-map" "1.11.1" + "@volar/source-map" "2.1.1" -"@volar/source-map@1.11.1", "@volar/source-map@~1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.11.1.tgz#535b0328d9e2b7a91dff846cab4058e191f4452f" - integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg== +"@volar/source-map@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.1.1.tgz#9ca00177177417496a0364cea2f965445e19abb2" + integrity sha512-OOtxrEWB2eZ+tnCy5JwDkcCPGlN3+ioNNzkywXE9k4XA7p4cN36frR7QPAOksvd7RXKUGHzSjq6XrYnTPa4z4Q== dependencies: - muggle-string "^0.3.1" + muggle-string "^0.4.0" -"@volar/typescript@~1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.11.1.tgz#ba86c6f326d88e249c7f5cfe4b765be3946fd627" - integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ== +"@volar/typescript@~2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.1.1.tgz#b3dddaf39140cc0e00d67bad943496e2470a3882" + integrity sha512-5K41AWvFZCMMKZCx8bbFvbkyiKHr0s9k8P0M1FVXLX/9HYHzK5C9B8cX4uhATSehAytFIRnR4fTXVQtWp/Yzag== dependencies: - "@volar/language-core" "1.11.1" + "@volar/language-core" "2.1.1" path-browserify "^1.0.1" -"@vue/compiler-core@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.19.tgz#3161b1ede69da00f3ce8155dfab907a3eaa0515e" - integrity sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w== +"@vue/compiler-core@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a" + integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og== dependencies: "@babel/parser" "^7.23.9" - "@vue/shared" "3.4.19" + "@vue/shared" "3.4.21" entities "^4.5.0" estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.4.19", "@vue/compiler-dom@^3.3.0": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz#2457e57e978f431e3b5fd11fc50a3e92d5816f9a" - integrity sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA== +"@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.4.0": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" + integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA== dependencies: - "@vue/compiler-core" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/compiler-core" "3.4.21" + "@vue/shared" "3.4.21" -"@vue/compiler-sfc@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz#33b238ded6d63e51f6a7048b742626f6007df129" - integrity sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg== +"@vue/compiler-sfc@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" + integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== dependencies: "@babel/parser" "^7.23.9" - "@vue/compiler-core" "3.4.19" - "@vue/compiler-dom" "3.4.19" - "@vue/compiler-ssr" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/compiler-core" "3.4.21" + "@vue/compiler-dom" "3.4.21" + "@vue/compiler-ssr" "3.4.21" + "@vue/shared" "3.4.21" estree-walker "^2.0.2" - magic-string "^0.30.6" - postcss "^8.4.33" + magic-string "^0.30.7" + postcss "^8.4.35" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz#1f8ee06005ebbaa354f8783fad84e9f7ea4a69c2" - integrity sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw== +"@vue/compiler-ssr@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef" + integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q== dependencies: - "@vue/compiler-dom" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/compiler-dom" "3.4.21" + "@vue/shared" "3.4.21" -"@vue/devtools-api@^6.5.0": +"@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1": version "6.6.1" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83" integrity sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA== @@ -2106,79 +2065,77 @@ "@typescript-eslint/parser" "^6.7.0" vue-eslint-parser "^9.3.1" -"@vue/language-core@1.8.27": - version "1.8.27" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.27.tgz#2ca6892cb524e024a44e554e4c55d7a23e72263f" - integrity sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA== +"@vue/language-core@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.0.5.tgz#bd3502604ea785f4171815005997988563f18469" + integrity sha512-knGXuQqhDSO7QJr8LFklsiWa23N2ikehkdVxtc9UKgnyqsnusughS2Tkg7VN8Hqed35X0B52Z+OGI5OrT/8uxQ== dependencies: - "@volar/language-core" "~1.11.1" - "@volar/source-map" "~1.11.1" - "@vue/compiler-dom" "^3.3.0" - "@vue/shared" "^3.3.0" + "@volar/language-core" "~2.1.1" + "@vue/compiler-dom" "^3.4.0" + "@vue/shared" "^3.4.0" computeds "^0.0.1" minimatch "^9.0.3" - muggle-string "^0.3.1" path-browserify "^1.0.1" vue-template-compiler "^2.7.14" -"@vue/reactivity@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.19.tgz#8cf335d97d07881d8184cb23289289dc18b03f60" - integrity sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA== +"@vue/reactivity@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02" + integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw== dependencies: - "@vue/shared" "3.4.19" + "@vue/shared" "3.4.21" -"@vue/runtime-core@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.19.tgz#ef10357fdf3afdf68523b55424541000105e2aeb" - integrity sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw== +"@vue/runtime-core@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062" + integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA== dependencies: - "@vue/reactivity" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/reactivity" "3.4.21" + "@vue/shared" "3.4.21" -"@vue/runtime-dom@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.19.tgz#079141e31d9f47515b9595f29843d51011f88739" - integrity sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g== +"@vue/runtime-dom@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588" + integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw== dependencies: - "@vue/runtime-core" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/runtime-core" "3.4.21" + "@vue/shared" "3.4.21" csstype "^3.1.3" -"@vue/server-renderer@3.4.19": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.19.tgz#e6f8ff5268d0758766ca9835375218924d5f0eb6" - integrity sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw== +"@vue/server-renderer@3.4.21": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" + integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== dependencies: - "@vue/compiler-ssr" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/compiler-ssr" "3.4.21" + "@vue/shared" "3.4.21" -"@vue/shared@3.4.19", "@vue/shared@^3.3.0": - version "3.4.19" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.19.tgz#28105147811bcf1e6612bf1c9ab0c6d91ada019c" - integrity sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw== +"@vue/shared@3.4.21", "@vue/shared@^3.4.0": + version "3.4.21" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" + integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== -"@vueuse/core@^10.7.2": - version "10.7.2" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.7.2.tgz#78917803a29a0bca1803a6521fdf7ff873f6e72c" - integrity sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ== +"@vueuse/core@^10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.9.0.tgz#7d779a95cf0189de176fee63cee4ba44b3c85d64" + integrity sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg== dependencies: "@types/web-bluetooth" "^0.0.20" - "@vueuse/metadata" "10.7.2" - "@vueuse/shared" "10.7.2" - vue-demi ">=0.14.6" + "@vueuse/metadata" "10.9.0" + "@vueuse/shared" "10.9.0" + vue-demi ">=0.14.7" -"@vueuse/metadata@10.7.2": - version "10.7.2" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.7.2.tgz#ba0187ce138c287fd80301afc5b0d6a97e563633" - integrity sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ== +"@vueuse/metadata@10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.9.0.tgz#769a1a9db65daac15cf98084cbf7819ed3758620" + integrity sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA== -"@vueuse/shared@10.7.2": - version "10.7.2" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.7.2.tgz#746441fbc08072371dd600a55883422c83fd0cab" - integrity sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA== +"@vueuse/shared@10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.9.0.tgz#13af2a348de15d07b7be2fd0c7fc9853a69d8fe0" + integrity sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw== dependencies: - vue-demi ">=0.14.6" + vue-demi ">=0.14.7" "@whatwg-node/events@^0.0.3": version "0.0.3" @@ -2202,11 +2159,11 @@ web-streams-polyfill "^3.2.1" "@whatwg-node/fetch@^0.9.0": - version "0.9.16" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.16.tgz#c833eb714f41f5d2caf1a345bed7a05f56db7b16" - integrity sha512-mqasZiUNquRe3ea9+aCAuo81BR6vq5opUKprPilIHTnrg8a21Z1T1OrI+KiMFX8OmwO5HUJe/vro47lpj2JPWQ== + version "0.9.17" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.17.tgz#10e4ea2392926c8d41ff57e3156857e885317d3f" + integrity sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q== dependencies: - "@whatwg-node/node-fetch" "^0.5.5" + "@whatwg-node/node-fetch" "^0.5.7" urlpattern-polyfill "^10.0.0" "@whatwg-node/node-fetch@^0.3.6": @@ -2220,10 +2177,10 @@ fast-url-parser "^1.1.3" tslib "^2.3.1" -"@whatwg-node/node-fetch@^0.5.5": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.5.6.tgz#3ec2044ff66dd78134492b5f2f841bedf1cc73c9" - integrity sha512-cmAsGMHoI0S3AHi3CmD3ma1Q234ZI2JNmXyDyM9rLtbXejBKxU3ZWdhS+mzRIAyUxZCMGlFW1tHmROv0MDdxpw== +"@whatwg-node/node-fetch@^0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.5.7.tgz#88d231c4e377354580f317cd5bb719fa1868850d" + integrity sha512-YZA+N3JcW1eh2QRi7o/ij+M07M0dqID73ltgsOEMRyEc2UYVDbyomaih+CWCEZqBIDHw4KMDveXvv4SBZ4TLIw== dependencies: "@kamilkisiela/fast-url-parser" "^1.1.4" "@whatwg-node/events" "^0.1.0" @@ -2507,9 +2464,9 @@ camelcase@^5.0.0: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001587: - version "1.0.30001587" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" - integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== + version "1.0.30001594" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz#bea552414cd52c2d0c985ed9206314a696e685f5" + integrity sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g== capital-case@^1.0.4: version "1.0.4" @@ -2520,11 +2477,6 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" -case-anything@^2.1.13: - version "2.1.13" - resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.13.tgz#0cdc16278cb29a7fcdeb072400da3f342ba329e9" - integrity sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng== - chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2581,7 +2533,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -2760,11 +2712,6 @@ csstype@^3.1.3: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -dash-get@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dash-get/-/dash-get-1.0.2.tgz#4c9e9ad5ef04c4bf9d3c9a451f6f7997298dcc7c" - integrity sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ== - dataloader@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" @@ -2797,11 +2744,6 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -2856,9 +2798,9 @@ dot-case@^3.0.4: tslib "^2.0.3" dotenv@^16.0.0: - version "16.4.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" - integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== dset@^3.1.2: version "3.1.3" @@ -2866,9 +2808,9 @@ dset@^3.1.2: integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== electron-to-chromium@^1.4.668: - version "1.4.672" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.672.tgz#f8ce803b43898b7e91dcfcf70d6fd656b11a645d" - integrity sha512-YYCy+goe3UqZqa3MOQCI5Mx/6HdBLzXL/mkbGCEWL3sP3Z1BP9zqAzeD3YEmLZlespYGFtyM8tRp5i2vfaUGCA== + version "1.4.692" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz#82139d20585a4b2318a02066af7593a3e6bec993" + integrity sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA== emoji-regex@^8.0.0: version "8.0.0" @@ -2961,16 +2903,16 @@ eslint-plugin-prettier@^5.0.0, eslint-plugin-prettier@^5.1.3: prettier-linter-helpers "^1.0.0" synckit "^0.8.6" -eslint-plugin-vue@^9.21.1: - version "9.21.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz#da5629efa48527cec98278dca0daa90fada4caf7" - integrity sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw== +eslint-plugin-vue@^9.22.0: + version "9.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.22.0.tgz#e8a625adb0b6ce3b65635dd74fec8345146f8e26" + integrity sha512-7wCXv5zuVnBtZE/74z4yZ0CM8AjH6bk4MQGm7hZjUC2DBppKU5ioeOk5LGSg/s9a1ZJnIsdPLJpXnu1Rc+cVHg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" nth-check "^2.1.1" - postcss-selector-parser "^6.0.13" - semver "^7.5.4" + postcss-selector-parser "^6.0.15" + semver "^7.6.0" vue-eslint-parser "^9.4.2" xml-name-validator "^4.0.0" @@ -2987,16 +2929,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -3217,9 +3159,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== floating-vue@^5.2.2: version "5.2.2" @@ -3396,9 +3338,9 @@ has-property-descriptors@^1.0.1: es-define-property "^1.0.0" has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" @@ -3557,13 +3499,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-extendable@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3603,13 +3538,6 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" @@ -3651,11 +3579,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - isomorphic-ws@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -3871,18 +3794,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.30.0, magic-string@^0.30.6: - version "0.30.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.7.tgz#0cecd0527d473298679da95a2d7aeb8c64048505" - integrity sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA== +magic-string@^0.30.0, magic-string@^0.30.7: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - map-cache@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3980,10 +3898,10 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -muggle-string@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a" - integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== +muggle-string@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" + integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== mute-stream@0.0.8: version "0.0.8" @@ -4064,20 +3982,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.omit@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-3.0.0.tgz#0e3edc2fce2ba54df5577ff529f6d97bd8a522af" - integrity sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ== - dependencies: - is-extendable "^1.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4289,7 +4193,7 @@ postcss-scss@^4.0.3: resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== -postcss-selector-parser@^6.0.13: +postcss-selector-parser@^6.0.15: version "6.0.15" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== @@ -4297,7 +4201,7 @@ postcss-selector-parser@^6.0.13: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8.4.33, postcss@^8.4.35: +postcss@^8.4.35: version "8.4.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== @@ -4463,9 +4367,9 @@ prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, pr prosemirror-view "^1.27.0" prosemirror-tables@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.5.tgz#80f03394f5b9991f9693bcb3a90b6dba6b16254d" - integrity sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ== + version "1.3.7" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz#9d296bd432d2bc7dca90f14e5c3b5c5f61277f7a" + integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== dependencies: prosemirror-keymap "^1.1.2" prosemirror-model "^1.8.1" @@ -4474,12 +4378,11 @@ prosemirror-tables@^1.3.5: prosemirror-view "^1.13.3" prosemirror-trailing-node@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.7.tgz#ba782a7929f18bcae650b1c7082a2d10443eab19" - integrity sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q== + version "2.0.8" + resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz#233ddcbda72de06f9b5d758d2a65a8cac482ea10" + integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== dependencies: "@remirror/core-constants" "^2.0.2" - "@remirror/core-helpers" "^3.0.0" escape-string-regexp "^4.0.0" prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: @@ -4621,9 +4524,9 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^4.2.0, "rollup@npm:@rollup/wasm-node": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@rollup/wasm-node/-/wasm-node-4.11.0.tgz#9dc9c69781ad4c527688624380e8af3bcb4398e8" - integrity sha512-PY6U3z5xwHS/jm4RIHz9baVR43ojMyYfHJ8HKIVjfym2GalN8lAQKO/EPZ4xHrGgBjq+neWsPuNnlZFxwxhRMQ== + version "4.12.0" + resolved "https://registry.yarnpkg.com/@rollup/wasm-node/-/wasm-node-4.12.0.tgz#d131697bbbfca561e57c910841db97e8841a6b02" + integrity sha512-sqy3+YvV/uWX6bPZOR5PlEdH6xyMPXoelllRQ/uZ13tzy9f4pXZTbajnoWN8IHHXwTNKPiLzsePLiDEVmkxMNw== dependencies: "@types/estree" "1.0.5" optionalDependencies: @@ -4663,10 +4566,10 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.71.0: - version "1.71.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.0.tgz#b3085759b9b2ab503a977aecb7e91153bf941117" - integrity sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w== +sass@^1.71.1: + version "1.71.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" + integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -4682,7 +4585,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.6, semver@^7.5.4: +semver@^7.3.6, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -4867,11 +4770,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throttle-debounce@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" - integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== - through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4957,11 +4855,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - typescript@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" @@ -4978,9 +4871,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uc.micro@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.0.0.tgz#84b3c335c12b1497fd9e80fcd3bfa7634c363ff1" - integrity sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig== + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== unc-path-regex@^0.1.2: version "0.1.2" @@ -4992,14 +4885,14 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -unhead@^1.8.10: - version "1.8.10" - resolved "https://registry.yarnpkg.com/unhead/-/unhead-1.8.10.tgz#dd8aeda5ba3388e44f585dcd8f3d3e67d97e2cc1" - integrity sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ== +unhead@^1.8.11: + version "1.8.11" + resolved "https://registry.yarnpkg.com/unhead/-/unhead-1.8.11.tgz#40115ae948267f8fc5aa68589f9d39423d25e7b5" + integrity sha512-g1coK+pRv+RbeD4+hK76FV6Y++i5jY99CftKyP1ARQcLCbz0ri6+vBpWMS4d+h7x0DfWSCGm/wWkPQ1WXWHfRA== dependencies: - "@unhead/dom" "1.8.10" - "@unhead/schema" "1.8.10" - "@unhead/shared" "1.8.10" + "@unhead/dom" "1.8.11" + "@unhead/schema" "1.8.11" + "@unhead/shared" "1.8.11" hookable "^5.5.3" unixify@^1.0.0: @@ -5009,10 +4902,10 @@ unixify@^1.0.0: dependencies: normalize-path "^2.1.1" -unplugin-fluent-vue@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unplugin-fluent-vue/-/unplugin-fluent-vue-1.1.4.tgz#497522a48919753624a027b95998ce8a7327fa65" - integrity sha512-cnhw9Mqog/D9qjQ2qRcdaq6RhibphIbnIj2uwVX5gUGhmoJwN3x0QYhpTLV5eMjgrUHK3o/E/07FAa6nGfcMRg== +unplugin-fluent-vue@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unplugin-fluent-vue/-/unplugin-fluent-vue-1.2.0.tgz#ff1fed9ab18dca2be7d47c3b174468298c911923" + integrity sha512-6xjrOfhl0WTXI0UjTGDb3fz5eQeRCb49OZ6OMKpNjm2w1yHPtv4cOyETYxJijv8Av4e5bQUxa0kDB9OVQpbpjw== dependencies: "@fluent/syntax" "^0.19.0" "@rollup/pluginutils" "^5.0.0" @@ -5020,12 +4913,12 @@ unplugin-fluent-vue@^1.1.4: unplugin "^1.0.0" unplugin@^1.0.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.7.1.tgz#009571e3128640f4e327f33680d2db27afaf1e11" - integrity sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.8.1.tgz#4948da299e5dbeaf5a4068f25141dfb7459c43f9" + integrity sha512-NDAvOEnZmeSRRmjfD0FoLzfve2/9lqceO5bR4J/2V72zphnFdq7UYo3fg6F1y1HfZEaSHa+7bZgbEN+z5x8ZDQ== dependencies: acorn "^8.11.3" - chokidar "^3.5.3" + chokidar "^3.6.0" webpack-sources "^3.2.3" webpack-virtual-modules "^0.6.1" @@ -5078,10 +4971,10 @@ value-or-promise@^1.0.11, value-or-promise@^1.0.12: resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== -vite@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.3.tgz#dd072653a80225702265550a4700561740dfde55" - integrity sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew== +vite@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb" + integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q== dependencies: esbuild "^0.19.3" postcss "^8.4.35" @@ -5089,7 +4982,7 @@ vite@^5.1.3: optionalDependencies: fsevents "~2.3.3" -vue-demi@>=0.14.5, vue-demi@>=0.14.6, vue-demi@latest: +vue-demi@>=0.14.5, vue-demi@>=0.14.7, vue-demi@latest: version "0.14.7" resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2" integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA== @@ -5124,12 +5017,12 @@ vue-resize@^2.0.0-alpha.1: resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz#43eeb79e74febe932b9b20c5c57e0ebc14e2df3a" integrity sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg== -vue-router@^4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.2.5.tgz#b9e3e08f1bd9ea363fdd173032620bc50cf0e98a" - integrity sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw== +vue-router@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.3.0.tgz#d5913f27bf68a0a178ee798c3c88be471811a235" + integrity sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ== dependencies: - "@vue/devtools-api" "^6.5.0" + "@vue/devtools-api" "^6.5.1" vue-template-compiler@^2.7.14: version "2.7.16" @@ -5139,13 +5032,13 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.8.27: - version "1.8.27" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.27.tgz#feb2bb1eef9be28017bb9e95e2bbd1ebdd48481c" - integrity sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg== +vue-tsc@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-2.0.5.tgz#f491e24d74fcbf50cc3a71fce5ac2c99ee6335d9" + integrity sha512-e8WCgOVTrbmC04XPnI+IpaMTFYKaTm5s/MXFcvxO1l9kxzn+9FpGNVrBSlQE8VpTJaJg4kaBK1nj3NC20VJzjw== dependencies: - "@volar/typescript" "~1.11.1" - "@vue/language-core" "1.8.27" + "@volar/typescript" "~2.1.1" + "@vue/language-core" "2.0.5" semver "^7.5.4" vue-virtual-scroller@^2.0.0-beta.8: @@ -5157,16 +5050,16 @@ vue-virtual-scroller@^2.0.0-beta.8: vue-observe-visibility "^2.0.0-alpha.1" vue-resize "^2.0.0-alpha.1" -vue@^3.2.19, vue@^3.4.15, vue@^3.4.19: - version "3.4.19" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.19.tgz#f9ae0a44db86628548736ff04152830726a97263" - integrity sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw== +vue@^3.2.19, vue@^3.4.15, vue@^3.4.21: + version "3.4.21" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731" + integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA== dependencies: - "@vue/compiler-dom" "3.4.19" - "@vue/compiler-sfc" "3.4.19" - "@vue/runtime-dom" "3.4.19" - "@vue/server-renderer" "3.4.19" - "@vue/shared" "3.4.19" + "@vue/compiler-dom" "3.4.21" + "@vue/compiler-sfc" "3.4.21" + "@vue/runtime-dom" "3.4.21" + "@vue/server-renderer" "3.4.21" + "@vue/shared" "3.4.21" w3c-keyname@^2.2.0: version "2.2.8" @@ -5181,9 +5074,9 @@ wcwidth@^1.0.1: defaults "^1.0.3" web-streams-polyfill@^3.2.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz#32e26522e05128203a7de59519be3c648004343b" - integrity sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webcrypto-core@^1.7.8: version "1.7.8" @@ -5295,9 +5188,9 @@ yaml-ast-parser@^0.0.43: integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== yaml@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.0.tgz#2376db1083d157f4b3a452995803dbcf43b08140" + integrity sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ== yargs-parser@^18.1.2: version "18.1.3" diff --git a/kitsune-job-runner/Cargo.toml b/kitsune-job-runner/Cargo.toml index 3ecb67398..10a5273ee 100644 --- a/kitsune-job-runner/Cargo.toml +++ b/kitsune-job-runner/Cargo.toml @@ -13,7 +13,8 @@ eula = false [dependencies] athena = { path = "../lib/athena" } -clap = { version = "4.5.1", features = ["derive", "wrap_help"] } +clap = { version = "4.5.2", features = ["derive", "wrap_help"] } +just-retry = { path = "../lib/just-retry" } kitsune-config = { path = "../crates/kitsune-config" } kitsune-core = { path = "../crates/kitsune-core" } kitsune-db = { path = "../crates/kitsune-db" } @@ -22,10 +23,10 @@ kitsune-federation = { path = "../crates/kitsune-federation" } kitsune-federation-filter = { path = "../crates/kitsune-federation-filter" } kitsune-jobs = { path = "../crates/kitsune-jobs" } kitsune-observability = { path = "../crates/kitsune-observability" } -kitsune-retry-policies = { path = "../lib/kitsune-retry-policies" } kitsune-service = { path = "../crates/kitsune-service" } kitsune-url = { path = "../crates/kitsune-url" } -miette = { version = "7.1.0", features = ["fancy"] } +kitsune-wasm-mrf = { path = "../crates/kitsune-wasm-mrf" } +miette = { version = "7.2.0", features = ["fancy"] } mimalloc = "0.1.39" multiplex-pool = { path = "../lib/multiplex-pool" } redis = { version = "0.24.0", default-features = false, features = [ diff --git a/kitsune-job-runner/src/lib.rs b/kitsune-job-runner/src/lib.rs index 2bc11b02c..f5c2c529c 100644 --- a/kitsune-job-runner/src/lib.rs +++ b/kitsune-job-runner/src/lib.rs @@ -1,7 +1,8 @@ #[macro_use] extern crate tracing; -use athena::JobQueue; +use athena::{JobQueue, TaskTracker}; +use just_retry::RetryExt; use kitsune_config::job_queue::Configuration; use kitsune_db::PgPool; use kitsune_email::{ @@ -13,13 +14,12 @@ use kitsune_federation::{ }; use kitsune_federation_filter::FederationFilter; use kitsune_jobs::{JobRunnerContext, KitsuneContextRepo, Service}; -use kitsune_retry_policies::{futures_backoff_policy, RetryPolicy}; use kitsune_service::attachment::AttachmentService; use kitsune_url::UrlService; +use kitsune_wasm_mrf::MrfService; use multiplex_pool::RoundRobinStrategy; use redis::RedisResult; -use std::{ops::ControlFlow, sync::Arc, time::Duration}; -use tokio::task::JoinSet; +use std::{sync::Arc, time::Duration}; use typed_builder::TypedBuilder; const EXECUTION_TIMEOUT_DURATION: Duration = Duration::from_secs(30); @@ -30,6 +30,7 @@ pub struct JobDispatcherState { db_pool: PgPool, federation_filter: FederationFilter, mail_sender: Option>>, + mrf_service: MrfService, url_service: UrlService, } @@ -66,6 +67,7 @@ pub async fn run_dispatcher( .attachment_service(state.attachment_service) .db_pool(state.db_pool.clone()) .federation_filter(state.federation_filter) + .mrf_service(state.mrf_service) .url_service(state.url_service.clone()) .build(); let prepare_deliverer = PrepareDeliverer::builder() @@ -86,28 +88,29 @@ pub async fn run_dispatcher( }, }); - let mut job_joinset = JoinSet::new(); + let job_queue = Arc::new(job_queue); + let job_tracker = TaskTracker::new(); + job_tracker.close(); + loop { - let mut backoff_policy = futures_backoff_policy(); - loop { - let result = job_queue - .spawn_jobs( - num_job_workers - job_joinset.len(), - Arc::clone(&ctx), - &mut job_joinset, - ) - .await; + let _ = (|| { + let job_queue = Arc::clone(&job_queue); + let ctx = Arc::clone(&ctx); + let job_tracker = job_tracker.clone(); - if let ControlFlow::Continue(duration) = backoff_policy.should_retry(result) { - tokio::time::sleep(duration).await; - } else { - break; + async move { + job_queue + .spawn_jobs( + num_job_workers - job_tracker.len(), + Arc::clone(&ctx), + &job_tracker, + ) + .await } - } - - let _ = tokio::time::timeout(EXECUTION_TIMEOUT_DURATION, async { - while job_joinset.join_next().await.is_some() {} }) + .retry(just_retry::backoff_policy()) .await; + + let _ = tokio::time::timeout(EXECUTION_TIMEOUT_DURATION, job_tracker.wait()).await; } } diff --git a/kitsune-job-runner/src/main.rs b/kitsune-job-runner/src/main.rs index ab94471a0..8194d0da7 100644 --- a/kitsune-job-runner/src/main.rs +++ b/kitsune-job-runner/src/main.rs @@ -5,6 +5,7 @@ use kitsune_federation_filter::FederationFilter; use kitsune_job_runner::JobDispatcherState; use kitsune_service::{attachment::AttachmentService, prepare}; use kitsune_url::UrlService; +use kitsune_wasm_mrf::MrfService; use miette::IntoDiagnostic; use std::path::PathBuf; @@ -34,6 +35,7 @@ async fn main() -> miette::Result<()> { .await .into_diagnostic()?; + let mrf_service = MrfService::from_config(&config.mrf).await?; let url_service = UrlService::builder() .domain(config.url.domain) .scheme(config.url.scheme) @@ -58,6 +60,7 @@ async fn main() -> miette::Result<()> { .map(prepare::mail_sender) .transpose()?, ) + .mrf_service(mrf_service) .url_service(url_service) .build(); diff --git a/kitsune/Cargo.toml b/kitsune/Cargo.toml index efb1e7617..70bad3fcb 100644 --- a/kitsune/Cargo.toml +++ b/kitsune/Cargo.toml @@ -32,15 +32,15 @@ axum-extra = { version = "0.9.2", features = [ axum-flash = "0.8.0" blowocking = { path = "../lib/blowocking" } bytes = "1.5.0" -chrono = { version = "0.4.34", default-features = false } -clap = { version = "4.5.1", features = ["derive", "wrap_help"] } +chrono = { version = "0.4.35", default-features = false } +clap = { version = "4.5.2", features = ["derive", "wrap_help"] } cursiv = { path = "../lib/cursiv", features = ["axum"] } der = { version = "0.7.8", features = ["std"] } diesel = "2.1.4" diesel-async = "0.4.1" futures-util = "0.3.30" headers = "0.4.0" -http = "1.0.0" +http = "1.1.0" http-body-util = "0.1.0" http-signatures = { path = "../lib/http-signatures" } iso8601-timestamp = "0.2.17" @@ -66,9 +66,10 @@ kitsune-storage = { path = "../crates/kitsune-storage" } kitsune-type = { path = "../crates/kitsune-type" } kitsune-url = { path = "../crates/kitsune-url" } kitsune-util = { path = "../crates/kitsune-util" } +kitsune-wasm-mrf = { path = "../crates/kitsune-wasm-mrf" } kitsune-webfinger = { path = "../crates/kitsune-webfinger" } metrics = "=0.22.0" -miette = { version = "7.1.0", features = ["fancy"] } +miette = { version = "7.2.0", features = ["fancy"] } mimalloc = "0.1.39" mime = "0.3.17" mime_guess = { version = "2.0.4", default-features = false } @@ -78,14 +79,15 @@ oxide-auth-axum = "0.4.0" redis = { version = "0.24.0", default-features = false, features = [ "tokio-rustls-comp", ] } -rust-embed = { version = "8.2.0", features = ["include-exclude"] } +rust-embed = { version = "8.3.0", features = ["include-exclude"] } scoped-futures = "0.1.3" serde = { version = "1.0.197", features = ["derive"] } serde_urlencoded = "0.7.1" simd-json = "0.13.8" +simdutf8 = { version = "0.1.4", features = ["aarch64_neon"] } speedy-uuid = { path = "../lib/speedy-uuid" } strum = { version = "0.26.1", features = ["derive", "phf"] } -tempfile = "3.10.0" +tempfile = "3.10.1" thiserror = "1.0.57" time = "0.3.34" tokio = { version = "1.36.0", features = ["full"] } diff --git a/kitsune/src/error.rs b/kitsune/src/error.rs index f29cf246f..1de24ae55 100644 --- a/kitsune/src/error.rs +++ b/kitsune/src/error.rs @@ -56,6 +56,9 @@ pub enum Error { #[error(transparent)] Messaging(kitsune_messaging::BoxError), + #[error(transparent)] + Mrf(#[from] kitsune_wasm_mrf::Error), + #[error(transparent)] Multipart(#[from] MultipartError), diff --git a/kitsune/src/http/extractor/signed_activity.rs b/kitsune/src/http/extractor/signed_activity.rs index 0e0230340..7ff5fa87e 100644 --- a/kitsune/src/http/extractor/signed_activity.rs +++ b/kitsune/src/http/extractor/signed_activity.rs @@ -17,6 +17,7 @@ use http_body_util::BodyExt; use kitsune_core::{error::HttpError, traits::fetcher::AccountFetchOptions}; use kitsune_db::{model::account::Account, schema::accounts, PgPool}; use kitsune_type::ap::Activity; +use kitsune_wasm_mrf::Outcome; use scoped_futures::ScopedFutureExt; /// Parses the body into an ActivityPub activity and verifies the HTTP signature @@ -43,14 +44,40 @@ impl FromRequest for SignedActivity { let (mut parts, body) = req.with_limited_body().into_parts(); parts.uri = original_uri; - let activity: Activity = match body.collect().await { - Ok(body) => simd_json::from_reader(body.aggregate().reader()).map_err(Error::from)?, + let aggregated_body = match body.collect().await { + Ok(body) => body.to_bytes(), Err(error) => { debug!(?error, "Failed to buffer body"); return Err(StatusCode::INTERNAL_SERVER_ERROR.into_response()); } }; + let activity: Activity = + simd_json::from_reader(aggregated_body.clone().reader()).map_err(Error::from)?; + let Ok(str_body) = simdutf8::basic::from_utf8(&aggregated_body) else { + debug!("Malformed body. Not UTF-8"); + return Err(StatusCode::BAD_REQUEST.into_response()); + }; + + let Outcome::Accept(str_body) = state + .service + .mrf + .handle_incoming(activity.r#type.as_ref(), str_body) + .await + .map_err(Error::from)? + else { + debug!("sending rejection"); + return Err(StatusCode::BAD_REQUEST.into_response()); + }; + + let activity: Activity = match simd_json::from_reader(str_body.as_ref().as_bytes()) { + Ok(activity) => activity, + Err(error) => { + debug!(?error, "Malformed activity"); + return Err(StatusCode::BAD_REQUEST.into_response()); + } + }; + let ap_id = activity.actor.as_str(); let Some(remote_user) = state .fetcher diff --git a/kitsune/src/lib.rs b/kitsune/src/lib.rs index a3a6c0656..55b180744 100644 --- a/kitsune/src/lib.rs +++ b/kitsune/src/lib.rs @@ -40,6 +40,7 @@ use kitsune_service::{ user::UserService, }; use kitsune_url::UrlService; +use kitsune_wasm_mrf::MrfService; #[cfg(feature = "oidc")] use {futures_util::future::OptionFuture, kitsune_oidc::OidcService}; @@ -152,6 +153,8 @@ pub async fn initialise_state( .build() .unwrap(); + let mrf_service = MrfService::from_config(&config.mrf).await?; + let notification_service = NotificationService::builder() .db_pool(db_pool.clone()) .build(); @@ -225,6 +228,7 @@ pub async fn initialise_state( custom_emoji: custom_emoji_service, job: job_service, mailing: mailing_service, + mrf: mrf_service, notification: notification_service, post: post_service, instance: instance_service, diff --git a/kitsune/src/main.rs b/kitsune/src/main.rs index 77aa1ada9..123e410eb 100644 --- a/kitsune/src/main.rs +++ b/kitsune/src/main.rs @@ -40,6 +40,7 @@ async fn boot() -> miette::Result<()> { .db_pool(state.db_pool.clone()) .federation_filter(state.federation_filter.clone()) .mail_sender(state.service.mailing.sender()) + .mrf_service(state.service.mrf.clone()) .url_service(state.service.url.clone()) .build(); diff --git a/kitsune/src/oauth2/mod.rs b/kitsune/src/oauth2/mod.rs index 382a5cae2..5df192737 100644 --- a/kitsune/src/oauth2/mod.rs +++ b/kitsune/src/oauth2/mod.rs @@ -38,9 +38,7 @@ fn timestamp_to_chrono(ts: iso8601_timestamp::Timestamp) -> chrono::DateTime |input: &Zustand| input.federation_filter.clone(), JobService => |input: &Zustand| input.service.job.clone(), MailingService => |input: &Zustand| input.service.mailing.clone(), + MrfService => |input: &Zustand| input.service.mrf.clone(), NotificationService => |input: &Zustand| input.service.notification.clone(), PostService => |input: &Zustand| input.service.post.clone(), SearchService => |input: &Zustand| input.service.search.clone(), @@ -141,6 +143,7 @@ pub struct Service { pub custom_emoji: CustomEmojiService, pub job: JobService, pub mailing: MailingService, + pub mrf: MrfService, pub notification: NotificationService, pub post: PostService, pub instance: InstanceService, diff --git a/lib/athena/Cargo.toml b/lib/athena/Cargo.toml index 9155a517c..796c27925 100644 --- a/lib/athena/Cargo.toml +++ b/lib/athena/Cargo.toml @@ -6,11 +6,11 @@ version.workspace = true license = "MIT OR Apache-2.0" [dependencies] -ahash = "0.8.9" +ahash = "0.8.11" either = { version = "1.10.0", default-features = false } futures-util = { version = "0.3.30", default-features = false } iso8601-timestamp = { version = "0.2.17", features = ["diesel-pg"] } -kitsune-retry-policies = { path = "../kitsune-retry-policies" } +just-retry = { path = "../just-retry" } multiplex-pool = { path = "../multiplex-pool" } once_cell = "1.19.0" rand = "0.8.5" @@ -21,13 +21,13 @@ redis = { version = "0.24.0", default-features = false, features = [ "streams", "tokio-comp", ] } -retry-policies = "0.2.1" serde = { version = "1.0.197", features = ["derive"] } simd-json = "0.13.8" smol_str = "0.2.1" speedy-uuid = { path = "../speedy-uuid", features = ["redis", "serde"] } thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["macros", "rt", "sync"] } +tokio-util = { version = "0.7.10", features = ["rt"] } tracing = "0.1.40" typed-builder = "0.18.1" diff --git a/lib/athena/examples/basic_queue.rs b/lib/athena/examples/basic_queue.rs index ead5fddfc..352dd8fd8 100644 --- a/lib/athena/examples/basic_queue.rs +++ b/lib/athena/examples/basic_queue.rs @@ -14,7 +14,7 @@ use std::{ }, time::Duration, }; -use tokio::task::JoinSet; +use tokio_util::task::TaskTracker; #[derive(Clone)] struct JobCtx; @@ -96,11 +96,13 @@ async fn main() { .unwrap(); } - let mut jobs = JoinSet::new(); + let jobs = TaskTracker::new(); + jobs.close(); + loop { if tokio::time::timeout( Duration::from_secs(5), - queue.spawn_jobs(20, Arc::new(()), &mut jobs), + queue.spawn_jobs(20, Arc::new(()), &jobs), ) .await .is_err() @@ -108,6 +110,7 @@ async fn main() { return; } - while jobs.join_next().await.is_some() {} + jobs.wait().await; + println!("spawned"); } } diff --git a/lib/athena/src/lib.rs b/lib/athena/src/lib.rs index e9f83040e..e855276df 100644 --- a/lib/athena/src/lib.rs +++ b/lib/athena/src/lib.rs @@ -9,6 +9,7 @@ pub use self::{ error::Error, queue::{JobDetails, JobQueue}, }; +pub use tokio_util::task::TaskTracker; mod error; mod macros; diff --git a/lib/athena/src/queue/mod.rs b/lib/athena/src/queue/mod.rs index 5e35597cc..7f2cc5842 100644 --- a/lib/athena/src/queue/mod.rs +++ b/lib/athena/src/queue/mod.rs @@ -4,23 +4,27 @@ use ahash::AHashMap; use either::Either; use futures_util::StreamExt; use iso8601_timestamp::Timestamp; -use kitsune_retry_policies::{futures_backoff_policy, RetryFutureExt}; +use just_retry::{ + retry_policies::{policies::ExponentialBackoff, Jitter}, + JustRetryPolicy, RetryExt, StartTime, +}; use redis::{ aio::ConnectionLike, streams::{StreamReadOptions, StreamReadReply}, AsyncCommands, RedisResult, }; -use retry_policies::{policies::ExponentialBackoff, Jitter, RetryDecision, RetryPolicy}; use serde::{Deserialize, Serialize}; use smol_str::SmolStr; use speedy_uuid::Uuid; use std::{ + ops::ControlFlow, pin::pin, str::FromStr, sync::Arc, time::{Duration, SystemTime}, }; -use tokio::{sync::OnceCell, task::JoinSet, time::Instant}; +use tokio::{sync::OnceCell, time::Instant}; +use tokio_util::task::TaskTracker; use typed_builder::TypedBuilder; mod scheduled; @@ -263,13 +267,15 @@ where .jitter(Jitter::Bounded) .build_with_max_retries(self.max_retries); - if let RetryDecision::Retry { execute_after } = backoff.should_retry(*fail_count) { + if let ControlFlow::Continue(delta) = + backoff.should_retry(StartTime::Irrelevant, *fail_count) + { let job_meta = JobMeta { job_id: *job_id, fail_count: fail_count + 1, }; - let backoff_timestamp = Timestamp::from(SystemTime::from(execute_after)); + let backoff_timestamp = Timestamp::from(SystemTime::now() + delta); let enqueue_cmd = self.enqueue_redis_cmd(&job_meta, Some(backoff_timestamp))?; pipeline.add_command(enqueue_cmd); @@ -315,7 +321,7 @@ where &self, max_jobs: usize, run_ctx: Arc<::Context>, - join_set: &mut JoinSet<()>, + join_set: &TaskTracker, ) -> Result<()> { let job_data = self.fetch_job_data(max_jobs).await?; let context_stream = self @@ -356,7 +362,7 @@ where result = &mut run_fut => break result, _ = tick_interval.tick() => { (|| this.reclaim_job(job_data)) - .retry(futures_backoff_policy()) + .retry(just_retry::backoff_policy()) .await .expect("Failed to reclaim job"); } @@ -378,7 +384,7 @@ where }; (|| this.complete_job(&job_state)) - .retry(futures_backoff_policy()) + .retry(just_retry::backoff_policy()) .await .expect("Failed to mark job as completed"); }); diff --git a/lib/blowocking/Cargo.toml b/lib/blowocking/Cargo.toml index cf715067e..8ee183a4e 100644 --- a/lib/blowocking/Cargo.toml +++ b/lib/blowocking/Cargo.toml @@ -7,7 +7,7 @@ license = "MIT OR Apache-2.0" [dependencies] once_cell = "1.19.0" -rayon = "1.8.1" +rayon = "1.9.0" thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["sync"] } tracing = "0.1.40" diff --git a/lib/cursiv/Cargo.toml b/lib/cursiv/Cargo.toml index 686898504..9066047c3 100644 --- a/lib/cursiv/Cargo.toml +++ b/lib/cursiv/Cargo.toml @@ -10,7 +10,7 @@ aliri_braid = "0.4.0" blake3 = "1.5.0" cookie = { version = "0.18.0", features = ["percent-encode"] } hex-simd = "0.8.0" -http = "1.0.0" +http = "1.1.0" pin-project-lite = "0.2.13" rand = "0.8.5" tower = { version = "0.4.13", default-features = false } diff --git a/lib/http-compat/Cargo.toml b/lib/http-compat/Cargo.toml index 464004e71..760c7d238 100644 --- a/lib/http-compat/Cargo.toml +++ b/lib/http-compat/Cargo.toml @@ -6,8 +6,8 @@ version.workspace = true license = "MIT OR Apache-2.0" [dependencies] -http02 = { package = "http", version = "0.2.11" } -http1 = { package = "http", version = "1.0.0" } +http02 = { package = "http", version = "0.2.12" } +http1 = { package = "http", version = "1.1.0" } [lints] workspace = true diff --git a/lib/http-signatures/Cargo.toml b/lib/http-signatures/Cargo.toml index fff061d08..eef5b379a 100644 --- a/lib/http-signatures/Cargo.toml +++ b/lib/http-signatures/Cargo.toml @@ -23,11 +23,11 @@ base64-simd = "0.8.0" blowocking = { path = "../blowocking", default-features = false, optional = true } const-oid = { version = "0.9.6", features = ["db"] } derive_builder = "0.20.0" -http = "1.0.0" +http = "1.1.0" httpdate = "1.0.3" itertools = { version = "0.12.1", default-features = false } logos = "0.14.0" -miette = "7.1.0" +miette = "7.2.0" pkcs8 = { version = "0.10.2", features = ["pem", "std"] } ring = { version = "0.17.8", features = ["std"] } scoped-futures = { version = "0.1.3", default-features = false } diff --git a/lib/just-retry/Cargo.toml b/lib/just-retry/Cargo.toml new file mode 100644 index 000000000..a4f3b76f4 --- /dev/null +++ b/lib/just-retry/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "just-retry" +authors.workspace = true +edition.workspace = true +version.workspace = true +license = "MIT OR Apache-2.0" + +[dependencies] +chrono = { version = "0.4.35", default-features = false, features = ["std"] } +retry-policies = "0.3.0" +tokio = { version = "1.36.0", features = ["time"] } +tracing = "0.1.40" + +[lints] +workspace = true diff --git a/lib/kitsune-retry-policies/LICENSE-APACHE-2.0 b/lib/just-retry/LICENSE-APACHE-2.0 similarity index 100% rename from lib/kitsune-retry-policies/LICENSE-APACHE-2.0 rename to lib/just-retry/LICENSE-APACHE-2.0 diff --git a/lib/kitsune-retry-policies/LICENSE-MIT b/lib/just-retry/LICENSE-MIT similarity index 100% rename from lib/kitsune-retry-policies/LICENSE-MIT rename to lib/just-retry/LICENSE-MIT diff --git a/lib/just-retry/src/lib.rs b/lib/just-retry/src/lib.rs new file mode 100644 index 000000000..e98763983 --- /dev/null +++ b/lib/just-retry/src/lib.rs @@ -0,0 +1,115 @@ +#[macro_use] +extern crate tracing; + +use retry_policies::{policies::ExponentialBackoff, Jitter, RetryDecision}; +use std::{ + fmt::Debug, + future::Future, + ops::ControlFlow, + time::{Duration, SystemTime}, +}; + +pub use retry_policies; + +/// Start time of the request +pub enum StartTime { + /// Implies the start time is at `n` + At(SystemTime), + + /// Implies the start time is irrelevant to the policy and we will imply pass + /// [`SystemTime::UNIX_EPOCH`] to it to avoid syscalls + Irrelevant, +} + +impl StartTime { + fn as_time(&self) -> SystemTime { + match self { + Self::At(at) => *at, + Self::Irrelevant => SystemTime::UNIX_EPOCH, + } + } +} + +pub trait JustRetryPolicy: retry_policies::RetryPolicy { + fn should_retry( + &self, + request_start_time: StartTime, + n_past_retries: u32, + ) -> ControlFlow<(), Duration>; +} + +impl JustRetryPolicy for T +where + T: retry_policies::RetryPolicy, +{ + fn should_retry( + &self, + request_start_time: StartTime, + n_past_retries: u32, + ) -> ControlFlow<(), Duration> { + if let RetryDecision::Retry { execute_after } = + self.should_retry(request_start_time.as_time().into(), n_past_retries) + { + let now = chrono::DateTime::from(SystemTime::now()); + let delta = (execute_after - now) + .to_std() + .expect("Some major clock fuckery happened"); + + ControlFlow::Continue(delta) + } else { + ControlFlow::Break(()) + } + } +} + +pub trait RetryExt { + fn retry(&mut self, retry_policy: R) -> impl Future + Send + where + R: JustRetryPolicy + Send; +} + +impl RetryExt for F +where + F: FnMut() -> Fut + Send, + Fut: Future> + Send, + T: Send, + E: Debug + Send, +{ + #[instrument(skip_all)] + async fn retry(&mut self, retry_policy: R) -> Fut::Output + where + R: JustRetryPolicy + Send, + { + let start_time = SystemTime::now(); + let mut retry_count = 0; + + loop { + let result = match (self)().await { + val @ Ok(..) => break val, + Err(error) => { + debug!(?error, retry_count, "run failed"); + Err(error) + } + }; + + if let ControlFlow::Continue(delta) = + JustRetryPolicy::should_retry(&retry_policy, StartTime::At(start_time), retry_count) + { + debug!(?delta, "retrying after backoff"); + tokio::time::sleep(delta).await; + } else { + debug!("not retrying"); + break result; + } + + retry_count += 1; + } + } +} + +#[must_use] +pub fn backoff_policy() -> impl JustRetryPolicy { + ExponentialBackoff::builder() + .jitter(Jitter::Bounded) + .build_with_total_retry_duration(Duration::from_secs(24 * 3600)) // Kill the retrying after 24 hours +} diff --git a/lib/kitsune-retry-policies/Cargo.toml b/lib/kitsune-retry-policies/Cargo.toml deleted file mode 100644 index 57cbe577e..000000000 --- a/lib/kitsune-retry-policies/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "kitsune-retry-policies" -authors.workspace = true -edition.workspace = true -version.workspace = true -license = "MIT OR Apache-2.0" - -[dependencies] -futures-retry-policies = { version = "0.3.1", features = [ - "retry-policies", - "tokio", - "tracing", -] } -retry-policies = "0.2.1" - -[lints] -workspace = true diff --git a/lib/kitsune-retry-policies/src/lib.rs b/lib/kitsune-retry-policies/src/lib.rs deleted file mode 100644 index d112c5139..000000000 --- a/lib/kitsune-retry-policies/src/lib.rs +++ /dev/null @@ -1,54 +0,0 @@ -use futures_retry_policies::{retry_policies::RetryPolicies, tracing::Traced}; -use retry_policies::{policies::ExponentialBackoff, Jitter}; -use std::{ - fmt::{self, Debug}, - ops::ControlFlow, - time::{Duration, SystemTime}, -}; - -pub use futures_retry_policies::{tokio::RetryFutureExt, RetryPolicy}; - -pub struct NeverRetry(T); - -impl Debug for NeverRetry -where - T: Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -impl futures_retry_policies::ShouldRetry for NeverRetry { - fn should_retry(&self, _attempts: u32) -> bool { - false - } -} - -impl futures_retry_policies::RetryPolicy for NeverRetry -where - T: futures_retry_policies::RetryPolicy>, -{ - fn should_retry(&mut self, result: Res) -> ControlFlow { - match self.0.should_retry(NeverRetry(result)) { - ControlFlow::Break(NeverRetry(val)) => ControlFlow::Break(val), - ControlFlow::Continue(dur) => ControlFlow::Continue(dur), - } - } -} - -#[must_use] -pub fn futures_backoff_policy() -> impl futures_retry_policies::RetryPolicy -where - Res: Debug, -{ - Traced(NeverRetry(RetryPolicies::new(backoff_policy()))) -} - -#[must_use] -pub fn backoff_policy() -> impl retry_policies::RetryPolicy { - ExponentialBackoff::builder() - .jitter(Jitter::Bounded) - .build_with_total_retry_duration(Duration::from_secs(24 * 3600)) // Kill the retrying after 24 hours - .for_task_started_at(SystemTime::now().into()) -} diff --git a/lib/masto-id-convert/fuzz/Cargo.lock b/lib/masto-id-convert/fuzz/Cargo.lock index c15e02a03..374e96768 100644 --- a/lib/masto-id-convert/fuzz/Cargo.lock +++ b/lib/masto-id-convert/fuzz/Cargo.lock @@ -16,9 +16,9 @@ checksum = "b6970a22a33d6a8f862aac371bac48505a1bfaa230ecb268c7b86fa4ac6e7121" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "a0ba8f7aaa012f30d5b2861462f6708eccd49c3c39863fe083a308035f63d723" dependencies = [ "jobserver", "libc", diff --git a/lib/mrf-manifest/Cargo.toml b/lib/mrf-manifest/Cargo.toml new file mode 100644 index 000000000..ab1ba0fde --- /dev/null +++ b/lib/mrf-manifest/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "mrf-manifest" +authors.workspace = true +edition.workspace = true +version.workspace = true +license = "MIT OR Apache-2.0" + +[dependencies] +ahash = { version = "0.8.11", features = ["serde"] } +leb128 = { version = "0.2.5", optional = true } +miette = { version = "7.2.0", optional = true } +olpc-cjson = { version = "0.1.3", optional = true } +schemars = { version = "0.8.16", features = ["impl_json_schema", "semver"] } +semver = { version = "1.0.22", features = ["serde"] } +serde = { version = "1.0.197", features = ["derive"] } +serde_json = { version = "1.0.114", optional = true } +thiserror = { version = "1.0.57", optional = true } +wasm-encoder = { version = "0.201.0", optional = true } +wasmparser = { version = "0.201.0", optional = true } + +[dev-dependencies] +insta = { version = "1.36.1", default-features = false, features = ["json"] } + +[features] +encode = ["dep:wasm-encoder", "serialise"] +parse = [ + "dep:miette", + "dep:leb128", + "dep:serde_json", + "dep:thiserror", + "dep:wasmparser", +] +serialise = ["dep:olpc-cjson", "dep:serde_json"] + +[lints] +workspace = true diff --git a/lib/mrf-manifest/LICENSE-APACHE-2.0 b/lib/mrf-manifest/LICENSE-APACHE-2.0 new file mode 120000 index 000000000..bffaaba2f --- /dev/null +++ b/lib/mrf-manifest/LICENSE-APACHE-2.0 @@ -0,0 +1 @@ +../../LICENSE-APACHE-2.0 \ No newline at end of file diff --git a/lib/mrf-manifest/LICENSE-MIT b/lib/mrf-manifest/LICENSE-MIT new file mode 120000 index 000000000..b2cfbdc7b --- /dev/null +++ b/lib/mrf-manifest/LICENSE-MIT @@ -0,0 +1 @@ +../../LICENSE-MIT \ No newline at end of file diff --git a/lib/mrf-manifest/src/decode.rs b/lib/mrf-manifest/src/decode.rs new file mode 100644 index 000000000..26c93ccc2 --- /dev/null +++ b/lib/mrf-manifest/src/decode.rs @@ -0,0 +1,50 @@ +use crate::{Manifest, SECTION_NAME}; +use miette::Diagnostic; +use std::{io, ops::Range}; +use thiserror::Error; +use wasmparser::Payload; + +/// Type specifying the range of a section +pub type SectionRange = Range; + +/// Error while decoding the manifest from a WASM module +#[derive(Debug, Diagnostic, Error)] +pub enum DecodeError { + /// Parsing of the JSON manifest failed + #[error(transparent)] + Parse(#[from] serde_json::Error), + + /// Parsing of the WASM component failed + #[error(transparent)] + WarmParse(#[from] wasmparser::BinaryReaderError), +} + +/// Decode a manifest from a WASM module +/// +/// If it was found a tuple consisting of the manifest and the custom section (including its type ID and length) is returned. +pub fn decode(module: &[u8]) -> Result, SectionRange)>, DecodeError> { + let mut sections = wasmparser::Parser::new(0).parse_all(module); + let payload = loop { + match sections.next().transpose()? { + Some(Payload::CustomSection(reader)) if reader.name() == SECTION_NAME => { + break reader; + } + Some(..) => { + // Section we don't care about. Skip. + } + None => return Ok(None), + } + }; + + // Check the size of the LEB128 encoded integer + let length_size = + leb128::write::unsigned(&mut io::sink(), payload.data().len() as u64).unwrap(); + let start_offset = 1 + length_size; // 1 byte for the section identifier, N bytes for the length of the section + + let mut section_range = payload.range(); + section_range.start -= start_offset; + + let manifest = serde_json::from_slice(payload.data())?; + + Ok(Some((manifest, section_range))) +} diff --git a/lib/mrf-manifest/src/encode.rs b/lib/mrf-manifest/src/encode.rs new file mode 100644 index 000000000..fb7e79f7f --- /dev/null +++ b/lib/mrf-manifest/src/encode.rs @@ -0,0 +1,20 @@ +use crate::{Manifest, SECTION_NAME}; +use std::borrow::Cow; +use wasm_encoder::{ComponentSection, CustomSection}; + +/// Encode a manifest into its proper WASM custom section representation. +/// +/// The manifest is encoded in canonical JSON. +/// The emitted byte vector can directly be appended to a WASM component +pub fn encode(manifest: &Manifest<'_>) -> Result, serde_json::Error> { + let canonical_manifest = crate::serialise(manifest)?; + let custom_section = CustomSection { + name: Cow::Borrowed(SECTION_NAME), + data: Cow::Owned(canonical_manifest), + }; + + let mut buf = Vec::new(); + custom_section.append_to_component(&mut buf); + + Ok(buf) +} diff --git a/lib/mrf-manifest/src/lib.rs b/lib/mrf-manifest/src/lib.rs new file mode 100644 index 000000000..ffcca93e8 --- /dev/null +++ b/lib/mrf-manifest/src/lib.rs @@ -0,0 +1,163 @@ +//! +//! Rust definition of the MRF manifest +//! +//! Includes some utility functions for parsing/encoding +//! + +#![deny(missing_docs)] + +use schemars::{schema::RootSchema, JsonSchema}; +use serde::{Deserialize, Serialize}; +use std::{ + borrow::Cow, + ops::{Deref, DerefMut}, +}; + +#[cfg(feature = "parse")] +pub use self::decode::{decode, DecodeError, SectionRange}; +#[cfg(feature = "encode")] +pub use self::encode::encode; +#[cfg(feature = "serialise")] +pub use self::serialise::serialise; + +#[cfg(feature = "parse")] +mod decode; +#[cfg(feature = "encode")] +mod encode; +#[cfg(feature = "serialise")] +mod serialise; + +/// Name of the section the manifest has to be encoded to +pub const SECTION_NAME: &str = "manifest-v0"; + +#[inline] +fn cow_to_static(cow: Cow<'_, T>) -> Cow<'static, T> +where + T: ToOwned + ?Sized, +{ + Cow::Owned(cow.into_owned()) +} + +/// Wrapper around a hash set intended for use with the `activityTypes` field +#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)] +#[serde(transparent)] +pub struct ActivitySet<'a>(#[serde(borrow)] pub ahash::HashSet>); + +impl ActivitySet<'_> { + /// Does the set of requested activity types contain `*`? + #[must_use] + pub fn all_activities(&self) -> bool { + self.0.contains("*") + } + + /// Turn a borrowed version of `ActivitySet` into a version with a `'static` lifetime + /// + /// This might allocate a bunch. + pub fn to_owned(&self) -> ActivitySet<'static> { + self.0 + .iter() + .cloned() + .map(cow_to_static) + .collect::>>() + .into() + } +} + +impl<'a> Deref for ActivitySet<'a> { + type Target = ahash::HashSet>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for ActivitySet<'_> { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +#[allow(clippy::implicit_hasher)] // Literally not applicable here. False positive. Otherwise we would need to have the whole thing generic over the hasher +impl<'a> From> for ahash::HashSet> { + fn from(value: ActivitySet<'a>) -> Self { + value.0 + } +} + +impl<'a> From>> for ActivitySet<'a> { + fn from(value: ahash::HashSet>) -> Self { + Self(value) + } +} + +/// Version of the API used +#[derive(Clone, Copy, Debug, Deserialize, JsonSchema, Serialize)] +#[serde(rename_all = "camelCase")] +#[non_exhaustive] +pub enum ApiVersion { + /// Version 1 + V1, +} + +/// Manifest of MRF modules +#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)] +#[serde(rename_all = "camelCase", tag = "manifestVersion")] +#[non_exhaustive] +pub enum Manifest<'a> { + /// Manifest v1 + #[serde(borrow)] + V1(ManifestV1<'a>), +} + +impl Manifest<'_> { + /// Turn a borrowed version of `Manifest` into a version with a `'static` lifetime + /// + /// This might allocate a bunch. + #[must_use] + pub fn to_owned(&self) -> Manifest<'static> { + match self { + Self::V1(v1) => Manifest::V1(v1.to_owned()), + } + } +} + +/// Manifest v1 +#[derive(Clone, Debug, Deserialize, JsonSchema, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ManifestV1<'a> { + /// Version of the MRF API + pub api_version: ApiVersion, + + /// Name of the MRF module + pub name: Cow<'a, str>, + + /// Version of the MRF module + pub version: semver::Version, + + /// Activity types passed to the MRF module + /// + /// `*` matching all types + #[serde(borrow)] + pub activity_types: ActivitySet<'a>, + + /// JSON schema of the configuration passed to the module + /// + /// This is optional but can be used for automatically generating a configuration UI + pub config_schema: Option, +} + +impl ManifestV1<'_> { + /// Turn a borrowed version of `ManifestV1` into a version with a `'static` lifetime + /// + /// This might allocate a bunch. + #[must_use] + pub fn to_owned(&self) -> ManifestV1<'static> { + ManifestV1 { + api_version: self.api_version, + name: cow_to_static(self.name.clone()), + activity_types: self.activity_types.to_owned(), + version: self.version.clone(), + config_schema: self.config_schema.clone(), + } + } +} diff --git a/lib/mrf-manifest/src/serialise.rs b/lib/mrf-manifest/src/serialise.rs new file mode 100644 index 000000000..3b2c4cc87 --- /dev/null +++ b/lib/mrf-manifest/src/serialise.rs @@ -0,0 +1,11 @@ +use crate::Manifest; +use olpc_cjson::CanonicalFormatter; +use serde::Serialize; + +/// Serialise a manifest into its canonical JSON representation +pub fn serialise(manifest: &Manifest<'_>) -> Result, serde_json::Error> { + let mut buf = Vec::new(); + let mut ser = serde_json::Serializer::with_formatter(&mut buf, CanonicalFormatter::new()); + manifest.serialize(&mut ser)?; + Ok(buf) +} diff --git a/lib/mrf-manifest/tests/snapshot_schema.rs b/lib/mrf-manifest/tests/snapshot_schema.rs new file mode 100644 index 000000000..38f6f16ef --- /dev/null +++ b/lib/mrf-manifest/tests/snapshot_schema.rs @@ -0,0 +1,7 @@ +use mrf_manifest::Manifest; + +#[test] +fn json_schema() { + let schema = schemars::schema_for!(Manifest<'_>); + insta::assert_json_snapshot!(schema); +} diff --git a/lib/mrf-manifest/tests/snapshots/snapshot_schema__json_schema.snap b/lib/mrf-manifest/tests/snapshots/snapshot_schema__json_schema.snap new file mode 100644 index 000000000..d5037302e --- /dev/null +++ b/lib/mrf-manifest/tests/snapshots/snapshot_schema__json_schema.snap @@ -0,0 +1,838 @@ +--- +source: lib/mrf-manifest/tests/snapshot_schema.rs +expression: schema +--- +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Manifest", + "description": "Manifest of MRF modules", + "oneOf": [ + { + "description": "Manifest v1", + "type": "object", + "required": [ + "activityTypes", + "apiVersion", + "manifestVersion", + "name", + "version" + ], + "properties": { + "activityTypes": { + "description": "Activity types passed to the MRF module\n\n`*` matching all types", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "apiVersion": { + "description": "Version of the MRF API", + "allOf": [ + { + "$ref": "#/definitions/ApiVersion" + } + ] + }, + "configSchema": { + "description": "JSON schema of the configuration passed to the module\n\nThis is optional but can be used for automatically generating a configuration UI", + "anyOf": [ + { + "$ref": "#/definitions/RootSchema" + }, + { + "type": "null" + } + ] + }, + "manifestVersion": { + "type": "string", + "enum": [ + "v1" + ] + }, + "name": { + "description": "Name of the MRF module", + "type": "string" + }, + "version": { + "description": "Version of the MRF module", + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + } + } + } + ], + "definitions": { + "ApiVersion": { + "description": "Version of the API used", + "oneOf": [ + { + "description": "Version 1", + "type": "string", + "enum": [ + "v1" + ] + } + ] + }, + "InstanceType": { + "description": "The possible types of values in JSON Schema documents.\n\nSee [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "type": "string", + "enum": [ + "null", + "boolean", + "object", + "array", + "number", + "string", + "integer" + ] + }, + "RootSchema": { + "description": "The root object of a JSON Schema document.", + "type": "object", + "properties": { + "$id": { + "description": "The `$id` keyword.\n\nSee [JSON Schema 8.2.2. The \"$id\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.2).", + "type": [ + "string", + "null" + ] + }, + "$ref": { + "description": "The `$ref` keyword.\n\nSee [JSON Schema 8.2.4.1. Direct References with \"$ref\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.4.1).", + "type": [ + "string", + "null" + ] + }, + "$schema": { + "description": "The `$schema` keyword.\n\nSee [JSON Schema 8.1.1. The \"$schema\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.1.1).", + "type": [ + "string", + "null" + ] + }, + "additionalItems": { + "description": "The `additionalItems` keyword.\n\nSee [JSON Schema 9.3.1.2. \"additionalItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "additionalProperties": { + "description": "The `additionalProperties` keyword.\n\nSee [JSON Schema 9.3.2.3. \"additionalProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "allOf": { + "description": "The `allOf` keyword.\n\nSee [JSON Schema 9.2.1.1. \"allOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.1).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "anyOf": { + "description": "The `anyOf` keyword.\n\nSee [JSON Schema 9.2.1.2. \"anyOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.2).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "const": { + "description": "The `const` keyword.\n\nSee [JSON Schema Validation 6.1.3. \"const\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)" + }, + "contains": { + "description": "The `contains` keyword.\n\nSee [JSON Schema 9.3.1.4. \"contains\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "default": { + "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)." + }, + "definitions": { + "description": "The `definitions` keyword.\n\nIn JSON Schema draft 2019-09 this was replaced by $defs, but in Schemars this is still serialized as `definitions` for backward-compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5), and [JSON Schema (draft 07) 9. Schema Re-Use With \"definitions\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "deprecated": { + "description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).", + "type": "boolean" + }, + "description": { + "description": "The `description` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "else": { + "description": "The `else` keyword.\n\nSee [JSON Schema 9.2.2.3. \"else\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "enum": { + "description": "The `enum` keyword.\n\nSee [JSON Schema Validation 6.1.2. \"enum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.2)", + "type": [ + "array", + "null" + ], + "items": true + }, + "examples": { + "description": "The `examples` keyword.\n\nSee [JSON Schema Validation 9.5. \"examples\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.5).", + "type": "array", + "items": true + }, + "exclusiveMaximum": { + "description": "The `exclusiveMaximum` keyword.\n\nSee [JSON Schema Validation 6.2.3. \"exclusiveMaximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.3).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "exclusiveMinimum": { + "description": "The `exclusiveMinimum` keyword.\n\nSee [JSON Schema Validation 6.2.5. \"exclusiveMinimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.5).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "format": { + "description": "The `format` keyword.\n\nSee [JSON Schema Validation 7. A Vocabulary for Semantic Content With \"format\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-7).", + "type": [ + "string", + "null" + ] + }, + "if": { + "description": "The `if` keyword.\n\nSee [JSON Schema 9.2.2.1. \"if\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "items": { + "description": "The `items` keyword.\n\nSee [JSON Schema 9.3.1.1. \"items\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_Schema" + }, + { + "type": "null" + } + ] + }, + "maxItems": { + "description": "The `maxItems` keyword.\n\nSee [JSON Schema Validation 6.4.1. \"maxItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxLength": { + "description": "The `maxLength` keyword.\n\nSee [JSON Schema Validation 6.3.1. \"maxLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxProperties": { + "description": "The `maxProperties` keyword.\n\nSee [JSON Schema Validation 6.5.1. \"maxProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maximum": { + "description": "The `maximum` keyword.\n\nSee [JSON Schema Validation 6.2.2. \"maximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.2).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "minItems": { + "description": "The `minItems` keyword.\n\nSee [JSON Schema Validation 6.4.2. \"minItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minLength": { + "description": "The `minLength` keyword.\n\nSee [JSON Schema Validation 6.3.2. \"minLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minProperties": { + "description": "The `minProperties` keyword.\n\nSee [JSON Schema Validation 6.5.2. \"minProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minimum": { + "description": "The `minimum` keyword.\n\nSee [JSON Schema Validation 6.2.4. \"minimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.4).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "multipleOf": { + "description": "The `multipleOf` keyword.\n\nSee [JSON Schema Validation 6.2.1. \"multipleOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.1).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "not": { + "description": "The `not` keyword.\n\nSee [JSON Schema 9.2.1.4. \"not\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "oneOf": { + "description": "The `oneOf` keyword.\n\nSee [JSON Schema 9.2.1.3. \"oneOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.3).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "pattern": { + "description": "The `pattern` keyword.\n\nSee [JSON Schema Validation 6.3.3. \"pattern\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.3).", + "type": [ + "string", + "null" + ] + }, + "patternProperties": { + "description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "properties": { + "description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "propertyNames": { + "description": "The `propertyNames` keyword.\n\nSee [JSON Schema 9.3.2.5. \"propertyNames\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.5).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "readOnly": { + "description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + }, + "required": { + "description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "then": { + "description": "The `then` keyword.\n\nSee [JSON Schema 9.2.2.2. \"then\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "title": { + "description": "The `title` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "The `type` keyword.\n\nSee [JSON Schema Validation 6.1.1. \"type\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.1) and [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_InstanceType" + }, + { + "type": "null" + } + ] + }, + "uniqueItems": { + "description": "The `uniqueItems` keyword.\n\nSee [JSON Schema Validation 6.4.3. \"uniqueItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.3).", + "type": [ + "boolean", + "null" + ] + }, + "writeOnly": { + "description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + } + }, + "additionalProperties": true + }, + "Schema": { + "description": "A JSON Schema.", + "anyOf": [ + { + "description": "A trivial boolean JSON Schema.\n\nThe schema `true` matches everything (always passes validation), whereas the schema `false` matches nothing (always fails validation).", + "type": "boolean" + }, + { + "description": "A JSON Schema object.", + "allOf": [ + { + "$ref": "#/definitions/SchemaObject" + } + ] + } + ] + }, + "SchemaObject": { + "description": "A JSON Schema object.", + "type": "object", + "properties": { + "$id": { + "description": "The `$id` keyword.\n\nSee [JSON Schema 8.2.2. The \"$id\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.2).", + "type": [ + "string", + "null" + ] + }, + "$ref": { + "description": "The `$ref` keyword.\n\nSee [JSON Schema 8.2.4.1. Direct References with \"$ref\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.4.1).", + "type": [ + "string", + "null" + ] + }, + "additionalItems": { + "description": "The `additionalItems` keyword.\n\nSee [JSON Schema 9.3.1.2. \"additionalItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "additionalProperties": { + "description": "The `additionalProperties` keyword.\n\nSee [JSON Schema 9.3.2.3. \"additionalProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "allOf": { + "description": "The `allOf` keyword.\n\nSee [JSON Schema 9.2.1.1. \"allOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.1).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "anyOf": { + "description": "The `anyOf` keyword.\n\nSee [JSON Schema 9.2.1.2. \"anyOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.2).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "const": { + "description": "The `const` keyword.\n\nSee [JSON Schema Validation 6.1.3. \"const\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)" + }, + "contains": { + "description": "The `contains` keyword.\n\nSee [JSON Schema 9.3.1.4. \"contains\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "default": { + "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)." + }, + "deprecated": { + "description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).", + "type": "boolean" + }, + "description": { + "description": "The `description` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "else": { + "description": "The `else` keyword.\n\nSee [JSON Schema 9.2.2.3. \"else\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "enum": { + "description": "The `enum` keyword.\n\nSee [JSON Schema Validation 6.1.2. \"enum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.2)", + "type": [ + "array", + "null" + ], + "items": true + }, + "examples": { + "description": "The `examples` keyword.\n\nSee [JSON Schema Validation 9.5. \"examples\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.5).", + "type": "array", + "items": true + }, + "exclusiveMaximum": { + "description": "The `exclusiveMaximum` keyword.\n\nSee [JSON Schema Validation 6.2.3. \"exclusiveMaximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.3).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "exclusiveMinimum": { + "description": "The `exclusiveMinimum` keyword.\n\nSee [JSON Schema Validation 6.2.5. \"exclusiveMinimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.5).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "format": { + "description": "The `format` keyword.\n\nSee [JSON Schema Validation 7. A Vocabulary for Semantic Content With \"format\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-7).", + "type": [ + "string", + "null" + ] + }, + "if": { + "description": "The `if` keyword.\n\nSee [JSON Schema 9.2.2.1. \"if\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "items": { + "description": "The `items` keyword.\n\nSee [JSON Schema 9.3.1.1. \"items\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_Schema" + }, + { + "type": "null" + } + ] + }, + "maxItems": { + "description": "The `maxItems` keyword.\n\nSee [JSON Schema Validation 6.4.1. \"maxItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxLength": { + "description": "The `maxLength` keyword.\n\nSee [JSON Schema Validation 6.3.1. \"maxLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxProperties": { + "description": "The `maxProperties` keyword.\n\nSee [JSON Schema Validation 6.5.1. \"maxProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maximum": { + "description": "The `maximum` keyword.\n\nSee [JSON Schema Validation 6.2.2. \"maximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.2).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "minItems": { + "description": "The `minItems` keyword.\n\nSee [JSON Schema Validation 6.4.2. \"minItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minLength": { + "description": "The `minLength` keyword.\n\nSee [JSON Schema Validation 6.3.2. \"minLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minProperties": { + "description": "The `minProperties` keyword.\n\nSee [JSON Schema Validation 6.5.2. \"minProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minimum": { + "description": "The `minimum` keyword.\n\nSee [JSON Schema Validation 6.2.4. \"minimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.4).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "multipleOf": { + "description": "The `multipleOf` keyword.\n\nSee [JSON Schema Validation 6.2.1. \"multipleOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.1).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "not": { + "description": "The `not` keyword.\n\nSee [JSON Schema 9.2.1.4. \"not\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "oneOf": { + "description": "The `oneOf` keyword.\n\nSee [JSON Schema 9.2.1.3. \"oneOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.3).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "pattern": { + "description": "The `pattern` keyword.\n\nSee [JSON Schema Validation 6.3.3. \"pattern\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.3).", + "type": [ + "string", + "null" + ] + }, + "patternProperties": { + "description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "properties": { + "description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "propertyNames": { + "description": "The `propertyNames` keyword.\n\nSee [JSON Schema 9.3.2.5. \"propertyNames\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.5).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "readOnly": { + "description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + }, + "required": { + "description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "then": { + "description": "The `then` keyword.\n\nSee [JSON Schema 9.2.2.2. \"then\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "title": { + "description": "The `title` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "The `type` keyword.\n\nSee [JSON Schema Validation 6.1.1. \"type\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.1) and [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_InstanceType" + }, + { + "type": "null" + } + ] + }, + "uniqueItems": { + "description": "The `uniqueItems` keyword.\n\nSee [JSON Schema Validation 6.4.3. \"uniqueItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.3).", + "type": [ + "boolean", + "null" + ] + }, + "writeOnly": { + "description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + } + }, + "additionalProperties": true + }, + "SingleOrVec_for_InstanceType": { + "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.", + "anyOf": [ + { + "$ref": "#/definitions/InstanceType" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/InstanceType" + } + } + ] + }, + "SingleOrVec_for_Schema": { + "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + } + ] + } + } +} diff --git a/lib/mrf-tool/Cargo.toml b/lib/mrf-tool/Cargo.toml new file mode 100644 index 000000000..55d9c0f3c --- /dev/null +++ b/lib/mrf-tool/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "mrf-tool" +description = "Tool for preparing and introspecting WASM MRFs" +authors.workspace = true +edition.workspace = true +version.workspace = true +license = "MIT OR Apache-2.0" + +[dependencies] +clap = { version = "4.5.2", features = ["derive", "wrap_help"] } +miette = { version = "7.2.0", features = ["fancy"] } +mrf-manifest = { path = "../mrf-manifest", features = [ + "encode", + "parse", + "serialise", +] } +serde_json = "1.0.114" +wasmparser = "0.201.0" + +[lints] +workspace = true diff --git a/lib/mrf-tool/LICENSE-APACHE-2.0 b/lib/mrf-tool/LICENSE-APACHE-2.0 new file mode 120000 index 000000000..bffaaba2f --- /dev/null +++ b/lib/mrf-tool/LICENSE-APACHE-2.0 @@ -0,0 +1 @@ +../../LICENSE-APACHE-2.0 \ No newline at end of file diff --git a/lib/mrf-tool/LICENSE-MIT b/lib/mrf-tool/LICENSE-MIT new file mode 120000 index 000000000..b2cfbdc7b --- /dev/null +++ b/lib/mrf-tool/LICENSE-MIT @@ -0,0 +1 @@ +../../LICENSE-MIT \ No newline at end of file diff --git a/lib/mrf-tool/src/args.rs b/lib/mrf-tool/src/args.rs new file mode 100644 index 000000000..fff191f0b --- /dev/null +++ b/lib/mrf-tool/src/args.rs @@ -0,0 +1,76 @@ +use clap::{Args, Parser, Subcommand}; +use std::path::PathBuf; + +#[derive(Args)] +pub struct AddManifest { + /// Path to the manifest + pub manifest_path: PathBuf, + + /// Path to the WASM module + pub module_path: PathBuf, + + /// Path to where the modified WASM module should be written + #[arg(long, short)] + pub output: PathBuf, +} + +#[derive(Args)] +pub struct ReadManifest { + /// Path to the WASM module + pub module_path: PathBuf, +} + +#[derive(Args)] +pub struct RemoveManifest { + /// Path to the WASM module + pub module_path: PathBuf, + + /// Path to where the modified WASM module should be written + #[arg(long, short)] + pub output: PathBuf, +} + +#[derive(Args)] +pub struct ValidateModule { + /// Path to the WASM module + pub module_path: PathBuf, +} + +#[derive(Subcommand)] +pub enum ManifestSubcommand { + /// Add a manifest to a WASM component + /// + /// Note: We don't validate whether the WASM component already contains a manifest section. + /// We simply append a new section. + Add(AddManifest), + + /// Read the manifest from a WASM component + Read(ReadManifest), + + /// Remove the manifest from a WASM component + Remove(RemoveManifest), +} + +#[derive(Subcommand)] +pub enum ModuleSubcommand { + /// Validate a WASM module + Validate(ValidateModule), +} + +#[derive(Subcommand)] +pub enum ToolSubcommand { + /// Manage manifests embedded into modules + #[clap(subcommand)] + Manifest(ManifestSubcommand), + + /// Manage WASM MRF modules + #[clap(subcommand)] + Module(ModuleSubcommand), +} + +#[derive(Parser)] +#[command(about, version)] +pub struct ToolArgs { + #[clap(subcommand)] + pub command: ToolSubcommand, +} diff --git a/lib/mrf-tool/src/main.rs b/lib/mrf-tool/src/main.rs new file mode 100644 index 000000000..05dca8240 --- /dev/null +++ b/lib/mrf-tool/src/main.rs @@ -0,0 +1,87 @@ +use self::args::{ManifestSubcommand, ModuleSubcommand, ToolArgs, ToolSubcommand}; +use clap::Parser; +use miette::{bail, IntoDiagnostic, Result}; +use std::{ + fs::{self, File}, + io::Write, + path::Path, +}; + +mod args; + +fn read_manifest(module: &[u8]) -> Result<()> { + let Some((manifest, _section_range)) = mrf_manifest::decode(module)? else { + bail!("missing manifest in module"); + }; + + let prettified = serde_json::to_string_pretty(&manifest).into_diagnostic()?; + println!("{prettified}"); + + Ok(()) +} + +fn remove_manifest(module_path: &Path, output_path: &Path) -> Result<()> { + let module = fs::read(module_path).into_diagnostic()?; + let Some((_manifest, section_range)) = mrf_manifest::decode(&module)? else { + bail!("missing manifest in module"); + }; + + let mut module_file = File::options() + .create(true) + .truncate(true) + .write(true) + .open(output_path) + .into_diagnostic()?; + + module_file + .write_all(&module[..section_range.start]) + .into_diagnostic()?; + module_file + .write_all(&module[section_range.end..]) + .into_diagnostic()?; + + Ok(()) +} + +fn write_manifest(manifest: &[u8], module_path: &Path) -> Result<()> { + // Parse the manifest and re-encode it in canonical JSON + let parsed_manifest = serde_json::from_slice(manifest).into_diagnostic()?; + let custom_section = mrf_manifest::encode(&parsed_manifest).into_diagnostic()?; + + let mut file = File::options() + .append(true) + .open(module_path) + .into_diagnostic()?; + file.write_all(&custom_section).into_diagnostic()?; + + Ok(()) +} + +fn main() -> Result<()> { + let args = ToolArgs::parse(); + match args.command { + ToolSubcommand::Manifest(ManifestSubcommand::Add(args)) => { + let manifest = fs::read(args.manifest_path).into_diagnostic()?; + + // Only copy if the paths are distinct + if args.module_path != args.output { + fs::copy(&args.module_path, &args.output).into_diagnostic()?; + } + + write_manifest(&manifest, &args.output)?; + } + ToolSubcommand::Manifest(ManifestSubcommand::Read(args)) => { + let data = fs::read(args.module_path).into_diagnostic()?; + read_manifest(&data)?; + } + ToolSubcommand::Manifest(ManifestSubcommand::Remove(args)) => { + remove_manifest(&args.module_path, &args.output)?; + } + ToolSubcommand::Module(ModuleSubcommand::Validate(args)) => { + let data = fs::read(args.module_path).into_diagnostic()?; + wasmparser::validate(&data).into_diagnostic()?; + } + } + + Ok(()) +} diff --git a/lib/post-process/Cargo.toml b/lib/post-process/Cargo.toml index f2d2151db..cfb57e3e7 100644 --- a/lib/post-process/Cargo.toml +++ b/lib/post-process/Cargo.toml @@ -15,7 +15,7 @@ logos = "0.14.0" [dev-dependencies] criterion = { version = "0.5.1", features = ["async_futures"] } futures = "0.3.30" -insta = { version = "1.35.1", features = ["glob"] } +insta = { version = "1.36.1", features = ["glob"] } pretty_assertions = "1.4.0" [lints] diff --git a/lib/post-process/fuzz/Cargo.lock b/lib/post-process/fuzz/Cargo.lock index 03237af5e..313d19532 100644 --- a/lib/post-process/fuzz/Cargo.lock +++ b/lib/post-process/fuzz/Cargo.lock @@ -22,9 +22,9 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "a0ba8f7aaa012f30d5b2861462f6708eccd49c3c39863fe083a308035f63d723" dependencies = [ "jobserver", "libc", @@ -206,9 +206,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", diff --git a/lib/tower-http-digest/Cargo.toml b/lib/tower-http-digest/Cargo.toml index 34e46861d..a828b7f2d 100644 --- a/lib/tower-http-digest/Cargo.toml +++ b/lib/tower-http-digest/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT OR Apache-2.0" base64-simd = "0.8.0" bytes = "1.5.0" either = { version = "1.10.0", default-features = false } -http = "1.0.0" +http = "1.1.0" http-body = "1.0.0" memchr = "2.7.1" pin-project-lite = "0.2.13" diff --git a/lib/tower-stop-using-brave/Cargo.toml b/lib/tower-stop-using-brave/Cargo.toml index 8b5d26e3c..ead55c5ba 100644 --- a/lib/tower-stop-using-brave/Cargo.toml +++ b/lib/tower-stop-using-brave/Cargo.toml @@ -7,7 +7,7 @@ license = "MIT OR Apache-2.0" [dependencies] either = "1.10.0" -http = "1.0.0" +http = "1.1.0" once_cell = "1.19.0" regex = "1.10.3" tower-layer = "0.3.2" diff --git a/lib/tower-x-clacks-overhead/Cargo.toml b/lib/tower-x-clacks-overhead/Cargo.toml index bc3286d25..cd92cf361 100644 --- a/lib/tower-x-clacks-overhead/Cargo.toml +++ b/lib/tower-x-clacks-overhead/Cargo.toml @@ -6,7 +6,7 @@ version.workspace = true license = "MIT OR Apache-2.0" [dependencies] -http = "1.0.0" +http = "1.1.0" itertools = { version = "0.12.1", default-features = false } pin-project-lite = "0.2.13" tower-layer = "0.3.2"