From 9c52016568ff9005ae58d96948ba0c15afd61bba Mon Sep 17 00:00:00 2001 From: Elad Kaplan Date: Mon, 25 Nov 2024 08:55:11 +0200 Subject: [PATCH 1/3] move socket implementation in initializer --- .devcontainer/.env | 0 .devcontainer/Dockerfile | 8 - .devcontainer/devcontainer.json | 9 - .devcontainer/docker-compose.yml | 12 - .github/workflows/ci.yml | 47 + Cargo.lock | 1977 ++++--- Cargo.toml | 17 +- README.md | 2 +- config/development.yaml | 25 +- frontend/dist/assets/index-S6s5_GGp.js | 43 - frontend/dist/assets/index-myMiaP76.css | 1 - frontend/dist/index.html | 43 +- frontend/dist/main.js | 278 + frontend/dist/style.css | 149 + frontend/dist/vite.svg | 1 - frontend/index.html | 13 - frontend/package-lock.json | 4803 ----------------- frontend/package.json | 33 - frontend/pnpm-lock.yaml | 3036 ----------- frontend/postcss.config.js | 6 - frontend/public/vite.svg | 1 - frontend/src/App.jsx | 98 - frontend/src/assets/react.svg | 1 - frontend/src/components/MsgSubmitBox.jsx | 33 - frontend/src/components/RoomMsgsList.jsx | 34 - .../src/components/sidebar/normal/Sidebar.jsx | 34 - .../sidebar/transitive/TransitiveSidebar.jsx | 78 - .../transitive/TransitiveSidebarRoomsList.jsx | 34 - frontend/src/index.css | 3 - frontend/src/main.jsx | 10 - frontend/src/utils/class-names.js | 3 - frontend/src/utils/color-for-name.js | 20 - frontend/src/utils/rooms.js | 9 - frontend/tailwind.config.js | 22 - frontend/vite.config.js | 7 - src/app.rs | 29 +- src/bin/main.rs | 4 +- src/channels/application.rs | 46 - src/channels/mod.rs | 2 - src/channels/state.rs | 30 - src/initializers/mod.rs | 1 + src/initializers/socket.rs | 128 + src/lib.rs | 2 +- 43 files changed, 1740 insertions(+), 9392 deletions(-) delete mode 100644 .devcontainer/.env delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .devcontainer/docker-compose.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 frontend/dist/assets/index-S6s5_GGp.js delete mode 100644 frontend/dist/assets/index-myMiaP76.css create mode 100644 frontend/dist/main.js create mode 100644 frontend/dist/style.css delete mode 100644 frontend/dist/vite.svg delete mode 100644 frontend/index.html delete mode 100644 frontend/package-lock.json delete mode 100644 frontend/package.json delete mode 100644 frontend/pnpm-lock.yaml delete mode 100644 frontend/postcss.config.js delete mode 100644 frontend/public/vite.svg delete mode 100644 frontend/src/App.jsx delete mode 100644 frontend/src/assets/react.svg delete mode 100644 frontend/src/components/MsgSubmitBox.jsx delete mode 100644 frontend/src/components/RoomMsgsList.jsx delete mode 100644 frontend/src/components/sidebar/normal/Sidebar.jsx delete mode 100644 frontend/src/components/sidebar/transitive/TransitiveSidebar.jsx delete mode 100644 frontend/src/components/sidebar/transitive/TransitiveSidebarRoomsList.jsx delete mode 100644 frontend/src/index.css delete mode 100644 frontend/src/main.jsx delete mode 100644 frontend/src/utils/class-names.js delete mode 100644 frontend/src/utils/color-for-name.js delete mode 100644 frontend/src/utils/rooms.js delete mode 100644 frontend/tailwind.config.js delete mode 100644 frontend/vite.config.js delete mode 100644 src/channels/application.rs delete mode 100644 src/channels/mod.rs delete mode 100644 src/channels/state.rs create mode 100644 src/initializers/mod.rs create mode 100644 src/initializers/socket.rs diff --git a/.devcontainer/.env b/.devcontainer/.env deleted file mode 100644 index e69de29..0000000 diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index fd43f09..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM mcr.microsoft.com/vscode/devcontainers/rust:0-1 - -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends postgresql-client \ - && cargo install cargo-insta \ - && chown -R vscode /usr/local/cargo - -COPY .env /.env diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index ddc39ee..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "Loco", - "dockerComposeFile": "docker-compose.yml", - "service": "app", - "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", - "forwardPorts": [ - 3000 - ] -} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml deleted file mode 100644 index 3985587..0000000 --- a/.devcontainer/docker-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: "3" - -services: - app: - build: - context: . - dockerfile: Dockerfile - command: sleep infinity - volumes: - - ../..:/workspaces:cached - env_file: - - .env diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..355ef51 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: "CI" + +on: + push: + branches: + - main + pull_request: + +env: + RUST_TOOLCHAIN: stable + TOOLCHAIN_PROFILE: minimal + +jobs: + rustfmt: + name: Check Style + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout the code + uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + components: rustfmt + - name: Run cargo fmt + run: cargo fmt --all -- --check + + clippy: + name: Run Clippy + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout the code + uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + - name: Setup Rust cache + uses: Swatinem/rust-cache@v2 + - name: Run cargo clippy + run: cargo clippy --all-features -- -D warnings -W clippy::pedantic -W clippy::nursery -W rust-2018-idioms \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 3c41cde..ab549b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,24 +4,24 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -31,9 +31,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -76,50 +76,51 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -136,9 +137,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.6" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "brotli", "flate2", @@ -152,37 +153,26 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "syn 2.0.89", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.4" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -195,7 +185,7 @@ dependencies = [ "hyper", "hyper-util", "itoa", - "matchit", + "matchit 0.7.3", "memchr", "mime", "percent-encoding", @@ -205,9 +195,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -215,9 +205,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -228,7 +218,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -236,51 +226,52 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.9.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "895ff42f72016617773af68fb90da2a9677d89c62338ec09162d4909d86fdd8f" +checksum = "c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04" dependencies = [ "axum", "axum-core", "bytes", "cookie", + "fastrand", "futures-util", "http", "http-body", "http-body-util", "mime", + "multer", "pin-project-lite", "serde", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", ] [[package]] name = "axum-macros" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa" +checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ - "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -295,12 +286,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -313,30 +298,11 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bb8" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b4b0f25f18bcdc3ac72bdb486ed0acf7e185221fd4dc985bc15db5800b0ba2" -dependencies = [ - "async-trait", - "futures-channel", - "futures-util", - "parking_lot", - "tokio", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blake2" @@ -358,9 +324,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.4.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -369,9 +335,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -379,9 +345,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", "serde", @@ -395,9 +361,9 @@ checksum = "0d75b8252ed252f881d1dc4482ae3c3854df6ee8183c1906bac50ff358f4f89f" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-unit" @@ -417,50 +383,22 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ - "camino", - "cargo-platform", - "semver", "serde", - "serde_json", - "thiserror", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -476,20 +414,22 @@ dependencies = [ "async-trait", "axum", "chrono", - "eyre", "loco-rs", "serde", "serde_json", + "socketioxide", "tokio", + "tower 0.5.1", + "tower-http", "tracing", "tracing-subscriber", ] [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -497,14 +437,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "chrono-tz" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d7b79e99bfaa0d47da0687c43aa3b7381938a62ad3a6498599039321f660b7" +checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" dependencies = [ "chrono", "chrono-tz-build", @@ -513,9 +453,9 @@ dependencies = [ [[package]] name = "chrono-tz-build" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" +checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" dependencies = [ "parse-zoneinfo", "phf", @@ -528,15 +468,15 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", "stacker", ] [[package]] name = "clap" -version = "4.4.18" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -544,9 +484,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -556,27 +496,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "colored" @@ -589,24 +529,23 @@ dependencies = [ ] [[package]] -name = "combine" -version = "4.6.6" +name = "console" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "bytes", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", ] [[package]] name = "cookie" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ "percent-encoding", "time", @@ -615,39 +554,48 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] -name = "cron_clock" -version = "0.8.0" +name = "cron" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8699d8ed16e3db689f8ae04d8dc3c6666a4ba7e724e5a157884b7cc385d16b" +checksum = "6f8c3e73077b4b4a6ab1ea5047c37c57aee77657bc8ecd6f29b0af082d0b0c07" dependencies = [ "chrono", "nom", "once_cell", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -669,34 +617,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crossterm" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" -dependencies = [ - "bitflags 1.3.2", - "crossterm_winapi", - "libc", - "mio", - "parking_lot", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "cruet" @@ -718,11 +641,46 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.89", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.89", +] + [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "deranged" @@ -735,9 +693,22 @@ dependencies = [ [[package]] name = "deunicode" -version = "1.4.2" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339544cc9e2c4dc3fc7149fd630c5f22263a4fdf18a98afd0075784968b5cf00" + +[[package]] +name = "dialoguer" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae2a35373c5c74340b79ae6780b498b2b183915ec5dacf263aac5a099bf485a" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] [[package]] name = "digest" @@ -751,32 +722,16 @@ dependencies = [ ] [[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "libc", - "redox_users", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.89", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "duct" version = "0.13.7" @@ -789,11 +744,20 @@ dependencies = [ "shared_child", ] +[[package]] +name = "duct_sh" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6633cadba557545fbbe0299a2f9adc4bb2fc5fb238773f5e841e0c23d62146" +dependencies = [ + "duct", +] + [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "email-encoding" @@ -801,25 +765,41 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60d1d33cdaede7e24091f039632eb5d3c7469fe5b066a985281a34fc70fa317f" dependencies = [ - "base64 0.22.1", + "base64", "memchr", ] [[package]] name = "email_address" -version = "0.2.4" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] [[package]] name = "engineioxide" -version = "0.10.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610253fc8536aa6b02c5a1ea09d3d32f4ec090bee9fcd877768bd2114d5fe149" +checksum = "ec84aea019c24ae0cae29a6306b1b9b6bd91a4c950542d804b742435ed797f0c" dependencies = [ - "base64 0.21.7", + "base64", "bytes", - "futures", + "futures-core", + "futures-util", "http", "http-body", "http-body-util", @@ -829,10 +809,22 @@ dependencies = [ "rand", "serde", "serde_json", + "smallvec", "thiserror", "tokio", "tokio-tungstenite", - "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "english-to-cron" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c16423ac933fee80f05a52b435a912d5b08edbbbfe936e0042ebb3accdf303da" +dependencies = [ + "lazy_static", + "regex", ] [[package]] @@ -843,35 +835,25 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "eyre" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "fastrand" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -903,9 +885,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -918,9 +900,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -928,15 +910,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -945,38 +927,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1013,21 +995,11 @@ dependencies = [ "version_check", ] -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1036,9 +1008,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1048,56 +1020,43 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] name = "globwalk" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 1.3.2", + "bitflags", "ignore", "walkdir", ] [[package]] -name = "h2" -version = "0.4.2" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "ahash", + "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", - "allocator-api2", -] +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1106,25 +1065,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" - -[[package]] -name = "hex" -version = "0.4.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hostname" @@ -1139,9 +1089,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", @@ -1150,9 +1100,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -1160,9 +1110,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", @@ -1173,15 +1123,15 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" +checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1206,46 +1156,44 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.1.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "smallvec", "tokio", ] [[package]] name = "hyper-util" -version = "0.1.2" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", - "futures-channel", "futures-util", "http", "http-body", "hyper", "pin-project-lite", - "socket2", "tokio", - "tracing", + "tower-service", ] [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1265,15 +1213,129 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -1285,22 +1347,37 @@ dependencies = [ ] [[package]] -name = "if_chain" -version = "1.0.2" +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -1308,86 +1385,95 @@ dependencies = [ [[package]] name = "include_dir" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ "proc-macro2", "quote", ] [[package]] -name = "indenter" -version = "0.3.3" +name = "indexmap" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.1", +] [[package]] -name = "indexmap" -version = "2.1.0" +name = "ipnetwork" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" dependencies = [ - "equivalent", - "hashbrown", + "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lettre" -version = "0.11.7" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a62049a808f1c4e2356a2a380bd5f2aca3b011b0b482cf3b914ba1731426969" +checksum = "0161e452348e399deb685ba05e55ee116cae9410f4f51fe42d597361444521d9" dependencies = [ "async-trait", - "base64 0.22.1", + "base64", "chumsky", "email-encoding", "email_address", @@ -1396,13 +1482,14 @@ dependencies = [ "futures-util", "hostname", "httpdate", - "idna 0.5.0", + "idna 1.0.3", "mime", "nom", "percent-encoding", "quoted_printable", "rustls", "rustls-pemfile", + "rustls-pki-types", "socket2", "tokio", "tokio-rustls", @@ -1412,88 +1499,103 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] -name = "libredox" -version = "0.0.1" +name = "linux-raw-sys" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.2", - "libc", - "redox_syscall", -] +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "linux-raw-sys" -version = "0.4.13" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", ] +[[package]] +name = "loco-gen" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375f07ea5f35282d5a4fcde991eb1462e2fb845ba8dcd75cda93187b33ab9e63" +dependencies = [ + "chrono", + "clap", + "dialoguer", + "duct", + "regex", + "rrgen", + "serde", + "serde_json", + "thiserror", + "tracing", +] + [[package]] name = "loco-rs" -version = "0.5.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99f53f783a0ee12fb70d93b8c0b19dc327a52c6d3e659654b7adb1dd47cb816e" +checksum = "aec49c7ff56024867eee6246fe13d32f6d9776fa7cf4487e3a3485dba98df0ad" dependencies = [ "argon2", "async-trait", "axum", "axum-extra", "backtrace_printer", - "bb8", "byte-unit", "bytes", - "cargo_metadata", "cfg-if", "chrono", "clap", "colored", "duct", - "eyre", + "duct_sh", + "english-to-cron", "fs-err", "futures-util", + "heck 0.4.1", "hyper", "include_dir", - "lazy_static", + "ipnetwork", "lettre", + "loco-gen", "mime", "object_store", "rand", "regex", - "requestty", - "rrgen", - "rusty-sidekiq", + "semver", "serde", "serde_json", "serde_variant", "serde_yaml", - "socketioxide", "tera", "thiserror", "tokio", - "tower", + "tokio-cron-scheduler", + "tokio-util", + "toml", + "tower 0.4.13", "tower-http", "tracing", + "tracing-appender", "tracing-subscriber", "uuid", "validator", @@ -1501,9 +1603,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "loom" @@ -1535,11 +1637,17 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matchit" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0aa4b8ca861b08d68afc8702af3250776898c1508b278e1da9d01e01d4b45c" + [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1549,9 +1657,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -1565,23 +1673,40 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.10" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", - "log", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", ] [[package]] @@ -1605,47 +1730,45 @@ dependencies = [ ] [[package]] -name = "num-traits" -version = "0.2.17" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "num_cpus" -version = "1.16.0" +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "hermit-abi 0.3.4", - "libc", + "proc-macro2", + "quote", + "syn 2.0.89", ] [[package]] -name = "num_threads" -version = "0.1.6" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "libc", + "autocfg", ] [[package]] name = "object" -version = "0.32.2" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "object_store" -version = "0.9.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8718f8b65fdf67a45108d1548347d4af7d71fb81ce727bbf9e3b2535e079db3" +checksum = "6eb4c22c6154a1e759d7099f9ffad7cc5ef8245f9efbab4a41b92623079c82f3" dependencies = [ "async-trait", "bytes", @@ -1664,18 +1787,18 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "os_pipe" -version = "1.1.5" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1686,9 +1809,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1696,22 +1819,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "parse-zoneinfo" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" dependencies = [ "regex", ] @@ -1735,9 +1858,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.6" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -1746,9 +1869,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.6" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -1756,22 +1879,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.6" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "pest_meta" -version = "2.7.6" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -1816,31 +1939,11 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1850,9 +1953,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "powerfmt" @@ -1862,9 +1965,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-error" @@ -1892,36 +1998,36 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "psm" -version = "0.1.21" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" dependencies = [ "cc", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "quoted_printable" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ec282e887b434b68c18fe5c121d38e72a5cf35119b59e54ec5b992ea9c8eb0" +checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" [[package]] name = "rand" @@ -1953,56 +2059,25 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redis" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8455fa3621f6b41c514946de66ea0531f57ca017b2e6c7cc368035ea5b46df" -dependencies = [ - "async-trait", - "bytes", - "combine", - "futures-util", - "itoa", - "percent-encoding", - "pin-project-lite", - "ryu", - "sha1_smol", - "tokio", - "tokio-util", - "url", -] - [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" -dependencies = [ - "getrandom", - "libredox", - "thiserror", + "bitflags", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -2016,13 +2091,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.5", ] [[package]] @@ -2033,48 +2108,23 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "requestty" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa883a1f3e288e65187f653e6ba2e84fdf810fe02f4c8074f9c723d1aa26e2ae" -dependencies = [ - "requestty-ui", - "shell-words", - "smallvec", - "tempfile", - "winsplit", -] - -[[package]] -name = "requestty-ui" -version = "0.5.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7549bab39cf982b629b68e7ec191a5574e85086e95c0ebe514c02d3b42ffe225" -dependencies = [ - "bitflags 1.3.2", - "crossterm", - "once_cell", - "textwrap", - "unicode-segmentation", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2086,7 +2136,7 @@ dependencies = [ "cruet", "fs-err", "glob", - "heck", + "heck 0.4.1", "regex", "serde", "serde_json", @@ -2098,17 +2148,17 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ - "bitflags 2.4.2", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -2117,9 +2167,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.8" +version = "0.23.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79adb16721f56eb2d843e67676896a61ce7a0fa622dc18d3e372477a029d2740" +checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" dependencies = [ "log", "once_cell", @@ -2132,25 +2182,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -2159,41 +2208,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "rusty-sidekiq" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a00db3916faeea070039864f98d4fd759d96fc07722571a4918d996fea5621" -dependencies = [ - "async-trait", - "bb8", - "chrono", - "cron_clock", - "gethostname", - "heck", - "hex", - "num_cpus", - "rand", - "redis", - "serde", - "serde_json", - "sha2", - "slog-term", - "thiserror", - "tokio", - "tracing", - "tracing-subscriber", -] +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -2218,49 +2241,47 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" -dependencies = [ - "serde", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_path_to_error" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -2276,6 +2297,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2290,18 +2320,18 @@ dependencies = [ [[package]] name = "serde_variant" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a8ec0b2fd0506290348d9699c0e3eb2e3e8c0498b5a9a6158b3bd4d6970076" +checksum = "0a0068df419f9d9b6488fdded3f1c818522cdea328e02ce9d9f147380265a432" dependencies = [ "serde", ] [[package]] name = "serde_yaml" -version = "0.9.30" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap", "itoa", @@ -2321,12 +2351,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sha2" version = "0.10.8" @@ -2349,12 +2373,12 @@ dependencies = [ [[package]] name = "shared_child" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" dependencies = [ "libc", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -2364,31 +2388,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.3" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" -dependencies = [ - "libc", - "mio", - "signal-hook", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -2408,30 +2417,11 @@ dependencies = [ "autocfg", ] -[[package]] -name = "slog" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" - -[[package]] -name = "slog-term" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" -dependencies = [ - "atty", - "slog", - "term", - "thread_local", - "time", -] - [[package]] name = "slug" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" +checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" dependencies = [ "deunicode", "wasm-bindgen", @@ -2439,67 +2429,90 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" - -[[package]] -name = "smawk" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" -version = "0.7.5" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ - "doc-comment", "snafu-derive", ] [[package]] name = "snafu-derive" -version = "0.7.5" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.89", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "socketioxide" -version = "0.10.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e3eb9502d5e53d8c2c82e7b06ae8aea0fc0b7fe5048d14a1e761fb04ba9bc5" +checksum = "4a9ce59f845cfea2fe24cc7adbd512268893ee07bde899ae6477569dbc42dff3" dependencies = [ + "bytes", "engineioxide", - "futures", + "futures-core", + "futures-util", "http", "http-body", "hyper", - "itoa", + "matchit 0.8.5", "pin-project-lite", + "rustversion", "serde", - "serde_json", + "socketioxide-core", + "socketioxide-parser-common", "state", "thiserror", "tokio", - "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "socketioxide-core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82826d9a1efb2b201e7d12d231f98870f768d98d02452eb642bca0587a8d51f0" +dependencies = [ + "bytes", + "engineioxide", + "serde", + "thiserror", +] + +[[package]] +name = "socketioxide-parser-common" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a20b64f78a6d093d73d4d166b5bfc8b5096069865c59cee67b3aafac77eaac" +dependencies = [ + "bytes", + "itoa", + "serde", + "serde_json", + "socketioxide-core", ] [[package]] @@ -2508,17 +2521,23 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stacker" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" dependencies = [ "cc", "cfg-if", "libc", "psm", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -2532,15 +2551,15 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2549,15 +2568,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.48" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", @@ -2570,24 +2588,41 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "tempfile" -version = "3.9.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "tera" -version = "1.19.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" +checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" dependencies = [ "chrono", "chrono-tz", @@ -2605,53 +2640,31 @@ dependencies = [ "unic-segment", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "textwrap" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" -dependencies = [ - "smawk", - "unicode-linebreak", - "unicode-width", -] - [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -2659,14 +2672,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", - "libc", - "num_threads", + "num-conv", "powerfmt", "serde", "time-core", @@ -2681,18 +2693,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2705,32 +2728,45 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", - "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-cron-scheduler" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2594dd7c2abbbafbb1c78d167fd10860dc7bd75f814cb051a1e0d3e796b9702" +dependencies = [ + "chrono", + "cron", + "num-derive", + "num-traits", + "tokio", + "tracing", + "uuid", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] @@ -2746,9 +2782,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", @@ -2758,16 +2794,49 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -2775,11 +2844,22 @@ name = "tower" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -2788,12 +2868,12 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "async-compression", - "bitflags 2.4.2", + "bitflags", "bytes", "futures-core", "futures-util", @@ -2815,15 +2895,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2837,6 +2917,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.27" @@ -2845,7 +2937,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", ] [[package]] @@ -2902,9 +2994,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", @@ -2915,7 +3007,6 @@ dependencies = [ "rand", "sha1", "thiserror", - "url", "utf-8", ] @@ -2927,9 +3018,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unic-char-property" @@ -2983,57 +3074,42 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -3043,12 +3119,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna 1.0.3", "percent-encoding", ] @@ -3058,35 +3134,48 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", + "rand", ] [[package]] name = "validator" -version = "0.16.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b92f40481c04ff1f4f61f304d61793c7b56ff76ac1469f1beb199b1445b253bd" +checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" dependencies = [ - "idna 0.4.0", - "lazy_static", + "idna 0.5.0", + "once_cell", "regex", "serde", "serde_derive", @@ -3097,28 +3186,16 @@ dependencies = [ [[package]] name = "validator_derive" -version = "0.16.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc44ca3088bb3ba384d9aecf40c6a23a676ce23e09bdaca2073d99c207f864af" +checksum = "df0bcf92720c40105ac4b2dda2a4ea3aa717d4d6a862cc217da653a4bd5c6b10" dependencies = [ - "if_chain", - "lazy_static", + "darling", + "once_cell", "proc-macro-error", "proc-macro2", "quote", - "regex", - "syn 1.0.109", - "validator_types", -] - -[[package]] -name = "validator_types" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111abfe30072511849c5910134e8baf8dc05de4c0e5903d681cbd5c9c4d611e3" -dependencies = [ - "proc-macro2", - "syn 1.0.109", + "syn 2.0.89", ] [[package]] @@ -3129,15 +3206,15 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[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", @@ -3151,34 +3228,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3186,28 +3264,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "webpki-roots" -version = "0.26.0" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de2cfda980f21be5a7ed2eadb3e6fe074d56022bea2cdeb1a62eb220fc04188" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -3230,11 +3308,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -3259,7 +3337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -3268,7 +3346,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -3286,7 +3364,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -3306,17 +3393,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -3327,9 +3415,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -3339,9 +3427,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -3351,9 +3439,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -3363,9 +3457,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -3375,9 +3469,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -3387,9 +3481,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -3399,65 +3493,148 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winsplit" -version = "0.1.0" +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab703352da6a72f35c39a533526393725640575bb211f61987a2748323ad956" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "synstructure", +] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.89", + "synstructure", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index a8213c9..8b97c1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,21 +9,24 @@ edition = "2021" [dependencies] -loco-rs = { version = "0.5.0", default-features = false, features = [ - "cli", - "channels", -] } +loco-rs = { version = "0.13.0", default-features = false, features = ["cli"] } serde = { version = "1.0.195", features = ["derive"] } serde_json = "1.0.111" -eyre = "0.6.11" -tokio = { version = "1.33.0", default-features = false } +tokio = { version = "1.33.0", default-features = false, features = [ + "rt-multi-thread", + "macros", +] } async-trait = "0.1.74" chrono = { version = "0.4", features = ["serde"] } -axum = "0.7.1" +axum = "0.7.5" tracing = "0.1.40" tracing-subscriber = { version = "0.3.17", features = ["env-filter", "json"] } +socketioxide = { version = "0.15.1", features = ["extensions", "state"] } +tower = { version = "*" } +tower-http = { version = "0.6.2", features = ["cors", "fs"] } + [[bin]] name = "chat_rooms-cli" path = "src/bin/main.rs" diff --git a/README.md b/README.md index ca66146..c4336dc 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ cargo loco start ``` -After the server starts, open your web browser and navigate to http://127.0.0.1:3000 to access the chat rooms. \ No newline at end of file +After the server starts, open your web browser and navigate to http://127.0.0.1:5150 to access the chat rooms. \ No newline at end of file diff --git a/config/development.yaml b/config/development.yaml index 9b2b6b7..3c229d9 100644 --- a/config/development.yaml +++ b/config/development.yaml @@ -15,34 +15,11 @@ logger: # Web server configuration server: # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} - port: 3000 + port: 5150 # The UI hostname or IP address that mailers will point to. host: http://localhost # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block middlewares: - # Enable Etag cache header middleware - etag: - enable: true - # Allows to limit the payload size request. payload that bigger than this file will blocked the request. - limit_payload: - # Enable/Disable the middleware. - enable: true - # the limit size. can be b,kb,kib,mb,mib,gb,gib - body_limit: 5mb - # Generating a unique request ID and enhancing logging with additional information such as the start and completion of request processing, latency, status code, and other request details. - logger: - # Enable/Disable the middleware. - enable: true - # when your code is panicked, the request still returns 500 status code. - catch_panic: - # Enable/Disable the middleware. - enable: true - # Timeout for incoming requests middleware. requests that take more time from the configuration will cute and 408 status code will returned. - timeout_request: - # Enable/Disable the middleware. - enable: false - # Duration time in milliseconds. - timeout: 5000 static: enable: true must_exist: true diff --git a/frontend/dist/assets/index-S6s5_GGp.js b/frontend/dist/assets/index-S6s5_GGp.js deleted file mode 100644 index 2806955..0000000 --- a/frontend/dist/assets/index-S6s5_GGp.js +++ /dev/null @@ -1,43 +0,0 @@ -function Wd(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();function Qd(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ka={exports:{}},so={},Ya={exports:{}},F={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var zr=Symbol.for("react.element"),Kd=Symbol.for("react.portal"),Yd=Symbol.for("react.fragment"),qd=Symbol.for("react.strict_mode"),Xd=Symbol.for("react.profiler"),Gd=Symbol.for("react.provider"),Jd=Symbol.for("react.context"),Zd=Symbol.for("react.forward_ref"),bd=Symbol.for("react.suspense"),ep=Symbol.for("react.memo"),tp=Symbol.for("react.lazy"),ku=Symbol.iterator;function np(e){return e===null||typeof e!="object"?null:(e=ku&&e[ku]||e["@@iterator"],typeof e=="function"?e:null)}var qa={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Xa=Object.assign,Ga={};function Un(e,t,n){this.props=e,this.context=t,this.refs=Ga,this.updater=n||qa}Un.prototype.isReactComponent={};Un.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Un.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ja(){}Ja.prototype=Un.prototype;function ms(e,t,n){this.props=e,this.context=t,this.refs=Ga,this.updater=n||qa}var vs=ms.prototype=new Ja;vs.constructor=ms;Xa(vs,Un.prototype);vs.isPureReactComponent=!0;var xu=Array.isArray,Za=Object.prototype.hasOwnProperty,gs={current:null},ba={key:!0,ref:!0,__self:!0,__source:!0};function ec(e,t,n){var r,i={},o=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(o=""+t.key),t)Za.call(t,r)&&!ba.hasOwnProperty(r)&&(i[r]=t[r]);var s=arguments.length-2;if(s===1)i.children=n;else if(1>>1,B=_[I];if(0>>1;Ii(Qr,O))sti(pn,Qr)?(_[I]=pn,_[st]=O,I=st):(_[I]=Qr,_[ne]=O,I=ne);else if(sti(pn,O))_[I]=pn,_[st]=O,I=st;else break e}}return L}function i(_,L){var O=_.sortIndex-L.sortIndex;return O!==0?O:_.id-L.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var l=Date,s=l.now();e.unstable_now=function(){return l.now()-s}}var u=[],a=[],f=1,h=null,m=3,g=!1,y=!1,w=!1,k=typeof setTimeout=="function"?setTimeout:null,p=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(_){for(var L=n(a);L!==null;){if(L.callback===null)r(a);else if(L.startTime<=_)r(a),L.sortIndex=L.expirationTime,t(u,L);else break;L=n(a)}}function E(_){if(w=!1,d(_),!y)if(n(u)!==null)y=!0,Qt(C);else{var L=n(a);L!==null&&Ve(E,L.startTime-_)}}function C(_,L){y=!1,w&&(w=!1,p(P),P=-1),g=!0;var O=m;try{for(d(L),h=n(u);h!==null&&(!(h.expirationTime>L)||_&&!oe());){var I=h.callback;if(typeof I=="function"){h.callback=null,m=h.priorityLevel;var B=I(h.expirationTime<=L);L=e.unstable_now(),typeof B=="function"?h.callback=B:h===n(u)&&r(u),d(L)}else r(u);h=n(u)}if(h!==null)var Kt=!0;else{var ne=n(a);ne!==null&&Ve(E,ne.startTime-L),Kt=!1}return Kt}finally{h=null,m=O,g=!1}}var x=!1,N=null,P=-1,z=5,$=-1;function oe(){return!(e.unstable_now()-$_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):z=0<_?Math.floor(1e3/_):5},e.unstable_getCurrentPriorityLevel=function(){return m},e.unstable_getFirstCallbackNode=function(){return n(u)},e.unstable_next=function(_){switch(m){case 1:case 2:case 3:var L=3;break;default:L=m}var O=m;m=L;try{return _()}finally{m=O}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(_,L){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var O=m;m=_;try{return L()}finally{m=O}},e.unstable_scheduleCallback=function(_,L,O){var I=e.unstable_now();switch(typeof O=="object"&&O!==null?(O=O.delay,O=typeof O=="number"&&0I?(_.sortIndex=O,t(a,_),n(u)===null&&_===n(a)&&(w?(p(P),P=-1):w=!0,Ve(E,O-I))):(_.sortIndex=B,t(u,_),y||g||(y=!0,Qt(C))),_},e.unstable_shouldYield=oe,e.unstable_wrapCallback=function(_){var L=m;return function(){var O=m;m=L;try{return _.apply(this,arguments)}finally{m=O}}}})(ic);rc.exports=ic;var pp=rc.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var oc=v,Ne=pp;function S(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),cl=Object.prototype.hasOwnProperty,hp=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,_u={},Tu={};function mp(e){return cl.call(Tu,e)?!0:cl.call(_u,e)?!1:hp.test(e)?Tu[e]=!0:(_u[e]=!0,!1)}function vp(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function gp(e,t,n,r){if(t===null||typeof t>"u"||vp(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ge(e,t,n,r,i,o,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=l}var ue={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ue[e]=new ge(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ue[t]=new ge(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ue[e]=new ge(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ue[e]=new ge(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ue[e]=new ge(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ue[e]=new ge(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ue[e]=new ge(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ue[e]=new ge(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ue[e]=new ge(e,5,!1,e.toLowerCase(),null,!1,!1)});var ws=/[\-:]([a-z])/g;function Es(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ws,Es);ue[t]=new ge(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ws,Es);ue[t]=new ge(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ws,Es);ue[t]=new ge(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ue[e]=new ge(e,1,!1,e.toLowerCase(),null,!1,!1)});ue.xlinkHref=new ge("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ue[e]=new ge(e,1,!1,e.toLowerCase(),null,!0,!0)});function Ss(e,t,n,r){var i=ue.hasOwnProperty(t)?ue[t]:null;(i!==null?i.type!==0:r||!(2s||i[l]!==o[s]){var u=` -`+i[l].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=l&&0<=s);break}}}finally{Oo=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?ir(e):""}function yp(e){switch(e.tag){case 5:return ir(e.type);case 16:return ir("Lazy");case 13:return ir("Suspense");case 19:return ir("SuspenseList");case 0:case 2:case 15:return e=$o(e.type,!1),e;case 11:return e=$o(e.type.render,!1),e;case 1:return e=$o(e.type,!0),e;default:return""}}function hl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case gn:return"Fragment";case vn:return"Portal";case fl:return"Profiler";case ks:return"StrictMode";case dl:return"Suspense";case pl:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case uc:return(e.displayName||"Context")+".Consumer";case sc:return(e._context.displayName||"Context")+".Provider";case xs:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Cs:return t=e.displayName||null,t!==null?t:hl(e.type)||"Memo";case Ct:t=e._payload,e=e._init;try{return hl(e(t))}catch{}}return null}function wp(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return hl(t);case 8:return t===ks?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Bt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function cc(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ep(e){var t=cc(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(l){r=""+l,o.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Xr(e){e._valueTracker||(e._valueTracker=Ep(e))}function fc(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=cc(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Ai(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ml(e,t){var n=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Pu(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Bt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function dc(e,t){t=t.checked,t!=null&&Ss(e,"checked",t,!1)}function vl(e,t){dc(e,t);var n=Bt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?gl(e,t.type,n):t.hasOwnProperty("defaultValue")&&gl(e,t.type,Bt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ru(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function gl(e,t,n){(t!=="number"||Ai(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var or=Array.isArray;function Pn(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=Gr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Sr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var cr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sp=["Webkit","ms","Moz","O"];Object.keys(cr).forEach(function(e){Sp.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),cr[t]=cr[e]})});function vc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||cr.hasOwnProperty(e)&&cr[e]?(""+t).trim():t+"px"}function gc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,i=vc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}var kp=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function El(e,t){if(t){if(kp[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(S(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(S(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(S(61))}if(t.style!=null&&typeof t.style!="object")throw Error(S(62))}}function Sl(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var kl=null;function _s(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xl=null,Rn=null,Ln=null;function $u(e){if(e=Br(e)){if(typeof xl!="function")throw Error(S(280));var t=e.stateNode;t&&(t=po(t),xl(e.stateNode,e.type,t))}}function yc(e){Rn?Ln?Ln.push(e):Ln=[e]:Rn=e}function wc(){if(Rn){var e=Rn,t=Ln;if(Ln=Rn=null,$u(e),t)for(e=0;e>>=0,e===0?32:31-(Ap(e)/Fp|0)|0}var Jr=64,Zr=4194304;function lr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function zi(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,o=e.pingedLanes,l=n&268435455;if(l!==0){var s=l&~i;s!==0?r=lr(s):(o&=l,o!==0&&(r=lr(o)))}else l=n&~i,l!==0?r=lr(l):o!==0&&(r=lr(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&i)&&(i=r&-r,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function jr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Xe(t),e[t]=n}function jp(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=dr),Uu=" ",Hu=!1;function Ic(e,t){switch(e){case"keyup":return dh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var yn=!1;function hh(e,t){switch(e){case"compositionend":return Bc(t);case"keypress":return t.which!==32?null:(Hu=!0,Uu);case"textInput":return e=t.data,e===Uu&&Hu?null:e;default:return null}}function mh(e,t){if(yn)return e==="compositionend"||!As&&Ic(e,t)?(e=zc(),Ei=Ls=Rt=null,yn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ku(n)}}function Wc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Wc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Qc(){for(var e=window,t=Ai();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ai(e.document)}return t}function Fs(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Ch(e){var t=Qc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Wc(n.ownerDocument.documentElement,n)){if(r!==null&&Fs(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,o=Math.min(r.start,i);r=r.end===void 0?o:Math.min(r.end,i),!e.extend&&o>r&&(i=r,r=o,o=i),i=Yu(n,o);var l=Yu(n,r);i&&l&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,wn=null,Rl=null,hr=null,Ll=!1;function qu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ll||wn==null||wn!==Ai(r)||(r=wn,"selectionStart"in r&&Fs(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),hr&&Nr(hr,r)||(hr=r,r=Bi(Rl,"onSelect"),0kn||(e.current=Ml[kn],Ml[kn]=null,kn--)}function U(e,t){kn++,Ml[kn]=e.current,e.current=t}var Ut={},pe=Vt(Ut),Ee=Vt(!1),on=Ut;function Dn(e,t){var n=e.type.contextTypes;if(!n)return Ut;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in n)i[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Se(e){return e=e.childContextTypes,e!=null}function Hi(){V(Ee),V(pe)}function ta(e,t,n){if(pe.current!==Ut)throw Error(S(168));U(pe,t),U(Ee,n)}function ef(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var i in r)if(!(i in t))throw Error(S(108,wp(e)||"Unknown",i));return q({},n,r)}function Vi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ut,on=pe.current,U(pe,e),U(Ee,Ee.current),!0}function na(e,t,n){var r=e.stateNode;if(!r)throw Error(S(169));n?(e=ef(e,t,on),r.__reactInternalMemoizedMergedChildContext=e,V(Ee),V(pe),U(pe,e)):V(Ee),U(Ee,n)}var ct=null,ho=!1,Ko=!1;function tf(e){ct===null?ct=[e]:ct.push(e)}function Mh(e){ho=!0,tf(e)}function Wt(){if(!Ko&&ct!==null){Ko=!0;var e=0,t=j;try{var n=ct;for(j=1;e>=l,i-=l,ft=1<<32-Xe(t)+i|n<P?(z=N,N=null):z=N.sibling;var $=m(p,N,d[P],E);if($===null){N===null&&(N=z);break}e&&N&&$.alternate===null&&t(p,N),c=o($,c,P),x===null?C=$:x.sibling=$,x=$,N=z}if(P===d.length)return n(p,N),W&&Yt(p,P),C;if(N===null){for(;PP?(z=N,N=null):z=N.sibling;var oe=m(p,N,$.value,E);if(oe===null){N===null&&(N=z);break}e&&N&&oe.alternate===null&&t(p,N),c=o(oe,c,P),x===null?C=oe:x.sibling=oe,x=oe,N=z}if($.done)return n(p,N),W&&Yt(p,P),C;if(N===null){for(;!$.done;P++,$=d.next())$=h(p,$.value,E),$!==null&&(c=o($,c,P),x===null?C=$:x.sibling=$,x=$);return W&&Yt(p,P),C}for(N=r(p,N);!$.done;P++,$=d.next())$=g(N,p,P,$.value,E),$!==null&&(e&&$.alternate!==null&&N.delete($.key===null?P:$.key),c=o($,c,P),x===null?C=$:x.sibling=$,x=$);return e&&N.forEach(function(Oe){return t(p,Oe)}),W&&Yt(p,P),C}function k(p,c,d,E){if(typeof d=="object"&&d!==null&&d.type===gn&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case qr:e:{for(var C=d.key,x=c;x!==null;){if(x.key===C){if(C=d.type,C===gn){if(x.tag===7){n(p,x.sibling),c=i(x,d.props.children),c.return=p,p=c;break e}}else if(x.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===Ct&&aa(C)===x.type){n(p,x.sibling),c=i(x,d.props),c.ref=Zn(p,x,d),c.return=p,p=c;break e}n(p,x);break}else t(p,x);x=x.sibling}d.type===gn?(c=tn(d.props.children,p.mode,E,d.key),c.return=p,p=c):(E=Pi(d.type,d.key,d.props,null,p.mode,E),E.ref=Zn(p,c,d),E.return=p,p=E)}return l(p);case vn:e:{for(x=d.key;c!==null;){if(c.key===x)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(p,c.sibling),c=i(c,d.children||[]),c.return=p,p=c;break e}else{n(p,c);break}else t(p,c);c=c.sibling}c=el(d,p.mode,E),c.return=p,p=c}return l(p);case Ct:return x=d._init,k(p,c,x(d._payload),E)}if(or(d))return y(p,c,d,E);if(Yn(d))return w(p,c,d,E);oi(p,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(p,c.sibling),c=i(c,d),c.return=p,p=c):(n(p,c),c=bo(d,p.mode,E),c.return=p,p=c),l(p)):n(p,c)}return k}var zn=cf(!0),ff=cf(!1),Ur={},rt=Vt(Ur),Or=Vt(Ur),$r=Vt(Ur);function Zt(e){if(e===Ur)throw Error(S(174));return e}function Vs(e,t){switch(U($r,t),U(Or,e),U(rt,Ur),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:wl(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=wl(t,e)}V(rt),U(rt,t)}function jn(){V(rt),V(Or),V($r)}function df(e){Zt($r.current);var t=Zt(rt.current),n=wl(t,e.type);t!==n&&(U(Or,e),U(rt,n))}function Ws(e){Or.current===e&&(V(rt),V(Or))}var K=Vt(0);function Xi(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Yo=[];function Qs(){for(var e=0;en?n:4,e(!0);var r=qo.transition;qo.transition={};try{e(!1),t()}finally{j=n,qo.transition=r}}function Pf(){return Ie().memoizedState}function Bh(e,t,n){var r=jt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Rf(e))Lf(t,n);else if(n=lf(e,t,n,r),n!==null){var i=me();Ge(n,e,r,i),Of(n,t,r)}}function Uh(e,t,n){var r=jt(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Rf(e))Lf(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var l=t.lastRenderedState,s=o(l,n);if(i.hasEagerState=!0,i.eagerState=s,Je(s,l)){var u=t.interleaved;u===null?(i.next=i,Us(t)):(i.next=u.next,u.next=i),t.interleaved=i;return}}catch{}finally{}n=lf(e,t,i,r),n!==null&&(i=me(),Ge(n,e,r,i),Of(n,t,r))}}function Rf(e){var t=e.alternate;return e===Y||t!==null&&t===Y}function Lf(e,t){mr=Gi=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Of(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ns(e,n)}}var Ji={readContext:je,useCallback:ae,useContext:ae,useEffect:ae,useImperativeHandle:ae,useInsertionEffect:ae,useLayoutEffect:ae,useMemo:ae,useReducer:ae,useRef:ae,useState:ae,useDebugValue:ae,useDeferredValue:ae,useTransition:ae,useMutableSource:ae,useSyncExternalStore:ae,useId:ae,unstable_isNewReconciler:!1},Hh={readContext:je,useCallback:function(e,t){return et().memoizedState=[e,t===void 0?null:t],e},useContext:je,useEffect:fa,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Ci(4194308,4,xf.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ci(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ci(4,2,e,t)},useMemo:function(e,t){var n=et();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=et();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Bh.bind(null,Y,e),[r.memoizedState,e]},useRef:function(e){var t=et();return e={current:e},t.memoizedState=e},useState:ca,useDebugValue:Gs,useDeferredValue:function(e){return et().memoizedState=e},useTransition:function(){var e=ca(!1),t=e[0];return e=Ih.bind(null,e[1]),et().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Y,i=et();if(W){if(n===void 0)throw Error(S(407));n=n()}else{if(n=t(),ie===null)throw Error(S(349));sn&30||mf(r,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,fa(gf.bind(null,r,o,e),[e]),r.flags|=2048,Dr(9,vf.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=et(),t=ie.identifierPrefix;if(W){var n=dt,r=ft;n=(r&~(1<<32-Xe(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Ar++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[tt]=t,e[Lr]=r,Bf(e,t,!1,!1),t.stateNode=e;e:{switch(l=Sl(n,r),n){case"dialog":H("cancel",e),H("close",e),i=r;break;case"iframe":case"object":case"embed":H("load",e),i=r;break;case"video":case"audio":for(i=0;iBn&&(t.flags|=128,r=!0,bn(o,!1),t.lanes=4194304)}else{if(!r)if(e=Xi(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),bn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!l.alternate&&!W)return ce(t),null}else 2*G()-o.renderingStartTime>Bn&&n!==1073741824&&(t.flags|=128,r=!0,bn(o,!1),t.lanes=4194304);o.isBackwards?(l.sibling=t.child,t.child=l):(n=o.last,n!==null?n.sibling=l:t.child=l,o.last=l)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=G(),t.sibling=null,n=K.current,U(K,r?n&1|2:n&1),t):(ce(t),null);case 22:case 23:return nu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?xe&1073741824&&(ce(t),t.subtreeFlags&6&&(t.flags|=8192)):ce(t),null;case 24:return null;case 25:return null}throw Error(S(156,t.tag))}function Gh(e,t){switch(Ms(t),t.tag){case 1:return Se(t.type)&&Hi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return jn(),V(Ee),V(pe),Qs(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ws(t),null;case 13:if(V(K),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(S(340));Mn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return V(K),null;case 4:return jn(),null;case 10:return Bs(t.type._context),null;case 22:case 23:return nu(),null;case 24:return null;default:return null}}var si=!1,fe=!1,Jh=typeof WeakSet=="function"?WeakSet:Set,T=null;function Tn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){X(e,t,r)}else n.current=null}function ql(e,t,n){try{n()}catch(r){X(e,t,r)}}var Ea=!1;function Zh(e,t){if(Ol=ji,e=Qc(),Fs(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var l=0,s=-1,u=-1,a=0,f=0,h=e,m=null;t:for(;;){for(var g;h!==n||i!==0&&h.nodeType!==3||(s=l+i),h!==o||r!==0&&h.nodeType!==3||(u=l+r),h.nodeType===3&&(l+=h.nodeValue.length),(g=h.firstChild)!==null;)m=h,h=g;for(;;){if(h===e)break t;if(m===n&&++a===i&&(s=l),m===o&&++f===r&&(u=l),(g=h.nextSibling)!==null)break;h=m,m=h.parentNode}h=g}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for($l={focusedElem:e,selectionRange:n},ji=!1,T=t;T!==null;)if(t=T,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,T=e;else for(;T!==null;){t=T;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var w=y.memoizedProps,k=y.memoizedState,p=t.stateNode,c=p.getSnapshotBeforeUpdate(t.elementType===t.type?w:Qe(t.type,w),k);p.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(S(163))}}catch(E){X(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,T=e;break}T=t.return}return y=Ea,Ea=!1,y}function vr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&ql(t,n,o)}i=i.next}while(i!==r)}}function go(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Xl(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Vf(e){var t=e.alternate;t!==null&&(e.alternate=null,Vf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[tt],delete t[Lr],delete t[Dl],delete t[Fh],delete t[Dh])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Wf(e){return e.tag===5||e.tag===3||e.tag===4}function Sa(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Wf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Gl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Ui));else if(r!==4&&(e=e.child,e!==null))for(Gl(e,t,n),e=e.sibling;e!==null;)Gl(e,t,n),e=e.sibling}function Jl(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Jl(e,t,n),e=e.sibling;e!==null;)Jl(e,t,n),e=e.sibling}var le=null,Ke=!1;function kt(e,t,n){for(n=n.child;n!==null;)Qf(e,t,n),n=n.sibling}function Qf(e,t,n){if(nt&&typeof nt.onCommitFiberUnmount=="function")try{nt.onCommitFiberUnmount(uo,n)}catch{}switch(n.tag){case 5:fe||Tn(n,t);case 6:var r=le,i=Ke;le=null,kt(e,t,n),le=r,Ke=i,le!==null&&(Ke?(e=le,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):le.removeChild(n.stateNode));break;case 18:le!==null&&(Ke?(e=le,n=n.stateNode,e.nodeType===8?Qo(e.parentNode,n):e.nodeType===1&&Qo(e,n),_r(e)):Qo(le,n.stateNode));break;case 4:r=le,i=Ke,le=n.stateNode.containerInfo,Ke=!0,kt(e,t,n),le=r,Ke=i;break;case 0:case 11:case 14:case 15:if(!fe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var o=i,l=o.destroy;o=o.tag,l!==void 0&&(o&2||o&4)&&ql(n,t,l),i=i.next}while(i!==r)}kt(e,t,n);break;case 1:if(!fe&&(Tn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){X(n,t,s)}kt(e,t,n);break;case 21:kt(e,t,n);break;case 22:n.mode&1?(fe=(r=fe)||n.memoizedState!==null,kt(e,t,n),fe=r):kt(e,t,n);break;default:kt(e,t,n)}}function ka(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Jh),t.forEach(function(r){var i=sm.bind(null,e,r);n.has(r)||(n.add(r),r.then(i,i))})}}function We(e,t){var n=t.deletions;if(n!==null)for(var r=0;ri&&(i=l),r&=~o}if(r=i,r=G()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*em(r/1960))-r,10e?16:e,Lt===null)var r=!1;else{if(e=Lt,Lt=null,eo=0,M&6)throw Error(S(331));var i=M;for(M|=4,T=e.current;T!==null;){var o=T,l=o.child;if(T.flags&16){var s=o.deletions;if(s!==null){for(var u=0;uG()-eu?en(e,0):bs|=n),ke(e,t)}function bf(e,t){t===0&&(e.mode&1?(t=Zr,Zr<<=1,!(Zr&130023424)&&(Zr=4194304)):t=1);var n=me();e=yt(e,t),e!==null&&(jr(e,t,n),ke(e,n))}function lm(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),bf(e,n)}function sm(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(S(314))}r!==null&&r.delete(t),bf(e,n)}var ed;ed=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ee.current)we=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return we=!1,qh(e,t,n);we=!!(e.flags&131072)}else we=!1,W&&t.flags&1048576&&nf(t,Qi,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;_i(e,t),e=t.pendingProps;var i=Dn(t,pe.current);$n(t,n),i=Ys(null,t,r,e,i,n);var o=qs();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Se(r)?(o=!0,Vi(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,Hs(t),i.updater=mo,t.stateNode=i,i._reactInternals=t,Ul(t,r,e,n),t=Wl(null,t,r,!0,o,n)):(t.tag=0,W&&o&&Ds(t),he(null,t,i,n),t=t.child),t;case 16:r=t.elementType;e:{switch(_i(e,t),e=t.pendingProps,i=r._init,r=i(r._payload),t.type=r,i=t.tag=am(r),e=Qe(r,e),i){case 0:t=Vl(null,t,r,e,n);break e;case 1:t=ga(null,t,r,e,n);break e;case 11:t=ma(null,t,r,e,n);break e;case 14:t=va(null,t,r,Qe(r.type,e),n);break e}throw Error(S(306,r,""))}return t;case 0:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Qe(r,i),Vl(e,t,r,i,n);case 1:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Qe(r,i),ga(e,t,r,i,n);case 3:e:{if(zf(t),e===null)throw Error(S(387));r=t.pendingProps,o=t.memoizedState,i=o.element,sf(e,t),qi(t,r,null,n);var l=t.memoizedState;if(r=l.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=In(Error(S(423)),t),t=ya(e,t,r,n,i);break e}else if(r!==i){i=In(Error(S(424)),t),t=ya(e,t,r,n,i);break e}else for(_e=Dt(t.stateNode.containerInfo.firstChild),Te=t,W=!0,qe=null,n=ff(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Mn(),r===i){t=wt(e,t,n);break e}he(e,t,r,n)}t=t.child}return t;case 5:return df(t),e===null&&jl(t),r=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,l=i.children,Al(r,i)?l=null:o!==null&&Al(r,o)&&(t.flags|=32),Mf(e,t),he(e,t,l,n),t.child;case 6:return e===null&&jl(t),null;case 13:return jf(e,t,n);case 4:return Vs(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=zn(t,null,r,n):he(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Qe(r,i),ma(e,t,r,i,n);case 7:return he(e,t,t.pendingProps,n),t.child;case 8:return he(e,t,t.pendingProps.children,n),t.child;case 12:return he(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,o=t.memoizedProps,l=i.value,U(Ki,r._currentValue),r._currentValue=l,o!==null)if(Je(o.value,l)){if(o.children===i.children&&!Ee.current){t=wt(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var s=o.dependencies;if(s!==null){l=o.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(o.tag===1){u=pt(-1,n&-n),u.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var f=a.pending;f===null?u.next=u:(u.next=f.next,f.next=u),a.pending=u}}o.lanes|=n,u=o.alternate,u!==null&&(u.lanes|=n),Il(o.return,n,t),s.lanes|=n;break}u=u.next}}else if(o.tag===10)l=o.type===t.type?null:o.child;else if(o.tag===18){if(l=o.return,l===null)throw Error(S(341));l.lanes|=n,s=l.alternate,s!==null&&(s.lanes|=n),Il(l,n,t),l=o.sibling}else l=o.child;if(l!==null)l.return=o;else for(l=o;l!==null;){if(l===t){l=null;break}if(o=l.sibling,o!==null){o.return=l.return,l=o;break}l=l.return}o=l}he(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=t.pendingProps.children,$n(t,n),i=je(i),r=r(i),t.flags|=1,he(e,t,r,n),t.child;case 14:return r=t.type,i=Qe(r,t.pendingProps),i=Qe(r.type,i),va(e,t,r,i,n);case 15:return Ff(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Qe(r,i),_i(e,t),t.tag=1,Se(r)?(e=!0,Vi(t)):e=!1,$n(t,n),af(t,r,i),Ul(t,r,i,n),Wl(null,t,r,!0,e,n);case 19:return If(e,t,n);case 22:return Df(e,t,n)}throw Error(S(156,t.tag))};function td(e,t){return Tc(e,t)}function um(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Me(e,t,n,r){return new um(e,t,n,r)}function iu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function am(e){if(typeof e=="function")return iu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===xs)return 11;if(e===Cs)return 14}return 2}function It(e,t){var n=e.alternate;return n===null?(n=Me(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Pi(e,t,n,r,i,o){var l=2;if(r=e,typeof e=="function")iu(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case gn:return tn(n.children,i,o,t);case ks:l=8,i|=8;break;case fl:return e=Me(12,n,t,i|2),e.elementType=fl,e.lanes=o,e;case dl:return e=Me(13,n,t,i),e.elementType=dl,e.lanes=o,e;case pl:return e=Me(19,n,t,i),e.elementType=pl,e.lanes=o,e;case ac:return wo(n,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case sc:l=10;break e;case uc:l=9;break e;case xs:l=11;break e;case Cs:l=14;break e;case Ct:l=16,r=null;break e}throw Error(S(130,e==null?e:typeof e,""))}return t=Me(l,n,t,i),t.elementType=e,t.type=r,t.lanes=o,t}function tn(e,t,n,r){return e=Me(7,e,r,t),e.lanes=n,e}function wo(e,t,n,r){return e=Me(22,e,r,t),e.elementType=ac,e.lanes=n,e.stateNode={isHidden:!1},e}function bo(e,t,n){return e=Me(6,e,null,t),e.lanes=n,e}function el(e,t,n){return t=Me(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function cm(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Fo(0),this.expirationTimes=Fo(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Fo(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function ou(e,t,n,r,i,o,l,s,u){return e=new cm(e,t,n,s,u),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Me(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Hs(o),e}function fm(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(od)}catch(e){console.error(e)}}od(),nc.exports=Pe;var ld=nc.exports,La=ld;al.createRoot=La.createRoot,al.hydrateRoot=La.hydrateRoot;const ot=Object.create(null);ot.open="0";ot.close="1";ot.ping="2";ot.pong="3";ot.message="4";ot.upgrade="5";ot.noop="6";const Ri=Object.create(null);Object.keys(ot).forEach(e=>{Ri[ot[e]]=e});const ns={type:"error",data:"parser error"},sd=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",ud=typeof ArrayBuffer=="function",ad=e=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,au=({type:e,data:t},n,r)=>sd&&t instanceof Blob?n?r(t):Oa(t,r):ud&&(t instanceof ArrayBuffer||ad(t))?n?r(t):Oa(new Blob([t]),r):r(ot[e]+(t||"")),Oa=(e,t)=>{const n=new FileReader;return n.onload=function(){const r=n.result.split(",")[1];t("b"+(r||""))},n.readAsDataURL(e)};function $a(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}let tl;function vm(e,t){if(sd&&e.data instanceof Blob)return e.data.arrayBuffer().then($a).then(t);if(ud&&(e.data instanceof ArrayBuffer||ad(e.data)))return t($a(e.data));au(e,!1,n=>{tl||(tl=new TextEncoder),t(tl.encode(n))})}const Aa="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ur=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let e=0;e{let t=e.length*.75,n=e.length,r,i=0,o,l,s,u;e[e.length-1]==="="&&(t--,e[e.length-2]==="="&&t--);const a=new ArrayBuffer(t),f=new Uint8Array(a);for(r=0;r>4,f[i++]=(l&15)<<4|s>>2,f[i++]=(s&3)<<6|u&63;return a},ym=typeof ArrayBuffer=="function",cu=(e,t)=>{if(typeof e!="string")return{type:"message",data:cd(e,t)};const n=e.charAt(0);return n==="b"?{type:"message",data:wm(e.substring(1),t)}:Ri[n]?e.length>1?{type:Ri[n],data:e.substring(1)}:{type:Ri[n]}:ns},wm=(e,t)=>{if(ym){const n=gm(e);return cd(n,t)}else return{base64:!0,data:e}},cd=(e,t)=>{switch(t){case"blob":return e instanceof Blob?e:new Blob([e]);case"arraybuffer":default:return e instanceof ArrayBuffer?e:e.buffer}},fd="",Em=(e,t)=>{const n=e.length,r=new Array(n);let i=0;e.forEach((o,l)=>{au(o,!1,s=>{r[l]=s,++i===n&&t(r.join(fd))})})},Sm=(e,t)=>{const n=e.split(fd),r=[];for(let i=0;i{const r=n.length;let i;if(r<126)i=new Uint8Array(1),new DataView(i.buffer).setUint8(0,r);else if(r<65536){i=new Uint8Array(3);const o=new DataView(i.buffer);o.setUint8(0,126),o.setUint16(1,r)}else{i=new Uint8Array(9);const o=new DataView(i.buffer);o.setUint8(0,127),o.setBigUint64(1,BigInt(r))}e.data&&typeof e.data!="string"&&(i[0]|=128),t.enqueue(i),t.enqueue(n)})}})}let nl;function ci(e){return e.reduce((t,n)=>t+n.length,0)}function fi(e,t){if(e[0].length===t)return e.shift();const n=new Uint8Array(t);let r=0;for(let i=0;iMath.pow(2,21)-1){s.enqueue(ns);break}i=f*Math.pow(2,32)+a.getUint32(4),r=3}else{if(ci(n)e){s.enqueue(ns);break}}}})}const dd=4;function b(e){if(e)return Cm(e)}function Cm(e){for(var t in b.prototype)e[t]=b.prototype[t];return e}b.prototype.on=b.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t),this};b.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this};b.prototype.off=b.prototype.removeListener=b.prototype.removeAllListeners=b.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var n=this._callbacks["$"+e];if(!n)return this;if(arguments.length==1)return delete this._callbacks["$"+e],this;for(var r,i=0;i(e.hasOwnProperty(r)&&(n[r]=e[r]),n),{})}const _m=De.setTimeout,Tm=De.clearTimeout;function Co(e,t){t.useNativeTimers?(e.setTimeoutFn=_m.bind(De),e.clearTimeoutFn=Tm.bind(De)):(e.setTimeoutFn=De.setTimeout.bind(De),e.clearTimeoutFn=De.clearTimeout.bind(De))}const Nm=1.33;function Pm(e){return typeof e=="string"?Rm(e):Math.ceil((e.byteLength||e.size)*Nm)}function Rm(e){let t=0,n=0;for(let r=0,i=e.length;r=57344?n+=3:(r++,n+=4);return n}function Lm(e){let t="";for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t}function Om(e){let t={},n=e.split("&");for(let r=0,i=n.length;r0);return t}function md(){const e=Ma(+new Date);return e!==Da?(Fa=0,Da=e):e+"."+Ma(Fa++)}for(;di{this.readyState="paused",t()};if(this.polling||!this.writable){let r=0;this.polling&&(r++,this.once("pollComplete",function(){--r||n()})),this.writable||(r++,this.once("drain",function(){--r||n()}))}else n()}poll(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){const n=r=>{if(this.readyState==="opening"&&r.type==="open"&&this.onOpen(),r.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(r)};Sm(t,this.socket.binaryType).forEach(n),this.readyState!=="closed"&&(this.polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this.poll())}doClose(){const t=()=>{this.write([{type:"close"}])};this.readyState==="open"?t():this.once("open",t)}write(t){this.writable=!1,Em(t,n=>{this.doWrite(n,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const t=this.opts.secure?"https":"http",n=this.query||{};return this.opts.timestampRequests!==!1&&(n[this.opts.timestampParam]=md()),!this.supportsBinary&&!n.sid&&(n.b64=1),this.createUri(t,n)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new it(this.uri(),t)}doWrite(t,n){const r=this.request({method:"POST",data:t});r.on("success",n),r.on("error",(i,o)=>{this.onError("xhr post error",i,o)})}doPoll(){const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",(n,r)=>{this.onError("xhr poll error",n,r)}),this.pollXhr=t}}class it extends b{constructor(t,n){super(),Co(this,n),this.opts=n,this.method=n.method||"GET",this.uri=t,this.data=n.data!==void 0?n.data:null,this.create()}create(){var t;const n=pd(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");n.xdomain=!!this.opts.xd;const r=this.xhr=new gd(n);try{r.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){r.setDisableHeaderCheck&&r.setDisableHeaderCheck(!0);for(let i in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(i)&&r.setRequestHeader(i,this.opts.extraHeaders[i])}}catch{}if(this.method==="POST")try{r.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{r.setRequestHeader("Accept","*/*")}catch{}(t=this.opts.cookieJar)===null||t===void 0||t.addCookies(r),"withCredentials"in r&&(r.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(r.timeout=this.opts.requestTimeout),r.onreadystatechange=()=>{var i;r.readyState===3&&((i=this.opts.cookieJar)===null||i===void 0||i.parseCookies(r)),r.readyState===4&&(r.status===200||r.status===1223?this.onLoad():this.setTimeoutFn(()=>{this.onError(typeof r.status=="number"?r.status:0)},0))},r.send(this.data)}catch(i){this.setTimeoutFn(()=>{this.onError(i)},0);return}typeof document<"u"&&(this.index=it.requestsCount++,it.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(!(typeof this.xhr>"u"||this.xhr===null)){if(this.xhr.onreadystatechange=Dm,t)try{this.xhr.abort()}catch{}typeof document<"u"&&delete it.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;t!==null&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}}it.requestsCount=0;it.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",za);else if(typeof addEventListener=="function"){const e="onpagehide"in De?"pagehide":"unload";addEventListener(e,za,!1)}}function za(){for(let e in it.requests)it.requests.hasOwnProperty(e)&&it.requests[e].abort()}const du=typeof Promise=="function"&&typeof Promise.resolve=="function"?t=>Promise.resolve().then(t):(t,n)=>n(t,0),pi=De.WebSocket||De.MozWebSocket,ja=!0,jm="arraybuffer",Ia=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class Im extends fu{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),n=this.opts.protocols,r=Ia?{}:pd(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(r.headers=this.opts.extraHeaders);try{this.ws=ja&&!Ia?n?new pi(t,n):new pi(t):new pi(t,n,r)}catch(i){return this.emitReserved("error",i)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let n=0;n{const l={};try{ja&&this.ws.send(o)}catch{}i&&du(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",n=this.query||{};return this.opts.timestampRequests&&(n[this.opts.timestampParam]=md()),this.supportsBinary||(n.b64=1),this.createUri(t,n)}check(){return!!pi}}class Bm extends fu{get name(){return"webtransport"}doOpen(){typeof WebTransport=="function"&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then(()=>{this.onClose()}).catch(t=>{this.onError("webtransport error",t)}),this.transport.ready.then(()=>{this.transport.createBidirectionalStream().then(t=>{const n=xm(Number.MAX_SAFE_INTEGER,this.socket.binaryType),r=t.readable.pipeThrough(n).getReader(),i=km();i.readable.pipeTo(t.writable),this.writer=i.writable.getWriter();const o=()=>{r.read().then(({done:s,value:u})=>{s||(this.onPacket(u),o())}).catch(s=>{})};o();const l={type:"open"};this.query.sid&&(l.data=`{"sid":"${this.query.sid}"}`),this.writer.write(l).then(()=>this.onOpen())})}))}write(t){this.writable=!1;for(let n=0;n{i&&du(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var t;(t=this.transport)===null||t===void 0||t.close()}}const Um={websocket:Im,webtransport:Bm,polling:zm},Hm=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,Vm=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function is(e){if(e.length>2e3)throw"URI too long";const t=e,n=e.indexOf("["),r=e.indexOf("]");n!=-1&&r!=-1&&(e=e.substring(0,n)+e.substring(n,r).replace(/:/g,";")+e.substring(r,e.length));let i=Hm.exec(e||""),o={},l=14;for(;l--;)o[Vm[l]]=i[l]||"";return n!=-1&&r!=-1&&(o.source=t,o.host=o.host.substring(1,o.host.length-1).replace(/;/g,":"),o.authority=o.authority.replace("[","").replace("]","").replace(/;/g,":"),o.ipv6uri=!0),o.pathNames=Wm(o,o.path),o.queryKey=Qm(o,o.query),o}function Wm(e,t){const n=/\/{2,9}/g,r=t.replace(n,"/").split("/");return(t.slice(0,1)=="/"||t.length===0)&&r.splice(0,1),t.slice(-1)=="/"&&r.splice(r.length-1,1),r}function Qm(e,t){const n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(r,i,o){i&&(n[i]=o)}),n}let yd=class mn extends b{constructor(t,n={}){super(),this.binaryType=jm,this.writeBuffer=[],t&&typeof t=="object"&&(n=t,t=null),t?(t=is(t),n.hostname=t.host,n.secure=t.protocol==="https"||t.protocol==="wss",n.port=t.port,t.query&&(n.query=t.query)):n.host&&(n.hostname=is(n.host).host),Co(this,n),this.secure=n.secure!=null?n.secure:typeof location<"u"&&location.protocol==="https:",n.hostname&&!n.port&&(n.port=this.secure?"443":"80"),this.hostname=n.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=n.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=n.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},n),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=Om(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,typeof addEventListener=="function"&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){const n=Object.assign({},this.opts.query);n.EIO=dd,n.transport=t,this.id&&(n.sid=this.id);const r=Object.assign({},this.opts,{query:n,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return new Um[t](r)}open(){let t;if(this.opts.rememberUpgrade&&mn.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)t="websocket";else if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}else t=this.transports[0];this.readyState="opening";try{t=this.createTransport(t)}catch{this.transports.shift(),this.open();return}t.open(),this.setTransport(t)}setTransport(t){this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",n=>this.onClose("transport close",n))}probe(t){let n=this.createTransport(t),r=!1;mn.priorWebsocketSuccess=!1;const i=()=>{r||(n.send([{type:"ping",data:"probe"}]),n.once("packet",h=>{if(!r)if(h.type==="pong"&&h.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",n),!n)return;mn.priorWebsocketSuccess=n.name==="websocket",this.transport.pause(()=>{r||this.readyState!=="closed"&&(f(),this.setTransport(n),n.send([{type:"upgrade"}]),this.emitReserved("upgrade",n),n=null,this.upgrading=!1,this.flush())})}else{const m=new Error("probe error");m.transport=n.name,this.emitReserved("upgradeError",m)}}))};function o(){r||(r=!0,f(),n.close(),n=null)}const l=h=>{const m=new Error("probe error: "+h);m.transport=n.name,o(),this.emitReserved("upgradeError",m)};function s(){l("transport closed")}function u(){l("socket closed")}function a(h){n&&h.name!==n.name&&o()}const f=()=>{n.removeListener("open",i),n.removeListener("error",l),n.removeListener("close",s),this.off("close",u),this.off("upgrading",a)};n.once("open",i),n.once("error",l),n.once("close",s),this.once("close",u),this.once("upgrading",a),this.upgrades.indexOf("webtransport")!==-1&&t!=="webtransport"?this.setTimeoutFn(()=>{r||n.open()},200):n.open()}onOpen(){if(this.readyState="open",mn.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush(),this.readyState==="open"&&this.opts.upgrade){let t=0;const n=this.upgrades.length;for(;t{this.onClose("ping timeout")},this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let n=1;for(let r=0;r0&&n>this.maxPayload)return this.writeBuffer.slice(0,r);n+=2}return this.writeBuffer}write(t,n,r){return this.sendPacket("message",t,n,r),this}send(t,n,r){return this.sendPacket("message",t,n,r),this}sendPacket(t,n,r,i){if(typeof n=="function"&&(i=n,n=void 0),typeof r=="function"&&(i=r,r=null),this.readyState==="closing"||this.readyState==="closed")return;r=r||{},r.compress=r.compress!==!1;const o={type:t,data:n,options:r};this.emitReserved("packetCreate",o),this.writeBuffer.push(o),i&&this.once("flush",i),this.flush()}close(){const t=()=>{this.onClose("forced close"),this.transport.close()},n=()=>{this.off("upgrade",n),this.off("upgradeError",n),t()},r=()=>{this.once("upgrade",n),this.once("upgradeError",n)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?r():t()}):this.upgrading?r():t()),this}onError(t){mn.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,n){(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")&&(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),typeof removeEventListener=="function"&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,n),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const n=[];let r=0;const i=t.length;for(;rtypeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer,wd=Object.prototype.toString,Xm=typeof Blob=="function"||typeof Blob<"u"&&wd.call(Blob)==="[object BlobConstructor]",Gm=typeof File=="function"||typeof File<"u"&&wd.call(File)==="[object FileConstructor]";function pu(e){return Ym&&(e instanceof ArrayBuffer||qm(e))||Xm&&e instanceof Blob||Gm&&e instanceof File}function Li(e,t){if(!e||typeof e!="object")return!1;if(Array.isArray(e)){for(let n=0,r=e.length;n=0&&e.num{delete this.acks[t];for(let l=0;l{this.io.clearTimeoutFn(o),n.apply(this,[null,...l])}}emitWithAck(t,...n){const r=this.flags.timeout!==void 0||this._opts.ackTimeout!==void 0;return new Promise((i,o)=>{n.push((l,s)=>r?l?o(l):i(s):i(l)),this.emit(t,...n)})}_addToQueue(t){let n;typeof t[t.length-1]=="function"&&(n=t.pop());const r={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push((i,...o)=>r!==this._queue[0]?void 0:(i!==null?r.tryCount>this._opts.retries&&(this._queue.shift(),n&&n(i)):(this._queue.shift(),n&&n(null,...o)),r.pending=!1,this._drainQueue())),this._queue.push(r),this._drainQueue()}_drainQueue(t=!1){if(!this.connected||this._queue.length===0)return;const n=this._queue[0];n.pending&&!t||(n.pending=!0,n.tryCount++,this.flags=n.flags,this.emit.apply(this,n.args))}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){typeof this.auth=="function"?this.auth(t=>{this._sendConnectPacket(t)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:D.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,n){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,n)}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case D.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case D.EVENT:case D.BINARY_EVENT:this.onevent(t);break;case D.ACK:case D.BINARY_ACK:this.onack(t);break;case D.DISCONNECT:this.ondisconnect();break;case D.CONNECT_ERROR:this.destroy();const r=new Error(t.data.message);r.data=t.data.data,this.emitReserved("connect_error",r);break}}onevent(t){const n=t.data||[];t.id!=null&&n.push(this.ack(t.id)),this.connected?this.emitEvent(n):this.receiveBuffer.push(Object.freeze(n))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const n=this._anyListeners.slice();for(const r of n)r.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&typeof t[t.length-1]=="string"&&(this._lastOffset=t[t.length-1])}ack(t){const n=this;let r=!1;return function(...i){r||(r=!0,n.packet({type:D.ACK,id:t,data:i}))}}onack(t){const n=this.acks[t.id];typeof n=="function"&&(n.apply(this,t.data),delete this.acks[t.id])}onconnect(t,n){this.id=t,this.recovered=n&&this._pid===n,this._pid=n,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(t=>this.emitEvent(t)),this.receiveBuffer=[],this.sendBuffer.forEach(t=>{this.notifyOutgoingListeners(t),this.packet(t)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(t=>t()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:D.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const n=this._anyListeners;for(let r=0;r0&&e.jitter<=1?e.jitter:0,this.attempts=0}Wn.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=Math.floor(t*10)&1?e+n:e-n}return Math.min(e,this.max)|0};Wn.prototype.reset=function(){this.attempts=0};Wn.prototype.setMin=function(e){this.ms=e};Wn.prototype.setMax=function(e){this.max=e};Wn.prototype.setJitter=function(e){this.jitter=e};class ss extends b{constructor(t,n){var r;super(),this.nsps={},this.subs=[],t&&typeof t=="object"&&(n=t,t=void 0),n=n||{},n.path=n.path||"/socket.io",this.opts=n,Co(this,n),this.reconnection(n.reconnection!==!1),this.reconnectionAttempts(n.reconnectionAttempts||1/0),this.reconnectionDelay(n.reconnectionDelay||1e3),this.reconnectionDelayMax(n.reconnectionDelayMax||5e3),this.randomizationFactor((r=n.randomizationFactor)!==null&&r!==void 0?r:.5),this.backoff=new Wn({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(n.timeout==null?2e4:n.timeout),this._readyState="closed",this.uri=t;const i=n.parser||rv;this.encoder=new i.Encoder,this.decoder=new i.Decoder,this._autoConnect=n.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return t===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var n;return t===void 0?this._reconnectionDelay:(this._reconnectionDelay=t,(n=this.backoff)===null||n===void 0||n.setMin(t),this)}randomizationFactor(t){var n;return t===void 0?this._randomizationFactor:(this._randomizationFactor=t,(n=this.backoff)===null||n===void 0||n.setJitter(t),this)}reconnectionDelayMax(t){var n;return t===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,(n=this.backoff)===null||n===void 0||n.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(t){if(~this._readyState.indexOf("open"))return this;this.engine=new yd(this.uri,this.opts);const n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;const i=Ye(n,"open",function(){r.onopen(),t&&t()}),o=s=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",s),t?t(s):this.maybeReconnectOnOpen()},l=Ye(n,"error",o);if(this._timeout!==!1){const s=this._timeout,u=this.setTimeoutFn(()=>{i(),o(new Error("timeout")),n.close()},s);this.opts.autoUnref&&u.unref(),this.subs.push(()=>{this.clearTimeoutFn(u)})}return this.subs.push(i),this.subs.push(l),this}connect(t){return this.open(t)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(Ye(t,"ping",this.onping.bind(this)),Ye(t,"data",this.ondata.bind(this)),Ye(t,"error",this.onerror.bind(this)),Ye(t,"close",this.onclose.bind(this)),Ye(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(n){this.onclose("parse error",n)}}ondecoded(t){du(()=>{this.emitReserved("packet",t)},this.setTimeoutFn)}onerror(t){this.emitReserved("error",t)}socket(t,n){let r=this.nsps[t];return r?this._autoConnect&&!r.active&&r.connect():(r=new Ed(this,t,n),this.nsps[t]=r),r}_destroy(t){const n=Object.keys(this.nsps);for(const r of n)if(this.nsps[r].active)return;this._close()}_packet(t){const n=this.encoder.encode(t);for(let r=0;rt()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,n){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,n),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const n=this.backoff.duration();this._reconnecting=!0;const r=this.setTimeoutFn(()=>{t.skipReconnect||(this.emitReserved("reconnect_attempt",t.backoff.attempts),!t.skipReconnect&&t.open(i=>{i?(t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",i)):t.onreconnect()}))},n);this.opts.autoUnref&&r.unref(),this.subs.push(()=>{this.clearTimeoutFn(r)})}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}const tr={};function Oi(e,t){typeof e=="object"&&(t=e,e=void 0),t=t||{};const n=Km(e,t.path||"/socket.io"),r=n.source,i=n.id,o=n.path,l=tr[i]&&o in tr[i].nsps,s=t.forceNew||t["force new connection"]||t.multiplex===!1||l;let u;return s?u=new ss(r,t):(tr[i]||(tr[i]=new ss(r,t)),u=tr[i]),n.query&&!t.query&&(t.query=n.queryKey),u.socket(n.path,t)}Object.assign(Oi,{Manager:ss,Socket:Ed,io:Oi,connect:Oi});function ov({title:e,titleId:t,...n},r){return v.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},n),e?v.createElement("title",{id:t},e):null,v.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"}))}const lv=v.forwardRef(ov),sv=lv;function uv({title:e,titleId:t,...n},r){return v.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},n),e?v.createElement("title",{id:t},e):null,v.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18 18 6M6 6l12 12"}))}const av=v.forwardRef(uv),cv=av,mu=(...e)=>e.filter(Boolean).join(" ");function fv({title:e,titleId:t,...n},r){return v.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},n),e?v.createElement("title",{id:t},e):null,v.createElement("path",{fillRule:"evenodd",d:"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z",clipRule:"evenodd"}))}const dv=v.forwardRef(fv),Sd=dv,nn=["General","C++","Rust","Go","Python","Java","JavaScript"];function pv(e){const{currentRoom:t,setCurrentRoom:n}=e;return R.jsx("aside",{className:"hidden lg:block lg:w-72 bg-ctp-crust p-4 pr-0",children:R.jsxs("div",{className:"bg-ctp-base p-4 rounded-lg mb-4 h-full overflow-y-scroll",children:[R.jsx("h1",{className:"text-2xl text-center text-white font-bold mb-4",children:"Rooms"}),R.jsx("ul",{className:"mt-4",children:nn==null?void 0:nn.map(r=>R.jsx("li",{className:mu("relative flex justify-between gap-x-6 px-4 py-5 hover:bg-ctp-mantle sm:px-6 w-full rounded-md cursor-pointer",t===r?"bg-ctp-mantle":""),onClick:()=>n(r),children:R.jsxs("div",{className:"flex flex-row justify-between w-full align-middle",children:[R.jsx("p",{className:"text-lg font-medium text-ctp-text",children:r}),R.jsx(Sd,{className:"h-6 w-6 text-ctp-blue"})]})},r))})]})})}const hv=e=>{const t=["ctp-green","ctp-pink","ctp-red","ctp-peach","ctp-blue","ctp-teal"];e=e.toLowerCase();let n=0;for(let i=0;iR.jsx("li",{className:"flex w-full justify-start gap-x-4 mb-4 align-top",children:R.jsxs("div",{children:[R.jsxs("div",{className:"flex flex-row gap-x-6 items-center",children:[R.jsx("p",{className:mu("text-sm font-semibold",`text-${hv(n.user)}`),children:n.user}),R.jsx("p",{className:"text-ctp-text text-sm",children:n.date.toLocaleString()})]}),R.jsx("p",{className:"text-ctp-text mt-1 text-lg",children:n.text})]})},r))})}function vv(e){const{socket:t,currentRoom:n}=e,[r,i]=v.useState(""),o=l=>{l.preventDefault(),t==null||t.emit("message",{text:r,room:n}),i("")};return R.jsxs("form",{className:"flex h-11",onSubmit:o,children:[R.jsx("input",{type:"text",value:r,onChange:l=>i(l.target.value),className:"flex-1 p-2 rounded-l-md bg-ctp-text text-ctp-base placeholder-ctp-subtext0",placeholder:"Enter something englightened..."}),R.jsx("button",{type:"submit",className:"bg-ctp-blue px-6 font-bold text-ctp-base p-2 rounded-r-md",children:"Send"})]})}var gv=Object.defineProperty,yv=(e,t,n)=>t in e?gv(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,rl=(e,t,n)=>(yv(e,typeof t!="symbol"?t+"":t,n),n);let wv=class{constructor(){rl(this,"current",this.detect()),rl(this,"handoffState","pending"),rl(this,"currentId",0)}set(t){this.current!==t&&(this.handoffState="pending",this.currentId=0,this.current=t)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}handoff(){this.handoffState==="pending"&&(this.handoffState="complete")}get isHandoffComplete(){return this.handoffState==="complete"}},ht=new wv,Be=(e,t)=>{ht.isServer?v.useEffect(e,t):v.useLayoutEffect(e,t)};function mt(e){let t=v.useRef(e);return Be(()=>{t.current=e},[e]),t}let Q=function(e){let t=mt(e);return A.useCallback((...n)=>t.current(...n),[t])};function _o(e){typeof queueMicrotask=="function"?queueMicrotask(e):Promise.resolve().then(e).catch(t=>setTimeout(()=>{throw t}))}function dn(){let e=[],t={addEventListener(n,r,i,o){return n.addEventListener(r,i,o),t.add(()=>n.removeEventListener(r,i,o))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);return t.add(()=>cancelAnimationFrame(r))},nextFrame(...n){return t.requestAnimationFrame(()=>t.requestAnimationFrame(...n))},setTimeout(...n){let r=setTimeout(...n);return t.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return _o(()=>{r.current&&n[0]()}),t.add(()=>{r.current=!1})},style(n,r,i){let o=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:i}),this.add(()=>{Object.assign(n.style,{[r]:o})})},group(n){let r=dn();return n(r),this.add(()=>r.dispose())},add(n){return e.push(n),()=>{let r=e.indexOf(n);if(r>=0)for(let i of e.splice(r,1))i()}},dispose(){for(let n of e.splice(0))n()}};return t}function vu(){let[e]=v.useState(dn);return v.useEffect(()=>()=>e.dispose(),[e]),e}function Ev(){let e=typeof document>"u";return"useSyncExternalStore"in wr?(t=>t.useSyncExternalStore)(wr)(()=>()=>{},()=>!1,()=>!e):!1}function Qn(){let e=Ev(),[t,n]=v.useState(ht.isHandoffComplete);return t&&ht.isHandoffComplete===!1&&n(!1),v.useEffect(()=>{t!==!0&&n(!0)},[t]),v.useEffect(()=>ht.handoff(),[]),e?!1:t}var Ua;let Kn=(Ua=A.useId)!=null?Ua:function(){let e=Qn(),[t,n]=A.useState(e?()=>ht.nextId():null);return Be(()=>{t===null&&n(ht.nextId())},[t]),t!=null?""+t:void 0};function de(e,t,...n){if(e in t){let i=t[e];return typeof i=="function"?i(...n):i}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(i=>`"${i}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,de),r}function kd(e){return ht.isServer?null:e instanceof Node?e.ownerDocument:e!=null&&e.hasOwnProperty("current")&&e.current instanceof Node?e.current.ownerDocument:document}let us=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var Xt=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(Xt||{}),xd=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(xd||{}),Sv=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(Sv||{});function kv(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(us)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var Cd=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(Cd||{});function xv(e,t=0){var n;return e===((n=kd(e))==null?void 0:n.body)?!1:de(t,{0(){return e.matches(us)},1(){let r=e;for(;r!==null;){if(r.matches(us))return!0;r=r.parentElement}return!1}})}var Cv=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(Cv||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{e.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:e.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function rn(e){e==null||e.focus({preventScroll:!0})}let _v=["textarea","input"].join(",");function Tv(e){var t,n;return(n=(t=e==null?void 0:e.matches)==null?void 0:t.call(e,_v))!=null?n:!1}function Nv(e,t=n=>n){return e.slice().sort((n,r)=>{let i=t(n),o=t(r);if(i===null||o===null)return 0;let l=i.compareDocumentPosition(o);return l&Node.DOCUMENT_POSITION_FOLLOWING?-1:l&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function $i(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:i=[]}={}){let o=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,l=Array.isArray(e)?n?Nv(e):e:kv(e);i.length>0&&l.length>1&&(l=l.filter(g=>!i.includes(g))),r=r??o.activeElement;let s=(()=>{if(t&5)return 1;if(t&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=(()=>{if(t&1)return 0;if(t&2)return Math.max(0,l.indexOf(r))-1;if(t&4)return Math.max(0,l.indexOf(r))+1;if(t&8)return l.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),a=t&32?{preventScroll:!0}:{},f=0,h=l.length,m;do{if(f>=h||f+h<=0)return 0;let g=u+f;if(t&16)g=(g+h)%h;else{if(g<0)return 3;if(g>=h)return 1}m=l[g],m==null||m.focus(a),f+=s}while(m!==o.activeElement);return t&6&&Tv(m)&&m.select(),2}function _d(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function Pv(){return/Android/gi.test(window.navigator.userAgent)}function Rv(){return _d()||Pv()}function hi(e,t,n){let r=mt(t);v.useEffect(()=>{function i(o){r.current(o)}return document.addEventListener(e,i,n),()=>document.removeEventListener(e,i,n)},[e,n])}function Td(e,t,n){let r=mt(t);v.useEffect(()=>{function i(o){r.current(o)}return window.addEventListener(e,i,n),()=>window.removeEventListener(e,i,n)},[e,n])}function Lv(e,t,n=!0){let r=v.useRef(!1);v.useEffect(()=>{requestAnimationFrame(()=>{r.current=n})},[n]);function i(l,s){if(!r.current||l.defaultPrevented)return;let u=s(l);if(u===null||!u.getRootNode().contains(u)||!u.isConnected)return;let a=function f(h){return typeof h=="function"?f(h()):Array.isArray(h)||h instanceof Set?h:[h]}(e);for(let f of a){if(f===null)continue;let h=f instanceof HTMLElement?f:f.current;if(h!=null&&h.contains(u)||l.composed&&l.composedPath().includes(h))return}return!xv(u,Cd.Loose)&&u.tabIndex!==-1&&l.preventDefault(),t(l,u)}let o=v.useRef(null);hi("pointerdown",l=>{var s,u;r.current&&(o.current=((u=(s=l.composedPath)==null?void 0:s.call(l))==null?void 0:u[0])||l.target)},!0),hi("mousedown",l=>{var s,u;r.current&&(o.current=((u=(s=l.composedPath)==null?void 0:s.call(l))==null?void 0:u[0])||l.target)},!0),hi("click",l=>{Rv()||o.current&&(i(l,()=>o.current),o.current=null)},!0),hi("touchend",l=>i(l,()=>l.target instanceof HTMLElement?l.target:null),!0),Td("blur",l=>i(l,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function Hr(...e){return v.useMemo(()=>kd(...e),[...e])}let Nd=Symbol();function Ov(e,t=!0){return Object.assign(e,{[Nd]:t})}function Ze(...e){let t=v.useRef(e);v.useEffect(()=>{t.current=e},[e]);let n=Q(r=>{for(let i of t.current)i!=null&&(typeof i=="function"?i(r):i.current=r)});return e.every(r=>r==null||(r==null?void 0:r[Nd]))?void 0:n}function gu(e,t){let n=v.useRef([]),r=Q(e);v.useEffect(()=>{let i=[...n.current];for(let[o,l]of t.entries())if(n.current[o]!==l){let s=r(t,i);return n.current=t,s}},[r,...t])}function ro(...e){return Array.from(new Set(e.flatMap(t=>typeof t=="string"?t.split(" "):[]))).filter(Boolean).join(" ")}var io=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(io||{}),Ot=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(Ot||{});function Ue({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:i,visible:o=!0,name:l,mergeRefs:s}){s=s??$v;let u=Pd(t,e);if(o)return mi(u,n,r,l,s);let a=i??0;if(a&2){let{static:f=!1,...h}=u;if(f)return mi(h,n,r,l,s)}if(a&1){let{unmount:f=!0,...h}=u;return de(f?0:1,{0(){return null},1(){return mi({...h,hidden:!0,style:{display:"none"}},n,r,l,s)}})}return mi(u,n,r,l,s)}function mi(e,t={},n,r,i){let{as:o=n,children:l,refName:s="ref",...u}=il(e,["unmount","static"]),a=e.ref!==void 0?{[s]:e.ref}:{},f=typeof l=="function"?l(t):l;"className"in u&&u.className&&typeof u.className=="function"&&(u.className=u.className(t));let h={};if(t){let m=!1,g=[];for(let[y,w]of Object.entries(t))typeof w=="boolean"&&(m=!0),w===!0&&g.push(y);m&&(h["data-headlessui-state"]=g.join(" "))}if(o===v.Fragment&&Object.keys(Ha(u)).length>0){if(!v.isValidElement(f)||Array.isArray(f)&&f.length>1)throw new Error(['Passing props on "Fragment"!',"",`The current component <${r} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(u).map(w=>` - ${w}`).join(` -`),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map(w=>` - ${w}`).join(` -`)].join(` -`));let m=f.props,g=typeof(m==null?void 0:m.className)=="function"?(...w)=>ro(m==null?void 0:m.className(...w),u.className):ro(m==null?void 0:m.className,u.className),y=g?{className:g}:{};return v.cloneElement(f,Object.assign({},Pd(f.props,Ha(il(u,["ref"]))),h,a,{ref:i(f.ref,a.ref)},y))}return v.createElement(o,Object.assign({},il(u,["ref"]),o!==v.Fragment&&a,o!==v.Fragment&&h),f)}function $v(...e){return e.every(t=>t==null)?void 0:t=>{for(let n of e)n!=null&&(typeof n=="function"?n(t):n.current=t)}}function Pd(...e){if(e.length===0)return{};if(e.length===1)return e[0];let t={},n={};for(let r of e)for(let i in r)i.startsWith("on")&&typeof r[i]=="function"?(n[i]!=null||(n[i]=[]),n[i].push(r[i])):t[i]=r[i];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map(r=>[r,void 0])));for(let r in n)Object.assign(t,{[r](i,...o){let l=n[r];for(let s of l){if((i instanceof Event||(i==null?void 0:i.nativeEvent)instanceof Event)&&i.defaultPrevented)return;s(i,...o)}}});return t}function Le(e){var t;return Object.assign(v.forwardRef(e),{displayName:(t=e.displayName)!=null?t:e.name})}function Ha(e){let t=Object.assign({},e);for(let n in t)t[n]===void 0&&delete t[n];return t}function il(e,t=[]){let n=Object.assign({},e);for(let r of t)r in n&&delete n[r];return n}let Av="div";var oo=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(oo||{});function Fv(e,t){var n;let{features:r=1,...i}=e,o={ref:t,"aria-hidden":(r&2)===2?!0:(n=i["aria-hidden"])!=null?n:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(r&4)===4&&(r&2)!==2&&{display:"none"}}};return Ue({ourProps:o,theirProps:i,slot:{},defaultTag:Av,name:"Hidden"})}let as=Le(Fv),yu=v.createContext(null);yu.displayName="OpenClosedContext";var Ce=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(Ce||{});function wu(){return v.useContext(yu)}function Dv({value:e,children:t}){return A.createElement(yu.Provider,{value:e},t)}function Mv(e){function t(){document.readyState!=="loading"&&(e(),document.removeEventListener("DOMContentLoaded",t))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",t),t())}let Pt=[];Mv(()=>{function e(t){t.target instanceof HTMLElement&&t.target!==document.body&&Pt[0]!==t.target&&(Pt.unshift(t.target),Pt=Pt.filter(n=>n!=null&&n.isConnected),Pt.splice(10))}window.addEventListener("click",e,{capture:!0}),window.addEventListener("mousedown",e,{capture:!0}),window.addEventListener("focus",e,{capture:!0}),document.body.addEventListener("click",e,{capture:!0}),document.body.addEventListener("mousedown",e,{capture:!0}),document.body.addEventListener("focus",e,{capture:!0})});function zv(e){let t=e.parentElement,n=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(n=t),t=t.parentElement;let r=(t==null?void 0:t.getAttribute("disabled"))==="";return r&&jv(n)?!1:r}function jv(e){if(!e)return!1;let t=e.previousElementSibling;for(;t!==null;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}var Rd=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Rd||{});function Ld(e,t,n,r){let i=mt(n);v.useEffect(()=>{e=e??window;function o(l){i.current(l)}return e.addEventListener(t,o,r),()=>e.removeEventListener(t,o,r)},[e,t,r])}function Vr(){let e=v.useRef(!1);return Be(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function Od(e){let t=Q(e),n=v.useRef(!1);v.useEffect(()=>(n.current=!1,()=>{n.current=!0,_o(()=>{n.current&&t()})}),[t])}var ar=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(ar||{});function Iv(){let e=v.useRef(0);return Td("keydown",t=>{t.key==="Tab"&&(e.current=t.shiftKey?1:0)},!0),e}function $d(e){if(!e)return new Set;if(typeof e=="function")return new Set(e());let t=new Set;for(let n of e.current)n.current instanceof HTMLElement&&t.add(n.current);return t}let Bv="div";var Ad=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(Ad||{});function Uv(e,t){let n=v.useRef(null),r=Ze(n,t),{initialFocus:i,containers:o,features:l=30,...s}=e;Qn()||(l=1);let u=Hr(n);Wv({ownerDocument:u},!!(l&16));let a=Qv({ownerDocument:u,container:n,initialFocus:i},!!(l&2));Kv({ownerDocument:u,container:n,containers:o,previousActiveElement:a},!!(l&8));let f=Iv(),h=Q(w=>{let k=n.current;k&&(p=>p())(()=>{de(f.current,{[ar.Forwards]:()=>{$i(k,Xt.First,{skipElements:[w.relatedTarget]})},[ar.Backwards]:()=>{$i(k,Xt.Last,{skipElements:[w.relatedTarget]})}})})}),m=vu(),g=v.useRef(!1),y={ref:r,onKeyDown(w){w.key=="Tab"&&(g.current=!0,m.requestAnimationFrame(()=>{g.current=!1}))},onBlur(w){let k=$d(o);n.current instanceof HTMLElement&&k.add(n.current);let p=w.relatedTarget;p instanceof HTMLElement&&p.dataset.headlessuiFocusGuard!=="true"&&(Fd(k,p)||(g.current?$i(n.current,de(f.current,{[ar.Forwards]:()=>Xt.Next,[ar.Backwards]:()=>Xt.Previous})|Xt.WrapAround,{relativeTo:w.target}):w.target instanceof HTMLElement&&rn(w.target)))}};return A.createElement(A.Fragment,null,!!(l&4)&&A.createElement(as,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:h,features:oo.Focusable}),Ue({ourProps:y,theirProps:s,defaultTag:Bv,name:"FocusTrap"}),!!(l&4)&&A.createElement(as,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:h,features:oo.Focusable}))}let Hv=Le(Uv),nr=Object.assign(Hv,{features:Ad});function Vv(e=!0){let t=v.useRef(Pt.slice());return gu(([n],[r])=>{r===!0&&n===!1&&_o(()=>{t.current.splice(0)}),r===!1&&n===!0&&(t.current=Pt.slice())},[e,Pt,t]),Q(()=>{var n;return(n=t.current.find(r=>r!=null&&r.isConnected))!=null?n:null})}function Wv({ownerDocument:e},t){let n=Vv(t);gu(()=>{t||(e==null?void 0:e.activeElement)===(e==null?void 0:e.body)&&rn(n())},[t]),Od(()=>{t&&rn(n())})}function Qv({ownerDocument:e,container:t,initialFocus:n},r){let i=v.useRef(null),o=Vr();return gu(()=>{if(!r)return;let l=t.current;l&&_o(()=>{if(!o.current)return;let s=e==null?void 0:e.activeElement;if(n!=null&&n.current){if((n==null?void 0:n.current)===s){i.current=s;return}}else if(l.contains(s)){i.current=s;return}n!=null&&n.current?rn(n.current):$i(l,Xt.First)===xd.Error&&console.warn("There are no focusable elements inside the "),i.current=e==null?void 0:e.activeElement})},[r]),i}function Kv({ownerDocument:e,container:t,containers:n,previousActiveElement:r},i){let o=Vr();Ld(e==null?void 0:e.defaultView,"focus",l=>{if(!i||!o.current)return;let s=$d(n);t.current instanceof HTMLElement&&s.add(t.current);let u=r.current;if(!u)return;let a=l.target;a&&a instanceof HTMLElement?Fd(s,a)?(r.current=a,rn(a)):(l.preventDefault(),l.stopPropagation(),rn(u)):rn(r.current)},!0)}function Fd(e,t){for(let n of e)if(n.contains(t))return!0;return!1}let Dd=v.createContext(!1);function Yv(){return v.useContext(Dd)}function cs(e){return A.createElement(Dd.Provider,{value:e.force},e.children)}function qv(e){let t=Yv(),n=v.useContext(Md),r=Hr(e),[i,o]=v.useState(()=>{if(!t&&n!==null||ht.isServer)return null;let l=r==null?void 0:r.getElementById("headlessui-portal-root");if(l)return l;if(r===null)return null;let s=r.createElement("div");return s.setAttribute("id","headlessui-portal-root"),r.body.appendChild(s)});return v.useEffect(()=>{i!==null&&(r!=null&&r.body.contains(i)||r==null||r.body.appendChild(i))},[i,r]),v.useEffect(()=>{t||n!==null&&o(n.current)},[n,o,t]),i}let Xv=v.Fragment;function Gv(e,t){let n=e,r=v.useRef(null),i=Ze(Ov(f=>{r.current=f}),t),o=Hr(r),l=qv(r),[s]=v.useState(()=>{var f;return ht.isServer?null:(f=o==null?void 0:o.createElement("div"))!=null?f:null}),u=v.useContext(fs),a=Qn();return Be(()=>{!l||!s||l.contains(s)||(s.setAttribute("data-headlessui-portal",""),l.appendChild(s))},[l,s]),Be(()=>{if(s&&u)return u.register(s)},[u,s]),Od(()=>{var f;!l||!s||(s instanceof Node&&l.contains(s)&&l.removeChild(s),l.childNodes.length<=0&&((f=l.parentElement)==null||f.removeChild(l)))}),a?!l||!s?null:ld.createPortal(Ue({ourProps:{ref:i},theirProps:n,defaultTag:Xv,name:"Portal"}),s):null}let Jv=v.Fragment,Md=v.createContext(null);function Zv(e,t){let{target:n,...r}=e,i={ref:Ze(t)};return A.createElement(Md.Provider,{value:n},Ue({ourProps:i,theirProps:r,defaultTag:Jv,name:"Popover.Group"}))}let fs=v.createContext(null);function bv(){let e=v.useContext(fs),t=v.useRef([]),n=Q(o=>(t.current.push(o),e&&e.register(o),()=>r(o))),r=Q(o=>{let l=t.current.indexOf(o);l!==-1&&t.current.splice(l,1),e&&e.unregister(o)}),i=v.useMemo(()=>({register:n,unregister:r,portals:t}),[n,r,t]);return[t,v.useMemo(()=>function({children:o}){return A.createElement(fs.Provider,{value:i},o)},[i])]}let eg=Le(Gv),tg=Le(Zv),ds=Object.assign(eg,{Group:tg});function ng(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}const rg=typeof Object.is=="function"?Object.is:ng,{useState:ig,useEffect:og,useLayoutEffect:lg,useDebugValue:sg}=wr;function ug(e,t,n){const r=t(),[{inst:i},o]=ig({inst:{value:r,getSnapshot:t}});return lg(()=>{i.value=r,i.getSnapshot=t,ol(i)&&o({inst:i})},[e,r,t]),og(()=>(ol(i)&&o({inst:i}),e(()=>{ol(i)&&o({inst:i})})),[e]),sg(r),r}function ol(e){const t=e.getSnapshot,n=e.value;try{const r=t();return!rg(n,r)}catch{return!0}}function ag(e,t,n){return t()}const cg=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",fg=!cg,dg=fg?ag:ug,pg="useSyncExternalStore"in wr?(e=>e.useSyncExternalStore)(wr):dg;function hg(e){return pg(e.subscribe,e.getSnapshot,e.getSnapshot)}function mg(e,t){let n=e(),r=new Set;return{getSnapshot(){return n},subscribe(i){return r.add(i),()=>r.delete(i)},dispatch(i,...o){let l=t[i].call(n,...o);l&&(n=l,r.forEach(s=>s()))}}}function vg(){let e;return{before({doc:t}){var n;let r=t.documentElement;e=((n=t.defaultView)!=null?n:window).innerWidth-r.clientWidth},after({doc:t,d:n}){let r=t.documentElement,i=r.clientWidth-r.offsetWidth,o=e-i;n.style(r,"paddingRight",`${o}px`)}}}function gg(){return _d()?{before({doc:e,d:t,meta:n}){function r(i){return n.containers.flatMap(o=>o()).some(o=>o.contains(i))}t.microTask(()=>{var i;if(window.getComputedStyle(e.documentElement).scrollBehavior!=="auto"){let s=dn();s.style(e.documentElement,"scrollBehavior","auto"),t.add(()=>t.microTask(()=>s.dispose()))}let o=(i=window.scrollY)!=null?i:window.pageYOffset,l=null;t.addEventListener(e,"click",s=>{if(s.target instanceof HTMLElement)try{let u=s.target.closest("a");if(!u)return;let{hash:a}=new URL(u.href),f=e.querySelector(a);f&&!r(f)&&(l=f)}catch{}},!0),t.addEventListener(e,"touchstart",s=>{if(s.target instanceof HTMLElement)if(r(s.target)){let u=s.target;for(;u.parentElement&&r(u.parentElement);)u=u.parentElement;t.style(u,"overscrollBehavior","contain")}else t.style(s.target,"touchAction","none")}),t.addEventListener(e,"touchmove",s=>{if(s.target instanceof HTMLElement)if(r(s.target)){let u=s.target;for(;u.parentElement&&u.dataset.headlessuiPortal!==""&&!(u.scrollHeight>u.clientHeight||u.scrollWidth>u.clientWidth);)u=u.parentElement;u.dataset.headlessuiPortal===""&&s.preventDefault()}else s.preventDefault()},{passive:!1}),t.add(()=>{var s;let u=(s=window.scrollY)!=null?s:window.pageYOffset;o!==u&&window.scrollTo(0,o),l&&l.isConnected&&(l.scrollIntoView({block:"nearest"}),l=null)})})}}:{}}function yg(){return{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}}function wg(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let bt=mg(()=>new Map,{PUSH(e,t){var n;let r=(n=this.get(e))!=null?n:{doc:e,count:0,d:dn(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:wg(n)},i=[gg(),vg(),yg()];i.forEach(({before:o})=>o==null?void 0:o(r)),i.forEach(({after:o})=>o==null?void 0:o(r))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});bt.subscribe(()=>{let e=bt.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let r=t.get(n.doc)==="hidden",i=n.count!==0;(i&&!r||!i&&r)&&bt.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&bt.dispatch("TEARDOWN",n)}});function Eg(e,t,n){let r=hg(bt),i=e?r.get(e):void 0,o=i?i.count>0:!1;return Be(()=>{if(!(!e||!t))return bt.dispatch("PUSH",e,n),()=>bt.dispatch("POP",e,n)},[t,e]),o}let ll=new Map,rr=new Map;function Va(e,t=!0){Be(()=>{var n;if(!t)return;let r=typeof e=="function"?e():e.current;if(!r)return;function i(){var l;if(!r)return;let s=(l=rr.get(r))!=null?l:1;if(s===1?rr.delete(r):rr.set(r,s-1),s!==1)return;let u=ll.get(r);u&&(u["aria-hidden"]===null?r.removeAttribute("aria-hidden"):r.setAttribute("aria-hidden",u["aria-hidden"]),r.inert=u.inert,ll.delete(r))}let o=(n=rr.get(r))!=null?n:0;return rr.set(r,o+1),o!==0||(ll.set(r,{"aria-hidden":r.getAttribute("aria-hidden"),inert:r.inert}),r.setAttribute("aria-hidden","true"),r.inert=!0),i},[e,t])}function Sg({defaultContainers:e=[],portals:t,mainTreeNodeRef:n}={}){var r;let i=v.useRef((r=n==null?void 0:n.current)!=null?r:null),o=Hr(i),l=Q(()=>{var s,u,a;let f=[];for(let h of e)h!==null&&(h instanceof HTMLElement?f.push(h):"current"in h&&h.current instanceof HTMLElement&&f.push(h.current));if(t!=null&&t.current)for(let h of t.current)f.push(h);for(let h of(s=o==null?void 0:o.querySelectorAll("html > *, body > *"))!=null?s:[])h!==document.body&&h!==document.head&&h instanceof HTMLElement&&h.id!=="headlessui-portal-root"&&(h.contains(i.current)||h.contains((a=(u=i.current)==null?void 0:u.getRootNode())==null?void 0:a.host)||f.some(m=>h.contains(m))||f.push(h));return f});return{resolveContainers:l,contains:Q(s=>l().some(u=>u.contains(s))),mainTreeNodeRef:i,MainTreeNode:v.useMemo(()=>function(){return n!=null?null:A.createElement(as,{features:oo.Hidden,ref:i})},[i,n])}}let Eu=v.createContext(()=>{});Eu.displayName="StackContext";var ps=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))(ps||{});function kg(){return v.useContext(Eu)}function xg({children:e,onUpdate:t,type:n,element:r,enabled:i}){let o=kg(),l=Q((...s)=>{t==null||t(...s),o(...s)});return Be(()=>{let s=i===void 0||i===!0;return s&&l(0,n,r),()=>{s&&l(1,n,r)}},[l,n,r,i]),A.createElement(Eu.Provider,{value:l},e)}let zd=v.createContext(null);function jd(){let e=v.useContext(zd);if(e===null){let t=new Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,jd),t}return e}function Cg(){let[e,t]=v.useState([]);return[e.length>0?e.join(" "):void 0,v.useMemo(()=>function(n){let r=Q(o=>(t(l=>[...l,o]),()=>t(l=>{let s=l.slice(),u=s.indexOf(o);return u!==-1&&s.splice(u,1),s}))),i=v.useMemo(()=>({register:r,slot:n.slot,name:n.name,props:n.props}),[r,n.slot,n.name,n.props]);return A.createElement(zd.Provider,{value:i},n.children)},[t])]}let _g="p";function Tg(e,t){let n=Kn(),{id:r=`headlessui-description-${n}`,...i}=e,o=jd(),l=Ze(t);Be(()=>o.register(r),[r,o.register]);let s={ref:l,...o.props,id:r};return Ue({ourProps:s,theirProps:i,slot:o.slot||{},defaultTag:_g,name:o.name||"Description"})}let Ng=Le(Tg),Pg=Object.assign(Ng,{});var Rg=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Rg||{}),Lg=(e=>(e[e.SetTitleId=0]="SetTitleId",e))(Lg||{});let Og={0(e,t){return e.titleId===t.id?e:{...e,titleId:t.id}}},lo=v.createContext(null);lo.displayName="DialogContext";function Wr(e){let t=v.useContext(lo);if(t===null){let n=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,Wr),n}return t}function $g(e,t,n=()=>[document.body]){Eg(e,t,r=>{var i;return{containers:[...(i=r.containers)!=null?i:[],n]}})}function Ag(e,t){return de(t.type,Og,e,t)}let Fg="div",Dg=io.RenderStrategy|io.Static;function Mg(e,t){let n=Kn(),{id:r=`headlessui-dialog-${n}`,open:i,onClose:o,initialFocus:l,role:s="dialog",__demoMode:u=!1,...a}=e,[f,h]=v.useState(0),m=v.useRef(!1);s=function(){return s==="dialog"||s==="alertdialog"?s:(m.current||(m.current=!0,console.warn(`Invalid role [${s}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")}();let g=wu();i===void 0&&g!==null&&(i=(g&Ce.Open)===Ce.Open);let y=v.useRef(null),w=Ze(y,t),k=Hr(y),p=e.hasOwnProperty("open")||g!==null,c=e.hasOwnProperty("onClose");if(!p&&!c)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!p)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!c)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if(typeof i!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${i}`);if(typeof o!="function")throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${o}`);let d=i?0:1,[E,C]=v.useReducer(Ag,{titleId:null,descriptionId:null,panelRef:v.createRef()}),x=Q(()=>o(!1)),N=Q(J=>C({type:0,id:J})),P=Qn()?u?!1:d===0:!1,z=f>1,$=v.useContext(lo)!==null,[oe,Oe]=bv(),He={get current(){var J;return(J=E.panelRef.current)!=null?J:y.current}},{resolveContainers:St,mainTreeNodeRef:lt,MainTreeNode:Qt}=Sg({portals:oe,defaultContainers:[He]}),Ve=z?"parent":"leaf",_=g!==null?(g&Ce.Closing)===Ce.Closing:!1,L=$||_?!1:P,O=v.useCallback(()=>{var J,ut;return(ut=Array.from((J=k==null?void 0:k.querySelectorAll("body > *"))!=null?J:[]).find($e=>$e.id==="headlessui-portal-root"?!1:$e.contains(lt.current)&&$e instanceof HTMLElement))!=null?ut:null},[lt]);Va(O,L);let I=z?!0:P,B=v.useCallback(()=>{var J,ut;return(ut=Array.from((J=k==null?void 0:k.querySelectorAll("[data-headlessui-portal]"))!=null?J:[]).find($e=>$e.contains(lt.current)&&$e instanceof HTMLElement))!=null?ut:null},[lt]);Va(B,I),Lv(St,x,!(!P||z));let ne=!(z||d!==0);Ld(k==null?void 0:k.defaultView,"keydown",J=>{ne&&(J.defaultPrevented||J.key===Rd.Escape&&(J.preventDefault(),J.stopPropagation(),x()))}),$g(k,!(_||d!==0||$),St),v.useEffect(()=>{if(d!==0||!y.current)return;let J=new ResizeObserver(ut=>{for(let $e of ut){let Kr=$e.target.getBoundingClientRect();Kr.x===0&&Kr.y===0&&Kr.width===0&&Kr.height===0&&x()}});return J.observe(y.current),()=>J.disconnect()},[d,y,x]);let[st,pn]=Cg(),Hd=v.useMemo(()=>[{dialogState:d,close:x,setTitleId:N},E],[d,E,x,N]),Su=v.useMemo(()=>({open:d===0}),[d]),Vd={ref:w,id:r,role:s,"aria-modal":d===0?!0:void 0,"aria-labelledby":E.titleId,"aria-describedby":st};return A.createElement(xg,{type:"Dialog",enabled:d===0,element:y,onUpdate:Q((J,ut)=>{ut==="Dialog"&&de(J,{[ps.Add]:()=>h($e=>$e+1),[ps.Remove]:()=>h($e=>$e-1)})})},A.createElement(cs,{force:!0},A.createElement(ds,null,A.createElement(lo.Provider,{value:Hd},A.createElement(ds.Group,{target:y},A.createElement(cs,{force:!1},A.createElement(pn,{slot:Su,name:"Dialog.Description"},A.createElement(nr,{initialFocus:l,containers:St,features:P?de(Ve,{parent:nr.features.RestoreFocus,leaf:nr.features.All&~nr.features.FocusLock}):nr.features.None},A.createElement(Oe,null,Ue({ourProps:Vd,theirProps:a,slot:Su,defaultTag:Fg,features:Dg,visible:d===0,name:"Dialog"}))))))))),A.createElement(Qt,null))}let zg="div";function jg(e,t){let n=Kn(),{id:r=`headlessui-dialog-overlay-${n}`,...i}=e,[{dialogState:o,close:l}]=Wr("Dialog.Overlay"),s=Ze(t),u=Q(f=>{if(f.target===f.currentTarget){if(zv(f.currentTarget))return f.preventDefault();f.preventDefault(),f.stopPropagation(),l()}}),a=v.useMemo(()=>({open:o===0}),[o]);return Ue({ourProps:{ref:s,id:r,"aria-hidden":!0,onClick:u},theirProps:i,slot:a,defaultTag:zg,name:"Dialog.Overlay"})}let Ig="div";function Bg(e,t){let n=Kn(),{id:r=`headlessui-dialog-backdrop-${n}`,...i}=e,[{dialogState:o},l]=Wr("Dialog.Backdrop"),s=Ze(t);v.useEffect(()=>{if(l.panelRef.current===null)throw new Error("A component is being used, but a component is missing.")},[l.panelRef]);let u=v.useMemo(()=>({open:o===0}),[o]);return A.createElement(cs,{force:!0},A.createElement(ds,null,Ue({ourProps:{ref:s,id:r,"aria-hidden":!0},theirProps:i,slot:u,defaultTag:Ig,name:"Dialog.Backdrop"})))}let Ug="div";function Hg(e,t){let n=Kn(),{id:r=`headlessui-dialog-panel-${n}`,...i}=e,[{dialogState:o},l]=Wr("Dialog.Panel"),s=Ze(t,l.panelRef),u=v.useMemo(()=>({open:o===0}),[o]),a=Q(f=>{f.stopPropagation()});return Ue({ourProps:{ref:s,id:r,onClick:a},theirProps:i,slot:u,defaultTag:Ug,name:"Dialog.Panel"})}let Vg="h2";function Wg(e,t){let n=Kn(),{id:r=`headlessui-dialog-title-${n}`,...i}=e,[{dialogState:o,setTitleId:l}]=Wr("Dialog.Title"),s=Ze(t);v.useEffect(()=>(l(r),()=>l(null)),[r,l]);let u=v.useMemo(()=>({open:o===0}),[o]);return Ue({ourProps:{ref:s,id:r},theirProps:i,slot:u,defaultTag:Vg,name:"Dialog.Title"})}let Qg=Le(Mg),Kg=Le(Bg),Yg=Le(Hg),qg=Le(jg),Xg=Le(Wg),Wa=Object.assign(Qg,{Backdrop:Kg,Panel:Yg,Overlay:qg,Title:Xg,Description:Pg});function Gg(e=0){let[t,n]=v.useState(e),r=Vr(),i=v.useCallback(u=>{r.current&&n(a=>a|u)},[t,r]),o=v.useCallback(u=>!!(t&u),[t]),l=v.useCallback(u=>{r.current&&n(a=>a&~u)},[n,r]),s=v.useCallback(u=>{r.current&&n(a=>a^u)},[n]);return{flags:t,addFlag:i,hasFlag:o,removeFlag:l,toggleFlag:s}}function Jg(e){let t={called:!1};return(...n)=>{if(!t.called)return t.called=!0,e(...n)}}function sl(e,...t){e&&t.length>0&&e.classList.add(...t)}function ul(e,...t){e&&t.length>0&&e.classList.remove(...t)}function Zg(e,t){let n=dn();if(!e)return n.dispose;let{transitionDuration:r,transitionDelay:i}=getComputedStyle(e),[o,l]=[r,i].map(u=>{let[a=0]=u.split(",").filter(Boolean).map(f=>f.includes("ms")?parseFloat(f):parseFloat(f)*1e3).sort((f,h)=>h-f);return a}),s=o+l;if(s!==0){n.group(a=>{a.setTimeout(()=>{t(),a.dispose()},s),a.addEventListener(e,"transitionrun",f=>{f.target===f.currentTarget&&a.dispose()})});let u=n.addEventListener(e,"transitionend",a=>{a.target===a.currentTarget&&(t(),u())})}else t();return n.add(()=>t()),n.dispose}function bg(e,t,n,r){let i=n?"enter":"leave",o=dn(),l=r!==void 0?Jg(r):()=>{};i==="enter"&&(e.removeAttribute("hidden"),e.style.display="");let s=de(i,{enter:()=>t.enter,leave:()=>t.leave}),u=de(i,{enter:()=>t.enterTo,leave:()=>t.leaveTo}),a=de(i,{enter:()=>t.enterFrom,leave:()=>t.leaveFrom});return ul(e,...t.base,...t.enter,...t.enterTo,...t.enterFrom,...t.leave,...t.leaveFrom,...t.leaveTo,...t.entered),sl(e,...t.base,...s,...a),o.nextFrame(()=>{ul(e,...t.base,...s,...a),sl(e,...t.base,...s,...u),Zg(e,()=>(ul(e,...t.base,...s),sl(e,...t.base,...t.entered),l()))}),o.dispose}function ey({immediate:e,container:t,direction:n,classes:r,onStart:i,onStop:o}){let l=Vr(),s=vu(),u=mt(n);Be(()=>{e&&(u.current="enter")},[e]),Be(()=>{let a=dn();s.add(a.dispose);let f=t.current;if(f&&u.current!=="idle"&&l.current)return a.dispose(),i.current(u.current),a.add(bg(f,r.current,u.current==="enter",()=>{a.dispose(),o.current(u.current)})),a.dispose},[n])}function xt(e=""){return e.split(/\s+/).filter(t=>t.length>1)}let To=v.createContext(null);To.displayName="TransitionContext";var ty=(e=>(e.Visible="visible",e.Hidden="hidden",e))(ty||{});function ny(){let e=v.useContext(To);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}function ry(){let e=v.useContext(No);if(e===null)throw new Error("A is used but it is missing a parent or .");return e}let No=v.createContext(null);No.displayName="NestingContext";function Po(e){return"children"in e?Po(e.children):e.current.filter(({el:t})=>t.current!==null).filter(({state:t})=>t==="visible").length>0}function Id(e,t){let n=mt(e),r=v.useRef([]),i=Vr(),o=vu(),l=Q((g,y=Ot.Hidden)=>{let w=r.current.findIndex(({el:k})=>k===g);w!==-1&&(de(y,{[Ot.Unmount](){r.current.splice(w,1)},[Ot.Hidden](){r.current[w].state="hidden"}}),o.microTask(()=>{var k;!Po(r)&&i.current&&((k=n.current)==null||k.call(n))}))}),s=Q(g=>{let y=r.current.find(({el:w})=>w===g);return y?y.state!=="visible"&&(y.state="visible"):r.current.push({el:g,state:"visible"}),()=>l(g,Ot.Unmount)}),u=v.useRef([]),a=v.useRef(Promise.resolve()),f=v.useRef({enter:[],leave:[],idle:[]}),h=Q((g,y,w)=>{u.current.splice(0),t&&(t.chains.current[y]=t.chains.current[y].filter(([k])=>k!==g)),t==null||t.chains.current[y].push([g,new Promise(k=>{u.current.push(k)})]),t==null||t.chains.current[y].push([g,new Promise(k=>{Promise.all(f.current[y].map(([p,c])=>c)).then(()=>k())})]),y==="enter"?a.current=a.current.then(()=>t==null?void 0:t.wait.current).then(()=>w(y)):w(y)}),m=Q((g,y,w)=>{Promise.all(f.current[y].splice(0).map(([k,p])=>p)).then(()=>{var k;(k=u.current.shift())==null||k()}).then(()=>w(y))});return v.useMemo(()=>({children:r,register:s,unregister:l,onStart:h,onStop:m,wait:a,chains:f}),[s,l,r,h,m,f,a])}function iy(){}let oy=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function Qa(e){var t;let n={};for(let r of oy)n[r]=(t=e[r])!=null?t:iy;return n}function ly(e){let t=v.useRef(Qa(e));return v.useEffect(()=>{t.current=Qa(e)},[e]),t}let sy="div",Bd=io.RenderStrategy;function uy(e,t){var n,r;let{beforeEnter:i,afterEnter:o,beforeLeave:l,afterLeave:s,enter:u,enterFrom:a,enterTo:f,entered:h,leave:m,leaveFrom:g,leaveTo:y,...w}=e,k=v.useRef(null),p=Ze(k,t),c=(n=w.unmount)==null||n?Ot.Unmount:Ot.Hidden,{show:d,appear:E,initial:C}=ny(),[x,N]=v.useState(d?"visible":"hidden"),P=ry(),{register:z,unregister:$}=P;v.useEffect(()=>z(k),[z,k]),v.useEffect(()=>{if(c===Ot.Hidden&&k.current){if(d&&x!=="visible"){N("visible");return}return de(x,{hidden:()=>$(k),visible:()=>z(k)})}},[x,k,z,$,d,c]);let oe=mt({base:xt(w.className),enter:xt(u),enterFrom:xt(a),enterTo:xt(f),entered:xt(h),leave:xt(m),leaveFrom:xt(g),leaveTo:xt(y)}),Oe=ly({beforeEnter:i,afterEnter:o,beforeLeave:l,afterLeave:s}),He=Qn();v.useEffect(()=>{if(He&&x==="visible"&&k.current===null)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[k,x,He]);let St=C&&!E,lt=E&&d&&C,Qt=!He||St?"idle":d?"enter":"leave",Ve=Gg(0),_=Q(ne=>de(ne,{enter:()=>{Ve.addFlag(Ce.Opening),Oe.current.beforeEnter()},leave:()=>{Ve.addFlag(Ce.Closing),Oe.current.beforeLeave()},idle:()=>{}})),L=Q(ne=>de(ne,{enter:()=>{Ve.removeFlag(Ce.Opening),Oe.current.afterEnter()},leave:()=>{Ve.removeFlag(Ce.Closing),Oe.current.afterLeave()},idle:()=>{}})),O=Id(()=>{N("hidden"),$(k)},P),I=v.useRef(!1);ey({immediate:lt,container:k,classes:oe,direction:Qt,onStart:mt(ne=>{I.current=!0,O.onStart(k,ne,_)}),onStop:mt(ne=>{I.current=!1,O.onStop(k,ne,L),ne==="leave"&&!Po(O)&&(N("hidden"),$(k))})});let B=w,Kt={ref:p};return lt?B={...B,className:ro(w.className,...oe.current.enter,...oe.current.enterFrom)}:I.current&&(B.className=ro(w.className,(r=k.current)==null?void 0:r.className),B.className===""&&delete B.className),A.createElement(No.Provider,{value:O},A.createElement(Dv,{value:de(x,{visible:Ce.Open,hidden:Ce.Closed})|Ve.flags},Ue({ourProps:Kt,theirProps:B,defaultTag:sy,features:Bd,visible:x==="visible",name:"Transition.Child"})))}function ay(e,t){let{show:n,appear:r=!1,unmount:i=!0,...o}=e,l=v.useRef(null),s=Ze(l,t);Qn();let u=wu();if(n===void 0&&u!==null&&(n=(u&Ce.Open)===Ce.Open),![!0,!1].includes(n))throw new Error("A is used but it is missing a `show={true | false}` prop.");let[a,f]=v.useState(n?"visible":"hidden"),h=Id(()=>{f("hidden")}),[m,g]=v.useState(!0),y=v.useRef([n]);Be(()=>{m!==!1&&y.current[y.current.length-1]!==n&&(y.current.push(n),g(!1))},[y,n]);let w=v.useMemo(()=>({show:n,appear:r,initial:m}),[n,r,m]);v.useEffect(()=>{if(n)f("visible");else if(!Po(h))f("hidden");else{let d=l.current;if(!d)return;let E=d.getBoundingClientRect();E.x===0&&E.y===0&&E.width===0&&E.height===0&&f("hidden")}},[n,h]);let k={unmount:i},p=Q(()=>{var d;m&&g(!1),(d=e.beforeEnter)==null||d.call(e)}),c=Q(()=>{var d;m&&g(!1),(d=e.beforeLeave)==null||d.call(e)});return A.createElement(No.Provider,{value:h},A.createElement(To.Provider,{value:w},Ue({ourProps:{...k,as:v.Fragment,children:A.createElement(Ud,{ref:s,...k,...o,beforeEnter:p,beforeLeave:c})},theirProps:{},defaultTag:v.Fragment,features:Bd,visible:a==="visible",name:"Transition"})))}function cy(e,t){let n=v.useContext(To)!==null,r=wu()!==null;return A.createElement(A.Fragment,null,!n&&r?A.createElement(hs,{ref:t,...e}):A.createElement(Ud,{ref:t,...e}))}let hs=Le(ay),Ud=Le(uy),fy=Le(cy),vi=Object.assign(hs,{Child:fy,Root:hs});function dy(e){const{currentRoom:t,setCurrentRoom:n}=e;return R.jsx("nav",{className:"flex flex-1 flex-col",children:R.jsx("ul",{role:"list",className:"flex flex-1 flex-col gap-y-7",children:R.jsx("li",{children:R.jsx("ul",{role:"list",className:"-mx-2 space-y-1",children:nn==null?void 0:nn.map(r=>R.jsx("li",{className:mu("relative flex justify-between gap-x-6 px-4 py-5 hover:bg-ctp-mantle sm:px-6 w-full rounded-md cursor-pointer",t===r?"bg-ctp-mantle":""),onClick:()=>n(r),children:R.jsxs("div",{className:"flex flex-row justify-between w-full align-middle",children:[R.jsx("p",{className:"text-lg font-medium text-ctp-text",children:r}),R.jsx(Sd,{className:"h-6 w-6 text-ctp-blue"})]})},r))})})})})}function py(e){const{sidebarOpen:t,setSidebarOpen:n,currentRoom:r,setCurrentRoom:i}=e;return R.jsx(vi.Root,{show:t,as:v.Fragment,children:R.jsxs(Wa,{as:"div",className:"relative z-50 lg:hidden",onClose:n,children:[R.jsx(vi.Child,{as:v.Fragment,enter:"transition-opacity ease-linear duration-300",enterFrom:"opacity-0",enterTo:"opacity-100",leave:"transition-opacity ease-linear duration-300",leaveFrom:"opacity-100",leaveTo:"opacity-0",children:R.jsx("div",{className:"fixed inset-0 bg-gray-900/80"})}),R.jsx("div",{className:"fixed inset-0 flex",children:R.jsx(vi.Child,{as:v.Fragment,enter:"transition ease-in-out duration-300 transform",enterFrom:"-translate-x-full",enterTo:"translate-x-0",leave:"transition ease-in-out duration-300 transform",leaveFrom:"translate-x-0",leaveTo:"-translate-x-full",children:R.jsxs(Wa.Panel,{className:"relative mr-16 flex w-full max-w-xs flex-1",children:[R.jsx(vi.Child,{as:v.Fragment,enter:"ease-in-out duration-300",enterFrom:"opacity-0",enterTo:"opacity-100",leave:"ease-in-out duration-300",leaveFrom:"opacity-100",leaveTo:"opacity-0",children:R.jsx("div",{className:"absolute left-full top-0 flex w-16 justify-center pt-5",children:R.jsxs("button",{type:"button",className:"-m-2.5 p-2.5",onClick:()=>n(!1),children:[R.jsx("span",{className:"sr-only",children:"Close sidebar"}),R.jsx(cv,{className:"h-6 w-6 text-white","aria-hidden":"true"})]})})}),R.jsxs("div",{className:"flex grow flex-col gap-y-5 overflow-y-auto bg-ctp-base px-6 pb-4",children:[R.jsx("div",{className:"flex h-16 shrink-0 items-center",children:R.jsx("h1",{className:"text-2xl text-white font-bold py-4",children:"Rooms"})}),R.jsx(dy,{currentRoom:r,setCurrentRoom:i})]})]})})})]})})}function hy(){const[e,t]=v.useState([]),[n,r]=v.useState(nn[0]),[i,o]=v.useState(null),l=v.useRef(!1),[s,u]=v.useState(!1);return v.useEffect(()=>{t([]),i==null||i.emit("join",n)},[n,i]),v.useEffect(()=>{if(l.current)return;l.current=!0;const a=Oi("ws://localhost:3000");o(a),a.on("connect",()=>{console.log("Connected to socket server"),console.log("joining room",n),a.emit("join",n)}),a.on("message",f=>{console.log("Message received",f),f.date=new Date(f.date),t(h=>[...h,f])}),a.on("messages",f=>{console.log("Messages received",f);let h=f.messages.map(m=>(m.date=new Date(m.date),m));t(h)})},[]),R.jsx(R.Fragment,{children:R.jsxs("main",{className:"h-screen w-screen flex text-ctp-text",children:[R.jsx(py,{sidebarOpen:s,setSidebarOpen:u,currentRoom:n,setCurrentRoom:r}),R.jsx(pv,{currentRoom:n,setCurrentRoom:r}),R.jsxs("div",{className:"h-screen p-4 bg-ctp-crust flex flex-col flex-grow justify-end",children:[R.jsxs("div",{className:"bg-ctp-base rounded-t-lg flex-grow",children:[R.jsxs("div",{className:"sticky top-0 z-40 flex items-center gap-x-6 bg-ctp-mantle px-2 sm:px-6 lg:hidden",children:[R.jsxs("button",{type:"button",className:"-m-2.5 p-2.5 text-gray-400 lg:hidden",onClick:()=>u(!0),children:[R.jsx("span",{className:"sr-only",children:"Open sidebar"}),R.jsx(sv,{className:"h-6 w-6","aria-hidden":"true"})]}),R.jsx("div",{className:"flex-1 text-sm font-semibold leading-6 text-white",children:R.jsx("h1",{className:"text-2xl text-white font-bold py-4",children:n})})]}),R.jsx("h1",{className:"hidden lg:block text-2xl text-center text-white font-bold my-4",children:n}),R.jsx(mv,{messages:e})]}),R.jsx(vv,{socket:i,currentRoom:n})]})]})})}al.createRoot(document.getElementById("root")).render(R.jsx(A.StrictMode,{children:R.jsx(hy,{})})); diff --git a/frontend/dist/assets/index-myMiaP76.css b/frontend/dist/assets/index-myMiaP76.css deleted file mode 100644 index d3e7ff4..0000000 --- a/frontend/dist/assets/index-myMiaP76.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--ctp-rosewater: 245, 224, 220;--ctp-flamingo: 242, 205, 205;--ctp-pink: 245, 194, 231;--ctp-mauve: 203, 166, 247;--ctp-red: 243, 139, 168;--ctp-maroon: 235, 160, 172;--ctp-peach: 250, 179, 135;--ctp-yellow: 249, 226, 175;--ctp-green: 166, 227, 161;--ctp-teal: 148, 226, 213;--ctp-sky: 137, 220, 235;--ctp-sapphire: 116, 199, 236;--ctp-blue: 137, 180, 250;--ctp-lavender: 180, 190, 254;--ctp-text: 205, 214, 244;--ctp-subtext1: 186, 194, 222;--ctp-subtext0: 166, 173, 200;--ctp-overlay2: 147, 153, 178;--ctp-overlay1: 127, 132, 156;--ctp-overlay0: 108, 112, 134;--ctp-surface2: 88, 91, 112;--ctp-surface1: 69, 71, 90;--ctp-surface0: 49, 50, 68;--ctp-base: 30, 30, 46;--ctp-mantle: 24, 24, 37;--ctp-crust: 17, 17, 27}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-full{left:100%}.top-0{top:0}.z-40{z-index:40}.z-50{z-index:50}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-4{margin-bottom:1rem}.mr-16{margin-right:4rem}.mt-1{margin-top:.25rem}.mt-4{margin-top:1rem}.flex{display:flex}.hidden{display:none}.h-11{height:2.75rem}.h-16{height:4rem}.h-6{height:1.5rem}.h-full{height:100%}.h-screen{height:100vh}.w-16{width:4rem}.w-6{width:1.5rem}.w-full{width:100%}.w-screen{width:100vw}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-5{row-gap:1.25rem}.gap-y-7{row-gap:1.75rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.bg-ctp-base{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-base),var(--tw-bg-opacity))}.bg-ctp-blue{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-blue),var(--tw-bg-opacity))}.bg-ctp-crust{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-crust),var(--tw-bg-opacity))}.bg-ctp-mantle{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-mantle),var(--tw-bg-opacity))}.bg-ctp-text{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-text),var(--tw-bg-opacity))}.bg-gray-900\/80{background-color:#111827cc}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.pb-4{padding-bottom:1rem}.pr-0{padding-right:0}.pt-5{padding-top:1.25rem}.text-center{text-align:center}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-6{line-height:1.5rem}.text-ctp-base{--tw-text-opacity: 1;color:rgba(var(--ctp-base),var(--tw-text-opacity))}.text-ctp-blue{--tw-text-opacity: 1;color:rgba(var(--ctp-blue),var(--tw-text-opacity))}.text-ctp-green{--tw-text-opacity: 1;color:rgba(var(--ctp-green),var(--tw-text-opacity))}.text-ctp-peach{--tw-text-opacity: 1;color:rgba(var(--ctp-peach),var(--tw-text-opacity))}.text-ctp-pink{--tw-text-opacity: 1;color:rgba(var(--ctp-pink),var(--tw-text-opacity))}.text-ctp-red{--tw-text-opacity: 1;color:rgba(var(--ctp-red),var(--tw-text-opacity))}.text-ctp-sky{--tw-text-opacity: 1;color:rgba(var(--ctp-sky),var(--tw-text-opacity))}.text-ctp-teal{--tw-text-opacity: 1;color:rgba(var(--ctp-teal),var(--tw-text-opacity))}.text-ctp-text{--tw-text-opacity: 1;color:rgba(var(--ctp-text),var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.placeholder-ctp-subtext0::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgba(var(--ctp-subtext0),var(--tw-placeholder-opacity))}.placeholder-ctp-subtext0::placeholder{--tw-placeholder-opacity: 1;color:rgba(var(--ctp-subtext0),var(--tw-placeholder-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.hover\:bg-ctp-mantle:hover{--tw-bg-opacity: 1;background-color:rgba(var(--ctp-mantle),var(--tw-bg-opacity))}@media (min-width: 640px){.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width: 1024px){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:w-72{width:18rem}} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 96f91c4..307aff9 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -1,14 +1,33 @@ - - - - - Chatly - - - - -
- - + + + + Socket.IO Chat Example + + + + +
    +
  • +
    +
      +
      + +
    • + +
    + + + + + + + \ No newline at end of file diff --git a/frontend/dist/main.js b/frontend/dist/main.js new file mode 100644 index 0000000..888e03d --- /dev/null +++ b/frontend/dist/main.js @@ -0,0 +1,278 @@ +$(function () { + const FADE_TIME = 150; // ms + const TYPING_TIMER_LENGTH = 400; // ms + const COLORS = [ + '#e21400', '#91580f', '#f8a700', '#f78b00', + '#58dc00', '#287b00', '#a8f07a', '#4ae8c4', + '#3b88eb', '#3824aa', '#a700ff', '#d300e7' + ]; + + // Initialize variables + const $window = $(window); + const $usernameInput = $('.usernameInput'); // Input for username + const $messages = $('.messages'); // Messages area + const $inputMessage = $('.inputMessage'); // Input message input box + + const $loginPage = $('.login.page'); // The login page + const $chatPage = $('.chat.page'); // The chatroom page + + const socket = io(); + + // Prompt for setting a username + let username; + let connected = false; + let typing = false; + let lastTypingTime; + let $currentInput = $usernameInput.focus(); + + const addParticipantsMessage = (data) => { + let message = ''; + if (data.numUsers === 1) { + message += `there's 1 participant`; + } else { + message += `there are ${data.numUsers} participants`; + } + log(message); + } + + // Sets the client's username + const setUsername = () => { + username = cleanInput($usernameInput.val().trim()); + + // If the username is valid + if (username) { + $loginPage.fadeOut(); + $chatPage.show(); + $loginPage.off('click'); + $currentInput = $inputMessage.focus(); + + // Tell the server your username + socket.emit('add user', username); + } + } + + // Sends a chat message + const sendMessage = () => { + let message = $inputMessage.val(); + // Prevent markup from being injected into the message + message = cleanInput(message); + // if there is a non-empty message and a socket connection + if (message && connected) { + $inputMessage.val(''); + addChatMessage({ username, message }); + // tell server to execute 'new message' and send along one parameter + socket.emit('new message', message); + } + } + + // Log a message + const log = (message, options) => { + const $el = $('
  • ').addClass('log').text(message); + addMessageElement($el, options); + } + + // Adds the visual chat message to the message list + const addChatMessage = (data, options = {}) => { + // Don't fade the message in if there is an 'X was typing' + const $typingMessages = getTypingMessages(data); + if ($typingMessages.length !== 0) { + options.fade = false; + $typingMessages.remove(); + } + + const $usernameDiv = $('') + .text(data.username) + .css('color', getUsernameColor(data.username)); + const $messageBodyDiv = $('') + .text(data.message); + + const typingClass = data.typing ? 'typing' : ''; + const $messageDiv = $('
  • ') + .data('username', data.username) + .addClass(typingClass) + .append($usernameDiv, $messageBodyDiv); + + addMessageElement($messageDiv, options); + } + + // Adds the visual chat typing message + const addChatTyping = (data) => { + data.typing = true; + data.message = 'is typing'; + addChatMessage(data); + } + + // Removes the visual chat typing message + const removeChatTyping = (data) => { + getTypingMessages(data).fadeOut(function () { + $(this).remove(); + }); + } + + // Adds a message element to the messages and scrolls to the bottom + // el - The element to add as a message + // options.fade - If the element should fade-in (default = true) + // options.prepend - If the element should prepend + // all other messages (default = false) + const addMessageElement = (el, options) => { + const $el = $(el); + // Setup default options + if (!options) { + options = {}; + } + if (typeof options.fade === 'undefined') { + options.fade = true; + } + if (typeof options.prepend === 'undefined') { + options.prepend = false; + } + + // Apply options + if (options.fade) { + $el.hide().fadeIn(FADE_TIME); + } + if (options.prepend) { + $messages.prepend($el); + } else { + $messages.append($el); + } + + $messages[0].scrollTop = $messages[0].scrollHeight; + } + + // Prevents input from having injected markup + const cleanInput = (input) => { + return $('
    ').text(input).html(); + } + + // Updates the typing event + const updateTyping = () => { + if (connected) { + if (!typing) { + typing = true; + socket.emit('typing'); + } + lastTypingTime = (new Date()).getTime(); + + setTimeout(() => { + const typingTimer = (new Date()).getTime(); + const timeDiff = typingTimer - lastTypingTime; + if (timeDiff >= TYPING_TIMER_LENGTH && typing) { + socket.emit('stop typing'); + typing = false; + } + }, TYPING_TIMER_LENGTH); + } + } + + // Gets the 'X is typing' messages of a user + const getTypingMessages = (data) => { + return $('.typing.message').filter(function (i) { + return $(this).data('username') === data.username; + }); + } + + // Gets the color of a username through our hash function + const getUsernameColor = (username) => { + // Compute hash code + let hash = 7; + for (let i = 0; i < username.length; i++) { + hash = username.charCodeAt(i) + (hash << 5) - hash; + } + // Calculate color + const index = Math.abs(hash % COLORS.length); + return COLORS[index]; + } + + // Keyboard events + + $window.keydown(event => { + // Auto-focus the current input when a key is typed + if (!(event.ctrlKey || event.metaKey || event.altKey)) { + $currentInput.focus(); + } + // When the client hits ENTER on their keyboard + if (event.which === 13) { + if (username) { + sendMessage(); + socket.emit('stop typing'); + typing = false; + } else { + setUsername(); + } + } + }); + + $inputMessage.on('input', () => { + updateTyping(); + }); + + // Click events + + // Focus input when clicking anywhere on login page + $loginPage.click(() => { + $currentInput.focus(); + }); + + // Focus input when clicking on the message input's border + $inputMessage.click(() => { + $inputMessage.focus(); + }); + + // Socket events + + // Whenever the server emits 'login', log the login message + socket.on('login', (data) => { + connected = true; + // Display the welcome message + const message = 'Welcome to Socket.IO Chat – '; + log(message, { + prepend: true + }); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'new message', update the chat body + socket.on('new message', (data) => { + addChatMessage(data); + }); + + // Whenever the server emits 'user joined', log it in the chat body + socket.on('user joined', (data) => { + log(`${data.username} joined`); + addParticipantsMessage(data); + }); + + // Whenever the server emits 'user left', log it in the chat body + socket.on('user left', (data) => { + log(`${data.username} left`); + addParticipantsMessage(data); + removeChatTyping(data); + }); + + // Whenever the server emits 'typing', show the typing message + socket.on('typing', (data) => { + addChatTyping(data); + }); + + // Whenever the server emits 'stop typing', kill the typing message + socket.on('stop typing', (data) => { + removeChatTyping(data); + }); + + socket.on('disconnect', () => { + log('you have been disconnected'); + }); + + socket.io.on('reconnect', () => { + log('you have been reconnected'); + if (username) { + socket.emit('add user', username); + } + }); + + socket.io.on('reconnect_error', () => { + log('attempt to reconnect has failed'); + }); + +}); diff --git a/frontend/dist/style.css b/frontend/dist/style.css new file mode 100644 index 0000000..3052d88 --- /dev/null +++ b/frontend/dist/style.css @@ -0,0 +1,149 @@ +/* Fix user-agent */ + +* { + box-sizing: border-box; +} + +html { + font-weight: 300; + -webkit-font-smoothing: antialiased; +} + +html, input { + font-family: + "HelveticaNeue-Light", + "Helvetica Neue Light", + "Helvetica Neue", + Helvetica, + Arial, + "Lucida Grande", + sans-serif; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +ul { + list-style: none; + word-wrap: break-word; +} + +/* Pages */ + +.pages { + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +.page { + height: 100%; + position: absolute; + width: 100%; +} + +/* Login Page */ + +.login.page { + background-color: #000; +} + +.login.page .form { + height: 100px; + margin-top: -100px; + position: absolute; + + text-align: center; + top: 50%; + width: 100%; +} + +.login.page .form .usernameInput { + background-color: transparent; + border: none; + border-bottom: 2px solid #fff; + outline: none; + padding-bottom: 15px; + text-align: center; + width: 400px; +} + +.login.page .title { + font-size: 200%; +} + +.login.page .usernameInput { + font-size: 200%; + letter-spacing: 3px; +} + +.login.page .title, .login.page .usernameInput { + color: #fff; + font-weight: 100; +} + +/* Chat page */ + +.chat.page { + display: none; +} + +/* Font */ + +.messages { + font-size: 150%; +} + +.inputMessage { + font-size: 100%; +} + +.log { + color: gray; + font-size: 70%; + margin: 5px; + text-align: center; +} + +/* Messages */ + +.chatArea { + height: 100%; + padding-bottom: 60px; +} + +.messages { + height: 100%; + margin: 0; + overflow-y: scroll; + padding: 10px 20px 10px 20px; +} + +.message.typing .messageBody { + color: gray; +} + +.username { + font-weight: 700; + overflow: hidden; + padding-right: 15px; + text-align: right; +} + +/* Input */ + +.inputMessage { + border: 10px solid #000; + bottom: 0; + height: 60px; + left: 0; + outline: none; + padding-left: 10px; + position: absolute; + right: 0; + width: 100%; +} diff --git a/frontend/dist/vite.svg b/frontend/dist/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/dist/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html deleted file mode 100644 index 7428258..0000000 --- a/frontend/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Chatly - - -
    - - - diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index d08de69..0000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,4803 +0,0 @@ -{ - "name": "chatly-web", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "chatly-web", - "version": "0.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "socket.io-client": "^4.7.2" - }, - "devDependencies": { - "@catppuccin/tailwindcss": "^0.1.6", - "@headlessui/react": "^1.7.17", - "@heroicons/react": "^2.0.18", - "@types/react": "^18.2.37", - "@types/react-dom": "^18.2.15", - "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.16", - "eslint": "^8.53.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.4", - "postcss": "^8.4.32", - "tailwindcss": "^3.3.6", - "vite": "^5.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", - "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@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.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@catppuccin/tailwindcss": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@catppuccin/tailwindcss/-/tailwindcss-0.1.6.tgz", - "integrity": "sha512-V+Y0AwZ5SSyvOVAcDl7Ng30xy+m82OKnEJ+9+kcZZ7lRyXuZrAb2GScdq9XR3v+ggt8qiZ/G4TvaC9cJ88AAXA==", - "dev": true, - "peerDependencies": { - "tailwindcss": ">=3.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", - "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@headlessui/react": { - "version": "1.7.17", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", - "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", - "dev": true, - "dependencies": { - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@heroicons/react": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", - "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==", - "dev": true, - "peerDependencies": { - "react": ">= 16" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", - "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", - "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", - "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", - "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", - "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", - "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", - "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", - "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", - "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz", - "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", - "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", - "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", - "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.43.tgz", - "integrity": "sha512-nvOV01ZdBdd/KW6FahSbcNplt2jCJfyWdTos61RYHV+FVv5L/g9AOX1bmbVcWcLFL8+KHQfh1zVIQrud6ihyQA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.609", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", - "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==", - "dev": true - }, - "node_modules/engine.io-client": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", - "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", - "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.8", - "@esbuild/android-arm64": "0.19.8", - "@esbuild/android-x64": "0.19.8", - "@esbuild/darwin-arm64": "0.19.8", - "@esbuild/darwin-x64": "0.19.8", - "@esbuild/freebsd-arm64": "0.19.8", - "@esbuild/freebsd-x64": "0.19.8", - "@esbuild/linux-arm": "0.19.8", - "@esbuild/linux-arm64": "0.19.8", - "@esbuild/linux-ia32": "0.19.8", - "@esbuild/linux-loong64": "0.19.8", - "@esbuild/linux-mips64el": "0.19.8", - "@esbuild/linux-ppc64": "0.19.8", - "@esbuild/linux-riscv64": "0.19.8", - "@esbuild/linux-s390x": "0.19.8", - "@esbuild/linux-x64": "0.19.8", - "@esbuild/netbsd-x64": "0.19.8", - "@esbuild/openbsd-x64": "0.19.8", - "@esbuild/sunos-x64": "0.19.8", - "@esbuild/win32-arm64": "0.19.8", - "@esbuild/win32-ia32": "0.19.8", - "@esbuild/win32-x64": "0.19.8" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", - "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.7.0", - "@rollup/rollup-android-arm64": "4.7.0", - "@rollup/rollup-darwin-arm64": "4.7.0", - "@rollup/rollup-darwin-x64": "4.7.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", - "@rollup/rollup-linux-arm64-gnu": "4.7.0", - "@rollup/rollup-linux-arm64-musl": "4.7.0", - "@rollup/rollup-linux-riscv64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-musl": "4.7.0", - "@rollup/rollup-win32-arm64-msvc": "4.7.0", - "@rollup/rollup-win32-ia32-msvc": "4.7.0", - "@rollup/rollup-win32-x64-msvc": "4.7.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index 694951f..0000000 --- a/frontend/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "loco-chat-rooms", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "socket.io-client": "^4.7.2" - }, - "devDependencies": { - "@catppuccin/tailwindcss": "^0.1.6", - "@headlessui/react": "^1.7.17", - "@heroicons/react": "^2.0.18", - "@types/react": "^18.2.37", - "@types/react-dom": "^18.2.15", - "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.16", - "eslint": "^8.53.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.4", - "postcss": "^8.4.32", - "tailwindcss": "^3.3.6", - "vite": "^5.0.0" - } -} \ No newline at end of file diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml deleted file mode 100644 index d00407d..0000000 --- a/frontend/pnpm-lock.yaml +++ /dev/null @@ -1,3036 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - socket.io-client: - specifier: ^4.7.2 - version: 4.7.4 - -devDependencies: - '@catppuccin/tailwindcss': - specifier: ^0.1.6 - version: 0.1.6(tailwindcss@3.4.1) - '@headlessui/react': - specifier: ^1.7.17 - version: 1.7.18(react-dom@18.2.0)(react@18.2.0) - '@heroicons/react': - specifier: ^2.0.18 - version: 2.1.1(react@18.2.0) - '@types/react': - specifier: ^18.2.37 - version: 18.2.48 - '@types/react-dom': - specifier: ^18.2.15 - version: 18.2.18 - '@vitejs/plugin-react': - specifier: ^4.2.0 - version: 4.2.1(vite@5.0.11) - autoprefixer: - specifier: ^10.4.16 - version: 10.4.17(postcss@8.4.33) - eslint: - specifier: ^8.53.0 - version: 8.56.0 - eslint-plugin-react: - specifier: ^7.33.2 - version: 7.33.2(eslint@8.56.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.56.0) - eslint-plugin-react-refresh: - specifier: ^0.4.4 - version: 0.4.5(eslint@8.56.0) - postcss: - specifier: ^8.4.32 - version: 8.4.33 - tailwindcss: - specifier: ^3.3.6 - version: 3.4.1 - vite: - specifier: ^5.0.0 - version: 5.0.11 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@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/core@7.23.7) - '@babel/helpers': 7.23.8 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.8: - resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true - - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@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.6 - '@babel/types': 7.23.6 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@catppuccin/tailwindcss@0.1.6(tailwindcss@3.4.1): - resolution: {integrity: sha512-V+Y0AwZ5SSyvOVAcDl7Ng30xy+m82OKnEJ+9+kcZZ7lRyXuZrAb2GScdq9XR3v+ggt8qiZ/G4TvaC9cJ88AAXA==} - peerDependencies: - tailwindcss: '>=3.0.0' - dependencies: - tailwindcss: 3.4.1 - dev: true - - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@headlessui/react@1.7.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - dependencies: - '@tanstack/react-virtual': 3.0.2(react-dom@18.2.0)(react@18.2.0) - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@heroicons/react@2.1.1(react@18.2.0): - resolution: {integrity: sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==} - peerDependencies: - react: '>= 16' - dependencies: - react: 18.2.0 - dev: true - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.21 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.21: - resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm-eabi@4.9.5: - resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.9.5: - resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.9.5: - resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.9.5: - resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.9.5: - resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.9.5: - resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.9.5: - resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.9.5: - resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.9.5: - resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.9.5: - resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.9.5: - resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.9.5: - resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.9.5: - resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: false - - /@tanstack/react-virtual@3.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9XbRLPKgnhMwwmuQMnJMv+5a9sitGNCSEtf/AZXzmJdesYk7XsjYHaEDny+IrJzvPNwZliIIDwCRiaUqR3zzCA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@tanstack/virtual-core': 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@tanstack/virtual-core@3.0.0: - resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} - dev: true - - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 - dev: true - - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true - - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true - - /@types/react-dom@18.2.18: - resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} - dependencies: - '@types/react': 18.2.48 - dev: true - - /@types/react@18.2.48: - resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - dev: true - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vitejs/plugin-react@4.2.1(vite@5.0.11): - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 - vite: 5.0.11 - transitivePeerDependencies: - - supports-color - dev: true - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-string: 1.0.7 - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.2 - dev: true - - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.2 - dev: true - - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - - /autoprefixer@10.4.17(postcss@8.4.33): - resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.22.2 - caniuse-lite: 1.0.30001579 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.33 - postcss-value-parser: 4.2.0 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001579 - electron-to-chromium: 1.4.639 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true - - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.2.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: true - - /caniuse-lite@1.0.30001579: - resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /electron-to-chromium@1.4.639: - resolution: {integrity: sha512-CkKf3ZUVZchr+zDpAlNLEEy2NJJ9T64ULWaDgy3THXXlPVPkLu3VOs9Bac44nebVtdwl2geSj6AxTtGDOxoXhg==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-parser: 5.2.1 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: false - - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.1.0 - safe-regex-test: 1.0.2 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 - dev: true - - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-set-tostringtag: 2.0.2 - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.6 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 - dev: true - - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - dev: true - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.0 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.56.0 - dev: true - - /eslint-plugin-react-refresh@0.4.5(eslint@8.56.0): - resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} - peerDependencies: - eslint: '>=7' - dependencies: - eslint: 8.56.0 - dev: true - - /eslint-plugin-react@7.33.2(eslint@8.56.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.56.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.10 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.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 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} - dependencies: - reusify: 1.0.4 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: true - - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.13 - dev: true - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - dev: true - - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.1.7 - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true - - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /postcss-import@15.1.0(postcss@8.4.33): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.33 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - dev: true - - /postcss-js@4.0.1(postcss@8.4.33): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.33 - dev: true - - /postcss-load-config@4.0.2(postcss@8.4.33): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.0.0 - postcss: 8.4.33 - yaml: 2.3.4 - dev: true - - /postcss-nested@6.0.1(postcss@8.4.33): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.33 - postcss-selector-parser: 6.0.15 - dev: true - - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true - - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - dev: true - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@4.9.5: - resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.5 - '@rollup/rollup-android-arm64': 4.9.5 - '@rollup/rollup-darwin-arm64': 4.9.5 - '@rollup/rollup-darwin-x64': 4.9.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.5 - '@rollup/rollup-linux-arm64-gnu': 4.9.5 - '@rollup/rollup-linux-arm64-musl': 4.9.5 - '@rollup/rollup-linux-riscv64-gnu': 4.9.5 - '@rollup/rollup-linux-x64-gnu': 4.9.5 - '@rollup/rollup-linux-x64-musl': 4.9.5 - '@rollup/rollup-win32-arm64-msvc': 4.9.5 - '@rollup/rollup-win32-ia32-msvc': 4.9.5 - '@rollup/rollup-win32-x64-msvc': 4.9.5 - fsevents: 2.3.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-regex-test@1.0.2: - resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-regex: 1.1.4 - dev: true - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /set-function-length@1.2.0: - resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /socket.io-client@4.7.4: - resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-client: 6.5.3 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - internal-slot: 1.0.6 - regexp.prototype.flags: 1.5.1 - set-function-name: 2.0.1 - side-channel: 1.0.4 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 10.3.10 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /tailwindcss@3.4.1: - resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.33 - postcss-import: 15.1.0(postcss@8.4.33) - postcss-js: 4.0.1(postcss@8.4.33) - postcss-load-config: 4.0.2(postcss@8.4.33) - postcss-nested: 6.0.1(postcss@8.4.33) - postcss-selector-parser: 6.0.15 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.5 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /vite@5.0.11: - resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.19.11 - postcss: 8.4.33 - rollup: 4.9.5 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: false - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js deleted file mode 100644 index 2e7af2b..0000000 --- a/frontend/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx deleted file mode 100644 index 62ef994..0000000 --- a/frontend/src/App.jsx +++ /dev/null @@ -1,98 +0,0 @@ -import {useState, useRef, useEffect} from "react"; -import {io} from "socket.io-client"; -import {Bars3Icon, } from "@heroicons/react/24/outline"; -import {Sidebar} from "./components/sidebar/normal/Sidebar.jsx"; -import {RoomMsgsList} from "./components/RoomMsgsList.jsx"; -import {MsgSubmitBox} from "./components/MsgSubmitBox.jsx"; -import {rooms} from "./utils/rooms.js"; -import {TransitiveSidebar} from "./components/sidebar/transitive/TransitiveSidebar.jsx"; - -function App() { - const [messages, setMessages] = useState([]); - const [currentRoom, setCurrentRoom] = useState(rooms[0]); - const [socket, setSocket] = useState(null); - const onceRef = useRef(false); - const [sidebarOpen, setSidebarOpen] = useState(false); - - useEffect(() => { - setMessages([]); - socket?.emit("join", currentRoom); - }, [currentRoom, socket]); - - useEffect(() => { - if (onceRef.current) { - return; - } - - onceRef.current = true; - - const socket = io("ws://localhost:3000"); - setSocket(socket); - - socket.on("connect", () => { - console.log("Connected to socket server"); - console.log("joining room", currentRoom); - - socket.emit("join", currentRoom); - }); - - socket.on("message", (msg) => { - console.log("Message received", msg); - msg.date = new Date(msg.date); - setMessages((messages) => [...messages, msg]); - }); - - socket.on("messages", (msgs) => { - console.log("Messages received", msgs); - let messages = msgs.messages.map((msg) => { - msg.date = new Date(msg.date); - return msg; - }); - setMessages(messages); - }); - }, []); - - return ( - <> -
    - - -
    -
    -
    - -
    -

    - {currentRoom} -

    -
    -
    - -

    - {currentRoom} -

    - -
    - -
    -
    - - ); -} - -export default App; diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/components/MsgSubmitBox.jsx b/frontend/src/components/MsgSubmitBox.jsx deleted file mode 100644 index ff0bb5b..0000000 --- a/frontend/src/components/MsgSubmitBox.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import {useState} from "react"; - -export function MsgSubmitBox(props) { - const {socket, currentRoom} = props; - const [input, setInput] = useState(""); - - const sendMessage = (e) => { - e.preventDefault(); - socket?.emit("message", { - text: input, - room: currentRoom, - }); - setInput(""); - }; - - return ( -
    - setInput(e.target.value)} - className="flex-1 p-2 rounded-l-md bg-ctp-text text-ctp-base placeholder-ctp-subtext0" - placeholder="Enter something englightened..." - /> - -
    - ) -} diff --git a/frontend/src/components/RoomMsgsList.jsx b/frontend/src/components/RoomMsgsList.jsx deleted file mode 100644 index d9ea978..0000000 --- a/frontend/src/components/RoomMsgsList.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import {classNames} from "../utils/class-names.js"; -import {colorForName} from "../utils/color-for-name.js"; - -export function RoomMsgsList(props) { - const {messages} = props - - return ( -
      - {messages?.map((msg, index) => ( -
    • -
      -
      -

      - {msg.user} -

      -

      - {msg.date.toLocaleString()} -

      -
      -

      {msg.text}

      -
      -
    • - ))} -
    - ) -} diff --git a/frontend/src/components/sidebar/normal/Sidebar.jsx b/frontend/src/components/sidebar/normal/Sidebar.jsx deleted file mode 100644 index b4b99b6..0000000 --- a/frontend/src/components/sidebar/normal/Sidebar.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import {classNames} from "../../../utils/class-names.js"; -import {ChevronRightIcon} from "@heroicons/react/20/solid/index.js"; -import {rooms} from "../../../utils/rooms.js"; - -export function Sidebar(props) { - const {currentRoom, setCurrentRoom} = props; - - return ( - - ) -} diff --git a/frontend/src/components/sidebar/transitive/TransitiveSidebar.jsx b/frontend/src/components/sidebar/transitive/TransitiveSidebar.jsx deleted file mode 100644 index 9a032f6..0000000 --- a/frontend/src/components/sidebar/transitive/TransitiveSidebar.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import {Fragment} from "react"; -import {Dialog, Transition} from "@headlessui/react"; -import {XMarkIcon} from "@heroicons/react/24/outline/index.js"; -import {TransitiveSidebarRoomsList} from "./TransitiveSidebarRoomsList.jsx"; - -export function TransitiveSidebar(props) { - const {sidebarOpen, setSidebarOpen, currentRoom, setCurrentRoom} = props; - return ( - - - -
    - - -
    - - - -
    - -
    -
    -
    -
    -

    - Rooms -

    -
    - -
    -
    -
    -
    -
    -
    - ) -} diff --git a/frontend/src/components/sidebar/transitive/TransitiveSidebarRoomsList.jsx b/frontend/src/components/sidebar/transitive/TransitiveSidebarRoomsList.jsx deleted file mode 100644 index 6643354..0000000 --- a/frontend/src/components/sidebar/transitive/TransitiveSidebarRoomsList.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import {ChevronRightIcon} from "@heroicons/react/20/solid/index.js"; -import {classNames} from "../../../utils/class-names.js"; -import {rooms} from "../../../utils/rooms.js"; - -export function TransitiveSidebarRoomsList(props) { - const {currentRoom, setCurrentRoom} = props - return ( - - ) -} diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index b5c61c9..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx deleted file mode 100644 index 54b39dd..0000000 --- a/frontend/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.jsx' -import './index.css' - -ReactDOM.createRoot(document.getElementById('root')).render( - - - , -) diff --git a/frontend/src/utils/class-names.js b/frontend/src/utils/class-names.js deleted file mode 100644 index 28cc7a7..0000000 --- a/frontend/src/utils/class-names.js +++ /dev/null @@ -1,3 +0,0 @@ -export const classNames = (...classes) => { - return classes.filter(Boolean).join(" "); -}; diff --git a/frontend/src/utils/color-for-name.js b/frontend/src/utils/color-for-name.js deleted file mode 100644 index 8668aa5..0000000 --- a/frontend/src/utils/color-for-name.js +++ /dev/null @@ -1,20 +0,0 @@ -export const colorForName = (name) => { - const colors = [ - "ctp-green", - "ctp-pink", - "ctp-red", - "ctp-peach", - "ctp-blue", - "ctp-teal", - ]; - - name = name.toLowerCase(); - - let sum = 0; - for (let i = 0; i < name.length; i++) { - sum += name.charCodeAt(i); - } - let index = sum % colors.length; - - return colors[index]; -}; diff --git a/frontend/src/utils/rooms.js b/frontend/src/utils/rooms.js deleted file mode 100644 index 2677582..0000000 --- a/frontend/src/utils/rooms.js +++ /dev/null @@ -1,9 +0,0 @@ -export const rooms = [ - "General", - "C++", - "Rust", - "Go", - "Python", - "Java", - "JavaScript", -]; diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js deleted file mode 100644 index 93e6777..0000000 --- a/frontend/tailwind.config.js +++ /dev/null @@ -1,22 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], - theme: { - extend: {}, - }, - safelist: [ - "text-ctp-red", - "text-ctp-green", - "text-ctp-pink", - "text-ctp-peach", - "text-ctp-blue", - "text-ctp-teal", - "text-ctp-sky", - ], - plugins: [ - require("@catppuccin/tailwindcss")({ - prefix: "ctp", - defaultFlavour: "mocha", - }), - ], -}; diff --git a/frontend/vite.config.js b/frontend/vite.config.js deleted file mode 100644 index 5a33944..0000000 --- a/frontend/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/src/app.rs b/src/app.rs index fcc3859..4c4d13a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,16 +1,16 @@ +// use crate::channels; +use crate::initializers; use async_trait::async_trait; use loco_rs::{ - app::{AppContext, Hooks}, + app::{AppContext, Hooks, Initializer}, + bgworker::Queue, boot::{create_app, BootResult, StartMode}, - controller::{channels::AppChannels, AppRoutes}, + controller::AppRoutes, environment::Environment, task::Tasks, - worker::Processor, Result, }; -use crate::channels; - pub struct App; #[async_trait] impl Hooks for App { @@ -32,21 +32,20 @@ impl Hooks for App { create_app::(mode, environment).await } - fn routes(ctx: &AppContext) -> AppRoutes { - AppRoutes::empty() - .prefix("/api") - .add_app_channels(Self::register_channels(ctx)) + fn routes(_ctx: &AppContext) -> AppRoutes { + AppRoutes::empty().prefix("/api") } - fn register_channels(_ctx: &AppContext) -> AppChannels { - let messages = channels::state::MessageStore::default(); + async fn initializers(_ctx: &AppContext) -> Result>> { + let initializers: Vec> = + vec![Box::new(initializers::socket::ChatInitializer)]; - let channels: AppChannels = AppChannels::builder().with_state(messages).into(); - channels.register.ns("/", channels::application::on_connect); - channels + Ok(initializers) } - fn connect_workers<'a>(_p: &'a mut Processor, _ctx: &'a AppContext) {} + async fn connect_workers(_ctx: &AppContext, _queue: &Queue) -> Result<()> { + Ok(()) + } fn register_tasks(_tasks: &mut Tasks) {} } diff --git a/src/bin/main.rs b/src/bin/main.rs index 20166e7..e77cee5 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -1,7 +1,7 @@ -use loco_rs::cli; use chat_rooms::app::App; +use loco_rs::cli; #[tokio::main] -async fn main() -> eyre::Result<()> { +async fn main() -> loco_rs::Result<()> { cli::main::().await } diff --git a/src/channels/application.rs b/src/channels/application.rs deleted file mode 100644 index dda1a4e..0000000 --- a/src/channels/application.rs +++ /dev/null @@ -1,46 +0,0 @@ -use loco_rs::socketioxide::extract::{Data, SocketRef, State}; - -use super::state; - -#[derive(Debug, serde::Deserialize)] -pub struct MessageIn { - room: String, - text: String, -} - -#[derive(serde::Serialize)] -pub struct Messages { - messages: Vec, -} - -pub async fn on_connect(socket: SocketRef) { - tracing::info!("socket connected: {}", socket.id); - - socket.on( - "join", - |socket: SocketRef, Data::(room), store: State| async move { - tracing::info!("Received join: {:?}", room); - let _ = socket.leave_all(); - let _ = socket.join(room.clone()); - let messages = store.get(&room).await; - let _ = socket.emit("messages", Messages { messages }); - }, - ); - - socket.on( - "message", - |socket: SocketRef, Data::(data), store: State| async move { - tracing::info!("Received message: {:?}", data); - - let response = state::Message { - text: data.text, - user: format!("anon-{}", socket.id), - date: chrono::Utc::now(), - }; - - store.insert(&data.room, response.clone()).await; - - let _ = socket.within(data.room).emit("message", response); - }, - ); -} diff --git a/src/channels/mod.rs b/src/channels/mod.rs deleted file mode 100644 index 6daee1b..0000000 --- a/src/channels/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod application; -pub mod state; diff --git a/src/channels/state.rs b/src/channels/state.rs deleted file mode 100644 index 1db8231..0000000 --- a/src/channels/state.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::collections::{HashMap, VecDeque}; -use tokio::sync::RwLock; - -#[derive(serde::Serialize, Clone, Debug)] -pub struct Message { - pub text: String, - pub user: String, - pub date: chrono::DateTime, -} - -pub type RoomStore = HashMap>; - -#[derive(Default)] -pub struct MessageStore { - pub messages: RwLock, -} - -impl MessageStore { - pub async fn insert(&self, room: &str, message: Message) { - let mut binding = self.messages.write().await; - let messages = binding.entry(room.to_owned()).or_default(); - messages.push_front(message); - messages.truncate(20); - } - - pub async fn get(&self, room: &str) -> Vec { - let messages = self.messages.read().await.get(room).cloned(); - messages.unwrap_or_default().into_iter().rev().collect() - } -} diff --git a/src/initializers/mod.rs b/src/initializers/mod.rs new file mode 100644 index 0000000..d22cc84 --- /dev/null +++ b/src/initializers/mod.rs @@ -0,0 +1 @@ +pub mod socket; diff --git a/src/initializers/socket.rs b/src/initializers/socket.rs new file mode 100644 index 0000000..097e0d3 --- /dev/null +++ b/src/initializers/socket.rs @@ -0,0 +1,128 @@ +use async_trait::async_trait; +use axum::Router as AxumRouter; +use loco_rs::prelude::*; +use serde::{Deserialize, Serialize}; +use socketioxide::{ + extract::{Data, Extension, SocketRef, State}, + SocketIo, +}; +use std::sync::{atomic::AtomicUsize, Arc}; +use tower::ServiceBuilder; +use tower_http::cors::CorsLayer; + +pub struct ChatInitializer; + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(transparent)] +struct Username(String); + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(rename_all = "camelCase", untagged)] +enum Res { + Login { + #[serde(rename = "numUsers")] + num_users: usize, + }, + UserEvent { + #[serde(rename = "numUsers")] + num_users: usize, + username: Username, + }, + Message { + username: Username, + message: String, + }, + Username { + username: Username, + }, +} + +#[derive(Clone)] +struct UserCnt(Arc); +impl UserCnt { + fn new() -> Self { + Self(Arc::new(AtomicUsize::new(0))) + } + fn add_user(&self) -> usize { + self.0.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1 + } + fn remove_user(&self) -> usize { + self.0.fetch_sub(1, std::sync::atomic::Ordering::SeqCst) - 1 + } +} + +#[async_trait] +impl Initializer for ChatInitializer { + fn name(&self) -> String { + "axum-session".to_string() + } + + async fn after_routes(&self, router: AxumRouter, _ctx: &AppContext) -> Result { + let (layer, io) = SocketIo::builder().with_state(UserCnt::new()).build_layer(); + + io.ns("/", |s: SocketRef| { + s.on( + "new message", + |s: SocketRef, Data::(msg), Extension::(username)| { + let msg = &Res::Message { + username, + message: msg, + }; + s.broadcast().emit("new message", msg).ok(); + }, + ); + + s.on( + "add user", + |s: SocketRef, Data::(username), user_cnt: State| { + if s.extensions.get::().is_some() { + return; + } + let num_users = user_cnt.add_user(); + s.extensions.insert(Username(username.clone())); + s.emit("login", &Res::Login { num_users }).ok(); + + let res = &Res::UserEvent { + num_users, + username: Username(username), + }; + s.broadcast().emit("user joined", res).ok(); + }, + ); + + s.on("typing", |s: SocketRef, Extension::(username)| { + s.broadcast() + .emit("typing", &Res::Username { username }) + .ok(); + }); + + s.on( + "stop typing", + |s: SocketRef, Extension::(username)| { + s.broadcast() + .emit("stop typing", &Res::Username { username }) + .ok(); + }, + ); + + s.on_disconnect( + |s: SocketRef, user_cnt: State, Extension::(username)| { + let num_users = user_cnt.remove_user(); + let res = &Res::UserEvent { + num_users, + username, + }; + s.broadcast().emit("user left", res).ok(); + }, + ); + }); + + let router = router.layer( + ServiceBuilder::new() + .layer(CorsLayer::permissive()) + .layer(layer), + ); + + Ok(router) + } +} diff --git a/src/lib.rs b/src/lib.rs index 4c4247b..365b261 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ pub mod app; -pub mod channels; pub mod controllers; +pub mod initializers; pub mod views; From 17f19830af6718c2d6c1a305051cc949841790ea Mon Sep 17 00:00:00 2001 From: Elad Kaplan Date: Mon, 25 Nov 2024 09:32:19 +0200 Subject: [PATCH 2/3] replace with loco saas client template --- .cargo/config.toml | 2 + .gitignore | 9 +- .rustfmt.toml | 2 + Cargo.lock | 2425 ++++++++++++++++- Cargo.toml | 43 +- README.md | 54 +- assets/i18n/de-DE/main.ftl | 4 + assets/i18n/en-US/main.ftl | 10 + assets/i18n/shared.ftl | 1 + assets/static/404.html | 3 + assets/static/image.png | Bin 0 -> 304720 bytes assets/views/home/hello.html | 12 + config/development.yaml | 72 +- config/test.yaml | 95 + examples/playground.rs | 21 + migration/Cargo.toml | 23 + migration/src/lib.rs | 17 + migration/src/m20220101_000001_users.rs | 50 + src/app.rs | 45 +- src/bin/main.rs | 3 +- src/bin/tool.rs | 8 + src/controllers/auth.rs | 157 ++ src/controllers/mod.rs | 2 +- src/fixtures/users.yaml | 17 + src/initializers/{socket.rs => chat.rs} | 37 +- src/initializers/mod.rs | 3 +- src/initializers/view_engine.rs | 46 + src/lib.rs | 4 + src/mailers/auth.rs | 65 + src/mailers/auth/forgot/html.t | 11 + src/mailers/auth/forgot/subject.t | 1 + src/mailers/auth/forgot/text.t | 3 + src/mailers/auth/welcome/html.t | 13 + src/mailers/auth/welcome/subject.t | 1 + src/mailers/auth/welcome/text.t | 4 + src/mailers/mod.rs | 1 + src/models/_entities/mod.rs | 5 + src/models/_entities/prelude.rs | 3 + src/models/_entities/users.rs | 28 + src/models/mod.rs | 2 + src/models/users.rs | 298 ++ src/tasks/mod.rs | 1 + src/tasks/seed.rs | 45 + src/views/auth.rs | 41 + src/views/mod.rs | 2 +- src/workers/downloader.rs | 23 + src/workers/mod.rs | 1 + tests/mod.rs | 4 + tests/models/mod.rs | 1 + .../can_create_with_password@users.snap | 21 + .../snapshots/can_find_by_email@users-2.snap | 7 + .../snapshots/can_find_by_email@users.snap | 21 + .../snapshots/can_find_by_pid@users-2.snap | 7 + .../snapshots/can_find_by_pid@users.snap | 21 + .../snapshots/can_validate_model@users.snap | 9 + ...te_with_password_with_duplicate@users.snap | 7 + tests/models/users.rs | 223 ++ tests/requests/auth.rs | 218 ++ tests/requests/mod.rs | 2 + tests/requests/prepare_data.rs | 57 + .../can_get_current_user@auth_request.snap | 8 + ...can_login_without_verify@auth_request.snap | 8 + .../can_register@auth_request-2.snap | 8 + .../snapshots/can_register@auth_request.snap | 25 + .../can_reset_password@auth_request-2.snap | 8 + .../can_reset_password@auth_request.snap | 8 + ...in_with_invalid_password@auth_request.snap | 8 + ...ogin_with_valid_password@auth_request.snap | 8 + tests/tasks/mod.rs | 1 + tests/tasks/seed.rs | 17 + tests/workers/mod.rs | 1 + 71 files changed, 4258 insertions(+), 153 deletions(-) create mode 100644 .rustfmt.toml create mode 100644 assets/i18n/de-DE/main.ftl create mode 100644 assets/i18n/en-US/main.ftl create mode 100644 assets/i18n/shared.ftl create mode 100644 assets/static/404.html create mode 100644 assets/static/image.png create mode 100644 assets/views/home/hello.html create mode 100644 config/test.yaml create mode 100644 examples/playground.rs create mode 100644 migration/Cargo.toml create mode 100644 migration/src/lib.rs create mode 100644 migration/src/m20220101_000001_users.rs create mode 100644 src/bin/tool.rs create mode 100644 src/controllers/auth.rs create mode 100644 src/fixtures/users.yaml rename src/initializers/{socket.rs => chat.rs} (75%) create mode 100644 src/initializers/view_engine.rs create mode 100644 src/mailers/auth.rs create mode 100644 src/mailers/auth/forgot/html.t create mode 100644 src/mailers/auth/forgot/subject.t create mode 100644 src/mailers/auth/forgot/text.t create mode 100644 src/mailers/auth/welcome/html.t create mode 100644 src/mailers/auth/welcome/subject.t create mode 100644 src/mailers/auth/welcome/text.t create mode 100644 src/mailers/mod.rs create mode 100644 src/models/_entities/mod.rs create mode 100644 src/models/_entities/prelude.rs create mode 100644 src/models/_entities/users.rs create mode 100644 src/models/mod.rs create mode 100644 src/models/users.rs create mode 100644 src/tasks/mod.rs create mode 100644 src/tasks/seed.rs create mode 100644 src/views/auth.rs create mode 100644 src/workers/downloader.rs create mode 100644 src/workers/mod.rs create mode 100644 tests/mod.rs create mode 100644 tests/models/mod.rs create mode 100644 tests/models/snapshots/can_create_with_password@users.snap create mode 100644 tests/models/snapshots/can_find_by_email@users-2.snap create mode 100644 tests/models/snapshots/can_find_by_email@users.snap create mode 100644 tests/models/snapshots/can_find_by_pid@users-2.snap create mode 100644 tests/models/snapshots/can_find_by_pid@users.snap create mode 100644 tests/models/snapshots/can_validate_model@users.snap create mode 100644 tests/models/snapshots/handle_create_with_password_with_duplicate@users.snap create mode 100644 tests/models/users.rs create mode 100644 tests/requests/auth.rs create mode 100644 tests/requests/mod.rs create mode 100644 tests/requests/prepare_data.rs create mode 100644 tests/requests/snapshots/can_get_current_user@auth_request.snap create mode 100644 tests/requests/snapshots/can_login_without_verify@auth_request.snap create mode 100644 tests/requests/snapshots/can_register@auth_request-2.snap create mode 100644 tests/requests/snapshots/can_register@auth_request.snap create mode 100644 tests/requests/snapshots/can_reset_password@auth_request-2.snap create mode 100644 tests/requests/snapshots/can_reset_password@auth_request.snap create mode 100644 tests/requests/snapshots/login_with_invalid_password@auth_request.snap create mode 100644 tests/requests/snapshots/login_with_valid_password@auth_request.snap create mode 100644 tests/tasks/mod.rs create mode 100644 tests/tasks/seed.rs create mode 100644 tests/workers/mod.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 5ebf033..fb921ea 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,4 @@ [alias] loco = "run --" +loco-tool = "run --bin tool --" +playground = "run --example playground" diff --git a/.gitignore b/.gitignore index 40eda95..d83d21a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,19 @@ **/config/local.yaml +**/config/*.local.yaml +**/config/production.yaml # Generated by Cargo # will have compiled files and executables debug/ target/ -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -#Cargo.lock +# include cargo lock +!Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk # MSVC Windows builds of rustc generate these, which store debugging information *.pdb + +*.sqlite \ No newline at end of file diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..d862e08 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,2 @@ +max_width = 100 +use_small_heuristics = "Default" diff --git a/Cargo.lock b/Cargo.lock index ab549b8..ea098bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -38,6 +49,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -123,6 +140,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "argon2" version = "0.5.3" @@ -135,6 +164,55 @@ dependencies = [ "password-hash", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compression" version = "0.4.18" @@ -151,6 +229,120 @@ dependencies = [ "zstd-safe", ] +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.83" @@ -162,6 +354,27 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto-future" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1e7e457ea78e524f48639f551fd79703ac3f2237f5ecccdf4708f8a75ad373" + [[package]] name = "autocfg" version = "1.4.0" @@ -179,7 +392,7 @@ dependencies = [ "axum-macros", "bytes", "futures-util", - "http", + "http 1.1.0", "http-body", "http-body-util", "hyper", @@ -212,7 +425,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", + "http 1.1.0", "http-body", "http-body-util", "mime", @@ -236,7 +449,7 @@ dependencies = [ "cookie", "fastrand", "futures-util", - "http", + "http 1.1.0", "http-body", "http-body-util", "mime", @@ -259,6 +472,36 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "axum-test" +version = "16.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "017cbca2776229a7100ebee44e065fcf5baccea6fc4cb9e5bea8328d83863a03" +dependencies = [ + "anyhow", + "assert-json-diff", + "auto-future", + "axum", + "bytes", + "bytesize", + "cookie", + "http 1.1.0", + "http-body-util", + "hyper", + "hyper-util", + "mime", + "pretty_assertions", + "reserve-port", + "rust-multipart-rfc7578_2", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "tokio", + "tower 0.5.1", + "url", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -286,6 +529,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -298,11 +547,52 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bb8" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89aabfae550a5c44b43ab941844ffcd2e993cb6900b342debf59e9ea74acdb8" +dependencies = [ + "async-trait", + "futures-util", + "parking_lot", + "tokio", +] + +[[package]] +name = "bigdecimal" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f850665a0385e070b64c38d2354e6c104c8479c59868d1e48a0c13ee2c7a1c1" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "blake2" @@ -322,6 +612,42 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "borsh" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "brotli" version = "7.0.0" @@ -375,6 +701,28 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -390,6 +738,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bytesize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" + [[package]] name = "cc" version = "1.2.1" @@ -408,21 +762,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "chat_rooms" +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chat-rooms" version = "0.1.0" dependencies = [ "async-trait", "axum", "chrono", + "fluent-templates", + "include_dir", + "insta", "loco-rs", + "migration", + "rstest", + "sea-orm", "serde", "serde_json", + "serial_test", "socketioxide", "tokio", "tower 0.5.1", "tower-http", "tracing", "tracing-subscriber", + "unic-langid", + "uuid", + "validator", ] [[package]] @@ -528,6 +898,29 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.8" @@ -542,15 +935,30 @@ dependencies = [ ] [[package]] -name = "cookie" -version = "0.18.1" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] [[package]] name = "core-foundation-sys" @@ -567,6 +975,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -587,6 +1010,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "cron_clock" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a8699d8ed16e3db689f8ae04d8dc3c6666a4ba7e724e5a157884b7cc385d16b" +dependencies = [ + "chrono", + "nom", + "once_cell", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -615,6 +1049,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -682,6 +1125,17 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -689,6 +1143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -710,6 +1165,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.10.7" @@ -717,10 +1178,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -732,6 +1215,18 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "duct" version = "0.13.7" @@ -758,6 +1253,9 @@ name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] [[package]] name = "email-encoding" @@ -765,7 +1263,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60d1d33cdaede7e24091f039632eb5d3c7469fe5b066a985281a34fc70fa317f" dependencies = [ - "base64", + "base64 0.22.1", "memchr", ] @@ -796,11 +1294,11 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec84aea019c24ae0cae29a6306b1b9b6bd91a4c950542d804b742435ed797f0c" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", - "http", + "http 1.1.0", "http-body", "http-body-util", "hyper", @@ -843,6 +1341,44 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.2.0" @@ -859,6 +1395,110 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb74634707bebd0ce645a981148e8fb8c7bccd4c33c652aeffd28bf2f96d555a" +dependencies = [ + "fluent-bundle", + "unic-langid", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +dependencies = [ + "thiserror", +] + +[[package]] +name = "fluent-template-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec7592cd1f45c1afe9084ce59c62a3a7c266c125c4c2ec97e95b0563c4aa914" +dependencies = [ + "flume 0.10.14", + "ignore", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "unic-langid", +] + +[[package]] +name = "fluent-templates" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3ef2c2152757885365abce32ddf682746062f1b6b3c0824a29fbed6ee4d080" +dependencies = [ + "arc-swap", + "fluent", + "fluent-bundle", + "fluent-langneg", + "fluent-syntax", + "fluent-template-macros", + "flume 0.10.14", + "heck 0.4.1", + "ignore", + "intl-memoizer", + "lazy_static", + "log", + "once_cell", + "serde_json", + "snafu 0.7.5", + "tera", + "unic-langid", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "spin", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -883,6 +1523,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.31" @@ -925,12 +1571,36 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -954,6 +1624,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -995,6 +1671,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -1002,8 +1688,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1042,21 +1730,51 @@ dependencies = [ "walkdir", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "hashlink" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] [[package]] name = "heck" @@ -1076,6 +1794,45 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "hostname" version = "0.4.0" @@ -1089,9 +1846,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -1099,13 +1856,24 @@ dependencies = [ ] [[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.1.0", ] [[package]] @@ -1116,7 +1884,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http", + "http 1.1.0", "http-body", "pin-project-lite", ] @@ -1163,7 +1931,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", + "http 1.1.0", "http-body", "httparse", "httpdate", @@ -1171,6 +1939,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] @@ -1180,13 +1949,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", + "futures-channel", "futures-util", - "http", + "http 1.1.0", "http-body", "hyper", "pin-project-lite", + "socket2", "tokio", "tower-service", + "tracing", ] [[package]] @@ -1409,7 +2181,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", +] + +[[package]] +name = "inherent" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "insta" +version = "1.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" +dependencies = [ + "console", + "lazy_static", + "linked-hash-map", + "pest", + "pest_derive", + "regex", + "serde", + "similar", +] + +[[package]] +name = "intl-memoizer" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe22e020fce238ae18a6d5d8c502ee76a52a6e880d99477657e6acc30ec57bda" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", ] [[package]] @@ -1421,12 +2239,32 @@ dependencies = [ "serde", ] +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -1460,11 +2298,38 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "9.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +dependencies = [ + "base64 0.21.7", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "lettre" @@ -1473,7 +2338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0161e452348e399deb685ba05e55ee116cae9410f4f51fe42d597361444521d9" dependencies = [ "async-trait", - "base64", + "base64 0.22.1", "chumsky", "email-encoding", "email_address", @@ -1509,6 +2374,33 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1559,7 +2451,9 @@ dependencies = [ "async-trait", "axum", "axum-extra", + "axum-test", "backtrace_printer", + "bb8", "byte-unit", "bytes", "cfg-if", @@ -1575,17 +2469,23 @@ dependencies = [ "hyper", "include_dir", "ipnetwork", + "jsonwebtoken", "lettre", "loco-gen", "mime", + "moka", "object_store", "rand", "regex", + "rusty-sidekiq", + "sea-orm", + "sea-orm-migration", "semver", "serde", "serde_json", "serde_variant", "serde_yaml", + "sqlx", "tera", "thiserror", "tokio", @@ -1597,6 +2497,7 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", + "ulid", "uuid", "validator", ] @@ -1606,6 +2507,9 @@ name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +dependencies = [ + "value-bag", +] [[package]] name = "loom" @@ -1643,12 +2547,31 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0aa4b8ca861b08d68afc8702af3250776898c1508b278e1da9d01e01d4b45c" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "migration" +version = "0.1.0" +dependencies = [ + "async-std", + "loco-rs", + "sea-orm-migration", +] + [[package]] name = "mime" version = "0.3.17" @@ -1686,12 +2609,32 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", ] +[[package]] +name = "moka" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "once_cell", + "parking_lot", + "quanta", + "rustc_version", + "smallvec", + "tagptr", + "thiserror", + "triomphe", + "uuid", +] + [[package]] name = "multer" version = "3.1.0" @@ -1701,7 +2644,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 1.1.0", "httparse", "memchr", "mime", @@ -1729,6 +2672,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1746,6 +2716,26 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1753,6 +2743,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", ] [[package]] @@ -1775,10 +2776,10 @@ dependencies = [ "chrono", "futures", "humantime", - "itertools", + "itertools 0.13.0", "parking_lot", "percent-encoding", - "snafu", + "snafu 0.8.5", "tokio", "tracing", "url", @@ -1791,6 +2792,15 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + [[package]] name = "os_pipe" version = "1.2.1" @@ -1801,12 +2811,43 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "ouroboros" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "944fa20996a25aded6b4795c6d63f10014a7a83f8be9828a11860b08c5fc4a67" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" +dependencies = [ + "heck 0.4.1", + "itertools 0.12.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.89", +] + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1850,6 +2891,31 @@ dependencies = [ "subtle", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1951,12 +3017,59 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1972,6 +3085,25 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1997,21 +3129,97 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.92" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "unicode-ident", + "proc-macro2", + "quote", ] [[package]] -name = "psm" -version = "0.1.24" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ - "cc", + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "version_check", + "yansi", +] + +[[package]] +name = "psm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +dependencies = [ + "cc", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", ] [[package]] @@ -2029,6 +3237,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -2059,6 +3273,35 @@ dependencies = [ "getrandom", ] +[[package]] +name = "raw-cpuid" +version = "11.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redis" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8455fa3621f6b41c514946de66ea0531f57ca017b2e6c7cc368035ea5b46df" +dependencies = [ + "async-trait", + "bytes", + "combine", + "futures-util", + "itoa", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "tokio", + "tokio-util", + "url", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -2068,6 +3311,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.11.1" @@ -2112,6 +3366,31 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reserve-port" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9838134a2bfaa8e1f40738fcc972ac799de6e0e06b5157acb95fc2b05a0ea283" +dependencies = [ + "lazy_static", + "thiserror", +] + [[package]] name = "ring" version = "0.17.8" @@ -2127,6 +3406,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rrgen" version = "0.5.3" @@ -2146,12 +3454,109 @@ dependencies = [ "thiserror", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rstest" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.89", + "unicode-ident", +] + +[[package]] +name = "rust-multipart-rfc7578_2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b748410c0afdef2ebbe3685a6a862e2ee937127cdaae623336a459451c8d57" +dependencies = [ + "bytes", + "futures-core", + "futures-util", + "http 0.2.12", + "mime", + "mime_guess", + "rand", + "thiserror", +] + +[[package]] +name = "rust_decimal" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.41" @@ -2181,63 +3586,286 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "rusty-sidekiq" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15544f047600b602c7b11ff7ee0882f9034f9cbe2c205693edd5615e2a6c03ee" +dependencies = [ + "async-trait", + "bb8", + "chrono", + "convert_case", + "cron_clock", + "gethostname", + "hex", + "num_cpus", + "rand", + "redis", + "serde", + "serde_json", + "serial_test", + "sha2", + "slog-term", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scc" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b202022bb57c049555430e11fc22fea12909276a80a4c3d368da36ac1d88ed" +dependencies = [ + "sdd", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" + +[[package]] +name = "sea-bae" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" +dependencies = [ + "heck 0.4.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "sea-orm" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5680a8b686985116607ef5f5af2b1f9e1cc2c228330e93101816a0baa279afa" +dependencies = [ + "async-stream", + "async-trait", + "bigdecimal", + "chrono", + "futures", + "log", + "ouroboros", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-query-binder", + "serde", + "serde_json", + "sqlx", + "strum", + "thiserror", + "time", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sea-orm-cli" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a157f42d291ccbd6e913b9d9b12dbe2ccbcf0472efc60c8715dd1254083aec" +dependencies = [ + "chrono", + "clap", + "dotenvy", + "glob", + "regex", + "sea-schema", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "sea-orm-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a239e3bb1b566ad4ec2654d0d193d6ceddfd733487edc9c21a64d214c773910" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "sea-bae", + "syn 2.0.89", + "unicode-ident", +] + +[[package]] +name = "sea-orm-migration" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63ba07e9f2479cc671758fcb1edee42ff2e32c34b3e67ab41d0af1e41f73c74e" +dependencies = [ + "async-trait", + "clap", + "dotenvy", + "futures", + "sea-orm", + "sea-orm-cli", + "sea-schema", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "sea-query" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "ff504d13b5e4b52fffcf2fb203d0352a5722fa5151696db768933e41e1e591bb" dependencies = [ - "rustls-pki-types", + "bigdecimal", + "chrono", + "inherent", + "ordered-float", + "rust_decimal", + "sea-query-derive", + "serde_json", + "time", + "uuid", ] [[package]] -name = "rustls-pki-types" -version = "1.10.0" +name = "sea-query-binder" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" +dependencies = [ + "bigdecimal", + "chrono", + "rust_decimal", + "sea-query", + "serde_json", + "sqlx", + "time", + "uuid", +] [[package]] -name = "rustls-webpki" -version = "0.102.8" +name = "sea-query-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "9834af2c4bd8c5162f00c89f1701fb6886119a88062cf76fe842ea9e232b9839" dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", + "darling", + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.89", + "thiserror", ] [[package]] -name = "rustversion" -version = "1.0.18" +name = "sea-schema" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "aab1592d17860a9a8584d9b549aebcd06f7bdc3ff615f71752486ba0b05b1e6e" +dependencies = [ + "futures", + "sea-query", + "sea-schema-derive", +] [[package]] -name = "ryu" -version = "1.0.18" +name = "sea-schema-derive" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "debdc8729c37fdbf88472f97fd470393089f997a909e535ff67c544d18cfccf0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.89", +] [[package]] -name = "same-file" -version = "1.0.6" +name = "seahash" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "self_cell" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" +dependencies = [ + "self_cell 1.0.4", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "self_cell" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" [[package]] name = "semver" @@ -2340,6 +3968,31 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2351,6 +4004,12 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.8" @@ -2402,6 +4061,40 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "similar" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -2417,6 +4110,25 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slog" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" + +[[package]] +name = "slog-term" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" +dependencies = [ + "is-terminal", + "slog", + "term", + "thread_local", + "time", +] + [[package]] name = "slug" version = "0.1.6" @@ -2432,6 +4144,19 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] + +[[package]] +name = "snafu" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" +dependencies = [ + "doc-comment", + "snafu-derive 0.7.5", +] [[package]] name = "snafu" @@ -2439,7 +4164,19 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ - "snafu-derive", + "snafu-derive 0.8.5", +] + +[[package]] +name = "snafu-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2465,61 +4202,300 @@ dependencies = [ ] [[package]] -name = "socketioxide" -version = "0.15.1" +name = "socketioxide" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9ce59f845cfea2fe24cc7adbd512268893ee07bde899ae6477569dbc42dff3" +dependencies = [ + "bytes", + "engineioxide", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body", + "hyper", + "matchit 0.8.5", + "pin-project-lite", + "rustversion", + "serde", + "socketioxide-core", + "socketioxide-parser-common", + "state", + "thiserror", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "socketioxide-core" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82826d9a1efb2b201e7d12d231f98870f768d98d02452eb642bca0587a8d51f0" +dependencies = [ + "bytes", + "engineioxide", + "serde", + "thiserror", +] + +[[package]] +name = "socketioxide-parser-common" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a20b64f78a6d093d73d4d166b5bfc8b5096069865c59cee67b3aafac77eaac" +dependencies = [ + "bytes", + "itoa", + "serde", + "serde_json", + "socketioxide-core", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +dependencies = [ + "atoi", + "bigdecimal", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener 5.3.1", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.14.5", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rust_decimal", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.89", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9ce59f845cfea2fe24cc7adbd512268893ee07bde899ae6477569dbc42dff3" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ - "bytes", - "engineioxide", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "matchit 0.8.5", - "pin-project-lite", - "rustversion", + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", "serde", - "socketioxide-core", - "socketioxide-parser-common", - "state", - "thiserror", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.89", + "tempfile", "tokio", - "tower-layer", - "tower-service", + "url", ] [[package]] -name = "socketioxide-core" -version = "0.15.1" +name = "sqlx-mysql" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82826d9a1efb2b201e7d12d231f98870f768d98d02452eb642bca0587a8d51f0" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ + "atoi", + "base64 0.22.1", + "bigdecimal", + "bitflags", + "byteorder", "bytes", - "engineioxide", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "rust_decimal", "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", "thiserror", + "time", + "tracing", + "uuid", + "whoami", ] [[package]] -name = "socketioxide-parser-common" -version = "0.15.1" +name = "sqlx-postgres" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9a20b64f78a6d093d73d4d166b5bfc8b5096069865c59cee67b3aafac77eaac" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ - "bytes", + "atoi", + "base64 0.22.1", + "bigdecimal", + "bitflags", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", "itoa", + "log", + "md-5", + "memchr", + "num-bigint", + "once_cell", + "rand", + "rust_decimal", "serde", "serde_json", - "socketioxide-core", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time", + "tracing", + "uuid", + "whoami", ] [[package]] -name = "spin" -version = "0.9.8" +name = "sqlx-sqlite" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +dependencies = [ + "atoi", + "chrono", + "flume 0.11.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "time", + "tracing", + "url", + "uuid", +] [[package]] name = "stable_deref_trait" @@ -2549,12 +4525,35 @@ dependencies = [ "loom", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + [[package]] name = "subtle" version = "2.6.1" @@ -2568,6 +4567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", + "quote", "unicode-ident", ] @@ -2605,6 +4605,18 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.14.0" @@ -2640,6 +4652,17 @@ dependencies = [ "unic-segment", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -2736,6 +4759,7 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -2780,6 +4804,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-tungstenite" version = "0.24.0" @@ -2877,7 +4912,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http", + "http 1.1.0", "http-body", "http-body-util", "http-range-header", @@ -2992,6 +5027,18 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "triomphe" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tungstenite" version = "0.24.0" @@ -3001,7 +5048,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.1.0", "httparse", "log", "rand", @@ -3010,6 +5057,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + [[package]] name = "typenum" version = "1.17.0" @@ -3022,6 +5078,17 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +[[package]] +name = "ulid" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f903f293d11f31c0c29e4148f6dc0d033a7f80cebc0282bea147611667d289" +dependencies = [ + "getrandom", + "rand", + "web-time", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -3043,6 +5110,49 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" +[[package]] +name = "unic-langid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dd9d1e72a73b25e07123a80776aae3e7b0ec461ef94f9151eed6ec88005a44" +dependencies = [ + "unic-langid-impl", + "unic-langid-macros", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5422c1f65949306c99240b81de9f3f15929f5a8bfe05bb44b034cc8bf593e5" +dependencies = [ + "tinystr", +] + +[[package]] +name = "unic-langid-macros" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da1cd2c042d3c7569a1008806b02039e7a4a2bdf8f8e96bd3c792434a0e275e" +dependencies = [ + "proc-macro-hack", + "tinystr", + "unic-langid-impl", + "unic-langid-macros-impl", +] + +[[package]] +name = "unic-langid-macros-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed7f4237ba393424195053097c1516bd4590dc82b84f2f97c5c69e12704555b" +dependencies = [ + "proc-macro-hack", + "quote", + "syn 2.0.89", + "unic-langid-impl", +] + [[package]] name = "unic-segment" version = "0.9.0" @@ -3099,12 +5209,30 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -3166,6 +5294,7 @@ checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "rand", + "serde", ] [[package]] @@ -3204,6 +5333,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -3220,12 +5361,27 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" 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.95" @@ -3252,6 +5408,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.95" @@ -3281,6 +5449,26 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.26.7" @@ -3290,6 +5478,16 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" @@ -3518,6 +5716,21 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.7.5" diff --git a/Cargo.toml b/Cargo.toml index 8b97c1a..690cc83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,27 +1,43 @@ [workspace] [package] -name = "chat_rooms" +name = "chat-rooms" version = "0.1.0" edition = "2021" +publish = false +default-run = "chat_rooms-cli" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies] +[workspace.dependencies] +loco-rs = { version = "0.13" } -loco-rs = { version = "0.13.0", default-features = false, features = ["cli"] } -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +[dependencies] +loco-rs = { workspace = true } +serde = { version = "1", features = ["derive"] } +serde_json = "1" tokio = { version = "1.33.0", default-features = false, features = [ "rt-multi-thread", - "macros", ] } async-trait = "0.1.74" -chrono = { version = "0.4", features = ["serde"] } - axum = "0.7.5" tracing = "0.1.40" tracing-subscriber = { version = "0.3.17", features = ["env-filter", "json"] } +migration = { path = "migration" } +sea-orm = { version = "1.1.0", features = [ + "sqlx-sqlite", + "sqlx-postgres", + "runtime-tokio-rustls", + "macros", +] } +chrono = "0.4" +validator = { version = "0.18" } +uuid = { version = "1.6.0", features = ["v4"] } +include_dir = "0.7" +# view engine i18n +fluent-templates = { version = "0.8.0", features = ["tera"] } +unic-langid = "0.9.4" +# /view engine socketioxide = { version = "0.15.1", features = ["extensions", "state"] } tower = { version = "*" } @@ -31,3 +47,14 @@ tower-http = { version = "0.6.2", features = ["cors", "fs"] } name = "chat_rooms-cli" path = "src/bin/main.rs" required-features = [] + +[[bin]] +name = "tool" +path = "src/bin/tool.rs" +required-features = [] + +[dev-dependencies] +loco-rs = { workspace = true, features = ["testing"] } +serial_test = "3.1.1" +rstest = "0.21.0" +insta = { version = "1.34.0", features = ["redactions", "yaml", "filters"] } diff --git a/README.md b/README.md index c4336dc..43b9bdd 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,58 @@ -# Chat Rooms With Loco +# Welcome to Loco :train: -In this guide, we will walk through the process of creating chat rooms using Loco and [socketioxide](https://github.com/Totodore/socketioxide). The example website is derived from the [socketioxide example]((https://github.com/Totodore/socketioxide/tree/main/examples)). +[Loco](https://loco.rs) is a web and API framework running on Rust. +This is the **SaaS starter** which includes a `User` model and authentication based on JWT. +It also include configuration sections that help you pick either a frontend or a server-side template set up for your fullstack server. + + +## Quick Start -## Running the Example ```sh cargo loco start +``` + +```sh +$ cargo loco start +Finished dev [unoptimized + debuginfo] target(s) in 21.63s + Running `target/debug/myapp start` + + : + : + : + +controller/app_routes.rs:203: [Middleware] Adding log trace id + ▄ ▀ + ▀ ▄ + ▄ ▀ ▄ ▄ ▄▀ + ▄ ▀▄▄ + ▄ ▀ ▀ ▀▄▀█▄ + ▀█▄ +▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█ + ██████ █████ ███ █████ ███ █████ ███ ▀█ + ██████ █████ ███ █████ ▀▀▀ █████ ███ ▄█▄ + ██████ █████ ███ █████ █████ ███ ████▄ + ██████ █████ ███ █████ ▄▄▄ █████ ███ █████ + ██████ █████ ███ ████ ███ █████ ███ ████▀ + ▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ██▀ + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ + https://loco.rs + +environment: development + database: automigrate + logger: debug +compilation: debug + modes: server + +listening on http://localhost:5150 ``` -After the server starts, open your web browser and navigate to http://127.0.0.1:5150 to access the chat rooms. \ No newline at end of file +## Full Stack Serving + +You can check your [configuration](config/development.yaml) to pick either frontend setup or server-side rendered template, and activate the relevant configuration sections. + + +## Getting help + +Check out [a quick tour](https://loco.rs/docs/getting-started/tour/) or [the complete guide](https://loco.rs/docs/getting-started/guide/). diff --git a/assets/i18n/de-DE/main.ftl b/assets/i18n/de-DE/main.ftl new file mode 100644 index 0000000..ced609f --- /dev/null +++ b/assets/i18n/de-DE/main.ftl @@ -0,0 +1,4 @@ +hello-world = Hallo Welt! +greeting = Hallochen { $name }! + .placeholder = Hallo Freund! +about = Uber diff --git a/assets/i18n/en-US/main.ftl b/assets/i18n/en-US/main.ftl new file mode 100644 index 0000000..9d4d5e7 --- /dev/null +++ b/assets/i18n/en-US/main.ftl @@ -0,0 +1,10 @@ +hello-world = Hello World! +greeting = Hello { $name }! + .placeholder = Hello Friend! +about = About +simple = simple text +reference = simple text with a reference: { -something } +parameter = text with a { $param } +parameter2 = text one { $param } second { $multi-word-param } +email = text with an EMAIL("example@example.org") +fallback = this should fall back diff --git a/assets/i18n/shared.ftl b/assets/i18n/shared.ftl new file mode 100644 index 0000000..f169eca --- /dev/null +++ b/assets/i18n/shared.ftl @@ -0,0 +1 @@ +-something = foo diff --git a/assets/static/404.html b/assets/static/404.html new file mode 100644 index 0000000..66e78fb --- /dev/null +++ b/assets/static/404.html @@ -0,0 +1,3 @@ + +not found :-( + diff --git a/assets/static/image.png b/assets/static/image.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5a09508d1b4510e2de0cb7d0fa20a44eb631c6 GIT binary patch literal 304720 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%0DeQf`{ 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�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%0DZ^Q%>elM^F6+0A)oFJ{$ckKC-VUABW#^>PD3wb_ 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%0DqC9P??cV;AKw1TI!SOt??NfSBi^fWgGAq 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 literal 0 HcmV?d00001 diff --git a/assets/views/home/hello.html b/assets/views/home/hello.html new file mode 100644 index 0000000..6b97c39 --- /dev/null +++ b/assets/views/home/hello.html @@ -0,0 +1,12 @@ + + +
    + find this tera template at assets/views/home/hello.html: +
    +
    + {{ t(key="hello-world", lang="en-US") }}, +
    + {{ t(key="hello-world", lang="de-DE") }} + + + \ No newline at end of file diff --git a/config/development.yaml b/config/development.yaml index 3c229d9..0e50c0a 100644 --- a/config/development.yaml +++ b/config/development.yaml @@ -4,9 +4,11 @@ logger: # Enable or disable logging. enable: true + # Enable pretty backtrace (sets RUST_BACKTRACE=1) + pretty_backtrace: true # Log level, options: trace, debug, info, warn or error. level: debug - # Define the logging format. options: compact, pretty or Json + # Define the logging format. options: compact, pretty or json format: compact # By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries # Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters. @@ -15,15 +17,79 @@ logger: # Web server configuration server: # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} - port: 5150 + port: 5150 # The UI hostname or IP address that mailers will point to. host: http://localhost # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block - middlewares: + middlewares: static: enable: true must_exist: true + precompressed: false folder: uri: "/" path: "frontend/dist" fallback: "frontend/dist/index.html" + +# Worker Configuration +workers: + # specifies the worker mode. Options: + # - BackgroundQueue - Workers operate asynchronously in the background, processing queued. + # - ForegroundBlocking - Workers operate in the foreground and block until tasks are completed. + # - BackgroundAsync - Workers operate asynchronously in the background, processing tasks with async capabilities. + mode: BackgroundAsync + + + +# Mailer Configuration. +mailer: + # SMTP mailer configuration. + smtp: + # Enable/Disable smtp mailer. + enable: true + # SMTP server host. e.x localhost, smtp.gmail.com + host: localhost + # SMTP server port + port: 1025 + # Use secure connection (SSL/TLS). + secure: false + # auth: + # user: + # password: + +# Initializers Configuration +# initializers: +# oauth2: +# authorization_code: # Authorization code grant type +# - client_identifier: google # Identifier for the OAuth2 provider. Replace 'google' with your provider's name if different, must be unique within the oauth2 config. +# ... other fields + +# Database Configuration +database: + # Database connection URI + uri: {{ get_env(name="DATABASE_URL", default="sqlite://loco_app.sqlite?mode=rwc") }} + # When enabled, the sql query will be logged. + enable_logging: false + # Set the timeout duration when acquiring a connection. + connect_timeout: {{ get_env(name="DB_CONNECT_TIMEOUT", default="500") }} + # Set the idle duration before closing a connection. + idle_timeout: {{ get_env(name="DB_IDLE_TIMEOUT", default="500") }} + # Minimum number of connections for a pool. + min_connections: {{ get_env(name="DB_MIN_CONNECTIONS", default="1") }} + # Maximum number of connections for a pool. + max_connections: {{ get_env(name="DB_MAX_CONNECTIONS", default="1") }} + # Run migration up when application loaded + auto_migrate: true + # Truncate database when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_truncate: false + # Recreating schema when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_recreate: false + +# Authentication Configuration +auth: + # JWT authentication + jwt: + # Secret key for token generation and verification + secret: lBDFKDFHXhNXUcJ1obtE + # Token expiration time in seconds + expiration: 604800 # 7 days diff --git a/config/test.yaml b/config/test.yaml new file mode 100644 index 0000000..7427fab --- /dev/null +++ b/config/test.yaml @@ -0,0 +1,95 @@ +# Loco configuration file documentation + +# Application logging configuration +logger: + # Enable or disable logging. + enable: false + # Enable pretty backtrace (sets RUST_BACKTRACE=1) + pretty_backtrace: true + # Log level, options: trace, debug, info, warn or error. + level: debug + # Define the logging format. options: compact, pretty or json + format: compact + # By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries + # Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters. + # override_filter: trace + +# Web server configuration +server: + # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} + port: 5150 + # The UI hostname or IP address that mailers will point to. + host: http://localhost + # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block + middlewares: + static: + enable: true + must_exist: true + precompressed: false + folder: + uri: "/" + path: "frontend/dist" + fallback: "frontend/dist/index.html" + +# Worker Configuration +workers: + # specifies the worker mode. Options: + # - BackgroundQueue - Workers operate asynchronously in the background, processing queued. + # - ForegroundBlocking - Workers operate in the foreground and block until tasks are completed. + # - BackgroundAsync - Workers operate asynchronously in the background, processing tasks with async capabilities. + mode: BackgroundAsync + + + +# Mailer Configuration. +mailer: + # SMTP mailer configuration. + smtp: + # Enable/Disable smtp mailer. + enable: true + # SMTP server host. e.x localhost, smtp.gmail.com + host: localhost + # SMTP server port + port: 1025 + # Use secure connection (SSL/TLS). + secure: false + # auth: + # user: + # password: + +# Initializers Configuration +# initializers: +# oauth2: +# authorization_code: # Authorization code grant type +# - client_identifier: google # Identifier for the OAuth2 provider. Replace 'google' with your provider's name if different, must be unique within the oauth2 config. +# ... other fields + +# Database Configuration +database: + # Database connection URI + uri: {{ get_env(name="DATABASE_URL", default="sqlite://loco_app.sqlite?mode=rwc") }} + # When enabled, the sql query will be logged. + enable_logging: false + # Set the timeout duration when acquiring a connection. + connect_timeout: {{ get_env(name="DB_CONNECT_TIMEOUT", default="500") }} + # Set the idle duration before closing a connection. + idle_timeout: {{ get_env(name="DB_IDLE_TIMEOUT", default="500") }} + # Minimum number of connections for a pool. + min_connections: {{ get_env(name="DB_MIN_CONNECTIONS", default="1") }} + # Maximum number of connections for a pool. + max_connections: {{ get_env(name="DB_MAX_CONNECTIONS", default="1") }} + # Run migration up when application loaded + auto_migrate: true + # Truncate database when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_truncate: true + # Recreating schema when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_recreate: false + +# Authentication Configuration +auth: + # JWT authentication + jwt: + # Secret key for token generation and verification + secret: 4DRI5Iq069PX6uScCpK9 + # Token expiration time in seconds + expiration: 604800 # 7 days diff --git a/examples/playground.rs b/examples/playground.rs new file mode 100644 index 0000000..1ba5cba --- /dev/null +++ b/examples/playground.rs @@ -0,0 +1,21 @@ +use chat_rooms::app::App; +#[allow(unused_imports)] +use loco_rs::{cli::playground, prelude::*}; + +#[tokio::main] +async fn main() -> loco_rs::Result<()> { + let _ctx = playground::().await?; + + // let active_model: articles::ActiveModel = ActiveModel { + // title: Set(Some("how to build apps in 3 steps".to_string())), + // content: Set(Some("use Loco: https://loco.rs".to_string())), + // ..Default::default() + // }; + // active_model.insert(&ctx.db).await.unwrap(); + + // let res = articles::Entity::find().all(&ctx.db).await.unwrap(); + // println!("{:?}", res); + println!("welcome to playground. edit me at `examples/playground.rs`"); + + Ok(()) +} diff --git a/migration/Cargo.toml b/migration/Cargo.toml new file mode 100644 index 0000000..cb2ad9b --- /dev/null +++ b/migration/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "migration" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +name = "migration" +path = "src/lib.rs" + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } +loco-rs = { workspace = true } + + +[dependencies.sea-orm-migration] +version = "1.1.0" +features = [ + # Enable at least one `ASYNC_RUNTIME` and `DATABASE_DRIVER` feature if you want to run migration via CLI. + # View the list of supported features at https://www.sea-ql.org/SeaORM/docs/install-and-config/database-and-async-runtime. + # e.g. + "runtime-tokio-rustls", # `ASYNC_RUNTIME` feature +] diff --git a/migration/src/lib.rs b/migration/src/lib.rs new file mode 100644 index 0000000..d37c3d1 --- /dev/null +++ b/migration/src/lib.rs @@ -0,0 +1,17 @@ +#![allow(elided_lifetimes_in_paths)] +#![allow(clippy::wildcard_imports)] +pub use sea_orm_migration::prelude::*; + +mod m20220101_000001_users; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![ + Box::new(m20220101_000001_users::Migration), + // inject-above (do not remove this comment) + ] + } +} diff --git a/migration/src/m20220101_000001_users.rs b/migration/src/m20220101_000001_users.rs new file mode 100644 index 0000000..936ad3d --- /dev/null +++ b/migration/src/m20220101_000001_users.rs @@ -0,0 +1,50 @@ +use loco_rs::schema::table_auto_tz; +use sea_orm_migration::{prelude::*, schema::*}; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let table = table_auto_tz(Users::Table) + .col(pk_auto(Users::Id)) + .col(uuid(Users::Pid)) + .col(string_uniq(Users::Email)) + .col(string(Users::Password)) + .col(string(Users::ApiKey).unique_key()) + .col(string(Users::Name)) + .col(string_null(Users::ResetToken)) + .col(timestamp_with_time_zone_null(Users::ResetSentAt)) + .col(string_null(Users::EmailVerificationToken)) + .col(timestamp_with_time_zone_null( + Users::EmailVerificationSentAt, + )) + .col(timestamp_with_time_zone_null(Users::EmailVerifiedAt)) + .to_owned(); + manager.create_table(table).await?; + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop().table(Users::Table).to_owned()) + .await + } +} + +#[derive(Iden)] +pub enum Users { + Table, + Id, + Pid, + Email, + Name, + Password, + ApiKey, + ResetToken, + ResetSentAt, + EmailVerificationToken, + EmailVerificationSentAt, + EmailVerifiedAt, +} diff --git a/src/app.rs b/src/app.rs index 4c4d13a..dddcfda 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,15 +1,21 @@ -// use crate::channels; -use crate::initializers; use async_trait::async_trait; use loco_rs::{ app::{AppContext, Hooks, Initializer}, - bgworker::Queue, + bgworker::{BackgroundWorker, Queue}, boot::{create_app, BootResult, StartMode}, controller::AppRoutes, + db::{self, truncate_table}, environment::Environment, task::Tasks, Result, }; +use migration::Migrator; +use sea_orm::DatabaseConnection; +use std::path::Path; + +use crate::{ + controllers, initializers, models::_entities::users, tasks, workers::downloader::DownloadWorker, +}; pub struct App; #[async_trait] @@ -29,23 +35,34 @@ impl Hooks for App { } async fn boot(mode: StartMode, environment: &Environment) -> Result { - create_app::(mode, environment).await - } - - fn routes(_ctx: &AppContext) -> AppRoutes { - AppRoutes::empty().prefix("/api") + create_app::(mode, environment).await } async fn initializers(_ctx: &AppContext) -> Result>> { - let initializers: Vec> = - vec![Box::new(initializers::socket::ChatInitializer)]; - - Ok(initializers) + Ok(vec![ + Box::new(initializers::view_engine::ViewEngineInitializer), + Box::new(initializers::chat::ChatInitializer), + ]) } - async fn connect_workers(_ctx: &AppContext, _queue: &Queue) -> Result<()> { + fn routes(_ctx: &AppContext) -> AppRoutes { + AppRoutes::with_default_routes() // controller routes below + .add_route(controllers::auth::routes()) + } + async fn connect_workers(ctx: &AppContext, queue: &Queue) -> Result<()> { + queue.register(DownloadWorker::build(ctx)).await?; + Ok(()) + } + fn register_tasks(tasks: &mut Tasks) { + tasks.register(tasks::seed::SeedData); + } + async fn truncate(db: &DatabaseConnection) -> Result<()> { + truncate_table(db, users::Entity).await?; Ok(()) } - fn register_tasks(_tasks: &mut Tasks) {} + async fn seed(db: &DatabaseConnection, base: &Path) -> Result<()> { + db::seed::(db, &base.join("users.yaml").display().to_string()).await?; + Ok(()) + } } diff --git a/src/bin/main.rs b/src/bin/main.rs index e77cee5..9b50dda 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -1,7 +1,8 @@ use chat_rooms::app::App; use loco_rs::cli; +use migration::Migrator; #[tokio::main] async fn main() -> loco_rs::Result<()> { - cli::main::().await + cli::main::().await } diff --git a/src/bin/tool.rs b/src/bin/tool.rs new file mode 100644 index 0000000..9b50dda --- /dev/null +++ b/src/bin/tool.rs @@ -0,0 +1,8 @@ +use chat_rooms::app::App; +use loco_rs::cli; +use migration::Migrator; + +#[tokio::main] +async fn main() -> loco_rs::Result<()> { + cli::main::().await +} diff --git a/src/controllers/auth.rs b/src/controllers/auth.rs new file mode 100644 index 0000000..27e3de7 --- /dev/null +++ b/src/controllers/auth.rs @@ -0,0 +1,157 @@ +use axum::debug_handler; +use loco_rs::prelude::*; +use serde::{Deserialize, Serialize}; + +use crate::{ + mailers::auth::AuthMailer, + models::{ + _entities::users, + users::{LoginParams, RegisterParams}, + }, + views::auth::{CurrentResponse, LoginResponse}, +}; +#[derive(Debug, Deserialize, Serialize)] +pub struct VerifyParams { + pub token: String, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct ForgotParams { + pub email: String, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct ResetParams { + pub token: String, + pub password: String, +} + +/// Register function creates a new user with the given parameters and sends a +/// welcome email to the user +#[debug_handler] +async fn register( + State(ctx): State, + Json(params): Json, +) -> Result { + let res = users::Model::create_with_password(&ctx.db, ¶ms).await; + + let user = match res { + Ok(user) => user, + Err(err) => { + tracing::info!( + message = err.to_string(), + user_email = ¶ms.email, + "could not register user", + ); + return format::json(()); + } + }; + + let user = user + .into_active_model() + .set_email_verification_sent(&ctx.db) + .await?; + + AuthMailer::send_welcome(&ctx, &user).await?; + + format::json(()) +} + +/// Verify register user. if the user not verified his email, he can't login to +/// the system. +#[debug_handler] +async fn verify( + State(ctx): State, + Json(params): Json, +) -> Result { + let user = users::Model::find_by_verification_token(&ctx.db, ¶ms.token).await?; + + if user.email_verified_at.is_some() { + tracing::info!(pid = user.pid.to_string(), "user already verified"); + } else { + let active_model = user.into_active_model(); + let user = active_model.verified(&ctx.db).await?; + tracing::info!(pid = user.pid.to_string(), "user verified"); + } + + format::json(()) +} + +/// In case the user forgot his password this endpoints generate a forgot token +/// and send email to the user. In case the email not found in our DB, we are +/// returning a valid request for for security reasons (not exposing users DB +/// list). +#[debug_handler] +async fn forgot( + State(ctx): State, + Json(params): Json, +) -> Result { + let Ok(user) = users::Model::find_by_email(&ctx.db, ¶ms.email).await else { + // we don't want to expose our users email. if the email is invalid we still + // returning success to the caller + return format::json(()); + }; + + let user = user + .into_active_model() + .set_forgot_password_sent(&ctx.db) + .await?; + + AuthMailer::forgot_password(&ctx, &user).await?; + + format::json(()) +} + +/// reset user password by the given parameters +#[debug_handler] +async fn reset(State(ctx): State, Json(params): Json) -> Result { + let Ok(user) = users::Model::find_by_reset_token(&ctx.db, ¶ms.token).await else { + // we don't want to expose our users email. if the email is invalid we still + // returning success to the caller + tracing::info!("reset token not found"); + + return format::json(()); + }; + user.into_active_model() + .reset_password(&ctx.db, ¶ms.password) + .await?; + + format::json(()) +} + +/// Creates a user login and returns a token +#[debug_handler] +async fn login(State(ctx): State, Json(params): Json) -> Result { + let user = users::Model::find_by_email(&ctx.db, ¶ms.email).await?; + + let valid = user.verify_password(¶ms.password); + + if !valid { + return unauthorized("unauthorized!"); + } + + let jwt_secret = ctx.config.get_jwt_config()?; + + let token = user + .generate_jwt(&jwt_secret.secret, &jwt_secret.expiration) + .or_else(|_| unauthorized("unauthorized!"))?; + + format::json(LoginResponse::new(&user, &token)) +} + +#[debug_handler] +async fn current(auth: auth::JWT, State(ctx): State) -> Result { + let user = users::Model::find_by_pid(&ctx.db, &auth.claims.pid).await?; + format::json(CurrentResponse::new(&user)) +} + +pub fn routes() -> Routes { + Routes::new() + .prefix("/api/auth") + .add("/register", post(register)) + .add("/verify", post(verify)) + .add("/login", post(login)) + .add("/forgot", post(forgot)) + .add("/reset", post(reset)) + .add("/current", get(current)) +} diff --git a/src/controllers/mod.rs b/src/controllers/mod.rs index 8b13789..0e4a05d 100644 --- a/src/controllers/mod.rs +++ b/src/controllers/mod.rs @@ -1 +1 @@ - +pub mod auth; diff --git a/src/fixtures/users.yaml b/src/fixtures/users.yaml new file mode 100644 index 0000000..8f5b5ed --- /dev/null +++ b/src/fixtures/users.yaml @@ -0,0 +1,17 @@ +--- +- id: 1 + pid: 11111111-1111-1111-1111-111111111111 + email: user1@example.com + password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc" + api_key: lo-95ec80d7-cb60-4b70-9b4b-9ef74cb88758 + name: user1 + created_at: "2023-11-12T12:34:56.789Z" + updated_at: "2023-11-12T12:34:56.789Z" +- id: 2 + pid: 22222222-2222-2222-2222-222222222222 + email: user2@example.com + password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc" + api_key: lo-153561ca-fa84-4e1b-813a-c62526d0a77e + name: user2 + created_at: "2023-11-12T12:34:56.789Z" + updated_at: "2023-11-12T12:34:56.789Z" diff --git a/src/initializers/socket.rs b/src/initializers/chat.rs similarity index 75% rename from src/initializers/socket.rs rename to src/initializers/chat.rs index 097e0d3..99bc210 100644 --- a/src/initializers/socket.rs +++ b/src/initializers/chat.rs @@ -1,3 +1,4 @@ +use crate::models::_entities::users; use async_trait::async_trait; use axum::Router as AxumRouter; use loco_rs::prelude::*; @@ -9,7 +10,6 @@ use socketioxide::{ use std::sync::{atomic::AtomicUsize, Arc}; use tower::ServiceBuilder; use tower_http::cors::CorsLayer; - pub struct ChatInitializer; #[derive(Deserialize, Serialize, Debug, Clone)] @@ -38,16 +38,23 @@ enum Res { } #[derive(Clone)] -struct UserCnt(Arc); -impl UserCnt { - fn new() -> Self { - Self(Arc::new(AtomicUsize::new(0))) +struct ChatRoomState { + pub count: Arc, + pub loco_ctx: loco_rs::app::AppContext, +} + +impl ChatRoomState { + fn new(ctx: loco_rs::app::AppContext) -> Self { + Self { + count: Arc::new(AtomicUsize::new(0)), + loco_ctx: ctx, + } } fn add_user(&self) -> usize { - self.0.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1 + self.count.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1 } fn remove_user(&self) -> usize { - self.0.fetch_sub(1, std::sync::atomic::Ordering::SeqCst) - 1 + self.count.fetch_sub(1, std::sync::atomic::Ordering::SeqCst) - 1 } } @@ -57,8 +64,10 @@ impl Initializer for ChatInitializer { "axum-session".to_string() } - async fn after_routes(&self, router: AxumRouter, _ctx: &AppContext) -> Result { - let (layer, io) = SocketIo::builder().with_state(UserCnt::new()).build_layer(); + async fn after_routes(&self, router: AxumRouter, ctx: &AppContext) -> Result { + let (layer, io) = SocketIo::builder() + .with_state(ChatRoomState::new(ctx.clone())) + .build_layer(); io.ns("/", |s: SocketRef| { s.on( @@ -74,7 +83,13 @@ impl Initializer for ChatInitializer { s.on( "add user", - |s: SocketRef, Data::(username), user_cnt: State| { + |s: SocketRef, Data::(username), user_cnt: State| async move { + let users = users::Entity::find() + .all(&user_cnt.loco_ctx.db) + .await + .unwrap(); + println!("list users {users:#?}"); + if s.extensions.get::().is_some() { return; } @@ -106,7 +121,7 @@ impl Initializer for ChatInitializer { ); s.on_disconnect( - |s: SocketRef, user_cnt: State, Extension::(username)| { + |s: SocketRef, user_cnt: State, Extension::(username)| { let num_users = user_cnt.remove_user(); let res = &Res::UserEvent { num_users, diff --git a/src/initializers/mod.rs b/src/initializers/mod.rs index d22cc84..2701969 100644 --- a/src/initializers/mod.rs +++ b/src/initializers/mod.rs @@ -1 +1,2 @@ -pub mod socket; +pub mod chat; +pub mod view_engine; diff --git a/src/initializers/view_engine.rs b/src/initializers/view_engine.rs new file mode 100644 index 0000000..397a21a --- /dev/null +++ b/src/initializers/view_engine.rs @@ -0,0 +1,46 @@ +use axum::{async_trait, Extension, Router as AxumRouter}; +use fluent_templates::{ArcLoader, FluentLoader}; +use loco_rs::{ + app::{AppContext, Initializer}, + controller::views::{engines, ViewEngine}, + Error, Result, +}; +use tracing::info; + +const I18N_DIR: &str = "assets/i18n"; +const I18N_SHARED: &str = "assets/i18n/shared.ftl"; +#[allow(clippy::module_name_repetitions)] +pub struct ViewEngineInitializer; + +#[async_trait] +impl Initializer for ViewEngineInitializer { + fn name(&self) -> String { + "view-engine".to_string() + } + + async fn after_routes(&self, router: AxumRouter, _ctx: &AppContext) -> Result { + #[allow(unused_mut)] + let mut tera_engine = engines::TeraView::build()?; + if std::path::Path::new(I18N_DIR).exists() { + let arc = ArcLoader::builder(&I18N_DIR, unic_langid::langid!("en-US")) + .shared_resources(Some(&[I18N_SHARED.into()])) + .customize(|bundle| bundle.set_use_isolating(false)) + .build() + .map_err(|e| Error::string(&e.to_string()))?; + #[cfg(debug_assertions)] + tera_engine + .tera + .lock() + .expect("lock") + .register_function("t", FluentLoader::new(arc)); + + #[cfg(not(debug_assertions))] + tera_engine + .tera + .register_function("t", FluentLoader::new(arc)); + info!("locales loaded"); + } + + Ok(router.layer(Extension(ViewEngine::from(tera_engine)))) + } +} diff --git a/src/lib.rs b/src/lib.rs index 365b261..dc3ea76 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,8 @@ pub mod app; pub mod controllers; pub mod initializers; +pub mod mailers; +pub mod models; +pub mod tasks; pub mod views; +pub mod workers; diff --git a/src/mailers/auth.rs b/src/mailers/auth.rs new file mode 100644 index 0000000..30bb1bf --- /dev/null +++ b/src/mailers/auth.rs @@ -0,0 +1,65 @@ +// auth mailer +#![allow(non_upper_case_globals)] + +use loco_rs::prelude::*; +use serde_json::json; + +use crate::models::users; + +static welcome: Dir<'_> = include_dir!("src/mailers/auth/welcome"); +static forgot: Dir<'_> = include_dir!("src/mailers/auth/forgot"); +// #[derive(Mailer)] // -- disabled for faster build speed. it works. but lets +// move on for now. + +#[allow(clippy::module_name_repetitions)] +pub struct AuthMailer {} +impl Mailer for AuthMailer {} +impl AuthMailer { + /// Sending welcome email the the given user + /// + /// # Errors + /// + /// When email sending is failed + pub async fn send_welcome(ctx: &AppContext, user: &users::Model) -> Result<()> { + Self::mail_template( + ctx, + &welcome, + mailer::Args { + to: user.email.to_string(), + locals: json!({ + "name": user.name, + "verifyToken": user.email_verification_token, + "domain": ctx.config.server.full_url() + }), + ..Default::default() + }, + ) + .await?; + + Ok(()) + } + + /// Sending forgot password email + /// + /// # Errors + /// + /// When email sending is failed + pub async fn forgot_password(ctx: &AppContext, user: &users::Model) -> Result<()> { + Self::mail_template( + ctx, + &forgot, + mailer::Args { + to: user.email.to_string(), + locals: json!({ + "name": user.name, + "resetToken": user.reset_token, + "domain": ctx.config.server.full_url() + }), + ..Default::default() + }, + ) + .await?; + + Ok(()) + } +} diff --git a/src/mailers/auth/forgot/html.t b/src/mailers/auth/forgot/html.t new file mode 100644 index 0000000..221dd60 --- /dev/null +++ b/src/mailers/auth/forgot/html.t @@ -0,0 +1,11 @@ +; + + + Hey {{name}}, + Forgot your password? No worries! You can reset it by clicking the link below: +
    Reset Your Password + If you didn't request a password reset, please ignore this email. + Best regards,
    The Loco Team
    + + + diff --git a/src/mailers/auth/forgot/subject.t b/src/mailers/auth/forgot/subject.t new file mode 100644 index 0000000..4938df1 --- /dev/null +++ b/src/mailers/auth/forgot/subject.t @@ -0,0 +1 @@ +Your reset password link diff --git a/src/mailers/auth/forgot/text.t b/src/mailers/auth/forgot/text.t new file mode 100644 index 0000000..58c30fd --- /dev/null +++ b/src/mailers/auth/forgot/text.t @@ -0,0 +1,3 @@ +Reset your password with this link: + +http://localhost/reset#{{resetToken}} diff --git a/src/mailers/auth/welcome/html.t b/src/mailers/auth/welcome/html.t new file mode 100644 index 0000000..ae4c41c --- /dev/null +++ b/src/mailers/auth/welcome/html.t @@ -0,0 +1,13 @@ +; + + + Dear {{name}}, + Welcome to Loco! You can now log in to your account. + Before you get started, please verify your account by clicking the link below: + + Verify Your Account + +

    Best regards,
    The Loco Team

    + + + diff --git a/src/mailers/auth/welcome/subject.t b/src/mailers/auth/welcome/subject.t new file mode 100644 index 0000000..82cc6fb --- /dev/null +++ b/src/mailers/auth/welcome/subject.t @@ -0,0 +1 @@ +Welcome {{name}} diff --git a/src/mailers/auth/welcome/text.t b/src/mailers/auth/welcome/text.t new file mode 100644 index 0000000..63beefd --- /dev/null +++ b/src/mailers/auth/welcome/text.t @@ -0,0 +1,4 @@ +Welcome {{name}}, you can now log in. + Verify your account with the link below: + + http://localhost/verify#{{verifyToken}} diff --git a/src/mailers/mod.rs b/src/mailers/mod.rs new file mode 100644 index 0000000..0e4a05d --- /dev/null +++ b/src/mailers/mod.rs @@ -0,0 +1 @@ +pub mod auth; diff --git a/src/models/_entities/mod.rs b/src/models/_entities/mod.rs new file mode 100644 index 0000000..095dade --- /dev/null +++ b/src/models/_entities/mod.rs @@ -0,0 +1,5 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0 + +pub mod prelude; + +pub mod users; diff --git a/src/models/_entities/prelude.rs b/src/models/_entities/prelude.rs new file mode 100644 index 0000000..4036ade --- /dev/null +++ b/src/models/_entities/prelude.rs @@ -0,0 +1,3 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0 + +pub use super::users::Entity as Users; diff --git a/src/models/_entities/users.rs b/src/models/_entities/users.rs new file mode 100644 index 0000000..120b1a1 --- /dev/null +++ b/src/models/_entities/users.rs @@ -0,0 +1,28 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] +#[sea_orm(table_name = "users")] +pub struct Model { + pub created_at: DateTimeWithTimeZone, + pub updated_at: DateTimeWithTimeZone, + #[sea_orm(primary_key)] + pub id: i32, + pub pid: Uuid, + #[sea_orm(unique)] + pub email: String, + pub password: String, + #[sea_orm(unique)] + pub api_key: String, + pub name: String, + pub reset_token: Option, + pub reset_sent_at: Option, + pub email_verification_token: Option, + pub email_verification_sent_at: Option, + pub email_verified_at: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..48da463 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1,2 @@ +pub mod _entities; +pub mod users; diff --git a/src/models/users.rs b/src/models/users.rs new file mode 100644 index 0000000..b4f3aae --- /dev/null +++ b/src/models/users.rs @@ -0,0 +1,298 @@ +use async_trait::async_trait; +use chrono::offset::Local; +use loco_rs::{auth::jwt, hash, prelude::*}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +pub use super::_entities::users::{self, ActiveModel, Entity, Model}; + +#[derive(Debug, Deserialize, Serialize)] +pub struct LoginParams { + pub email: String, + pub password: String, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct RegisterParams { + pub email: String, + pub password: String, + pub name: String, +} + +#[derive(Debug, Validate, Deserialize)] +pub struct Validator { + #[validate(length(min = 2, message = "Name must be at least 2 characters long."))] + pub name: String, + #[validate(custom(function = "validation::is_valid_email"))] + pub email: String, +} + +impl Validatable for super::_entities::users::ActiveModel { + fn validator(&self) -> Box { + Box::new(Validator { + name: self.name.as_ref().to_owned(), + email: self.email.as_ref().to_owned(), + }) + } +} + +#[async_trait::async_trait] +impl ActiveModelBehavior for super::_entities::users::ActiveModel { + async fn before_save(self, _db: &C, insert: bool) -> Result + where + C: ConnectionTrait, + { + self.validate()?; + if insert { + let mut this = self; + this.pid = ActiveValue::Set(Uuid::new_v4()); + this.api_key = ActiveValue::Set(format!("lo-{}", Uuid::new_v4())); + Ok(this) + } else { + Ok(self) + } + } +} + +#[async_trait] +impl Authenticable for super::_entities::users::Model { + async fn find_by_api_key(db: &DatabaseConnection, api_key: &str) -> ModelResult { + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::ApiKey, api_key) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + async fn find_by_claims_key(db: &DatabaseConnection, claims_key: &str) -> ModelResult { + Self::find_by_pid(db, claims_key).await + } +} + +impl super::_entities::users::Model { + /// finds a user by the provided email + /// + /// # Errors + /// + /// When could not find user by the given token or DB query error + pub async fn find_by_email(db: &DatabaseConnection, email: &str) -> ModelResult { + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::Email, email) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + /// finds a user by the provided verification token + /// + /// # Errors + /// + /// When could not find user by the given token or DB query error + pub async fn find_by_verification_token( + db: &DatabaseConnection, + token: &str, + ) -> ModelResult { + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::EmailVerificationToken, token) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + /// finds a user by the provided reset token + /// + /// # Errors + /// + /// When could not find user by the given token or DB query error + pub async fn find_by_reset_token(db: &DatabaseConnection, token: &str) -> ModelResult { + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::ResetToken, token) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + /// finds a user by the provided pid + /// + /// # Errors + /// + /// When could not find user or DB query error + pub async fn find_by_pid(db: &DatabaseConnection, pid: &str) -> ModelResult { + let parse_uuid = Uuid::parse_str(pid).map_err(|e| ModelError::Any(e.into()))?; + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::Pid, parse_uuid) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + /// finds a user by the provided api key + /// + /// # Errors + /// + /// When could not find user by the given token or DB query error + pub async fn find_by_api_key(db: &DatabaseConnection, api_key: &str) -> ModelResult { + let user = users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::ApiKey, api_key) + .build(), + ) + .one(db) + .await?; + user.ok_or_else(|| ModelError::EntityNotFound) + } + + /// Verifies whether the provided plain password matches the hashed password + /// + /// # Errors + /// + /// when could not verify password + #[must_use] + pub fn verify_password(&self, password: &str) -> bool { + hash::verify_password(password, &self.password) + } + + /// Asynchronously creates a user with a password and saves it to the + /// database. + /// + /// # Errors + /// + /// When could not save the user into the DB + pub async fn create_with_password( + db: &DatabaseConnection, + params: &RegisterParams, + ) -> ModelResult { + let txn = db.begin().await?; + + if users::Entity::find() + .filter( + model::query::condition() + .eq(users::Column::Email, ¶ms.email) + .build(), + ) + .one(&txn) + .await? + .is_some() + { + return Err(ModelError::EntityAlreadyExists {}); + } + + let password_hash = + hash::hash_password(¶ms.password).map_err(|e| ModelError::Any(e.into()))?; + let user = users::ActiveModel { + email: ActiveValue::set(params.email.to_string()), + password: ActiveValue::set(password_hash), + name: ActiveValue::set(params.name.to_string()), + ..Default::default() + } + .insert(&txn) + .await?; + + txn.commit().await?; + + Ok(user) + } + + /// Creates a JWT + /// + /// # Errors + /// + /// when could not convert user claims to jwt token + pub fn generate_jwt(&self, secret: &str, expiration: &u64) -> ModelResult { + Ok(jwt::JWT::new(secret).generate_token(expiration, self.pid.to_string(), None)?) + } +} + +impl super::_entities::users::ActiveModel { + /// Sets the email verification information for the user and + /// updates it in the database. + /// + /// This method is used to record the timestamp when the email verification + /// was sent and generate a unique verification token for the user. + /// + /// # Errors + /// + /// when has DB query error + pub async fn set_email_verification_sent( + mut self, + db: &DatabaseConnection, + ) -> ModelResult { + self.email_verification_sent_at = ActiveValue::set(Some(Local::now().into())); + self.email_verification_token = ActiveValue::Set(Some(Uuid::new_v4().to_string())); + Ok(self.update(db).await?) + } + + /// Sets the information for a reset password request, + /// generates a unique reset password token, and updates it in the + /// database. + /// + /// This method records the timestamp when the reset password token is sent + /// and generates a unique token for the user. + /// + /// # Arguments + /// + /// # Errors + /// + /// when has DB query error + pub async fn set_forgot_password_sent(mut self, db: &DatabaseConnection) -> ModelResult { + self.reset_sent_at = ActiveValue::set(Some(Local::now().into())); + self.reset_token = ActiveValue::Set(Some(Uuid::new_v4().to_string())); + Ok(self.update(db).await?) + } + + /// Records the verification time when a user verifies their + /// email and updates it in the database. + /// + /// This method sets the timestamp when the user successfully verifies their + /// email. + /// + /// # Errors + /// + /// when has DB query error + pub async fn verified(mut self, db: &DatabaseConnection) -> ModelResult { + self.email_verified_at = ActiveValue::set(Some(Local::now().into())); + Ok(self.update(db).await?) + } + + /// Resets the current user password with a new password and + /// updates it in the database. + /// + /// This method hashes the provided password and sets it as the new password + /// for the user. + /// + /// # Errors + /// + /// when has DB query error or could not hashed the given password + pub async fn reset_password( + mut self, + db: &DatabaseConnection, + password: &str, + ) -> ModelResult { + self.password = + ActiveValue::set(hash::hash_password(password).map_err(|e| ModelError::Any(e.into()))?); + self.reset_token = ActiveValue::Set(None); + self.reset_sent_at = ActiveValue::Set(None); + Ok(self.update(db).await?) + } +} diff --git a/src/tasks/mod.rs b/src/tasks/mod.rs new file mode 100644 index 0000000..01fbdda --- /dev/null +++ b/src/tasks/mod.rs @@ -0,0 +1 @@ +pub mod seed; diff --git a/src/tasks/seed.rs b/src/tasks/seed.rs new file mode 100644 index 0000000..1647beb --- /dev/null +++ b/src/tasks/seed.rs @@ -0,0 +1,45 @@ +//! This task implements data seeding functionality for initializing new +//! development/demo environments. +//! +//! # Example +//! +//! Run the task with the following command: +//! ```sh +//! cargo run task +//! ``` +//! +//! To override existing data and reset the data structure, use the following +//! command with the `refresh:true` argument: +//! ```sh +//! cargo run task seed_data refresh:true +//! ``` + +use loco_rs::{db, prelude::*}; +use migration::Migrator; + +use crate::app::App; + +#[allow(clippy::module_name_repetitions)] +pub struct SeedData; +#[async_trait] +impl Task for SeedData { + fn task(&self) -> TaskInfo { + TaskInfo { + name: "seed_data".to_string(), + detail: "Task for seeding data".to_string(), + } + } + + async fn run(&self, app_context: &AppContext, vars: &task::Vars) -> Result<()> { + let refresh = vars + .cli_arg("refresh") + .is_ok_and(|refresh| refresh == "true"); + + if refresh { + db::reset::(&app_context.db).await?; + } + let path = std::path::Path::new("src/fixtures"); + db::run_app_seed::(&app_context.db, path).await?; + Ok(()) + } +} diff --git a/src/views/auth.rs b/src/views/auth.rs new file mode 100644 index 0000000..3d2d74f --- /dev/null +++ b/src/views/auth.rs @@ -0,0 +1,41 @@ +use serde::{Deserialize, Serialize}; + +use crate::models::_entities::users; + +#[derive(Debug, Deserialize, Serialize)] +pub struct LoginResponse { + pub token: String, + pub pid: String, + pub name: String, + pub is_verified: bool, +} + +impl LoginResponse { + #[must_use] + pub fn new(user: &users::Model, token: &String) -> Self { + Self { + token: token.to_string(), + pid: user.pid.to_string(), + name: user.name.clone(), + is_verified: user.email_verified_at.is_some(), + } + } +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct CurrentResponse { + pub pid: String, + pub name: String, + pub email: String, +} + +impl CurrentResponse { + #[must_use] + pub fn new(user: &users::Model) -> Self { + Self { + pid: user.pid.to_string(), + name: user.name.clone(), + email: user.email.clone(), + } + } +} diff --git a/src/views/mod.rs b/src/views/mod.rs index 8b13789..0e4a05d 100644 --- a/src/views/mod.rs +++ b/src/views/mod.rs @@ -1 +1 @@ - +pub mod auth; diff --git a/src/workers/downloader.rs b/src/workers/downloader.rs new file mode 100644 index 0000000..1abafa4 --- /dev/null +++ b/src/workers/downloader.rs @@ -0,0 +1,23 @@ +use loco_rs::prelude::*; +use serde::{Deserialize, Serialize}; + +pub struct DownloadWorker { + pub ctx: AppContext, +} + +#[derive(Deserialize, Debug, Serialize)] +pub struct DownloadWorkerArgs { + pub user_guid: String, +} + +#[async_trait] +impl BackgroundWorker for DownloadWorker { + fn build(ctx: &AppContext) -> Self { + Self { ctx: ctx.clone() } + } + async fn perform(&self, _args: DownloadWorkerArgs) -> Result<()> { + // TODO: Some actual work goes here... + + Ok(()) + } +} diff --git a/src/workers/mod.rs b/src/workers/mod.rs new file mode 100644 index 0000000..acb5733 --- /dev/null +++ b/src/workers/mod.rs @@ -0,0 +1 @@ +pub mod downloader; diff --git a/tests/mod.rs b/tests/mod.rs new file mode 100644 index 0000000..b42f234 --- /dev/null +++ b/tests/mod.rs @@ -0,0 +1,4 @@ +mod models; +mod requests; +mod tasks; +mod workers; diff --git a/tests/models/mod.rs b/tests/models/mod.rs new file mode 100644 index 0000000..5975988 --- /dev/null +++ b/tests/models/mod.rs @@ -0,0 +1 @@ +mod users; diff --git a/tests/models/snapshots/can_create_with_password@users.snap b/tests/models/snapshots/can_create_with_password@users.snap new file mode 100644 index 0000000..6e66fd3 --- /dev/null +++ b/tests/models/snapshots/can_create_with_password@users.snap @@ -0,0 +1,21 @@ +--- +source: tests/models/users.rs +expression: res +--- +Ok( + Model { + created_at: DATE, + updated_at: DATE, + id: ID + pid: PID, + email: "test@framework.com", + password: "PASSWORD", + api_key: "lo-PID", + name: "framework", + reset_token: None, + reset_sent_at: None, + email_verification_token: None, + email_verification_sent_at: None, + email_verified_at: None, + }, +) diff --git a/tests/models/snapshots/can_find_by_email@users-2.snap b/tests/models/snapshots/can_find_by_email@users-2.snap new file mode 100644 index 0000000..25c700a --- /dev/null +++ b/tests/models/snapshots/can_find_by_email@users-2.snap @@ -0,0 +1,7 @@ +--- +source: tests/models/users.rs +expression: non_existing_user_results +--- +Err( + EntityNotFound, +) diff --git a/tests/models/snapshots/can_find_by_email@users.snap b/tests/models/snapshots/can_find_by_email@users.snap new file mode 100644 index 0000000..067d0e7 --- /dev/null +++ b/tests/models/snapshots/can_find_by_email@users.snap @@ -0,0 +1,21 @@ +--- +source: tests/models/users.rs +expression: existing_user +--- +Ok( + Model { + created_at: 2023-11-12T12:34:56.789+00:00, + updated_at: 2023-11-12T12:34:56.789+00:00, + id: 1, + pid: 11111111-1111-1111-1111-111111111111, + email: "user1@example.com", + password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc", + api_key: "lo-95ec80d7-cb60-4b70-9b4b-9ef74cb88758", + name: "user1", + reset_token: None, + reset_sent_at: None, + email_verification_token: None, + email_verification_sent_at: None, + email_verified_at: None, + }, +) diff --git a/tests/models/snapshots/can_find_by_pid@users-2.snap b/tests/models/snapshots/can_find_by_pid@users-2.snap new file mode 100644 index 0000000..25c700a --- /dev/null +++ b/tests/models/snapshots/can_find_by_pid@users-2.snap @@ -0,0 +1,7 @@ +--- +source: tests/models/users.rs +expression: non_existing_user_results +--- +Err( + EntityNotFound, +) diff --git a/tests/models/snapshots/can_find_by_pid@users.snap b/tests/models/snapshots/can_find_by_pid@users.snap new file mode 100644 index 0000000..067d0e7 --- /dev/null +++ b/tests/models/snapshots/can_find_by_pid@users.snap @@ -0,0 +1,21 @@ +--- +source: tests/models/users.rs +expression: existing_user +--- +Ok( + Model { + created_at: 2023-11-12T12:34:56.789+00:00, + updated_at: 2023-11-12T12:34:56.789+00:00, + id: 1, + pid: 11111111-1111-1111-1111-111111111111, + email: "user1@example.com", + password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc", + api_key: "lo-95ec80d7-cb60-4b70-9b4b-9ef74cb88758", + name: "user1", + reset_token: None, + reset_sent_at: None, + email_verification_token: None, + email_verification_sent_at: None, + email_verified_at: None, + }, +) diff --git a/tests/models/snapshots/can_validate_model@users.snap b/tests/models/snapshots/can_validate_model@users.snap new file mode 100644 index 0000000..708479a --- /dev/null +++ b/tests/models/snapshots/can_validate_model@users.snap @@ -0,0 +1,9 @@ +--- +source: tests/models/users.rs +expression: res +--- +Err( + Custom( + "{\"email\":[{\"code\":\"invalid email\",\"message\":null}],\"name\":[{\"code\":\"length\",\"message\":\"Name must be at least 2 characters long.\"}]}", + ), +) diff --git a/tests/models/snapshots/handle_create_with_password_with_duplicate@users.snap b/tests/models/snapshots/handle_create_with_password_with_duplicate@users.snap new file mode 100644 index 0000000..ff28ea1 --- /dev/null +++ b/tests/models/snapshots/handle_create_with_password_with_duplicate@users.snap @@ -0,0 +1,7 @@ +--- +source: tests/models/users.rs +expression: new_user +--- +Err( + EntityAlreadyExists, +) diff --git a/tests/models/users.rs b/tests/models/users.rs new file mode 100644 index 0000000..7c76709 --- /dev/null +++ b/tests/models/users.rs @@ -0,0 +1,223 @@ +use chat_rooms::{ + app::App, + models::users::{self, Model, RegisterParams}, +}; +use insta::assert_debug_snapshot; +use loco_rs::{model::ModelError, testing}; +use sea_orm::{ActiveModelTrait, ActiveValue, IntoActiveModel}; +use serial_test::serial; + +macro_rules! configure_insta { + ($($expr:expr),*) => { + let mut settings = insta::Settings::clone_current(); + settings.set_prepend_module_to_snapshot(false); + settings.set_snapshot_suffix("users"); + let _guard = settings.bind_to_scope(); + }; +} + +#[tokio::test] +#[serial] +async fn test_can_validate_model() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + + let res = users::ActiveModel { + name: ActiveValue::set("1".to_string()), + email: ActiveValue::set("invalid-email".to_string()), + ..Default::default() + } + .insert(&boot.app_context.db) + .await; + + assert_debug_snapshot!(res); +} + +#[tokio::test] +#[serial] +async fn can_create_with_password() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + + let params = RegisterParams { + email: "test@framework.com".to_string(), + password: "1234".to_string(), + name: "framework".to_string(), + }; + let res = Model::create_with_password(&boot.app_context.db, ¶ms).await; + + insta::with_settings!({ + filters => testing::cleanup_user_model() + }, { + assert_debug_snapshot!(res); + }); +} + +#[tokio::test] +#[serial] +async fn handle_create_with_password_with_duplicate() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let new_user: Result = Model::create_with_password( + &boot.app_context.db, + &RegisterParams { + email: "user1@example.com".to_string(), + password: "1234".to_string(), + name: "framework".to_string(), + }, + ) + .await; + assert_debug_snapshot!(new_user); +} + +#[tokio::test] +#[serial] +async fn can_find_by_email() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let existing_user = Model::find_by_email(&boot.app_context.db, "user1@example.com").await; + let non_existing_user_results = + Model::find_by_email(&boot.app_context.db, "un@existing-email.com").await; + + assert_debug_snapshot!(existing_user); + assert_debug_snapshot!(non_existing_user_results); +} + +#[tokio::test] +#[serial] +async fn can_find_by_pid() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let existing_user = + Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111").await; + let non_existing_user_results = + Model::find_by_pid(&boot.app_context.db, "23232323-2323-2323-2323-232323232323").await; + + assert_debug_snapshot!(existing_user); + assert_debug_snapshot!(non_existing_user_results); +} + +#[tokio::test] +#[serial] +async fn can_verification_token() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.email_verification_sent_at.is_none()); + assert!(user.email_verification_token.is_none()); + + assert!(user + .into_active_model() + .set_email_verification_sent(&boot.app_context.db) + .await + .is_ok()); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.email_verification_sent_at.is_some()); + assert!(user.email_verification_token.is_some()); +} + +#[tokio::test] +#[serial] +async fn can_set_forgot_password_sent() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.reset_sent_at.is_none()); + assert!(user.reset_token.is_none()); + + assert!(user + .into_active_model() + .set_forgot_password_sent(&boot.app_context.db) + .await + .is_ok()); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.reset_sent_at.is_some()); + assert!(user.reset_token.is_some()); +} + +#[tokio::test] +#[serial] +async fn can_verified() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.email_verified_at.is_none()); + + assert!(user + .into_active_model() + .verified(&boot.app_context.db) + .await + .is_ok()); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.email_verified_at.is_some()); +} + +#[tokio::test] +#[serial] +async fn can_reset_password() { + configure_insta!(); + + let boot = testing::boot_test::().await.unwrap(); + testing::seed::(&boot.app_context.db).await.unwrap(); + + let user = Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap(); + + assert!(user.verify_password("12341234")); + + assert!(user + .clone() + .into_active_model() + .reset_password(&boot.app_context.db, "new-password") + .await + .is_ok()); + + assert!( + Model::find_by_pid(&boot.app_context.db, "11111111-1111-1111-1111-111111111111") + .await + .unwrap() + .verify_password("new-password") + ); +} diff --git a/tests/requests/auth.rs b/tests/requests/auth.rs new file mode 100644 index 0000000..3fe3d1c --- /dev/null +++ b/tests/requests/auth.rs @@ -0,0 +1,218 @@ +use chat_rooms::{app::App, models::users}; +use insta::{assert_debug_snapshot, with_settings}; +use loco_rs::testing; +use rstest::rstest; +use serial_test::serial; + +use super::prepare_data; + +// TODO: see how to dedup / extract this to app-local test utils +// not to framework, because that would require a runtime dep on insta +macro_rules! configure_insta { + ($($expr:expr),*) => { + let mut settings = insta::Settings::clone_current(); + settings.set_prepend_module_to_snapshot(false); + settings.set_snapshot_suffix("auth_request"); + let _guard = settings.bind_to_scope(); + }; +} + +#[tokio::test] +#[serial] +async fn can_register() { + configure_insta!(); + + testing::request::(|request, ctx| async move { + let email = "test@loco.com"; + let payload = serde_json::json!({ + "name": "loco", + "email": email, + "password": "12341234" + }); + + let _response = request.post("/api/auth/register").json(&payload).await; + let saved_user = users::Model::find_by_email(&ctx.db, email).await; + + with_settings!({ + filters => testing::cleanup_user_model() + }, { + assert_debug_snapshot!(saved_user); + }); + + with_settings!({ + filters => testing::cleanup_email() + }, { + assert_debug_snapshot!(ctx.mailer.unwrap().deliveries()); + }); + }) + .await; +} + +#[rstest] +#[case("login_with_valid_password", "12341234")] +#[case("login_with_invalid_password", "invalid-password")] +#[tokio::test] +#[serial] +async fn can_login_with_verify(#[case] test_name: &str, #[case] password: &str) { + configure_insta!(); + + testing::request::(|request, ctx| async move { + let email = "test@loco.com"; + let register_payload = serde_json::json!({ + "name": "loco", + "email": email, + "password": "12341234" + }); + + //Creating a new user + _ = request + .post("/api/auth/register") + .json(®ister_payload) + .await; + + let user = users::Model::find_by_email(&ctx.db, email).await.unwrap(); + let verify_payload = serde_json::json!({ + "token": user.email_verification_token, + }); + request.post("/api/auth/verify").json(&verify_payload).await; + + //verify user request + let response = request + .post("/api/auth/login") + .json(&serde_json::json!({ + "email": email, + "password": password + })) + .await; + + // Make sure email_verified_at is set + assert!(users::Model::find_by_email(&ctx.db, email) + .await + .unwrap() + .email_verified_at + .is_some()); + + with_settings!({ + filters => testing::cleanup_user_model() + }, { + assert_debug_snapshot!(test_name, (response.status_code(), response.text())); + }); + }) + .await; +} + +#[tokio::test] +#[serial] +async fn can_login_without_verify() { + configure_insta!(); + + testing::request::(|request, _ctx| async move { + let email = "test@loco.com"; + let password = "12341234"; + let register_payload = serde_json::json!({ + "name": "loco", + "email": email, + "password": password + }); + + //Creating a new user + _ = request + .post("/api/auth/register") + .json(®ister_payload) + .await; + + //verify user request + let response = request + .post("/api/auth/login") + .json(&serde_json::json!({ + "email": email, + "password": password + })) + .await; + + with_settings!({ + filters => testing::cleanup_user_model() + }, { + assert_debug_snapshot!((response.status_code(), response.text())); + }); + }) + .await; +} + +#[tokio::test] +#[serial] +async fn can_reset_password() { + configure_insta!(); + + testing::request::(|request, ctx| async move { + let login_data = prepare_data::init_user_login(&request, &ctx).await; + + let forgot_payload = serde_json::json!({ + "email": login_data.user.email, + }); + _ = request.post("/api/auth/forgot").json(&forgot_payload).await; + + let user = users::Model::find_by_email(&ctx.db, &login_data.user.email) + .await + .unwrap(); + assert!(user.reset_token.is_some()); + assert!(user.reset_sent_at.is_some()); + + let new_password = "new-password"; + let reset_payload = serde_json::json!({ + "token": user.reset_token, + "password": new_password, + }); + + let reset_response = request.post("/api/auth/reset").json(&reset_payload).await; + + let user = users::Model::find_by_email(&ctx.db, &user.email) + .await + .unwrap(); + + assert!(user.reset_token.is_none()); + assert!(user.reset_sent_at.is_none()); + + assert_debug_snapshot!((reset_response.status_code(), reset_response.text())); + + let response = request + .post("/api/auth/login") + .json(&serde_json::json!({ + "email": user.email, + "password": new_password + })) + .await; + + assert_eq!(response.status_code(), 200); + + with_settings!({ + filters => testing::cleanup_email() + }, { + assert_debug_snapshot!(ctx.mailer.unwrap().deliveries()); + }); + }) + .await; +} + +#[tokio::test] +#[serial] +async fn can_get_current_user() { + configure_insta!(); + + testing::request::(|request, ctx| async move { + let user = prepare_data::init_user_login(&request, &ctx).await; + + let (auth_key, auth_value) = prepare_data::auth_header(&user.token); + let response = request + .get("/api/auth/current") + .add_header(auth_key, auth_value) + .await; + + with_settings!({ + filters => testing::cleanup_user_model() + }, { + assert_debug_snapshot!((response.status_code(), response.text())); + }); + }) + .await; +} diff --git a/tests/requests/mod.rs b/tests/requests/mod.rs new file mode 100644 index 0000000..887b7ce --- /dev/null +++ b/tests/requests/mod.rs @@ -0,0 +1,2 @@ +mod auth; +mod prepare_data; diff --git a/tests/requests/prepare_data.rs b/tests/requests/prepare_data.rs new file mode 100644 index 0000000..6c80cce --- /dev/null +++ b/tests/requests/prepare_data.rs @@ -0,0 +1,57 @@ +use axum::http::{HeaderName, HeaderValue}; +use chat_rooms::{models::users, views::auth::LoginResponse}; +use loco_rs::{app::AppContext, TestServer}; + +const USER_EMAIL: &str = "test@loco.com"; +const USER_PASSWORD: &str = "1234"; + +pub struct LoggedInUser { + pub user: users::Model, + pub token: String, +} + +pub async fn init_user_login(request: &TestServer, ctx: &AppContext) -> LoggedInUser { + let register_payload = serde_json::json!({ + "name": "loco", + "email": USER_EMAIL, + "password": USER_PASSWORD + }); + + //Creating a new user + request + .post("/api/auth/register") + .json(®ister_payload) + .await; + let user = users::Model::find_by_email(&ctx.db, USER_EMAIL) + .await + .unwrap(); + + let verify_payload = serde_json::json!({ + "token": user.email_verification_token, + }); + + request.post("/api/auth/verify").json(&verify_payload).await; + + let response = request + .post("/api/auth/login") + .json(&serde_json::json!({ + "email": USER_EMAIL, + "password": USER_PASSWORD + })) + .await; + + let login_response: LoginResponse = serde_json::from_str(&response.text()).unwrap(); + + LoggedInUser { + user: users::Model::find_by_email(&ctx.db, USER_EMAIL) + .await + .unwrap(), + token: login_response.token, + } +} + +pub fn auth_header(token: &str) -> (HeaderName, HeaderValue) { + let auth_header_value = HeaderValue::from_str(&format!("Bearer {}", &token)).unwrap(); + + (HeaderName::from_static("authorization"), auth_header_value) +} diff --git a/tests/requests/snapshots/can_get_current_user@auth_request.snap b/tests/requests/snapshots/can_get_current_user@auth_request.snap new file mode 100644 index 0000000..74f7e71 --- /dev/null +++ b/tests/requests/snapshots/can_get_current_user@auth_request.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: "(response.status_code(), response.text())" +--- +( + 200, + "{\"pid\":\"PID\",\"name\":\"loco\",\"email\":\"test@loco.com\"}", +) diff --git a/tests/requests/snapshots/can_login_without_verify@auth_request.snap b/tests/requests/snapshots/can_login_without_verify@auth_request.snap new file mode 100644 index 0000000..ef54ba6 --- /dev/null +++ b/tests/requests/snapshots/can_login_without_verify@auth_request.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: "(response.status_code(), response.text())" +--- +( + 200, + "{\"token\":\"TOKEN\",\"pid\":\"PID\",\"name\":\"loco\",\"is_verified\":false}", +) diff --git a/tests/requests/snapshots/can_register@auth_request-2.snap b/tests/requests/snapshots/can_register@auth_request-2.snap new file mode 100644 index 0000000..f380dd9 --- /dev/null +++ b/tests/requests/snapshots/can_register@auth_request-2.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: ctx.mailer.unwrap().deliveries() +--- +Deliveries { + count: 0, + messages: [], +} diff --git a/tests/requests/snapshots/can_register@auth_request.snap b/tests/requests/snapshots/can_register@auth_request.snap new file mode 100644 index 0000000..0c0e13b --- /dev/null +++ b/tests/requests/snapshots/can_register@auth_request.snap @@ -0,0 +1,25 @@ +--- +source: tests/requests/auth.rs +expression: saved_user +--- +Ok( + Model { + created_at: DATE, + updated_at: DATE, + id: ID + pid: PID, + email: "test@loco.com", + password: "PASSWORD", + api_key: "lo-PID", + name: "loco", + reset_token: None, + reset_sent_at: None, + email_verification_token: Some( + "PID", + ), + email_verification_sent_at: Some( + DATE, + ), + email_verified_at: None, + }, +) diff --git a/tests/requests/snapshots/can_reset_password@auth_request-2.snap b/tests/requests/snapshots/can_reset_password@auth_request-2.snap new file mode 100644 index 0000000..f380dd9 --- /dev/null +++ b/tests/requests/snapshots/can_reset_password@auth_request-2.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: ctx.mailer.unwrap().deliveries() +--- +Deliveries { + count: 0, + messages: [], +} diff --git a/tests/requests/snapshots/can_reset_password@auth_request.snap b/tests/requests/snapshots/can_reset_password@auth_request.snap new file mode 100644 index 0000000..be6838d --- /dev/null +++ b/tests/requests/snapshots/can_reset_password@auth_request.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: "(reset_response.status_code(), reset_response.text())" +--- +( + 200, + "null", +) diff --git a/tests/requests/snapshots/login_with_invalid_password@auth_request.snap b/tests/requests/snapshots/login_with_invalid_password@auth_request.snap new file mode 100644 index 0000000..eb6e89f --- /dev/null +++ b/tests/requests/snapshots/login_with_invalid_password@auth_request.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: "(response.status_code(), response.text())" +--- +( + 401, + "{\"error\":\"unauthorized\",\"description\":\"You do not have permission to access this resource\"}", +) diff --git a/tests/requests/snapshots/login_with_valid_password@auth_request.snap b/tests/requests/snapshots/login_with_valid_password@auth_request.snap new file mode 100644 index 0000000..f06fbaa --- /dev/null +++ b/tests/requests/snapshots/login_with_valid_password@auth_request.snap @@ -0,0 +1,8 @@ +--- +source: tests/requests/auth.rs +expression: "(response.status_code(), response.text())" +--- +( + 200, + "{\"token\":\"TOKEN\",\"pid\":\"PID\",\"name\":\"loco\",\"is_verified\":true}", +) diff --git a/tests/tasks/mod.rs b/tests/tasks/mod.rs new file mode 100644 index 0000000..01fbdda --- /dev/null +++ b/tests/tasks/mod.rs @@ -0,0 +1 @@ +pub mod seed; diff --git a/tests/tasks/seed.rs b/tests/tasks/seed.rs new file mode 100644 index 0000000..3171c32 --- /dev/null +++ b/tests/tasks/seed.rs @@ -0,0 +1,17 @@ +use chat_rooms::app::App; +use loco_rs::{boot::run_task, task, testing}; +use serial_test::serial; + +#[tokio::test] +#[serial] +async fn test_can_seed_data() { + let boot = testing::boot_test::().await.unwrap(); + + assert!(run_task::( + &boot.app_context, + Some(&"seed_data".to_string()), + &task::Vars::default() + ) + .await + .is_ok()); +} diff --git a/tests/workers/mod.rs b/tests/workers/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/workers/mod.rs @@ -0,0 +1 @@ + From 1b4433de82c4fe5838fb7cb9d165c38894559f36 Mon Sep 17 00:00:00 2001 From: Elad Kaplan Date: Mon, 25 Nov 2024 09:37:10 +0200 Subject: [PATCH 3/3] replace with loco saas client template --- config/test.yaml | 95 ---------------------------------------- src/initializers/chat.rs | 2 + 2 files changed, 2 insertions(+), 95 deletions(-) delete mode 100644 config/test.yaml diff --git a/config/test.yaml b/config/test.yaml deleted file mode 100644 index 7427fab..0000000 --- a/config/test.yaml +++ /dev/null @@ -1,95 +0,0 @@ -# Loco configuration file documentation - -# Application logging configuration -logger: - # Enable or disable logging. - enable: false - # Enable pretty backtrace (sets RUST_BACKTRACE=1) - pretty_backtrace: true - # Log level, options: trace, debug, info, warn or error. - level: debug - # Define the logging format. options: compact, pretty or json - format: compact - # By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries - # Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters. - # override_filter: trace - -# Web server configuration -server: - # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} - port: 5150 - # The UI hostname or IP address that mailers will point to. - host: http://localhost - # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block - middlewares: - static: - enable: true - must_exist: true - precompressed: false - folder: - uri: "/" - path: "frontend/dist" - fallback: "frontend/dist/index.html" - -# Worker Configuration -workers: - # specifies the worker mode. Options: - # - BackgroundQueue - Workers operate asynchronously in the background, processing queued. - # - ForegroundBlocking - Workers operate in the foreground and block until tasks are completed. - # - BackgroundAsync - Workers operate asynchronously in the background, processing tasks with async capabilities. - mode: BackgroundAsync - - - -# Mailer Configuration. -mailer: - # SMTP mailer configuration. - smtp: - # Enable/Disable smtp mailer. - enable: true - # SMTP server host. e.x localhost, smtp.gmail.com - host: localhost - # SMTP server port - port: 1025 - # Use secure connection (SSL/TLS). - secure: false - # auth: - # user: - # password: - -# Initializers Configuration -# initializers: -# oauth2: -# authorization_code: # Authorization code grant type -# - client_identifier: google # Identifier for the OAuth2 provider. Replace 'google' with your provider's name if different, must be unique within the oauth2 config. -# ... other fields - -# Database Configuration -database: - # Database connection URI - uri: {{ get_env(name="DATABASE_URL", default="sqlite://loco_app.sqlite?mode=rwc") }} - # When enabled, the sql query will be logged. - enable_logging: false - # Set the timeout duration when acquiring a connection. - connect_timeout: {{ get_env(name="DB_CONNECT_TIMEOUT", default="500") }} - # Set the idle duration before closing a connection. - idle_timeout: {{ get_env(name="DB_IDLE_TIMEOUT", default="500") }} - # Minimum number of connections for a pool. - min_connections: {{ get_env(name="DB_MIN_CONNECTIONS", default="1") }} - # Maximum number of connections for a pool. - max_connections: {{ get_env(name="DB_MAX_CONNECTIONS", default="1") }} - # Run migration up when application loaded - auto_migrate: true - # Truncate database when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode - dangerously_truncate: true - # Recreating schema when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode - dangerously_recreate: false - -# Authentication Configuration -auth: - # JWT authentication - jwt: - # Secret key for token generation and verification - secret: 4DRI5Iq069PX6uScCpK9 - # Token expiration time in seconds - expiration: 604800 # 7 days diff --git a/src/initializers/chat.rs b/src/initializers/chat.rs index 99bc210..c8841e0 100644 --- a/src/initializers/chat.rs +++ b/src/initializers/chat.rs @@ -10,6 +10,8 @@ use socketioxide::{ use std::sync::{atomic::AtomicUsize, Arc}; use tower::ServiceBuilder; use tower_http::cors::CorsLayer; + +#[allow(clippy::module_name_repetitions)] pub struct ChatInitializer; #[derive(Deserialize, Serialize, Debug, Clone)]