From 10610e157f14d86d528a9c899629c9a386843bc7 Mon Sep 17 00:00:00 2001 From: Danielle Date: Mon, 27 Jun 2022 15:53:25 -0700 Subject: [PATCH 1/7] Refactor Library The launcher code was in a position ripe for sphagetti, so this rewrites it in a more robust way. In addition to cleaner code, this provides the following changes: - Removal of obsolete Mojang authentication - The rebasing of some internal state into a Sled database - Tweaks which make some internal mechanisms more robust (e.g. profiles which fail to load can be removed) - Additional tooling integration such as direnv - Distinct public API to avoid messing with too much internal code - Unified error handling in the form of `theseus::Error` and `theseus::Result` --- .envrc | 1 + .gitignore | 3 +- Cargo.lock | 2131 ++++++++++-------------- flake.lock | 34 +- flake.nix | 30 +- theseus/Cargo.toml | 9 +- theseus/examples/download-pack.rs | 55 - theseus/src/api/mod.rs | 20 + theseus/src/api/profile.rs | 215 +++ theseus/src/config.rs | 22 + theseus/src/data/meta.rs | 107 -- theseus/src/data/mod.rs | 27 - theseus/src/data/profiles.rs | 502 ------ theseus/src/data/settings.rs | 124 -- theseus/src/error.rs | 55 + theseus/src/launcher/args.rs | 137 +- theseus/src/launcher/auth.rs | 211 +-- theseus/src/launcher/download.rs | 534 +++--- theseus/src/launcher/mod.rs | 348 ++-- theseus/src/launcher/rules.rs | 55 - theseus/src/lib.rs | 66 +- theseus/src/modpack/manifest.rs | 446 ----- theseus/src/modpack/mod.rs | 194 --- theseus/src/modpack/modrinth_api.rs | 180 -- theseus/src/modpack/pack.rs | 277 --- theseus/src/state/dirs.rs | 129 ++ theseus/src/state/metadata.rs | 90 + theseus/src/state/mod.rs | 118 ++ theseus/src/state/profiles.rs | 340 ++++ theseus/src/state/settings.rs | 119 ++ theseus/src/util.rs | 18 - theseus/src/util/fetch.rs | 92 + theseus/src/util/mod.rs | 3 + theseus/src/util/platform.rs | 60 + theseus_cli/Cargo.toml | 7 +- theseus_cli/src/main.rs | 6 +- theseus_cli/src/subcommands/profile.rs | 82 +- 37 files changed, 2730 insertions(+), 4117 deletions(-) create mode 100644 .envrc delete mode 100644 theseus/examples/download-pack.rs create mode 100644 theseus/src/api/mod.rs create mode 100644 theseus/src/api/profile.rs create mode 100644 theseus/src/config.rs delete mode 100644 theseus/src/data/meta.rs delete mode 100644 theseus/src/data/mod.rs delete mode 100644 theseus/src/data/profiles.rs delete mode 100644 theseus/src/data/settings.rs create mode 100644 theseus/src/error.rs delete mode 100644 theseus/src/launcher/rules.rs delete mode 100644 theseus/src/modpack/manifest.rs delete mode 100644 theseus/src/modpack/mod.rs delete mode 100644 theseus/src/modpack/modrinth_api.rs delete mode 100644 theseus/src/modpack/pack.rs create mode 100644 theseus/src/state/dirs.rs create mode 100644 theseus/src/state/metadata.rs create mode 100644 theseus/src/state/mod.rs create mode 100644 theseus/src/state/profiles.rs create mode 100644 theseus/src/state/settings.rs delete mode 100644 theseus/src/util.rs create mode 100644 theseus/src/util/fetch.rs create mode 100644 theseus/src/util/mod.rs create mode 100644 theseus/src/util/platform.rs diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..3550a30f2 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 61d861c1a..a9fedb997 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,10 @@ node_modules/ .svelte-kit/ theseus_gui/build/ WixTools +.direnv/ [#]*[#] # TEMPORARY: ignore my test instance and metadata -theseus_cli/launcher theseus_cli/foo + diff --git a/Cargo.lock b/Cargo.lock index e58d7bb90..3c54e629e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -34,15 +49,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.55" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "argh" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f023c76cd7975f9969f8e29f0e461decbdc7f51048ce43427107a3d192f1c9bf" +checksum = "dbb41d85d92dfab96cb95ab023c265c5e4261bb956c0fb49ca06d90c570f1958" dependencies = [ "argh_derive", "argh_shared", @@ -50,9 +65,9 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ad219abc0c06ca788aface2e3a1970587e3413ab70acd20e54b6ec524c1f8f" +checksum = "be69f70ef5497dd6ab331a50bd95c6ac6b8f7f17a7967838332743fbd58dc3b5" dependencies = [ "argh_shared", "heck 0.3.3", @@ -63,128 +78,15 @@ dependencies = [ [[package]] name = "argh_shared" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38de00daab4eac7d753e97697066238d67ce9d7e2d823ab4f72fe14af29f3f33" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "ashpd" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7915e26e0786f91768d23de32afafa4ee5e2ea76be21c0ecd8e14441543c1655" -dependencies = [ - "enumflags2", - "futures", - "rand 0.8.4", - "serde", - "serde_repr", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90622698a1218e0b2fb846c97b5f19a0831f6baddee73d9454156365ccfa473b" -dependencies = [ - "easy-parallel", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", - "slab", -] - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-lock" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-recursion" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-task" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" +checksum = "e6f8c380fa28aa1b36107cd97f0196474bb7241bb95a453c5c01a15ac74b2eac" [[package]] name = "async-trait" -version = "0.1.51" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -209,17 +111,17 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "attohttpc" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69e13a99a7e6e070bb114f7ff381e58c7ccc188630121fc4c2fe4bcf24cd072" +checksum = "262c3f7f5d61249d8c00e5546e2685cd15ebeeb1bc0f3cc5449350a1cb07319e" dependencies = [ "flate2", "http", @@ -234,10 +136,21 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.0.1" +name = "atty" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -247,45 +160,29 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bincode" -version = "1.3.3" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" dependencies = [ + "bincode_derive", "serde", ] +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "cc", - "cfg-if", - "constant_time_eq", - "digest 0.10.3", - "rayon", -] - [[package]] name = "block" version = "0.1.6" @@ -322,6 +219,27 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bstr" version = "0.2.17" @@ -333,9 +251,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byte-tools" @@ -343,6 +261,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +[[package]] +name = "bytemuck" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc" + [[package]] name = "byteorder" version = "1.4.3" @@ -376,17 +300,11 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - [[package]] name = "cairo-rs" -version = "0.15.6" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b14c80d8d1a02fa6d914b9d1afeeca9bc34257f8300d9696e1e331ae114223" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" dependencies = [ "bitflags", "cairo-sys-rs", @@ -401,16 +319,16 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "cargo_toml" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e270ef0cd868745878982f7ce470aa898d0d4bb248af67f0cf66f54617913ef" +checksum = "5809dd3e6444651fd1cdd3dbec71eca438c439a0fcc8081674a14da0afe50185" dependencies = [ "serde", "serde_derive", @@ -419,30 +337,27 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] [[package]] -name = "cfb" -version = "0.4.0" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" -dependencies = [ - "byteorder", - "uuid", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cfg-expr" -version = "0.8.1" +name = "cfb" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" dependencies = [ - "smallvec", + "byteorder", + "uuid 0.8.2", ] [[package]] @@ -456,9 +371,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295b6eb918a60a25fec0b23a5e633e74fddbaf7bb04411e65a10c366aca4b5cd" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" dependencies = [ "smallvec", ] @@ -469,12 +384,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chrono" version = "0.4.19" @@ -485,7 +394,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time", + "time 0.1.44", "winapi", ] @@ -521,12 +430,19 @@ dependencies = [ ] [[package]] -name = "concurrent-queue" -version = "1.2.2" +name = "color_quant" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" dependencies = [ - "cache-padded", + "bytes", + "memchr", ] [[package]] @@ -546,9 +462,9 @@ dependencies = [ [[package]] name = "const_format" -version = "0.2.22" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bc6cd49b0ec407b680c3e380182b6ac63b73991cb7602de350352fc309b614" +checksum = "2906f2480cdc015e998deac388331a0f1c1cd88744948c749513020c83c370bc" dependencies = [ "const_format_proc_macros", ] @@ -564,12 +480,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "convert_case" version = "0.4.0" @@ -578,9 +488,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -619,64 +529,54 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.2.2" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3825b1e8580894917dc4468cb634a1b4e9745fddc854edad72d9c04644c0319f" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" dependencies = [ "cfg-if", "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - [[package]] name = "crossbeam-epoch" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" +checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", "memoffset", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" dependencies = [ "cfg-if", - "lazy_static", + "once_cell", ] [[package]] @@ -718,9 +618,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote", "syn", @@ -734,10 +634,11 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "daedalus" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71fa5e7862c4cf3c86f6250f0254875838304eb3ee6aca95df2057fb3870805" +checksum = "af1949fc56475cb37470a1abb5a113e6f70d48fbcc0c2c315a11b24040f81062" dependencies = [ + "bincode", "bytes", "chrono", "reqwest", @@ -750,72 +651,48 @@ dependencies = [ [[package]] name = "darling" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" -dependencies = [ - "darling_core 0.13.1", - "darling_macro 0.13.1", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.9.3", - "syn", -] - -[[package]] -name = "darling_core" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", + "strsim", "syn", ] [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.10.2", + "darling_core", "quote", "syn", ] [[package]] -name = "darling_macro" -version = "0.13.1" +name = "dbus" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +checksum = "de0a745c25b32caa56b82a3950f5fec7893a960f4c10ca3b02060b0c38d8c2ce" dependencies = [ - "darling_core 0.13.1", - "quote", - "syn", + "libc", + "libdbus-sys", + "winapi", ] [[package]] @@ -830,23 +707,11 @@ dependencies = [ [[package]] name = "deflate" -version = "0.8.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" dependencies = [ "adler32", - "byteorder", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn", ] [[package]] @@ -864,9 +729,9 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d6b4fabcd9e97e1df1ae15395ac7e49fb144946a0d453959dc2696273b9da" +checksum = "d8c8ae48e400addc32a8710c8d62d55cb84249a7d58ac4cd959daecfbaddc545" dependencies = [ "console", "tempfile", @@ -896,18 +761,6 @@ checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ "block-buffer 0.10.2", "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", ] [[package]] @@ -936,7 +789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -947,7 +800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -973,16 +826,17 @@ dependencies = [ ] [[package]] -name = "easy-parallel" -version = "3.2.0" +name = "embed-resource" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" +dependencies = [ + "cc", + "rustc_version 0.4.0", + "toml", + "vswhom", + "winreg", +] [[package]] name = "embed_plist" @@ -998,45 +852,31 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.29" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] [[package]] -name = "enumflags2" -version = "0.7.3" +name = "env_logger" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ - "enumflags2_derive", - "serde", + "atty", + "humantime", + "log", + "regex", + "termcolor", ] -[[package]] -name = "enumflags2_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "event-listener" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" - [[package]] name = "eyre" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9289ed2c0440a6536e65119725cf91fc2c6b5e513bfd2e36e1134d7cca6ca12f" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" dependencies = [ "indenter", "once_cell", @@ -1069,26 +909,24 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "winapi", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if", "crc32fast", - "libc", - "miniz_oxide 0.4.4", + "miniz_oxide", ] [[package]] @@ -1122,6 +960,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "fs_extra" version = "1.2.0" @@ -1140,9 +988,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -1155,9 +1003,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -1165,15 +1013,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -1182,9 +1030,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-lite" @@ -1203,9 +1051,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89f17b21645bc4ed773c69af9c9a0effd4a3f1a3876eadd453469f8854e7fdd" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", @@ -1214,21 +1062,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -1269,9 +1117,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8750501d75f318c2ec0314701bc8403901303210def80bafd13f6b6059a3f45" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -1282,13 +1130,13 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" dependencies = [ - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] @@ -1301,9 +1149,9 @@ checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "pango-sys", "pkg-config", @@ -1317,7 +1165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" dependencies = [ "gdk-sys", - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", "x11", @@ -1368,26 +1216,26 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "gio" -version = "0.15.6" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96efd8a1c00d890f6b45671916e165b5e43ccec61957d443aff6d7e44f62d348" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", - "gio-sys 0.15.6", + "gio-sys", "glib", "libc", "once_cell", @@ -1396,25 +1244,12 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" dependencies = [ - "glib-sys 0.14.0", - "gobject-sys 0.14.0", - "libc", - "system-deps 3.2.0", - "winapi", -] - -[[package]] -name = "gio-sys" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0fa5052773f5a56b8ae47dab09d040f5d9ce1311f4f99006e16e9a08269296" -dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", "winapi", @@ -1422,9 +1257,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.6" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa570813c504bdf7539a9400180c2dd4b789a819556fb86da7226d7d1b037b49" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" dependencies = [ "bitflags", "futures-channel", @@ -1432,8 +1267,8 @@ dependencies = [ "futures-executor", "futures-task", "glib-macros", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "once_cell", "smallvec", @@ -1442,13 +1277,13 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41bfd8d227dead0829ac142454e97531b93f576d0805d779c42bfd799c65c572" +checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" dependencies = [ "anyhow", "heck 0.4.0", - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -1457,19 +1292,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" -dependencies = [ - "libc", - "system-deps 3.2.0", -] - -[[package]] -name = "glib-sys" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4366377bd56697de8aaee24e673c575d2694d72e7756324ded2b0428829a7b8" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", "system-deps 6.0.2", @@ -1483,9 +1308,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -1496,31 +1321,20 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ - "glib-sys 0.14.0", - "libc", - "system-deps 3.2.0", -] - -[[package]] -name = "gobject-sys" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6859463843c20cf3837e3a9069b6ab2051aeeadf4c899d33344f4aea83189a" -dependencies = [ - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "gtk" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d1326b36af927fe46ae2f89a8fec38c6f0d279ebc5ef07ffeeabb70300bfc" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" dependencies = [ "atk", "bitflags", @@ -1549,9 +1363,9 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "pango-sys", "system-deps 6.0.2", @@ -1564,7 +1378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" dependencies = [ "anyhow", - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -1573,9 +1387,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.7" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -1592,9 +1406,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" [[package]] name = "heck" @@ -1620,17 +1434,11 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "html5ever" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" dependencies = [ "log", "mac", @@ -1642,20 +1450,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -1670,9 +1478,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.5.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1681,10 +1489,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] -name = "hyper" -version = "0.14.15" +name = "humantime" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.14.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" dependencies = [ "bytes", "futures-channel", @@ -1695,7 +1512,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 0.4.8", + "itoa 1.0.2", "pin-project-lite", "socket2", "tokio", @@ -1762,6 +1579,20 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "indenter" version = "0.3.3" @@ -1770,9 +1601,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", @@ -1780,9 +1611,9 @@ dependencies = [ [[package]] name = "infer" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" dependencies = [ "cfb", ] @@ -1807,18 +1638,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" - -[[package]] -name = "itertools" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" -dependencies = [ - "either", -] +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" @@ -1828,9 +1650,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "javascriptcore-rs" @@ -1849,12 +1671,40 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 5.0.0", ] +[[package]] +name = "jni" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -1872,9 +1722,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -1921,33 +1771,43 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.119" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libdbus-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c185b5b7ad900923ef3a8ff594083d4d9b5aea80bb4f32b8342363138c0d456b" +dependencies = [ + "pkg-config", +] [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "loom" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", "generator", @@ -1966,14 +1826,15 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +checksum = "042f74a606175d72ca483e14e0873fe0f6c003f7af45865b17b16fdaface7203" dependencies = [ "cc", - "chrono", - "dirs 1.0.5", + "dirs-next", "objc-foundation", + "objc_id", + "time 0.3.11", ] [[package]] @@ -2022,9 +1883,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -2043,50 +1904,30 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "miniz_oxide" -version = "0.3.7" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -2102,9 +1943,9 @@ dependencies = [ [[package]] name = "ndk" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" dependencies = [ "bitflags", "jni-sys", @@ -2115,43 +1956,18 @@ dependencies = [ [[package]] name = "ndk-context" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" - -[[package]] -name = "ndk-glue" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1454575120e3265d2442222299c711ace58ba417532ee4f0fc71b860016b93" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-macro", - "ndk-sys", -] - -[[package]] -name = "ndk-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" -dependencies = [ - "darling 0.10.2", - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn", -] +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] [[package]] name = "new_debug_unreachable" @@ -2159,19 +1975,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" -dependencies = [ - "bitflags", - "cc", - "cfg-if", - "libc", - "memoffset", -] - [[package]] name = "nodrop" version = "0.1.14" @@ -2180,32 +1983,20 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "notify-rust" -version = "4.5.6" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367e1355a950d3e758e414f3ca1b3981a57a2aa1fa3338eb0059f5b230b6ffa4" +checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4" dependencies = [ + "dbus", "mac-notification-sys", - "serde", "winrt-notification", - "zbus", - "zvariant", - "zvariant_derive", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -2213,9 +2004,20 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-integer", @@ -2224,18 +2026,18 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -2243,25 +2045,34 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720d3ea1055e4e4574c0c0b0f8c3fd4f24c4cdaf465948206dea090b57b526ad" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d992b768490d7fe0d8586d9b5745f6c49f557da6d81dc982b1d167ad4edbb21" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro2", "quote", "syn", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -2303,9 +2114,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "opaque-debug" @@ -2315,39 +2126,51 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "open" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a82915836ef43159bb6a3c64d884c42329ccd0b8afdca737cf1e3dd701709dc" +checksum = "360bcc8316bf6363aa3954c3ccc4de8add167b087e0259190a043c9514f910fe" dependencies = [ "pathdiff", - "winapi", + "windows-sys", ] [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] [[package]] -name = "openssl-probe" -version = "0.1.4" +name = "openssl-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.71" +version = "0.9.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" dependencies = [ "autocfg", "cc", @@ -2356,21 +2179,11 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "ordered-stream" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "os_info" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023df84d545ef479cf67fd2f4459a613585c9db4852c2fad12ab70587859d340" +checksum = "0eca3ecae1481e12c3d9379ec541b238a16f0b75c9a409942daa8ec20dbfdb62" dependencies = [ "log", "serde", @@ -2379,9 +2192,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3492ebca331b895fe23ed427dce2013d9b2e00c45964f12040b0db38b8ab27" +checksum = "2c92f2b54f081d635c77e7120862d48db8e91f7f21cef23ab1b4fe9971c59f55" dependencies = [ "libc", "winapi", @@ -2398,9 +2211,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c7420fc01a390ec200da7395b64d705f5d82fe03e5d0708aee422c46538be7" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" dependencies = [ "bitflags", "glib", @@ -2411,12 +2224,12 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] @@ -2432,9 +2245,9 @@ dependencies = [ [[package]] name = "paris" -version = "1.5.11" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69d19a208bba8b94bd27d4b7a06ad153cddc6b88cb2149a668e23ce7bdb67d5" +checksum = "2eaf2319cd71dd9ff38c72bebde61b9ea657134abcf26ae4205f54f772a32810" [[package]] name = "parking" @@ -2455,12 +2268,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.1", + "parking_lot_core 0.9.3", ] [[package]] @@ -2472,24 +2285,30 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "winapi", ] [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "windows-sys", ] +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + [[package]] name = "path-clean" version = "0.1.0" @@ -2600,7 +2419,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand 0.8.4", + "rand 0.8.5", ] [[package]] @@ -2651,9 +2470,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -2663,9 +2482,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "png" @@ -2681,40 +2500,21 @@ dependencies = [ [[package]] name = "png" -version = "0.16.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", - "deflate 0.8.6", - "miniz_oxide 0.3.7", + "deflate 1.0.0", + "miniz_oxide", ] -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "precomputed-hash" @@ -2724,9 +2524,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty_assertions" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c038cb5319b9c704bf9c227c261d275bfec0ad438118a2787ce47944fb228b" +checksum = "c89f989ac94207d048d92db058e4f6ec7342b0971fc58d1271ca148b799b3563" dependencies = [ "ansi_term", "ctor", @@ -2735,19 +2535,20 @@ dependencies = [ ] [[package]] -name = "proc-macro-crate" -version = "0.1.5" +name = "pretty_env_logger" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" dependencies = [ - "toml", + "env_logger", + "log", ] [[package]] name = "proc-macro-crate" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dada8c9981fcf32929c3c0f0cd796a9284aca335565227ed88c83babb1d43dc" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ "thiserror", "toml", @@ -2785,18 +2586,24 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] -name = "quote" -version = "1.0.10" +name = "quick-error" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -2811,20 +2618,19 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", "rand_pcg", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -2862,7 +2668,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", ] [[package]] @@ -2874,15 +2680,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rand_pcg" version = "0.2.1" @@ -2894,79 +2691,38 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" dependencies = [ "cty", ] -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "redox_users" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" -dependencies = [ - "getrandom 0.2.3", - "redox_syscall 0.2.10", + "getrandom 0.2.7", + "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -2984,9 +2740,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -2999,15 +2755,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.6" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", @@ -3025,6 +2782,7 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -3034,15 +2792,15 @@ dependencies = [ [[package]] name = "rfd" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aaf1d71ccd44689f7c2c72da1117fd8db71f72a76fe9b5c5dbb17ab903007e0" +checksum = "f121348fd3b9035ed11be1f028e8944263c30641f8c5deacf57a4320782fb402" dependencies = [ - "ashpd", "block", "dispatch", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "embed-resource", + "glib-sys", + "gobject-sys", "gtk-sys", "js-sys", "lazy_static", @@ -3050,24 +2808,11 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "pollster", "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.30.0", -] - -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", + "windows 0.37.0", ] [[package]] @@ -3085,20 +2830,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.6", + "semver 1.0.10", ] [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" [[package]] name = "ryu" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -3111,12 +2856,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi", + "windows-sys", ] [[package]] @@ -3133,9 +2878,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -3146,9 +2891,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -3185,9 +2930,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" +dependencies = [ + "serde", +] [[package]] name = "semver-parser" @@ -3200,18 +2948,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -3220,20 +2968,20 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.72" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -3242,34 +2990,33 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_with" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1e6ec4d8950e5b1e894eac0d360742f3b1407a6078a604a731c4b3f49cefbc" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ - "rustversion", "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ - "darling 0.13.1", + "darling", "proc-macro2", "quote", "syn", @@ -3321,9 +3068,18 @@ dependencies = [ [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" @@ -3366,21 +3122,38 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "sled" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" +dependencies = [ + "crc32fast", + "crossbeam-epoch", + "crossbeam-utils", + "fs2", + "fxhash", + "libc", + "log", + "parking_lot 0.11.2", + "zstd", +] [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "cc88c725d61fc6c3132893370cac4a0200e3fedf5da8331c570664b1987f5ca2" [[package]] name = "socket2" @@ -3393,15 +3166,29 @@ dependencies = [ ] [[package]] -name = "soup2-sys" -version = "0.1.0" +name = "soup2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f056675eda9a7417163e5f742bb119e8e1d385edd2ada8f7031a7230a3ec10a" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" dependencies = [ "bitflags", - "gio-sys 0.14.0", - "glib-sys 0.14.0", - "gobject-sys 0.14.0", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "system-deps 5.0.0", ] @@ -3414,28 +3201,22 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "state" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" dependencies = [ "loom", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "string_cache" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ - "lazy_static", "new_debug_unreachable", - "parking_lot 0.11.2", + "once_cell", + "parking_lot 0.12.1", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3443,53 +3224,29 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro2", "quote", ] -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "strum" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" - [[package]] name = "strum" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" dependencies = [ - "strum_macros 0.22.0", -] - -[[package]] -name = "strum_macros" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" -dependencies = [ - "heck 0.3.3", - "proc-macro2", - "quote", - "syn", + "strum_macros", ] [[package]] @@ -3504,21 +3261,15 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" -version = "1.0.82" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -3531,24 +3282,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" -dependencies = [ - "anyhow", - "cfg-expr 0.8.1", - "heck 0.3.3", - "itertools", - "pkg-config", - "strum 0.21.0", - "strum_macros 0.21.1", - "thiserror", - "toml", - "version-compare 0.0.11", -] - [[package]] name = "system-deps" version = "5.0.0" @@ -3568,7 +3301,7 @@ version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ - "cfg-expr 0.10.1", + "cfg-expr 0.10.3", "heck 0.4.0", "pkg-config", "toml", @@ -3598,9 +3331,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.6.2" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3b3bbc9151bce45db3cf9ccb808730c8df8786d0223f34591f6e5890503939" +checksum = "3bfe4c782f0543f667ee3b732d026b2f1c64af39cd52e726dec1ea1f2d8f6b80" dependencies = [ "bitflags", "cairo-rs", @@ -3616,24 +3349,30 @@ dependencies = [ "gdkx11-sys", "gio", "glib", - "glib-sys 0.15.6", + "glib-sys", "gtk", + "image", "instant", + "jni 0.19.0", "lazy_static", "libc", "log", "ndk", - "ndk-glue", + "ndk-context", "ndk-sys", "objc", + "once_cell", "parking_lot 0.11.2", + "paste", + "png 0.17.5", "raw-window-handle", "scopeguard", "serde", "tao-core-video-sys", "unicode-segmentation", - "windows 0.30.0", - "windows_macros", + "uuid 0.8.2", + "windows 0.37.0", + "windows-implement", "x11-dl", ] @@ -3662,16 +3401,14 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-rc.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0c4a4ffd1f9b02cc3e974ce902f8132fb3d08ec6cce4ca193f97d921f5bce4" +checksum = "8e1ebb60bb8f246d5351ff9b7728fdfa7a6eba72baa722ab6021d553981caba1" dependencies = [ "anyhow", "attohttpc", - "bincode", - "cfg_aliases", + "cocoa", "dirs-next", - "either", "embed_plist", "flate2", "futures", @@ -3679,19 +3416,21 @@ dependencies = [ "glib", "glob", "gtk", + "heck 0.4.0", "http", "ignore", "notify-rust", + "objc", "once_cell", "open", "os_info", "os_pipe", "percent-encoding", - "rand 0.8.4", + "rand 0.8.5", "raw-window-handle", "regex", "rfd", - "semver 1.0.6", + "semver 1.0.10", "serde", "serde_json", "serde_repr", @@ -3707,18 +3446,22 @@ dependencies = [ "thiserror", "tokio", "url", - "uuid", - "zip", + "uuid 1.1.2", + "webkit2gtk", + "webview2-com", + "windows 0.37.0", ] [[package]] name = "tauri-build" -version = "1.0.0-rc.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855e47d8cfb2219fc14d2eed2c09bfb35f9ecd71a40ca2084aeeee2d23e0b60d" +checksum = "e7b26eb3523e962b90012fedbfb744ca153d9be85e7981e00737e106d5323941" dependencies = [ "anyhow", "cargo_toml", + "heck 0.4.0", + "semver 1.0.10", "serde_json", "tauri-utils", "winres", @@ -3726,30 +3469,32 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0-rc.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef4656d174ba982198266da0c016573fe6c7c760e4290f05c8c384fe180007e" +checksum = "9468c5189188c820ef605dfe4937c768cb2918e9460c8093dc4ee2cbd717b262" dependencies = [ "base64", - "blake3", + "brotli", + "ico", + "png 0.17.5", "proc-macro2", "quote", "regex", + "semver 1.0.10", "serde", "serde_json", "sha2", "tauri-utils", "thiserror", - "uuid", + "uuid 1.1.2", "walkdir", - "zstd", ] [[package]] name = "tauri-macros" -version = "1.0.0-rc.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0993f5a867e321d26200b2d6394cdf482bd6cc5a0e4691bcabf811544f51cd4" +checksum = "40e3ffddd7a274fc7baaa260888c971a0d95d2ef403aa16600c878b8b1c00ffe" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -3761,9 +3506,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.3.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851cd65e2c9df4dd70a4f9e115fb2441ac89f1c80df79de0c15a448b4acd7768" +checksum = "fb7dc4db360bb40584187b6cb7834da736ce4ef2ab0914e2be98014444fa9920" dependencies = [ "gtk", "http", @@ -3773,79 +3518,90 @@ dependencies = [ "serde_json", "tauri-utils", "thiserror", - "uuid", + "uuid 1.1.2", "webview2-com", - "windows 0.30.0", + "windows 0.37.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.3.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0184f95e065fb80afadf53f0a5f87a75af2da774d0524fe8cb2976fbec4a0bf2" +checksum = "c876fb3a6e7c6fe2ac466b2a6ecd83658528844b4df0914558a9bc1501b31cf3" dependencies = [ + "cocoa", "gtk", - "ico", - "infer", - "png 0.16.8", + "percent-encoding", + "rand 0.8.5", "tauri-runtime", "tauri-utils", - "uuid", + "uuid 1.1.2", + "webkit2gtk", "webview2-com", - "windows 0.30.0", + "windows 0.37.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.0.0-rc.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad38ad698838886bf22ecb91c4b3d1ce178fdff7901ac7bff370103a4f51e59" +checksum = "727145cb55b8897fa9f2bcea4fad31dc39394703d037c9669b40f2d1c0c2d7f3" dependencies = [ + "brotli", "ctor", "glob", "heck 0.4.0", "html5ever", "json-patch", "kuchiki", + "memchr", "phf 0.10.1", "proc-macro2", "quote", + "semver 1.0.10", "serde", "serde_json", "serde_with", - "serialize-to-javascript", "thiserror", "url", "walkdir", - "zstd", ] [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand 0.8.4", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] [[package]] name = "tendril" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" dependencies = [ "futf", "mac", "utf-8", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "terminal_size" version = "0.1.17" @@ -3862,15 +3618,15 @@ version = "0.1.0" dependencies = [ "argh", "async-trait", + "bincode", "bytes", "chrono", "const_format", "daedalus", - "dirs 4.0.0", + "dirs", "fs_extra", "futures", "json5", - "lazy_static", "log", "once_cell", "path-clean", @@ -3880,10 +3636,11 @@ dependencies = [ "serde", "serde_json", "sha1", + "sled", "sys-info", "thiserror", "tokio", - "uuid", + "uuid 0.8.2", "zip", "zip-extensions", ] @@ -3895,15 +3652,17 @@ dependencies = [ "argh", "daedalus", "dialoguer", - "dirs 4.0.0", + "dirs", "eyre", "futures", + "log", "paris", + "pretty_env_logger", "tabled", "theseus", "tokio", "tokio-stream", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -3924,18 +3683,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -3953,19 +3712,30 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] [[package]] -name = "tinyvec" -version = "1.5.1" +name = "time" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +dependencies = [ + "libc", + "num_threads", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -3978,9 +3748,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ "bytes", "libc", @@ -3988,7 +3758,7 @@ dependencies = [ "mio", "num_cpus", "once_cell", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3998,9 +3768,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -4019,9 +3789,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite", @@ -4030,38 +3800,38 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if", "pin-project-lite", @@ -4071,9 +3841,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -4082,18 +3852,19 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" dependencies = [ - "lazy_static", + "once_cell", + "valuable", ] [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -4102,9 +3873,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.7" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", "lazy_static", @@ -4135,9 +3906,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "typenum" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" @@ -4147,24 +3918,30 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "81dee68f85cab8cf68dec42158baf3a79a1cdc065a8b103025965d6ccb7f6cbd" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" @@ -4174,9 +3951,9 @@ checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "url" @@ -4203,10 +3980,25 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", "serde", ] +[[package]] +name = "uuid" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -4231,6 +4023,32 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -4266,15 +4084,21 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4282,9 +4106,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -4297,9 +4121,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if", "js-sys", @@ -4309,9 +4133,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4319,9 +4143,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -4332,15 +4156,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", @@ -4348,67 +4172,68 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cbd39499e917de9dad36eb11c09f665eb984d432638ae7971feed98eb96df88" +checksum = "29952969fb5e10fe834a52eb29ad0814ccdfd8387159b0933edf1344a1c9cdcc" dependencies = [ "bitflags", "cairo-rs", "gdk", "gdk-sys", "gio", - "gio-sys 0.15.6", + "gio-sys", "glib", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "gtk", "gtk-sys", "javascriptcore-rs", "libc", "once_cell", + "soup2", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcce6f1e0fc7715d651dba29875741509f5fc12f4e2976907272a74405f2b01" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" dependencies = [ "atk-sys", "bitflags", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "gtk-sys", "javascriptcore-rs-sys", "libc", "pango-sys", "pkg-config", "soup2-sys", - "system-deps 5.0.0", + "system-deps 6.0.2", ] [[package]] name = "webview2-com" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8e90ac2d9ce39cdb70017aaec641be09fbdd702b7b332b9896d053eb469524" +checksum = "a489a9420acabb3c2ed0434b6f71f6b56b9485ec32665a28dec1ee186d716e0f" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.30.0", - "windows_macros", + "windows 0.37.0", + "windows-implement", ] [[package]] name = "webview2-com-macros" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515c6c82fcee93f6edaacc72c8e233dbe4ff3ca569dce1901dfc36c404a3e99" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" dependencies = [ "proc-macro2", "quote", @@ -4417,27 +4242,18 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92160310b3322397e4ff8a8285a7429d73a07a68fda44ee80879605b93e53f76" +checksum = "0258c53ee9adc0a4f8ba1c8c317588f7a58c7048a55b621d469ba75ab3709ca1" dependencies = [ "regex", "serde", "serde_json", "thiserror", - "windows 0.30.0", + "windows 0.37.0", "windows-bindgen", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "wildmatch" version = "2.1.0" @@ -4489,61 +4305,74 @@ dependencies = [ [[package]] name = "windows" -version = "0.30.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b749ebd2304aa012c5992d11a25d07b406bdbe5f79d371cb7a918ce501a19eb0" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" dependencies = [ - "windows_aarch64_msvc 0.30.0", - "windows_i686_gnu 0.30.0", - "windows_i686_msvc 0.30.0", - "windows_x86_64_gnu 0.30.0", - "windows_x86_64_msvc 0.30.0", + "windows-implement", + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", ] [[package]] name = "windows-bindgen" -version = "0.30.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944c545fcae9dd66488308f8b69aa3ba34f53714416ecfcdcbbfa4b6821e27c6" +checksum = "0bed7be31ade0af08fec9b5343e9edcc005d22b1f11859b8a59b24797f5858e8" dependencies = [ - "windows_quote", - "windows_reader", + "windows-metadata", + "windows-tokens", ] +[[package]] +name = "windows-implement" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a1062e555f7d9d66fd1130ed4f7c6ec41a47529ee0850cd0e926d95b26bb14" +dependencies = [ + "syn", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f33f2b90a6664e369c41ab5ff262d06f048fc9685d9bf8a0e99a47750bb0463" + [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] [[package]] -name = "windows_aarch64_msvc" -version = "0.30.0" +name = "windows-tokens" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" +checksum = "3263d25f1170419995b78ff10c06b949e8a986c35c208dc24333c64753a87169" [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] -name = "windows_gen" -version = "0.30.0" +name = "windows_aarch64_msvc" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30dff4d91d22520628bb94b66f2bb313cb16a09a515a32320a84a1b449bc94c0" -dependencies = [ - "windows_quote", - "windows_reader", -] +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" [[package]] name = "windows_i686_gnu" @@ -4553,15 +4382,15 @@ checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" [[package]] name = "windows_i686_gnu" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" [[package]] name = "windows_i686_msvc" @@ -4571,39 +4400,15 @@ checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" [[package]] name = "windows_i686_msvc" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - -[[package]] -name = "windows_macros" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ae44ab917e9005fe710d99d52d227ca0164b10a09be90649142cc3fab825d3" -dependencies = [ - "syn", - "windows_gen", - "windows_quote", - "windows_reader", -] - -[[package]] -name = "windows_quote" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f02c51a77e6248c1206aaa920802c32d50a05205e229b118d7f3afd3036667" - -[[package]] -name = "windows_reader" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44e6df0da993cda589c5ac852272fbb2a0ead67a031a017dd3eac11528a2d72" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" [[package]] name = "windows_x86_64_gnu" @@ -4613,15 +4418,15 @@ checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" [[package]] name = "windows_x86_64_gnu" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" [[package]] name = "windows_x86_64_msvc" @@ -4631,21 +4436,21 @@ checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" [[package]] name = "windows_x86_64_msvc" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] @@ -4665,17 +4470,18 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007a0353840b23e0c6dc73e5b962ff58ed7f6bc9ceff3ce7fe6fbad8d496edf4" dependencies = [ - "strum 0.22.0", + "strum", "windows 0.24.0", "xml-rs", ] [[package]] name = "wry" -version = "0.13.2" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620bfe8ed3cde9310f32a69ffc654dfd8dae4ac5a0e08d6fbf0205a996fc7f0f" +checksum = "26b1ba327c7dd4292f46bf8e6ba8e6ec2db4443b2973c9d304a359d95e0aa856" dependencies = [ + "block", "cocoa", "core-graphics", "gdk", @@ -4683,6 +4489,7 @@ dependencies = [ "glib", "gtk", "http", + "jni 0.18.0", "libc", "log", "objc", @@ -4690,15 +4497,14 @@ dependencies = [ "once_cell", "serde", "serde_json", - "sys-info", "tao", "thiserror", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.30.0", - "windows_macros", + "windows 0.37.0", + "windows-implement", ] [[package]] @@ -4724,9 +4530,9 @@ dependencies = [ [[package]] name = "xattr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" dependencies = [ "libc", ] @@ -4737,72 +4543,11 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" -[[package]] -name = "zbus" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb86f3d4592e26a48b2719742aec94f8ae6238ebde20d98183ee185d1275e9a" -dependencies = [ - "async-broadcast", - "async-channel", - "async-executor", - "async-io", - "async-lock", - "async-recursion", - "async-task", - "async-trait", - "byteorder", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "lazy_static", - "nix", - "once_cell", - "ordered-stream", - "rand 0.8.4", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "winapi", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36823cc10fddc3c6b19f048903262dacaf8274170e9a255784bdd8b4570a8040" -dependencies = [ - "proc-macro-crate 1.1.2", - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "zbus_names" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dfcdcf87b71dad505d30cc27b1b7b88a64b6d1c435648f48f9dbc1fdc4b7e1" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - [[package]] name = "zeroize" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" +checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" [[package]] name = "zip" @@ -4815,7 +4560,7 @@ dependencies = [ "crc32fast", "flate2", "thiserror", - "time", + "time 0.1.44", ] [[package]] @@ -4829,18 +4574,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.10.0+zstd.1.5.2" +version = "0.9.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" +checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.4+zstd.1.5.2" +version = "4.1.3+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" +checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" dependencies = [ "libc", "zstd-sys", @@ -4848,36 +4593,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.6.3+zstd.1.5.2" +version = "1.6.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" +checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" dependencies = [ "cc", "libc", ] - -[[package]] -name = "zvariant" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ea5dc38b2058fae6a5b79009388143dadce1e91c26a67f984a0fc0381c8033" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2cecc5a61c2a053f7f653a24cd15b3b0195d7f7ddb5042c837fb32e161fb7a" -dependencies = [ - "proc-macro-crate 1.1.2", - "proc-macro2", - "quote", - "syn", -] diff --git a/flake.lock b/flake.lock index 70fbe9249..9df5a0b4f 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1646893503, - "narHash": "sha256-N4Wn8FUXUC1h1DkL8X9I7VMvIv0fLLLjeJX3uFyzvRQ=", + "lastModified": 1655706580, + "narHash": "sha256-7DshIT1Ya5W9NAW7UdnYCHsGmXfOXJZCEHbbB/cCX7g=", "owner": "nix-community", "repo": "fenix", - "rev": "aad7f0a3e44ecfc9e2c5f1a45387d193c1c51aa6", + "rev": "d895003d8e03ac2fc8ffe2aa898299cbef1a7048", "type": "github" }, "original": { @@ -28,11 +28,11 @@ ] }, "locked": { - "lastModified": 1639947939, - "narHash": "sha256-pGsM8haJadVP80GFq4xhnSpNitYNQpaXk4cnA796Cso=", + "lastModified": 1655042882, + "narHash": "sha256-9BX8Fuez5YJlN7cdPO63InoyBy7dm3VlJkkmTt6fS1A=", "owner": "nix-community", "repo": "naersk", - "rev": "2fc8ce9d3c025d59fee349c1f80be9785049d653", + "rev": "cddffb5aa211f50c4b8750adbec0bbbdfb26bb9f", "type": "github" }, "original": { @@ -43,11 +43,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1646497237, - "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "lastModified": 1655624069, + "narHash": "sha256-7g1zwTdp35GMTERnSzZMWJ7PG3QdDE8VOX3WsnOkAtM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "rev": "0d68d7c857fe301d49cdcd56130e0beea4ecd5aa", "type": "github" }, "original": { @@ -68,15 +68,15 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1646862342, - "narHash": "sha256-zXd3qsIcQFDFMB6p8bSpkOKjTuBTvYuM4GkPYxEfQdA=", - "owner": "rust-analyzer", + "lastModified": 1655654433, + "narHash": "sha256-auHQ0XPCiaTPSn+R3Yu4J7oZ5Zq/FS5/Da1ivvdYb/Y=", + "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "5b51cb835a356cf79cba00cf5c65d51cadeea7f1", + "rev": "427061da19723f2206fe4dcb175c9c43b9a6193d", "type": "github" }, "original": { - "owner": "rust-analyzer", + "owner": "rust-lang", "ref": "nightly", "repo": "rust-analyzer", "type": "github" @@ -84,11 +84,11 @@ }, "utils": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 746b13631..e6399f1b1 100644 --- a/flake.nix +++ b/flake.nix @@ -14,7 +14,7 @@ }; }; - outputs = inputs: + outputs = inputs@{self, ...}: inputs.utils.lib.eachDefaultSystem (system: let pkgs = import inputs.nixpkgs { inherit system; }; fenix = inputs.fenix.packages.${system}; @@ -32,13 +32,15 @@ deps = with pkgs; { global = [ - openssl pkg-config + openssl pkg-config gcc ]; gui = [ - gtk4 gdk-pixbuf atk webkitgtk + gtk4 gdk-pixbuf atk webkitgtk dbus ]; shell = [ - toolchain fenix.default.clippy git + toolchain + (with fenix; combine [toolchain default.clippy rust-analyzer]) + git jdk17 jdk8 ]; }; @@ -53,8 +55,22 @@ }; apps = { - theseus-cli = utils.mkApp { - drv = inputs.self.packages.${system}.theseus-cli; + cli = utils.mkApp { + drv = self.packages.${system}.theseus-cli; + }; + cli-test = utils.mkApp { + drv = pkgs.writeShellApplication { + name = "theseus-test-cli"; + runtimeInputs = [ + (self.packages.${system}.theseus-cli.overrideAttrs (old: old // { + release = false; + })) + ]; + text = '' + DUMMY_ID="$(printf '%0.sa' {1..32})" + theseus_cli profile run -t "" -n "Test" -i "$DUMMY_ID" "$@" + ''; + }; }; }; @@ -62,5 +78,5 @@ buildInputs = with deps; global ++ gui ++ shell; }; - }); + }) } diff --git a/theseus/Cargo.toml b/theseus/Cargo.toml index c8b5413b3..619f96572 100644 --- a/theseus/Cargo.toml +++ b/theseus/Cargo.toml @@ -10,7 +10,10 @@ edition = "2018" thiserror = "1.0" async-trait = "0.1.51" -daedalus = "0.1.12" +daedalus = { version = "0.1.16", features = ["bincode"] } + +bincode = { version = "2.0.0-rc.1", features = ["serde"] } +sled = { version = "0.34.7", features = ["compression"] } reqwest = { version = "0.11", features = ["json"] } serde = { version = "1.0", features = ["derive"] } @@ -36,13 +39,9 @@ sys-info = "0.9.0" log = "0.4.14" const_format = "0.2.22" once_cell = "1.9.0" -lazy_static = "1.4" [dev-dependencies] argh = "0.1.6" pretty_assertions = "1.1.0" -[[example]] -name = "download-pack" - [features] diff --git a/theseus/examples/download-pack.rs b/theseus/examples/download-pack.rs deleted file mode 100644 index 50cba5307..000000000 --- a/theseus/examples/download-pack.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::{path::PathBuf, time::Instant}; - -use argh::FromArgs; -use theseus::modpack::{fetch_modpack, pack::ModpackSide}; - -#[derive(FromArgs)] -/// Simple modpack download -struct ModpackDownloader { - /// where to download to - #[argh(positional)] - url: String, - - /// where to put the resulting pack - #[argh(option, short = 'o')] - output: Option, - - /// the sha1 hash, if you want it checked - #[argh(option, short = 'c')] - hash: Option, - - /// use verbose logging - #[argh(switch, short = 'v')] - verbose: bool, -} - -// Simple logging helper -fn debug(msg: &str, verbose: bool) { - if verbose { - println!("{}", msg); - } -} - -#[tokio::main] -pub async fn main() { - let args = argh::from_env::(); - let dest = args.output.unwrap_or(PathBuf::from("./pack-download/")); - - debug( - &format!( - "Downloading pack {} to {}", - args.url, - dest.to_str().unwrap_or("?") - ), - args.verbose, - ); - - let start = Instant::now(); - fetch_modpack(&args.url, args.hash.as_deref(), &dest, ModpackSide::Client) - .await - .unwrap(); - let end = start.elapsed(); - - println!("Download completed in {} seconds", end.as_secs_f32()); - debug("Done!", args.verbose); -} diff --git a/theseus/src/api/mod.rs b/theseus/src/api/mod.rs new file mode 100644 index 000000000..cdddd67b5 --- /dev/null +++ b/theseus/src/api/mod.rs @@ -0,0 +1,20 @@ +//! API for interacting with Theseus +pub mod profile; + +pub mod data { + pub use crate::{ + launcher::Credentials, + state::{ + DirectoryInfo, Hooks, JavaSettings, MemorySettings, ModLoader, + ProfileMetadata, Settings, WindowSize, + }, + }; +} + +pub mod prelude { + pub use crate::{ + data::*, + profile::{self, Profile}, + State, + }; +} diff --git a/theseus/src/api/profile.rs b/theseus/src/api/profile.rs new file mode 100644 index 000000000..6b91592ca --- /dev/null +++ b/theseus/src/api/profile.rs @@ -0,0 +1,215 @@ +//! Theseus profile management interface + +pub use crate::{ + state::{JavaSettings, Profile}, + State, +}; +use daedalus as d; +use std::{future::Future, path::Path}; +use tokio::process::{Child, Command}; + +/// Add a profile to the in-memory state +pub async fn add(profile: Profile) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.insert(profile)?; + + Ok(()) +} + +/// Add a path as a profile in-memory +pub async fn add_path(path: &Path) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.insert_from(path).await?; + + Ok(()) +} + +/// Remove a profile +pub async fn remove(path: &Path) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.remove(path)?; + + Ok(()) +} + +/// Get a profile by path, +pub async fn get(path: &Path) -> crate::Result> { + let state = State::get().await?; + let profiles = state.profiles.read().await; + + profiles.0.get(path).map_or(Ok(None), |prof| match prof { + Some(prof) => Ok(Some(prof.clone())), + None => Err(crate::Error::UnloadedProfileError( + path.display().to_string(), + )), + }) +} + +/// Check if a profile is already managed by Theseus +pub async fn is_managed(profile: &Path) -> crate::Result { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles.0.contains_key(profile)) +} + +/// Check if a profile is loaded +pub async fn is_loaded(profile: &Path) -> crate::Result { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles + .0 + .get(profile) + .map(Option::as_ref) + .flatten() + .is_some()) +} + +/// Edit a profile using a given asynchronous closure +pub async fn edit( + path: &Path, + action: impl Fn(&mut Profile) -> Fut, +) -> crate::Result<()> +where + Fut: Future>, +{ + let state = State::get().await.unwrap(); + let mut profiles = state.profiles.write().await; + + match profiles.0.get_mut(path) { + Some(&mut Some(ref mut profile)) => action(profile).await, + Some(&mut None) => Err(crate::Error::UnloadedProfileError( + path.display().to_string(), + )), + None => Err(crate::Error::UnmanagedProfileError( + path.display().to_string(), + )), + } +} + +/// Run Minecraft using a profile +pub async fn run( + path: &Path, + credentials: &crate::launcher::Credentials, +) -> crate::Result { + let state = State::get().await.unwrap(); + let settings = state.settings.read().await; + let profile = get(path).await?.ok_or_else(|| { + crate::Error::OtherError(format!( + "Tried to run a nonexistent or unloaded profile at path {}!", + path.display() + )) + })?; + + let version = state + .metadata + .minecraft + .versions + .iter() + .find(|it| it.id == profile.metadata.game_version.as_ref()) + .ok_or_else(|| { + crate::Error::LauncherError(format!( + "Invalid or unknown Minecraft version: {}", + profile.metadata.game_version + )) + })?; + let version_info = d::minecraft::fetch_version_info(version).await?; + + let ref pre_launch_hooks = + profile.hooks.as_ref().unwrap_or(&settings.hooks).pre_launch; + for hook in pre_launch_hooks.iter() { + // TODO: hook parameters + let mut cmd = hook.split(' '); + let result = Command::new(cmd.next().unwrap()) + .args(&cmd.collect::>()) + .current_dir(path) + .spawn()? + .wait() + .await?; + + if !result.success() { + return Err(crate::Error::LauncherError(format!( + "Non-zero exit code for pre-launch hook: {}", + result.code().unwrap_or(-1) + ))); + } + } + + let java_install = match profile.java { + Some(JavaSettings { + install: Some(ref install), + .. + }) => install, + _ => if version_info + .java_version + .as_ref() + .filter(|it| it.major_version >= 16) + .is_some() + { + settings.java_17_path.as_ref() + } else { + settings.java_8_path.as_ref() + } + .ok_or_else(|| { + crate::Error::LauncherError(format!( + "No Java installed for version {}", + version_info.java_version.map_or(8, |it| it.major_version), + )) + })?, + }; + + if !java_install.exists() { + return Err(crate::Error::LauncherError(format!( + "Could not find Java install: {}", + java_install.display() + ))); + } + + let ref java_args = profile + .java + .as_ref() + .and_then(|it| it.extra_arguments.as_ref()) + .unwrap_or(&settings.custom_java_args); + + let wrapper = profile + .hooks + .as_ref() + .map_or(&settings.hooks.wrapper, |it| &it.wrapper); + + let ref memory = profile.memory.unwrap_or(settings.memory); + let ref resolution = profile.resolution.unwrap_or(settings.game_resolution); + + crate::launcher::launch_minecraft( + &profile.metadata.game_version, + &profile.metadata.loader_version, + &profile.path, + &java_install, + &java_args, + &wrapper, + memory, + resolution, + credentials, + ) + .await +} + +pub async fn kill(running: &mut Child) -> crate::Result<()> { + running.kill().await?; + wait_for(running).await +} + +pub async fn wait_for(running: &mut Child) -> crate::Result<()> { + let result = running.wait().await.map_err(|err| { + crate::Error::LauncherError(format!("Error running minecraft: {err}")) + })?; + + match result.success() { + false => Err(crate::Error::LauncherError(format!( + "Minecraft exited with non-zero code {}", + result.code().unwrap_or(-1) + ))), + true => Ok(()), + } +} diff --git a/theseus/src/config.rs b/theseus/src/config.rs new file mode 100644 index 000000000..eedbec89f --- /dev/null +++ b/theseus/src/config.rs @@ -0,0 +1,22 @@ +//! Configuration structs + +use once_cell::sync::Lazy; +use std::time; + +pub static BINCODE_CONFIG: Lazy = + Lazy::new(|| { + bincode::config::standard() + .with_little_endian() + .with_no_limit() + }); + +pub static REQWEST_CLIENT: Lazy = Lazy::new(|| { + reqwest::Client::builder() + .tcp_keepalive(Some(time::Duration::from_secs(10))) + .build() + .unwrap() +}); + +pub fn sled_config() -> sled::Config { + sled::Config::default().use_compression(true) +} diff --git a/theseus/src/data/meta.rs b/theseus/src/data/meta.rs deleted file mode 100644 index 3aa3f7252..000000000 --- a/theseus/src/data/meta.rs +++ /dev/null @@ -1,107 +0,0 @@ -use crate::{data::DataError, LAUNCHER_WORK_DIR}; -use once_cell::sync; -use serde::{Deserialize, Serialize}; -use tokio::sync::{RwLock, RwLockReadGuard}; - -const META_FILE: &str = "meta.json"; -const META_URL: &str = "https://meta.modrinth.com/gamedata"; - -static METADATA: sync::OnceCell> = sync::OnceCell::new(); - -#[derive(Clone, Serialize, Deserialize, Debug)] -pub struct Metadata { - pub minecraft: daedalus::minecraft::VersionManifest, - pub forge: daedalus::modded::Manifest, - pub fabric: daedalus::modded::Manifest, -} - -impl Metadata { - pub async fn init() -> Result<(), DataError> { - let meta_path = LAUNCHER_WORK_DIR.join(META_FILE); - - if meta_path.exists() { - let meta_data = tokio::fs::read_to_string(meta_path) - .await - .ok() - .and_then(|it| serde_json::from_str::(&it).ok()); - - if let Some(metadata) = meta_data { - METADATA.get_or_init(|| RwLock::new(metadata)); - } - } - - let future = async { - for attempt in 0..=3 { - let res = async { - let new = Self::fetch().await?; - - std::fs::write( - LAUNCHER_WORK_DIR.join(META_FILE), - &serde_json::to_string(&new)?, - )?; - - if let Some(metadata) = METADATA.get() { - *metadata.write().await = new; - } else { - METADATA.get_or_init(|| RwLock::new(new)); - } - - Ok::<(), DataError>(()) - } - .await; - - match res { - Ok(_) => { - break; - } - Err(_) if attempt <= 3 => continue, - Err(err) => { - log::warn!("Unable to fetch launcher metadata: {}", err) - } - }; - } - }; - - if METADATA.get().is_some() { - tokio::task::spawn(future); - } else { - future.await; - } - - Ok(()) - } - - pub async fn fetch() -> Result { - let (game, forge, fabric) = futures::future::join3( - daedalus::minecraft::fetch_version_manifest(Some(&format!( - "{}/minecraft/v0/manifest.json", - META_URL - ))), - daedalus::modded::fetch_manifest(&format!( - "{}/forge/v0/manifest.json", - META_URL - )), - daedalus::modded::fetch_manifest(&format!( - "{}/fabric/v0/manifest.json", - META_URL - )), - ) - .await; - - Ok(Self { - minecraft: game?, - forge: forge?, - fabric: fabric?, - }) - } - - pub async fn get<'a>() -> Result, DataError> { - let res = METADATA - .get() - .ok_or_else(|| DataError::InitializedError("metadata".to_string()))? - .read() - .await; - - Ok(res) - } -} diff --git a/theseus/src/data/mod.rs b/theseus/src/data/mod.rs deleted file mode 100644 index fb307d8a5..000000000 --- a/theseus/src/data/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::io; - -pub use meta::Metadata; -pub use profiles::{Profile, Profiles}; -pub use settings::Settings; - -mod meta; -pub mod profiles; -mod settings; - -#[derive(thiserror::Error, Debug)] -pub enum DataError { - #[error("I/O error while reading data: {0}")] - IOError(#[from] io::Error), - - #[error("Daedalus error: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Data format error: {0}")] - FormatError(String), - - #[error("Attempted to access {0} without initializing it!")] - InitializedError(String), - - #[error("Error while serializing/deserializing data")] - SerdeError(#[from] serde_json::Error), -} diff --git a/theseus/src/data/profiles.rs b/theseus/src/data/profiles.rs deleted file mode 100644 index 5f9639200..000000000 --- a/theseus/src/data/profiles.rs +++ /dev/null @@ -1,502 +0,0 @@ -use super::DataError; -use crate::launcher::ModLoader; -use daedalus::modded::LoaderVersion; -use futures::*; -use once_cell::sync::OnceCell; -use serde::{Deserialize, Serialize}; -use std::{ - collections::{HashMap, HashSet}, - path::{Path, PathBuf}, - sync::Arc, -}; -use tokio::{ - fs, - process::{Child, Command}, - sync::{Mutex, RwLock, RwLockReadGuard}, -}; - -static PROFILES: OnceCell> = OnceCell::new(); -pub const PROFILE_JSON_PATH: &str = "profile.json"; - -#[derive(Debug)] -pub struct Profiles(pub HashMap); - -// TODO: possibly add defaults to some of these values -pub const CURRENT_FORMAT_VERSION: u32 = 1; -pub const SUPPORTED_ICON_FORMATS: &[&'static str] = &[ - "bmp", "gif", "jpeg", "jpg", "jpe", "png", "svg", "svgz", "webp", "rgb", - "mp4", -]; - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct Profile { - #[serde(skip)] - pub path: PathBuf, - pub metadata: Metadata, - #[serde(skip_serializing_if = "Option::is_none")] - pub java: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub memory: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub resolution: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub hooks: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct Metadata { - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub icon: Option, - pub game_version: String, - #[serde(default)] - pub loader: ModLoader, - #[serde(skip_serializing_if = "Option::is_none")] - pub loader_version: Option, - pub format_version: u32, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct JavaSettings { - #[serde(skip_serializing_if = "Option::is_none")] - pub install: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub extra_arguments: Option>, -} - -#[derive(Serialize, Deserialize, Clone, Copy, Debug)] -pub struct MemorySettings { - #[serde(skip_serializing_if = "Option::is_none")] - pub minimum: Option, - pub maximum: u32, -} - -impl Default for MemorySettings { - fn default() -> Self { - Self { - minimum: None, - maximum: 2048, - } - } -} - -#[derive(Serialize, Deserialize, Clone, Copy, Debug)] -pub struct WindowSize(pub u16, pub u16); - -impl Default for WindowSize { - fn default() -> Self { - Self(854, 480) - } -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct ProfileHooks { - #[serde(skip_serializing_if = "HashSet::is_empty", default)] - pub pre_launch: HashSet, - #[serde(skip_serializing_if = "Option::is_none")] - pub wrapper: Option, - #[serde(skip_serializing_if = "HashSet::is_empty", default)] - pub post_exit: HashSet, -} - -impl Default for ProfileHooks { - fn default() -> Self { - Self { - pre_launch: HashSet::::new(), - wrapper: None, - post_exit: HashSet::::new(), - } - } -} - -impl Profile { - pub async fn new( - name: String, - version: String, - path: PathBuf, - ) -> Result { - if name.trim().is_empty() { - return Err(DataError::FormatError(String::from( - "Empty name for instance!", - ))); - } - - Ok(Self { - path: path.canonicalize()?, - metadata: Metadata { - name, - icon: None, - game_version: version, - loader: ModLoader::Vanilla, - loader_version: None, - format_version: CURRENT_FORMAT_VERSION, - }, - java: None, - memory: None, - resolution: None, - hooks: None, - }) - } - - pub async fn run( - &self, - credentials: &crate::launcher::Credentials, - ) -> Result { - use crate::launcher::LauncherError; - let (settings, version_info) = tokio::try_join! { - super::Settings::get(), - super::Metadata::get() - .and_then(|manifest| async move { - let version = manifest - .minecraft - .versions - .iter() - .find(|it| it.id == self.metadata.game_version.as_ref()) - .ok_or_else(|| DataError::FormatError(format!( - "invalid or unknown version: {}", - self.metadata.game_version - )))?; - - Ok(daedalus::minecraft::fetch_version_info(version) - .await?) - }) - }?; - - let ref pre_launch_hooks = - self.hooks.as_ref().unwrap_or(&settings.hooks).pre_launch; - for hook in pre_launch_hooks.iter() { - // TODO: hook parameters - let mut cmd = hook.split(' '); - let result = Command::new(cmd.next().unwrap()) - .args(&cmd.collect::>()) - .current_dir(&self.path) - .spawn()? - .wait() - .await?; - - if !result.success() { - return Err(LauncherError::ExitError( - result.code().unwrap_or(-1), - )); - } - } - - let java_install = match self.java { - Some(JavaSettings { - install: Some(ref install), - .. - }) => install, - _ => if version_info - .java_version - .as_ref() - .filter(|it| it.major_version >= 16) - .is_some() - { - settings.java_17_path.as_ref() - } else { - settings.java_8_path.as_ref() - } - .ok_or_else(|| { - LauncherError::JavaError(format!( - "No Java installed for version {}", - version_info.java_version.map_or(8, |it| it.major_version), - )) - })?, - }; - - if !java_install.exists() { - return Err(LauncherError::JavaError(format!( - "Could not find java install: {}", - java_install.display() - ))); - } - - let java_args = &self - .java - .as_ref() - .and_then(|it| it.extra_arguments.as_ref()) - .unwrap_or(&settings.custom_java_args); - - let wrapper = self - .hooks - .as_ref() - .map_or(&settings.hooks.wrapper, |it| &it.wrapper); - - let ref memory = self.memory.unwrap_or(settings.memory); - let ref resolution = - self.resolution.unwrap_or(settings.game_resolution); - - crate::launcher::launch_minecraft( - &self.metadata.game_version, - &self.metadata.loader_version, - &self.path, - &java_install, - &java_args, - &wrapper, - memory, - resolution, - credentials, - ) - .await - } - - pub async fn kill( - &self, - running: &mut Child, - ) -> Result<(), crate::launcher::LauncherError> { - running.kill().await?; - self.wait_for(running).await - } - - pub async fn wait_for( - &self, - running: &mut Child, - ) -> Result<(), crate::launcher::LauncherError> { - let result = running.wait().await.map_err(|err| { - crate::launcher::LauncherError::ProcessError { - inner: err, - process: String::from("minecraft"), - } - })?; - - match result.success() { - false => Err(crate::launcher::LauncherError::ExitError( - result.code().unwrap_or(-1), - )), - true => Ok(()), - } - } - - // TODO: deduplicate these builder methods - // They are flat like this in order to allow builder-style usage - pub fn with_name(&mut self, name: String) -> &mut Self { - self.metadata.name = name; - self - } - - pub async fn with_icon( - &mut self, - icon: &Path, - ) -> Result<&mut Self, DataError> { - let ext = icon - .extension() - .and_then(std::ffi::OsStr::to_str) - .unwrap_or(""); - - if SUPPORTED_ICON_FORMATS.contains(&ext) { - let file_name = format!("icon.{ext}"); - fs::copy(icon, &self.path.join(&file_name)).await?; - self.metadata.icon = - Some(Path::new(&format!("./{file_name}")).to_owned()); - - Ok(self) - } else { - Err(DataError::FormatError(format!( - "Unsupported image type: {ext}" - ))) - } - } - - pub fn with_game_version(&mut self, version: String) -> &mut Self { - self.metadata.game_version = version; - self - } - - pub fn with_loader( - &mut self, - loader: ModLoader, - version: Option, - ) -> &mut Self { - self.metadata.loader = loader; - self.metadata.loader_version = version; - self - } - - pub fn with_java_settings( - &mut self, - settings: Option, - ) -> &mut Self { - self.java = settings; - self - } - - pub fn with_memory( - &mut self, - settings: Option, - ) -> &mut Self { - self.memory = settings; - self - } - - pub fn with_resolution( - &mut self, - resolution: Option, - ) -> &mut Self { - self.resolution = resolution; - self - } - - pub fn with_hooks(&mut self, hooks: Option) -> &mut Self { - self.hooks = hooks; - self - } -} - -impl Profiles { - pub async fn init() -> Result<(), DataError> { - let settings = super::Settings::get().await?; - let profiles = Arc::new(Mutex::new(HashMap::new())); - - let futures = settings.profiles.clone().into_iter().map(|path| async { - let profiles = Arc::clone(&profiles); - tokio::spawn(async move { - // TODO: handle missing profiles - let mut profiles = profiles.lock().await; - let profile = Self::read_profile_from_dir(path.clone()).await?; - - profiles.insert(path, profile); - Ok(()) as Result<_, DataError> - }) - .await - .unwrap() - }); - futures::future::try_join_all(futures).await?; - - PROFILES.get_or_init(|| { - RwLock::new(Profiles( - Arc::try_unwrap(profiles).unwrap().into_inner(), - )) - }); - Ok(()) - } - - pub async fn insert(profile: Profile) -> Result<(), DataError> { - let mut profiles = PROFILES - .get() - .ok_or_else(|| { - DataError::InitializedError(String::from("profiles")) - })? - .write() - .await; - - super::Settings::get_mut() - .await? - .profiles - .insert(profile.path.clone()); - profiles.0.insert(profile.path.clone(), profile); - Ok(()) - } - - pub async fn insert_from(path: PathBuf) -> Result<(), DataError> { - Self::read_profile_from_dir(path) - .and_then(Self::insert) - .await - } - - pub async fn remove(path: &Path) -> Result, DataError> { - let path = path.canonicalize()?; - let mut profiles = PROFILES.get().unwrap().write().await; - super::Settings::get_mut().await?.profiles.remove(&path); - Ok(profiles.0.remove(&path)) - } - - pub async fn save() -> Result<(), DataError> { - let profiles = Self::get().await?; - - let futures = profiles.0.clone().into_iter().map(|(path, profile)| { - tokio::spawn(async move { - let json = tokio::task::spawn_blocking(move || { - serde_json::to_vec_pretty(&profile) - }) - .await - .unwrap()?; - - let profile_json_path = path.join(PROFILE_JSON_PATH); - fs::write(profile_json_path, json).await?; - Ok(()) as Result<(), DataError> - }) - }); - futures::future::try_join_all(futures) - .await - .unwrap() - .into_iter() - .collect::>()?; - - Ok(()) - } - - pub async fn get<'a>() -> Result, DataError> { - Ok(PROFILES - .get() - .ok_or_else(|| DataError::InitializedError("profiles".to_string()))? - .read() - .await) - } - - async fn read_profile_from_dir( - path: PathBuf, - ) -> Result { - let json = fs::read(path.join(PROFILE_JSON_PATH)).await?; - let mut profile = serde_json::from_slice::(&json)?; - profile.path = path.clone(); - Ok(profile) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use pretty_assertions::{assert_eq, assert_str_eq}; - - #[test] - fn profile_test() -> Result<(), serde_json::Error> { - let profile = Profile { - path: PathBuf::from("/tmp/nunya/beeswax"), - metadata: Metadata { - name: String::from("Example Pack"), - icon: None, - game_version: String::from("1.18.2"), - loader: ModLoader::Vanilla, - loader_version: None, - format_version: CURRENT_FORMAT_VERSION, - }, - java: JavaSettings { - install: PathBuf::from("/usr/bin/java"), - extra_arguments: Vec::new(), - }, - memory: MemorySettings { - minimum: None, - maximum: 8192, - }, - resolution: WindowSize(1920, 1080), - hooks: ProfileHooks { - pre_launch: HashSet::new(), - wrapper: None, - post_exit: HashSet::new(), - }, - }; - let json = serde_json::json!({ - "path": "/tmp/nunya/beeswax", - "metadata": { - "name": "Example Pack", - "game_version": "1.18.2", - "format_version": 1u32, - }, - "java": { - "install": "/usr/bin/java", - }, - "memory": { - "maximum": 8192u32, - }, - "resolution": (1920u16, 1080u16), - "hooks": {}, - }); - - assert_eq!(serde_json::to_value(profile.clone())?, json.clone()); - assert_str_eq!( - format!("{:?}", serde_json::from_value::(json)?), - format!("{:?}", profile), - ); - Ok(()) - } -} diff --git a/theseus/src/data/settings.rs b/theseus/src/data/settings.rs deleted file mode 100644 index 1c33697b6..000000000 --- a/theseus/src/data/settings.rs +++ /dev/null @@ -1,124 +0,0 @@ -use super::profiles::*; -use std::{collections::HashSet, path::PathBuf}; - -use crate::{data::DataError, LAUNCHER_WORK_DIR}; -use once_cell::sync; -use serde::{Deserialize, Serialize}; -use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; - -const SETTINGS_FILE: &str = "settings.json"; -const ICONS_PATH: &str = "icons"; -const METADATA_DIR: &str = "meta"; -const SETTINGS_PATH_ENV: &str = "THESEUS_CONFIG_DIR"; - -static SETTINGS: sync::OnceCell> = sync::OnceCell::new(); -pub const FORMAT_VERSION: u32 = 1; - -#[derive(Clone, Serialize, Deserialize, Debug)] -#[serde(default)] -pub struct Settings { - pub memory: MemorySettings, - pub game_resolution: WindowSize, - pub custom_java_args: Vec, - pub java_8_path: Option, - pub java_17_path: Option, - pub hooks: ProfileHooks, - pub icon_path: PathBuf, - pub metadata_dir: PathBuf, - pub profiles: HashSet, - pub max_concurrent_downloads: usize, - pub version: u32, -} - -impl Default for Settings { - fn default() -> Self { - Self { - memory: MemorySettings::default(), - game_resolution: WindowSize::default(), - custom_java_args: Vec::new(), - java_8_path: None, - java_17_path: None, - hooks: ProfileHooks::default(), - icon_path: LAUNCHER_WORK_DIR.join(ICONS_PATH), - metadata_dir: LAUNCHER_WORK_DIR.join(METADATA_DIR), - profiles: HashSet::new(), - max_concurrent_downloads: 32, - version: FORMAT_VERSION, - } - } -} - -impl Settings { - pub async fn init() -> Result<(), DataError> { - let settings_path = std::env::var_os(SETTINGS_PATH_ENV) - .map_or(LAUNCHER_WORK_DIR.join(SETTINGS_FILE), PathBuf::from); - - if settings_path.exists() { - let settings_data = tokio::fs::read_to_string(settings_path) - .await - .map(|x| serde_json::from_str::(&x).ok()) - .ok() - .flatten(); - - if let Some(settings) = settings_data { - SETTINGS.get_or_init(|| RwLock::new(settings)); - } - } - - if SETTINGS.get().is_none() { - let new = Self::default(); - - tokio::fs::write( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - &serde_json::to_string(&new)?, - ) - .await?; - - SETTINGS.get_or_init(|| RwLock::new(new)); - } - - Ok(()) - } - - pub async fn load() -> Result<(), DataError> { - let new = serde_json::from_str::(&std::fs::read_to_string( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - )?)?; - - let mut write = SETTINGS - .get() - .ok_or_else(|| DataError::InitializedError("settings".to_string()))? - .write() - .await; - - *write = new; - - Ok(()) - } - - pub async fn save() -> Result<(), DataError> { - let settings = Self::get().await?; - - std::fs::write( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - &serde_json::to_string_pretty(&*settings)?, - )?; - - Ok(()) - } - - pub async fn get<'a>() -> Result, DataError> { - Ok(Self::get_or_uninit::<'a>()?.read().await) - } - - pub async fn get_mut<'a>() -> Result, DataError> - { - Ok(Self::get_or_uninit::<'a>()?.write().await) - } - - fn get_or_uninit<'a>() -> Result<&'a RwLock, DataError> { - SETTINGS - .get() - .ok_or_else(|| DataError::InitializedError("settings".to_string())) - } -} diff --git a/theseus/src/error.rs b/theseus/src/error.rs new file mode 100644 index 000000000..2ba5ccc82 --- /dev/null +++ b/theseus/src/error.rs @@ -0,0 +1,55 @@ +//! Theseus error type +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("Filesystem error: {0}")] + FSError(String), + + #[error("Serialization error (JSON): {0}")] + JSONError(#[from] serde_json::Error), + + #[error("Serialization error (Bincode): {0}")] + EncodeError(#[from] bincode::error::DecodeError), + + #[error("Deserialization error (Bincode): {0}")] + DecodeError(#[from] bincode::error::EncodeError), + + #[error("Database error: {0}")] + DBError(#[from] sled::Error), + + #[error("Unable to read {0} from any source")] + NoValueFor(String), + + #[error("Metadata error: {0}")] + MetadataError(#[from] daedalus::Error), + + #[error("I/O error: {0}")] + IOError(#[from] std::io::Error), + + #[error("Error launching Minecraft: {0}")] + LauncherError(String), + + #[error("Error fetching URL: {0}")] + FetchError(#[from] reqwest::Error), + + #[error("Incorrect Sha1 hash for download: {0} != {1}")] + HashError(String, String), + + #[error("Paths stored in the database need to be valid UTF-8: {0}")] + UTFError(std::path::PathBuf), + + #[error("Invalid input: {0}")] + InputError(String), + + #[error( + "Tried to access unloaded profile {0}, loading it probably failed" + )] + UnloadedProfileError(String), + + #[error("Profile {0} is not managed by Theseus!")] + UnmanagedProfileError(String), + + #[error("Error: {0}")] + OtherError(String), +} + +pub type Result = core::result::Result; diff --git a/theseus/src/launcher/args.rs b/theseus/src/launcher/args.rs index 1a444d540..4fadcb146 100644 --- a/theseus/src/launcher/args.rs +++ b/theseus/src/launcher/args.rs @@ -1,32 +1,29 @@ -use crate::data::profiles::*; -use crate::launcher::auth::provider::Credentials; -use crate::launcher::rules::parse_rules; -use crate::launcher::LauncherError; -use daedalus::get_path_from_artifact; -use daedalus::minecraft::{Argument, ArgumentValue, Library, Os, VersionType}; -use daedalus::modded::SidedDataEntry; -use std::collections::HashMap; +//! Minecraft CLI argument logic +// TODO: Rafactor this section +use super::{auth::Credentials, parse_rule}; +use crate::{ + state::{MemorySettings, WindowSize}, + util::platform::classpath_separator, +}; +use daedalus::{ + get_path_from_artifact, + minecraft::{Argument, ArgumentValue, Library, VersionType}, + modded::SidedDataEntry, +}; use std::io::{BufRead, BufReader}; -use std::path::Path; +use std::{collections::HashMap, path::Path}; use uuid::Uuid; -fn get_cp_separator() -> &'static str { - match super::download::get_os() { - Os::Osx | Os::Linux | Os::Unknown => ":", - Os::Windows => ";", - } -} - pub fn get_class_paths( libraries_path: &Path, libraries: &[Library], client_path: &Path, -) -> Result { - let mut class_paths = libraries +) -> crate::Result { + let mut cps = libraries .iter() .filter_map(|library| { if let Some(rules) = &library.rules { - if !super::rules::parse_rules(rules.as_slice()) { + if !rules.iter().all(parse_rule) { return None; } } @@ -39,10 +36,11 @@ pub fn get_class_paths( }) .collect::, _>>()?; - class_paths.push( - crate::util::absolute_path(&client_path) + cps.push( + client_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified class path {} does not exist", client_path.to_string_lossy() )) @@ -51,44 +49,35 @@ pub fn get_class_paths( .to_string(), ); - Ok(class_paths.join(get_cp_separator())) + Ok(cps.join(classpath_separator())) } pub fn get_class_paths_jar>( libraries_path: &Path, libraries: &[T], -) -> Result { - let class_paths = libraries +) -> crate::Result { + let cps = libraries .iter() .map(|library| get_lib_path(libraries_path, library.as_ref())) .collect::, _>>()?; - Ok(class_paths.join(get_cp_separator())) + Ok(cps.join(classpath_separator())) } -pub fn get_lib_path(libraries_path: &Path, lib: &str) -> Result { +pub fn get_lib_path(libraries_path: &Path, lib: &str) -> crate::Result { let mut path = libraries_path.to_path_buf(); path.push(get_path_from_artifact(lib.as_ref())?); - let path = crate::util::absolute_path(&path).map_err(|_| { - LauncherError::InvalidInput(format!( + let path = &path.canonicalize().map_err(|_| { + crate::Error::LauncherError(format!( "Library file at path {} does not exist", path.to_string_lossy() )) })?; - /*if !path.exists() { - if let Some(parent) = &path.parent() { - std::fs::create_dir_all(parent)?; - } - - std::fs::File::create(&path)?; - }*/ - Ok(path.to_string_lossy().to_string()) } - pub fn get_jvm_arguments( arguments: Option<&[Argument]>, natives_path: &Path, @@ -97,7 +86,7 @@ pub fn get_jvm_arguments( version_name: &str, memory: MemorySettings, custom_args: Vec, -) -> Result, LauncherError> { +) -> crate::Result> { let mut parsed_arguments = Vec::new(); if let Some(args) = arguments { @@ -113,8 +102,9 @@ pub fn get_jvm_arguments( } else { parsed_arguments.push(format!( "-Djava.library.path={}", - &crate::util::absolute_path(natives_path) - .map_err(|_| LauncherError::InvalidInput(format!( + &natives_path + .canonicalize() + .map_err(|_| crate::Error::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() )))? @@ -144,14 +134,15 @@ fn parse_jvm_argument( libraries_path: &Path, class_paths: &str, version_name: &str, -) -> Result { +) -> crate::Result { argument.retain(|c| !c.is_whitespace()); Ok(argument .replace( "${natives_directory}", - &crate::util::absolute_path(natives_path) + &natives_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() )) @@ -160,9 +151,10 @@ fn parse_jvm_argument( ) .replace( "${library_directory}", - &crate::util::absolute_path(libraries_path) + &libraries_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified libraries path {} does not exist", libraries_path.to_string_lossy() )) @@ -170,7 +162,7 @@ fn parse_jvm_argument( .to_string_lossy() .to_string(), ) - .replace("${classpath_separator}", get_cp_separator()) + .replace("${classpath_separator}", classpath_separator()) .replace("${launcher_name}", "theseus") .replace("${launcher_version}", env!("CARGO_PKG_VERSION")) .replace("${version_name}", version_name) @@ -188,7 +180,7 @@ pub fn get_minecraft_arguments( assets_directory: &Path, version_type: &VersionType, resolution: WindowSize, -) -> Result, LauncherError> { +) -> crate::Result> { if let Some(arguments) = arguments { let mut parsed_arguments = Vec::new(); @@ -242,7 +234,7 @@ fn parse_minecraft_argument( assets_directory: &Path, version_type: &VersionType, resolution: WindowSize, -) -> Result { +) -> crate::Result { Ok(argument .replace("${auth_access_token}", access_token) .replace("${auth_session}", access_token) @@ -254,9 +246,10 @@ fn parse_minecraft_argument( .replace("${assets_index_name}", asset_index_name) .replace( "${game_directory}", - &crate::util::absolute_path(game_directory) + &game_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified game directory {} does not exist", game_directory.to_string_lossy() )) @@ -266,9 +259,10 @@ fn parse_minecraft_argument( ) .replace( "${assets_root}", - &crate::util::absolute_path(assets_directory) + &assets_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) @@ -278,9 +272,10 @@ fn parse_minecraft_argument( ) .replace( "${game_assets}", - &crate::util::absolute_path(assets_directory) + &assets_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::Error::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) @@ -297,9 +292,9 @@ fn parse_arguments( arguments: &[Argument], parsed_arguments: &mut Vec, parse_function: F, -) -> Result<(), LauncherError> +) -> crate::Result<()> where - F: Fn(&str) -> Result, + F: Fn(&str) -> crate::Result, { for argument in arguments { match argument { @@ -311,7 +306,7 @@ where } } Argument::Ruled { rules, value } => { - if parse_rules(rules.as_slice()) { + if rules.iter().all(parse_rule) { match value { ArgumentValue::Single(arg) => { parsed_arguments.push(parse_function(arg)?); @@ -334,7 +329,7 @@ pub fn get_processor_arguments>( libraries_path: &Path, arguments: &[T], data: &HashMap, -) -> Result, LauncherError> { +) -> crate::Result> { let mut new_arguments = Vec::new(); for argument in arguments { @@ -342,7 +337,10 @@ pub fn get_processor_arguments>( if argument.as_ref().starts_with('{') { if let Some(entry) = data.get(trimmed_arg) { new_arguments.push(if entry.client.starts_with('[') { - get_lib_path(libraries_path, &entry.client[1..entry.client.len() - 1])? + get_lib_path( + libraries_path, + &entry.client[1..entry.client.len() - 1], + )? } else { entry.client.clone() }) @@ -357,15 +355,23 @@ pub fn get_processor_arguments>( Ok(new_arguments) } -pub async fn get_processor_main_class(path: String) -> Result, LauncherError> { +pub async fn get_processor_main_class( + path: String, +) -> crate::Result> { Ok(tokio::task::spawn_blocking(move || { let zipfile = std::fs::File::open(&path)?; let mut archive = zip::ZipArchive::new(zipfile).map_err(|_| { - LauncherError::ProcessorError(format!("Cannot read processor at {}", path)) + crate::Error::LauncherError(format!( + "Cannot read processor at {}", + path + )) })?; let file = archive.by_name("META-INF/MANIFEST.MF").map_err(|_| { - LauncherError::ProcessorError(format!("Cannot read processor manifest at {}", path)) + crate::Error::LauncherError(format!( + "Cannot read processor manifest at {}", + path + )) })?; let reader = BufReader::new(file); @@ -381,7 +387,8 @@ pub async fn get_processor_main_class(path: String) -> Result, La } } - Ok::, LauncherError>(None) + Ok::, crate::Error>(None) }) - .await??) + .await + .unwrap()?) } diff --git a/theseus/src/launcher/auth.rs b/theseus/src/launcher/auth.rs index 909eb5d27..d05595754 100644 --- a/theseus/src/launcher/auth.rs +++ b/theseus/src/launcher/auth.rs @@ -1,205 +1,8 @@ -pub mod api { - use serde::{Deserialize, Serialize}; - use uuid::Uuid; - - #[derive(Debug, Serialize, Deserialize)] - pub struct GameProfile { - pub id: Uuid, - pub name: String, - } - - #[derive(Debug, Deserialize)] - pub struct UserProperty { - pub name: String, - pub value: String, - } - - #[derive(Debug, Deserialize)] - pub struct User { - pub id: String, - pub username: String, - pub properties: Option>, - } - - #[derive(Debug, Deserialize)] - #[serde(rename_all = "camelCase")] - pub struct AuthenticateResponse { - pub user: Option, - pub client_token: Uuid, - pub access_token: String, - pub available_profiles: Vec, - pub selected_profile: Option, - } - - pub async fn login( - username: &str, - password: &str, - request_user: bool, - ) -> Result { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/authenticate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "agent": { - "name": "Minecraft", - "version": 1 - }, - "username": username, - "password": password, - "clientToken": Uuid::new_v4(), - "requestUser": request_user - } - ) - .to_string(), - ) - .send() - .await? - .json() - .await - } - - pub async fn sign_out(username: &str, password: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/signout") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "username": username, - "password": password - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - pub async fn validate(access_token: &str, client_token: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/validate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - pub async fn invalidate(access_token: &str, client_token: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/invalidate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - #[derive(Debug, Deserialize)] - #[serde(rename_all = "camelCase")] - pub struct RefreshResponse { - pub user: Option, - pub client_token: Uuid, - pub access_token: String, - pub selected_profile: Option, - } - - pub async fn refresh( - access_token: &str, - client_token: &str, - selected_profile: &GameProfile, - request_user: bool, - ) -> Result { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/refresh") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token, - "selectedProfile": { - "id": selected_profile.id, - "name": selected_profile.name, - }, - "requestUser": request_user, - } - ) - .to_string(), - ) - .send() - .await? - .json() - .await - } -} - -pub mod provider { - use crate::launcher::auth::api::login; - use crate::launcher::LauncherError; - use uuid::Uuid; - - #[derive(Debug)] - /// The credentials of a user - pub struct Credentials { - /// The user UUID the credentials belong to - pub id: Uuid, - /// The username of the user - pub username: String, - /// The access token associated with the credentials - pub access_token: String, - } - - impl Credentials { - /// Gets a credentials instance from a user's login - pub async fn from_login(username: &str, password: &str) -> Result { - let login = - login(username, password, true) - .await - .map_err(|err| LauncherError::FetchError { - inner: err, - item: "authentication credentials".to_string(), - })?; - - let profile = login.selected_profile.unwrap(); - - Ok(Credentials { - id: profile.id, - username: profile.name, - access_token: login.access_token, - }) - } - } +//! Authentication flow +// TODO: Implement authentication +#[derive(Debug)] +pub struct Credentials { + pub id: uuid::Uuid, + pub username: String, + pub access_token: String, } diff --git a/theseus/src/launcher/download.rs b/theseus/src/launcher/download.rs index 0e0794e3c..224594757 100644 --- a/theseus/src/launcher/download.rs +++ b/theseus/src/launcher/download.rs @@ -1,362 +1,282 @@ +//! Downloader for Minecraft data + use crate::{ - data::{DataError, Settings}, - launcher::LauncherError, + state::State, + util::{fetch::*, platform::OsExt}, }; -use daedalus::get_path_from_artifact; -use daedalus::minecraft::{ - fetch_assets_index, fetch_version_info, Asset, AssetsIndex, DownloadType, - Library, Os, Version, VersionInfo, -}; -use daedalus::modded::{ - fetch_partial_version, merge_partial_version, LoaderVersion, -}; -use futures::future; -use std::path::Path; -use std::time::Duration; -use tokio::{ - fs::File, - io::AsyncWriteExt, - sync::{OnceCell, Semaphore}, +use daedalus::{ + self as d, + minecraft::{ + Asset, AssetsIndex, Library, Os, Version as GameVersion, + VersionInfo as GameVersionInfo, + }, + modded::LoaderVersion, }; +use futures::prelude::*; +use std::sync::Arc; +use tokio::{fs, sync::OnceCell}; -static DOWNLOADS_SEMAPHORE: OnceCell = OnceCell::const_new(); +pub async fn download_minecraft( + st: &State, + version: &GameVersionInfo, +) -> crate::Result<()> { + log::info!("Downloading Minecraft version {}", version.id); + let assets_index = download_assets_index(st, version).await?; -pub async fn init() -> Result<(), DataError> { - DOWNLOADS_SEMAPHORE - .get_or_try_init(|| async { - let settings = Settings::get().await?; - Ok::<_, DataError>(Semaphore::new( - settings.max_concurrent_downloads, - )) - }) - .await?; + tokio::try_join! { + download_client(st, version), + download_assets(st, version.assets == "legacy", &assets_index), + download_libraries(st, version.libraries.as_slice(), &version.id) + }?; + log::info!("Done downloading Minecraft!"); Ok(()) } pub async fn download_version_info( - client_path: &Path, - version: &Version, - loader_version: Option<&LoaderVersion>, -) -> Result { - let id = match loader_version { - Some(x) => &x.id, - None => &version.id, - }; + st: &State, + version: &GameVersion, + loader: Option<&LoaderVersion>, +) -> crate::Result { + let version_id = loader.map_or(&version.id, |it| &it.id); + log::debug!("Loading version info for Minecraft {version_id}"); + let path = st + .directories + .version_dir(version_id) + .join(format!("{version_id}.json")); - let mut path = client_path.join(id); - path.push(&format!("{id}.json")); - - if path.exists() { - let contents = std::fs::read_to_string(path)?; - Ok(serde_json::from_str(&contents)?) + let res = if path.exists() { + fs::read(path) + .err_into::() + .await + .and_then(|ref it| Ok(serde_json::from_slice(it)?)) } else { - let mut info = fetch_version_info(version).await?; + log::info!("Downloading version info for version {}", &version.id); + let mut info = d::minecraft::fetch_version_info(version).await?; - if let Some(loader_version) = loader_version { - let partial = fetch_partial_version(&loader_version.url).await?; - info = merge_partial_version(partial, info); - info.id = loader_version.id.clone(); + if let Some(loader) = loader { + let partial = d::modded::fetch_partial_version(&loader.url).await?; + info = d::modded::merge_partial_version(partial, info); + info.id = loader.id.clone(); } - let info_s = serde_json::to_string(&info)?; - save_file(&path, &bytes::Bytes::from(info_s)).await?; + let permit = st.io_semaphore.acquire().await.unwrap(); + write(&path, &serde_json::to_vec(&info)?, &permit).await?; Ok(info) - } + }?; + + log::debug!("Loaded version info for Minecraft {version_id}"); + Ok(res) } pub async fn download_client( - client_path: &Path, - version_info: &VersionInfo, -) -> Result<(), LauncherError> { - let version = &version_info.id; + st: &State, + version_info: &GameVersionInfo, +) -> crate::Result<()> { + let ref version = version_info.id; + log::debug!("Locating client for version {version}"); let client_download = version_info .downloads - .get(&DownloadType::Client) - .ok_or_else(|| { - LauncherError::InvalidInput(format!( - "Version {version} does not have any client downloads" - )) - })?; + .get(&d::minecraft::DownloadType::Client) + .ok_or(crate::Error::LauncherError(format!( + "No client downloads exist for version {version}" + )))?; + let path = st + .directories + .version_dir(version) + .join(format!("{version}.jar")); - let mut path = client_path.join(version); - path.push(&format!("{version}.jar")); + if !path.exists() { + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = + fetch(&client_download.url, Some(&client_download.sha1), &permit) + .await?; + write(&path, &bytes, &permit).await?; + log::info!("Fetched client version {version}"); + } - save_and_download_file( - &path, - &client_download.url, - Some(&client_download.sha1), - ) - .await?; + log::debug!("Client loaded for version {version}!"); Ok(()) } pub async fn download_assets_index( - assets_path: &Path, - version: &VersionInfo, -) -> Result { - let path = - assets_path.join(format!("indexes/{}.json", &version.asset_index.id)); + st: &State, + version: &GameVersionInfo, +) -> crate::Result { + log::debug!("Loading assets index"); + let path = st + .directories + .assets_index_dir() + .join(format!("{}.json", &version.asset_index.id)); - if path.exists() { - let content = std::fs::read_to_string(path)?; - Ok(serde_json::from_str(&content)?) + let res = if path.exists() { + fs::read(path) + .err_into::() + .await + .and_then(|ref it| Ok(serde_json::from_slice(it)?)) } else { - let index = fetch_assets_index(version).await?; - - save_file(&path, &bytes::Bytes::from(serde_json::to_string(&index)?)) - .await?; - + let index = d::minecraft::fetch_assets_index(version).await?; + let permit = st.io_semaphore.acquire().await.unwrap(); + write(&path, &serde_json::to_vec(&index)?, &permit).await?; + log::info!("Fetched assets index"); Ok(index) - } + }?; + + log::debug!("Assets index successfully loaded!"); + Ok(res) } pub async fn download_assets( - assets_path: &Path, - legacy_path: Option<&Path>, + st: &State, + with_legacy: bool, index: &AssetsIndex, -) -> Result<(), LauncherError> { - future::join_all(index.objects.iter().map(|(name, asset)| { - download_asset(assets_path, legacy_path, name, asset) - })) - .await - .into_iter() - .collect::, LauncherError>>()?; +) -> crate::Result<()> { + log::debug!("Loading assets"); - Ok(()) -} + stream::iter(index.objects.iter()) + .map(Ok::<(&String, &Asset), crate::Error>) + .try_for_each_concurrent(None, |(name, asset)| async move { + let ref hash = asset.hash; + let resource_path = st.directories.object_dir(hash); + let url = format!( + "https://resources.download.minecraft.net/{sub_hash}/{hash}", + sub_hash = &hash[..2] + ); -async fn download_asset( - assets_path: &Path, - legacy_path: Option<&Path>, - name: &str, - asset: &Asset, -) -> Result<(), LauncherError> { - let hash = &asset.hash; - let sub_hash = &hash[..2]; + let fetch_cell = OnceCell::::new(); + tokio::try_join! { + async { + if !resource_path.exists() { + let permit = st.io_semaphore.acquire().await.unwrap(); + let resource = fetch_cell + .get_or_try_init(|| fetch(&url, Some(hash), &permit)) + .await?; + write(&resource_path, &resource, &permit).await?; + log::info!("Fetched asset with hash {hash}"); + } + Ok::<_, crate::Error>(()) + }, + async { + if with_legacy { + let permit = st.io_semaphore.acquire().await.unwrap(); + let resource = fetch_cell + .get_or_try_init(|| fetch(&url, Some(hash), &permit)) + .await?; + let resource_path = st.directories.legacy_assets_dir().join( + name.replace('/', &String::from(std::path::MAIN_SEPARATOR)) + ); + write(&resource_path, &resource, &permit).await?; + log::info!("Fetched legacy asset with hash {hash}"); + } + Ok::<_, crate::Error>(()) + }, + }?; - let mut resource_path = assets_path.join("objects"); - resource_path.push(sub_hash); - resource_path.push(hash); - - let url = - format!("https://resources.download.minecraft.net/{sub_hash}/{hash}"); - - let resource = - save_and_download_file(&resource_path, &url, Some(hash)).await?; - - if let Some(legacy_path) = legacy_path { - let resource_path = legacy_path - .join(name.replace('/', &std::path::MAIN_SEPARATOR.to_string())); - save_file(resource_path.as_path(), &resource).await?; - } + log::debug!("Loaded asset with hash {hash}"); + Ok(()) + }).await?; + log::debug!("Done loading assets!"); Ok(()) } pub async fn download_libraries( - libraries_path: &Path, - natives_path: &Path, + st: &State, libraries: &[Library], -) -> Result<(), LauncherError> { - future::join_all(libraries.iter().map(|library| { - download_library(libraries_path, natives_path, library) - })) - .await - .into_iter() - .collect::, LauncherError>>()?; + version: &str, +) -> crate::Result<()> { + log::debug!("Loading libraries"); + let (libraries_dir, natives_dir) = ( + Arc::new(st.directories.libraries_dir()), + Arc::new(st.directories.version_natives_dir(version)), + ); - Ok(()) -} + tokio::try_join! { + fs::create_dir_all(st.directories.libraries_dir()), + fs::create_dir_all(st.directories.version_natives_dir(version)) + }?; -async fn download_library( - libraries_path: &Path, - natives_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - if let Some(rules) = &library.rules { - if !super::rules::parse_rules(rules) { - return Ok(()); - } - } + stream::iter(libraries.iter()) + .map(Ok::<&Library, crate::Error>) + .try_for_each_concurrent(None, |library| async move { + if let Some(rules) = &library.rules { + if !rules.iter().all(super::parse_rule) { + return Ok(()); + } + } + tokio::try_join! { + async { + let artifact_path = d::get_path_from_artifact(&library.name)?; + let path = st.directories.libraries_dir().join(&artifact_path); - future::try_join( - download_library_jar(libraries_path, library), - download_native(natives_path, library), - ) - .await?; + match library.downloads { + _ if path.exists() => Ok(()), + Some(d::minecraft::LibraryDownloads { + artifact: Some(ref artifact), + .. + }) => { + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = fetch(&artifact.url, Some(&artifact.sha1), &permit) + .await?; + write(&path, &bytes, &permit).await?; + log::info!("Fetched library {}", &library.name); + Ok::<_, crate::Error>(()) + } + None => { + let url = [ + library + .url + .as_deref() + .unwrap_or("https://libraries.minecraft.net"), + &artifact_path + ].concat(); - Ok(()) -} + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = fetch(&url, None, &permit).await?; + write(&path, &bytes, &permit).await?; + log::info!("Fetched library {}", &library.name); + Ok::<_, crate::Error>(()) + } + _ => Ok(()) + } + }, + async { + // HACK: pseudo try block using or else + if let Some((os_key, classifiers)) = None.or_else(|| Some(( + library + .natives + .as_ref()? + .get(&Os::native())?, + library + .downloads + .as_ref()? + .classifiers + .as_ref()? + ))) { + let parsed_key = os_key.replace( + "${arch}", + crate::util::platform::ARCH_WIDTH, + ); -async fn download_library_jar( - libraries_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - let artifact_path = get_path_from_artifact(&library.name)?; - let path = libraries_path.join(&artifact_path); - - if let Some(downloads) = &library.downloads { - if let Some(library) = &downloads.artifact { - save_and_download_file(&path, &library.url, Some(&library.sha1)) - .await?; - } - } else { - let url = format!( - "{}{artifact_path}", - library - .url - .as_deref() - .unwrap_or("https://libraries.minecraft.net/"), - ); - save_and_download_file(&path, &url, None).await?; - } - - Ok(()) -} - -async fn download_native( - natives_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - use daedalus::minecraft::LibraryDownload; - use std::collections::HashMap; - - // Try blocks in stable Rust when? - let optional_cascade = - || -> Option<(&String, &HashMap)> { - let os_key = library.natives.as_ref()?.get(&get_os())?; - let classifiers = - library.downloads.as_ref()?.classifiers.as_ref()?; - Some((os_key, classifiers)) - }; - - if let Some((os_key, classifiers)) = optional_cascade() { - #[cfg(target_pointer_width = "64")] - let parsed_key = os_key.replace("${arch}", "64"); - #[cfg(target_pointer_width = "32")] - let parsed_key = os_key.replace("${arch}", "32"); - - if let Some(native) = classifiers.get(&parsed_key) { - let file = download_file(&native.url, Some(&native.sha1)).await?; - - let reader = std::io::Cursor::new(&file); - - let mut archive = zip::ZipArchive::new(reader).unwrap(); - archive.extract(natives_path).unwrap(); - } - } - Ok(()) -} - -async fn save_and_download_file( - path: &Path, - url: &str, - sha1: Option<&str>, -) -> Result { - match std::fs::read(path) { - Ok(bytes) => Ok(bytes::Bytes::from(bytes)), - Err(_) => { - let file = download_file(url, sha1).await?; - save_file(path, &file).await?; - Ok(file) - } - } -} - -async fn save_file(path: &Path, bytes: &bytes::Bytes) -> std::io::Result<()> { - let _save_permit = DOWNLOADS_SEMAPHORE - .get() - .expect("File operation semaphore not initialized!") - .acquire() - .await - .unwrap(); - if let Some(parent) = path.parent() { - tokio::fs::create_dir_all(parent).await?; - } - - let mut file = File::create(path).await?; - file.write_all(bytes).await?; - Ok(()) -} - -pub fn get_os() -> Os { - match std::env::consts::OS { - "windows" => Os::Windows, - "macos" => Os::Osx, - "linux" => Os::Linux, - _ => Os::Unknown, - } -} - -pub async fn download_file( - url: &str, - sha1: Option<&str>, -) -> Result { - let _download_permit = DOWNLOADS_SEMAPHORE - .get() - .expect("File operation semaphore not initialized!") - .acquire() - .await - .unwrap(); - - let client = reqwest::Client::builder() - .tcp_keepalive(Some(Duration::from_secs(10))) - .build() - .map_err(|err| LauncherError::FetchError { - inner: err, - item: url.to_string(), - })?; - - for attempt in 1..=4 { - let result = client.get(url).send().await; - - match result { - Ok(x) => { - let bytes = x.bytes().await; - - if let Ok(bytes) = bytes { - if let Some(sha1) = sha1 { - if &get_hash(bytes.clone()).await? != sha1 { - if attempt <= 3 { - continue; - } else { - return Err(LauncherError::ChecksumFailure { - hash: sha1.to_string(), - url: url.to_string(), - tries: attempt, - }); - } + if let Some(native) = classifiers.get(&parsed_key) { + let permit = st.io_semaphore.acquire().await.unwrap(); + let data = fetch(&native.url, Some(&native.sha1), &permit).await?; + let reader = std::io::Cursor::new(&data); + let mut archive = zip::ZipArchive::new(reader).unwrap(); + archive.extract(&st.directories.version_natives_dir(version)).unwrap(); + log::info!("Fetched native {}", &library.name); } } - return Ok(bytes); - } else if attempt <= 3 { - continue; - } else if let Err(err) = bytes { - return Err(LauncherError::FetchError { - inner: err, - item: url.to_string(), - }); + Ok(()) } - } - Err(_) if attempt <= 3 => continue, - Err(err) => { - return Err(LauncherError::FetchError { - inner: err, - item: url.to_string(), - }) - } + }?; + + log::debug!("Loaded library {}", library.name); + Ok(()) } - } - unreachable!() -} + ).await?; -/// Computes a checksum of the input bytes -async fn get_hash(bytes: bytes::Bytes) -> Result { - let hash = - tokio::task::spawn_blocking(|| sha1::Sha1::from(bytes).hexdigest()) - .await?; - - Ok(hash) + log::debug!("Done loading libraries!"); + Ok(()) } diff --git a/theseus/src/launcher/mod.rs b/theseus/src/launcher/mod.rs index 2d54c5339..93da54c32 100644 --- a/theseus/src/launcher/mod.rs +++ b/theseus/src/launcher/mod.rs @@ -1,205 +1,116 @@ -use daedalus::minecraft::{ArgumentType, VersionInfo}; -use daedalus::modded::LoaderVersion; -use serde::{Deserialize, Serialize}; +//! Logic for launching Minecraft +use crate::state as st; +use daedalus as d; use std::{path::Path, process::Stdio}; -use thiserror::Error; use tokio::process::{Child, Command}; -pub use crate::launcher::auth::provider::Credentials; - mod args; -pub mod auth; + +mod auth; +pub use auth::Credentials; + mod download; -mod rules; -pub(crate) use download::init as init_download_semaphore; +pub fn parse_rule(rule: &d::minecraft::Rule) -> bool { + use d::minecraft::{Rule, RuleAction}; -#[derive(Error, Debug)] -pub enum LauncherError { - #[error("Failed to validate file checksum at url {url} with hash {hash} after {tries} tries")] - ChecksumFailure { - hash: String, - url: String, - tries: u32, - }, + let res = match rule { + Rule { + os: Some(ref os), .. + } => crate::util::platform::os_rule(os), + Rule { + features: Some(ref features), + .. + } => features.has_demo_resolution.unwrap_or(false), + _ => true, + }; - #[error("Failed to run processor: {0}")] - ProcessorError(String), - - #[error("Invalid input: {0}")] - InvalidInput(String), - - #[error("Error while managing asynchronous tasks")] - TaskError(#[from] tokio::task::JoinError), - - #[error("Error while reading/writing to the disk: {0}")] - IoError(#[from] std::io::Error), - - #[error("Error while spawning child process {process}")] - ProcessError { - inner: std::io::Error, - process: String, - }, - - #[error("Error while deserializing JSON")] - SerdeError(#[from] serde_json::Error), - - #[error("Unable to fetch {item}")] - FetchError { inner: reqwest::Error, item: String }, - - #[error("{0}")] - ParseError(String), - - #[error("Error while fetching metadata: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Error while reading metadata: {0}")] - MetaError(#[from] crate::data::DataError), - - #[error("Java error: {0}")] - JavaError(String), - - #[error("Command exited with non-zero exit code: {0}")] - ExitError(i32), -} - -// TODO: this probably should be in crate::data -#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)] -#[serde(rename_all = "lowercase")] -pub enum ModLoader { - Vanilla, - Forge, - Fabric, -} - -impl Default for ModLoader { - fn default() -> Self { - ModLoader::Vanilla + match rule.action { + RuleAction::Allow => res, + RuleAction::Disallow => !res, } } -impl std::fmt::Display for ModLoader { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let repr = match self { - &Self::Vanilla => "Vanilla", - &Self::Forge => "Forge", - &Self::Fabric => "Fabric", - }; - - f.write_str(repr) +macro_rules! processor_rules { + ($dest:expr; $($name:literal : client => $client:expr, server => $server:expr;)+) => { + $(std::collections::HashMap::insert( + $dest, + String::from($name), + daedalus::modded::SidedDataEntry { + client: String::from($client), + server: String::from($server), + }, + );)+ } } pub async fn launch_minecraft( game_version: &str, - loader_version: &Option, - root_dir: &Path, - java: &Path, - java_args: &Vec, + loader_version: &Option, + instance_path: &Path, + java_install: &Path, + java_args: &[String], wrapper: &Option, - memory: &crate::data::profiles::MemorySettings, - resolution: &crate::data::profiles::WindowSize, - credentials: &Credentials, -) -> Result { - let (metadata, settings) = futures::try_join! { - crate::data::Metadata::get(), - crate::data::Settings::get(), - }?; - let root_dir = root_dir.canonicalize()?; - let metadata_dir = &settings.metadata_dir; + memory: &st::MemorySettings, + resolution: &st::WindowSize, + credentials: &auth::Credentials, +) -> crate::Result { + let state = st::State::get().await?; + let instance_path = instance_path.canonicalize()?; - let ( - versions_path, - libraries_path, - assets_path, - legacy_assets_path, - natives_path, - ) = ( - metadata_dir.join("versions"), - metadata_dir.join("libraries"), - metadata_dir.join("assets"), - metadata_dir.join("resources"), - metadata_dir.join("natives"), - ); - - let version = metadata + let version = state + .metadata .minecraft .versions .iter() .find(|it| it.id == game_version) - .ok_or_else(|| { - LauncherError::InvalidInput(format!( - "Invalid game version: {game_version}", - )) - })?; + .ok_or(crate::Error::LauncherError(format!( + "Invalid game version: {game_version}" + )))?; let version_jar = loader_version .as_ref() .map_or(version.id.clone(), |it| it.id.clone()); - let mut version = download::download_version_info( - &versions_path, - version, + let mut version_info = download::download_version_info( + &state, + &version, loader_version.as_ref(), ) .await?; - let client_path = versions_path - .join(&version.id) - .join(format!("{}.jar", &version_jar)); - let version_natives_path = natives_path.join(&version.id); + let client_path = state + .directories + .version_dir(&version.id) + .join(format!("{version_jar}.jar")); - download_minecraft( - &version, - &versions_path, - &assets_path, - &legacy_assets_path, - &libraries_path, - &version_natives_path, - ) - .await?; + download::download_minecraft(&state, &version_info).await?; + st::State::sync().await?; - if let Some(processors) = &version.processors { - if let Some(ref mut data) = version.data { - data.insert( - "SIDE".to_string(), - daedalus::modded::SidedDataEntry { - client: "client".to_string(), - server: "".to_string(), - }, - ); - data.insert( - "MINECRAFT_JAR".to_string(), - daedalus::modded::SidedDataEntry { - client: client_path.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); - data.insert( - "MINECRAFT_VERSION".to_string(), - daedalus::modded::SidedDataEntry { - client: game_version.to_string(), - server: "".to_string(), - }, - ); - data.insert( - "ROOT".to_string(), - daedalus::modded::SidedDataEntry { - client: root_dir.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); - data.insert( - "LIBRARY_DIR".to_string(), - daedalus::modded::SidedDataEntry { - client: libraries_path.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); + if let Some(processors) = &version_info.processors { + if let Some(ref mut data) = version_info.data { + processor_rules! { + data; + "SIDE": + client => "client", + server => ""; + "MINECRAFT_JAR" : + client => client_path.to_string_lossy(), + server => ""; + "MINECRAFT_VERSION": + client => game_version, + server => ""; + "ROOT": + client => instance_path.to_string_lossy(), + server => ""; + "LIBRARY_DIR": + client => state.directories.libraries_dir().to_string_lossy(), + server => ""; + } for processor in processors { if let Some(sides) = &processor.sides { - if !sides.contains(&"client".to_string()) { + if !sides.contains(&String::from("client")) { continue; } } @@ -209,120 +120,93 @@ pub async fn launch_minecraft( let child = Command::new("java") .arg("-cp") - .arg(args::get_class_paths_jar(&libraries_path, &cp)?) + .arg(args::get_class_paths_jar( + &state.directories.libraries_dir(), + &cp, + )?) .arg( args::get_processor_main_class(args::get_lib_path( - &libraries_path, + &state.directories.libraries_dir(), &processor.jar, )?) .await? .ok_or_else(|| { - LauncherError::ProcessorError(format!( + crate::Error::LauncherError(format!( "Could not find processor main class for {}", processor.jar )) })?, ) .args(args::get_processor_arguments( - &libraries_path, + &state.directories.libraries_dir(), &processor.args, data, )?) .output() .await - .map_err(|err| LauncherError::ProcessError { - inner: err, - process: "java".to_string(), + .map_err(|err| { + crate::Error::LauncherError(format!( + "Error running processor: {err}", + )) })?; if !child.status.success() { - return Err(LauncherError::ProcessorError( - String::from_utf8_lossy(&child.stderr).to_string(), - )); + return Err(crate::Error::LauncherError(format!( + "Processor error: {}", + String::from_utf8_lossy(&child.stderr) + ))); } } } } - let arguments = version.arguments.clone().unwrap_or_default(); + let args = version_info.arguments.clone().unwrap_or_default(); let mut command = match wrapper { Some(hook) => { let mut cmd = Command::new(hook); - cmd.arg(java); + cmd.arg(java_install); cmd } - None => Command::new(java.to_string_lossy().to_string()), + None => Command::new(String::from(java_install.to_string_lossy())), }; command .args(args::get_jvm_arguments( - arguments.get(&ArgumentType::Jvm).map(|x| x.as_slice()), - &version_natives_path, - &libraries_path, + args.get(&d::minecraft::ArgumentType::Jvm) + .map(|x| x.as_slice()), + &state.directories.version_natives_dir(&version.id), + &state.directories.libraries_dir(), &args::get_class_paths( - &libraries_path, - version.libraries.as_slice(), + &state.directories.libraries_dir(), + version_info.libraries.as_slice(), &client_path, )?, &version_jar, *memory, - java_args.clone(), + Vec::from(java_args), )?) - .arg(version.main_class.clone()) + .arg(version_info.main_class.clone()) .args(args::get_minecraft_arguments( - arguments.get(&ArgumentType::Game).map(|x| x.as_slice()), - version.minecraft_arguments.as_deref(), + args.get(&d::minecraft::ArgumentType::Game) + .map(|x| x.as_slice()), + version_info.minecraft_arguments.as_deref(), credentials, &version.id, - &version.asset_index.id, - &root_dir, - &assets_path, + &version_info.asset_index.id, + &instance_path, + &state.directories.assets_dir(), &version.type_, *resolution, )?) - .current_dir(root_dir.clone()) + .current_dir(instance_path.clone()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()); - command.spawn().map_err(|err| LauncherError::ProcessError { - inner: err, - process: format!("minecraft-{} @ {}", &version.id, root_dir.display()), + command.spawn().map_err(|err| { + crate::Error::LauncherError(format!( + "Error running Minecraft (minecraft-{} @ {}): {err}", + &version.id, + instance_path.display() + )) }) } - -pub async fn download_minecraft( - version: &VersionInfo, - versions_dir: &Path, - assets_dir: &Path, - legacy_assets_dir: &Path, - libraries_dir: &Path, - natives_dir: &Path, -) -> Result<(), LauncherError> { - let assets_index = - download::download_assets_index(assets_dir, version).await?; - - let (a, b, c) = futures::future::join3( - download::download_client(versions_dir, version), - download::download_assets( - assets_dir, - if version.assets == "legacy" { - Some(legacy_assets_dir) - } else { - None - }, - &assets_index, - ), - download::download_libraries( - libraries_dir, - natives_dir, - version.libraries.as_slice(), - ), - ) - .await; - - a?; - b?; - c?; - - Ok(()) -} diff --git a/theseus/src/launcher/rules.rs b/theseus/src/launcher/rules.rs deleted file mode 100644 index de4f588ca..000000000 --- a/theseus/src/launcher/rules.rs +++ /dev/null @@ -1,55 +0,0 @@ -use crate::launcher::download::get_os; -use daedalus::minecraft::{OsRule, Rule, RuleAction}; -use regex::Regex; - -pub fn parse_rules(rules: &[Rule]) -> bool { - rules.iter().all(|x| parse_rule(x)) -} - -pub fn parse_rule(rule: &Rule) -> bool { - let result = if let Some(os) = &rule.os { - parse_os_rule(os) - } else if let Some(features) = &rule.features { - features.has_demo_resolution.unwrap_or(false) - } else { - true - }; - - match rule.action { - RuleAction::Allow => result, - RuleAction::Disallow => !result, - } -} - -pub fn parse_os_rule(rule: &OsRule) -> bool { - if let Some(arch) = &rule.arch { - match arch.as_str() { - "x86" => { - #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] - return false; - } - "arm" => { - #[cfg(not(target_arch = "arm"))] - return false; - } - _ => {} - } - } - - if let Some(name) = &rule.name { - if &get_os() != name { - return false; - } - } - if let Some(version) = &rule.version { - let regex = Regex::new(version.as_str()); - - if let Ok(regex) = regex { - if !regex.is_match(&sys_info::os_release().unwrap_or_default()) { - return false; - } - } - } - - true -} diff --git a/theseus/src/lib.rs b/theseus/src/lib.rs index 7b4265d5b..80baede2d 100644 --- a/theseus/src/lib.rs +++ b/theseus/src/lib.rs @@ -1,57 +1,19 @@ -//! # Theseus -//! -//! Theseus is a library which provides utilities for launching minecraft, creating Modrinth mod packs, -//! and launching Modrinth mod packs +/*! +# Theseus +Theseus is a library which provides utilities for launching minecraft, creating Modrinth mod packs, +and launching Modrinth mod packs +*/ #![warn(unused_import_braces, missing_debug_implementations)] +#![deny(unused_must_use)] -// TODO: make non-hardcoded -lazy_static::lazy_static! { - static ref LAUNCHER_WORK_DIR: std::path::PathBuf = dirs::config_dir().expect("Could not find config dir").join("theseus"); -} - -pub mod data; -pub mod launcher; -pub mod modpack; +mod api; +mod config; +mod error; +mod launcher; +mod state; mod util; -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("Launcher error: {0}")] - LauncherError(#[from] launcher::LauncherError), - - #[error("Modpack error: {0}")] - ModpackError(#[from] modpack::ModpackError), - - #[error("Data error: {0}")] - DaedalusError(#[from] data::DataError), -} - -pub async fn init() -> Result<(), Error> { - tokio::fs::create_dir_all(LAUNCHER_WORK_DIR.as_path()) - .await - .expect("Unable to create launcher root directory!"); - - use crate::data::*; - Metadata::init().await?; - - Settings::init().await?; - - tokio::try_join! { - launcher::init_download_semaphore(), - Profiles::init(), - }?; - - Ok(()) -} - -pub async fn save() -> Result<(), Error> { - use crate::data::*; - - tokio::try_join! { - Settings::save(), - Profiles::save(), - }?; - - Ok(()) -} +pub use api::*; +pub use error::*; +pub use state::State; diff --git a/theseus/src/modpack/manifest.rs b/theseus/src/modpack/manifest.rs deleted file mode 100644 index 85e6c16c3..000000000 --- a/theseus/src/modpack/manifest.rs +++ /dev/null @@ -1,446 +0,0 @@ -use std::path::PathBuf; - -use std::convert::TryFrom; - -use crate::launcher::ModLoader; - -use super::pack::ModpackGame; -use super::{pack, ModpackError, ModpackResult}; -use serde::{Deserialize, Serialize}; - -pub const DEFAULT_FORMAT_VERSION: u32 = 1; -const MODRINTH_GAMEDATA_URL: &str = "https://staging-cdn.modrinth.com/gamedata"; - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct Manifest { - pub format_version: u32, - pub game: String, - pub version_id: String, - pub name: String, - pub summary: Option, - pub files: Vec, - pub dependencies: ManifestDeps, -} - -impl TryFrom for pack::Modpack { - type Error = ModpackError; - - fn try_from(manifest: Manifest) -> Result { - let files = manifest - .files - .into_iter() - .map(pack::ModpackFile::try_from) - .collect::>()?; - - Ok(Self { - name: manifest.name, - version: manifest.version_id, - summary: manifest.summary, - game: ModpackGame::from(manifest.dependencies), - files, - }) - } -} - -fn get_loader_version(loader: ModLoader, version: &str) -> ModpackResult { - let source = match loader { - ModLoader::Vanilla => Err(ModpackError::VersionError(String::from( - "Attempted to get mod loader version of Vanilla", - ))), - ModLoader::Forge => Ok(format!("{MODRINTH_GAMEDATA_URL}/forge/v0/manifest.json")), - ModLoader::Fabric => Ok(format!("{MODRINTH_GAMEDATA_URL}/fabric/v0/manifest.json")), - }?; - let manifest = futures::executor::block_on(daedalus::modded::fetch_manifest(&source))?; - - let version = manifest - .game_versions - .iter() - .find(|&it| it.id == version) - .map(|x| x.loaders.first()) - .flatten() - .ok_or_else(|| { - ModpackError::VersionError(format!( - "No versions of modloader {loader:?} exist for Minecraft {version}", - )) - })?; - Ok(version.id.clone()) -} - -impl TryFrom for Manifest { - type Error = ModpackError; - - fn try_from(pack: pack::Modpack) -> Result { - let pack::Modpack { - game, - version, - name, - summary, - files, - } = pack; - - let game_name = match &game { - ModpackGame::Minecraft(..) => "minecraft".into(), - }; - - let files: Vec<_> = files.into_iter().map(ManifestFile::from).collect(); - - Ok(Manifest { - format_version: DEFAULT_FORMAT_VERSION, - game: game_name, - version_id: version, - name, - summary, - files, - dependencies: ManifestDeps::try_from(game)?, - }) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ManifestFile { - pub path: PathBuf, - pub hashes: Option, - #[serde(default)] - pub env: ManifestEnvs, - pub downloads: Vec, -} - -impl TryFrom for pack::ModpackFile { - type Error = ModpackError; - - fn try_from(file: ManifestFile) -> Result { - Ok(Self { - path: file.path, - hashes: file.hashes.map(pack::ModpackFileHashes::from), - env: pack::ModpackEnv::try_from(file.env)?, - downloads: file.downloads.into_iter().collect(), - }) - } -} - -impl From for ManifestFile { - fn from(file: pack::ModpackFile) -> Self { - Self { - path: file.path, - hashes: file.hashes.map(ManifestHashes::from), - env: file.env.into(), - downloads: file.downloads.into_iter().collect(), - } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -pub struct ManifestHashes { - pub sha1: String, -} - -impl From for pack::ModpackFileHashes { - fn from(hashes: ManifestHashes) -> Self { - Self { sha1: hashes.sha1 } - } -} - -impl From for ManifestHashes { - fn from(hashes: pack::ModpackFileHashes) -> Self { - Self { sha1: hashes.sha1 } - } -} - -#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq)] -pub struct ManifestEnvs { - pub client: ManifestEnv, - pub server: ManifestEnv, -} - -impl Default for ManifestEnvs { - fn default() -> Self { - Self { - client: ManifestEnv::Optional, - server: ManifestEnv::Optional, - } - } -} - -#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "lowercase")] -pub enum ManifestEnv { - Required, - Optional, - Unsupported, -} - -impl TryFrom for pack::ModpackEnv { - type Error = ModpackError; - - fn try_from(envs: ManifestEnvs) -> Result { - use ManifestEnv::*; - - match (envs.client, envs.server) { - (Required, Unsupported) => Ok(Self::ClientOnly), - (Unsupported, Required) => Ok(Self::ServerOnly), - (Optional, Optional) => Ok(Self::Both), - _ => Err(ModpackError::FormatError(format!( - "Invalid environment specification: {:?}", - envs - ))), - } - } -} - -impl From for ManifestEnvs { - fn from(envs: pack::ModpackEnv) -> Self { - use super::pack::ModpackEnv::*; - - let (client, server) = match envs { - ClientOnly => (ManifestEnv::Required, ManifestEnv::Unsupported), - ServerOnly => (ManifestEnv::Unsupported, ManifestEnv::Required), - Both => (ManifestEnv::Optional, ManifestEnv::Optional), - }; - - Self { client, server } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(untagged)] -pub enum ManifestDeps { - MinecraftFabric { - minecraft: String, - #[serde(rename = "fabric-loader")] - fabric_loader: String, - }, - MinecraftForge { - minecraft: String, - forge: String, - }, - MinecraftVanilla { - minecraft: String, - }, -} - -impl From for pack::ModpackGame { - fn from(deps: ManifestDeps) -> Self { - use ManifestDeps::*; - - match deps { - MinecraftVanilla { minecraft } => Self::Minecraft(minecraft, ModLoader::Vanilla), - MinecraftFabric { minecraft, .. } => Self::Minecraft(minecraft, ModLoader::Fabric), - MinecraftForge { minecraft, .. } => Self::Minecraft(minecraft, ModLoader::Forge), - } - } -} - -impl TryFrom for ManifestDeps { - type Error = ModpackError; - - fn try_from(game: pack::ModpackGame) -> Result { - use super::pack::ModpackGame::*; - Ok(match game { - Minecraft(minecraft, ModLoader::Vanilla) => Self::MinecraftVanilla { minecraft }, - Minecraft(minecraft, ModLoader::Fabric) => Self::MinecraftFabric { - fabric_loader: get_loader_version(ModLoader::Fabric, &minecraft)?, - minecraft, - }, - Minecraft(minecraft, ModLoader::Forge) => Self::MinecraftForge { - forge: get_loader_version(ModLoader::Fabric, &minecraft)?, - minecraft, - }, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parse_simple() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [], - "dependencies": { - "minecraft": "1.17.1" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![], - dependencies: ManifestDeps::MinecraftVanilla { - minecraft: "1.17.1".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_forge() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "forge": "37.0.110" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs::default(), - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftForge { - minecraft: "1.17.1".into(), - forge: "37.0.110".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_fabric() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "fabric-loader": "0.9.0" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs::default(), - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftFabric { - minecraft: "1.17.1".into(), - fabric_loader: "0.9.0".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_complete() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "summary": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "env": { - "client": "required", - "server": "unsupported" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "forge": "37.0.110" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: Some("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".into()), - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs { - client: ManifestEnv::Required, - server: ManifestEnv::Unsupported, - }, - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftForge { - minecraft: "1.17.1".into(), - forge: "37.0.110".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } -} diff --git a/theseus/src/modpack/mod.rs b/theseus/src/modpack/mod.rs deleted file mode 100644 index c9655d34a..000000000 --- a/theseus/src/modpack/mod.rs +++ /dev/null @@ -1,194 +0,0 @@ -//! Provides utilties for downloading and parsing modpacks - -use daedalus::download_file; -use fs_extra::dir::CopyOptions; -use std::{convert::TryFrom, env, io, path::Path}; -use tokio::{fs, try_join}; -use uuid::Uuid; -use zip::ZipArchive; -use zip_extensions::ZipWriterExtensions; - -use self::{ - manifest::Manifest, - pack::{Modpack, ModpackGame}, -}; - -pub mod manifest; -pub mod modrinth_api; -pub mod pack; - -pub const COMPILED_PATH: &str = "compiled/"; -pub const COMPILED_ZIP: &str = "compiled.mrpack"; -pub const MANIFEST_PATH: &str = "modrinth.index.json"; -pub const OVERRIDES_PATH: &str = "overrides/"; -pub const PACK_JSON5_PATH: &str = "modpack.json5"; -const PACK_GITIGNORE: &'static str = const_format::formatcp!( - r#" -{COMPILED_PATH} -{COMPILED_ZIP} -"# -); - -#[derive(thiserror::Error, Debug)] -pub enum ModpackError { - #[error("I/O error while reading modpack: {0}")] - IOError(#[from] io::Error), - - #[error("I/O error while reading modpack: {0}")] - FSExtraError(#[from] fs_extra::error::Error), - - #[error("Error extracting archive: {0}")] - ZipError(#[from] zip::result::ZipError), - - #[error("Invalid modpack format: {0}")] - FormatError(String), - - #[error("Invalid output directory: {0}")] - InvalidDirectory(String), - - #[error("Error parsing manifest: {0}")] - ManifestError(String), - - #[error("Daedalus error: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Error parsing json: {0}")] - JsonError(#[from] serde_json::Error), - - #[error("Error parsing json5: {0}")] - Json5Error(#[from] json5::Error), - - #[error("Error joining futures: {0}")] - JoinError(#[from] tokio::task::JoinError), - - #[error("Versioning Error: {0}")] - VersionError(String), - - #[error("Error downloading file: {0}")] - FetchError(#[from] reqwest::Error), - - #[error("Invalid modpack source: {0} (set the WHITELISTED_MODPACK_DOMAINS environment variable to override)")] - SourceWhitelistError(String), -} - -type ModpackResult = Result; - -/// Realise a modpack from a given URL -pub async fn fetch_modpack( - url: &str, - sha1: Option<&str>, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - let bytes = download_file(url, sha1).await?; - let mut archive = ZipArchive::new(io::Cursor::new(&bytes as &[u8]))?; - realise_modpack_zip(&mut archive, dest, side).await -} - -/// Realise a given modpack from a zip archive -pub async fn realise_modpack_zip( - archive: &mut ZipArchive, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - let mut tmp = env::temp_dir(); - tmp.push(format!("theseus-{}/", Uuid::new_v4())); - archive.extract(&tmp)?; - realise_modpack(&tmp, dest, side).await -} - -/// Realise a given modpack into an instance -pub async fn realise_modpack( - dir: &Path, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - if dest.is_file() { - return Err(ModpackError::InvalidDirectory(String::from( - "Output is not a directory", - ))); - } - if std::fs::read_dir(dest).map_or(false, |it| it.count() != 0) { - return Err(ModpackError::InvalidDirectory(String::from( - "Output directory is non-empty", - ))); - } - if !dest.exists() { - fs::create_dir_all(dest).await?; - } - - // Copy overrides - let overrides = dir.join(OVERRIDES_PATH); - if overrides.is_dir() { - fs_extra::dir::copy(overrides, dest, &CopyOptions::new())?; - } - - // Parse manifest - // NOTE: I'm using standard files here, since Serde does not support async readers - let manifest_path = Some(dir.join(MANIFEST_PATH)) - .filter(|it| it.is_file()) - .ok_or_else(|| { - ModpackError::ManifestError(String::from("Manifest missing or is not a file")) - })?; - let manifest_file = std::fs::File::open(manifest_path)?; - let reader = io::BufReader::new(manifest_file); - - let manifest: Manifest = serde_json::from_reader(reader)?; - let modpack = Modpack::try_from(manifest)?; - - // Realise modpack - modpack.download_files(dest, side).await?; - Ok(()) -} - -pub fn to_pack_json5(pack: &Modpack) -> ModpackResult { - let json5 = json5::to_string(pack)?; - Ok(format!("// This modpack is managed using Theseus. It can be edited using either a Theseus-compatible launcher or manually.\n{json5}")) -} - -pub async fn create_modpack( - name: &str, - game: ModpackGame, - summary: Option<&str>, -) -> ModpackResult<()> { - let output_dir = Path::new("./").join(name); - let pack = Modpack::new(game, "0.1.0", name, summary); - - try_join!( - fs::create_dir(&output_dir), - fs::create_dir(output_dir.join(OVERRIDES_PATH)), - fs::write(output_dir.join(".gitignore"), PACK_GITIGNORE), - fs::write(output_dir.join(PACK_JSON5_PATH), to_pack_json5(&pack)?), - )?; - - Ok(()) -} - -pub async fn compile_modpack(dir: &Path) -> ModpackResult<()> { - let result_dir = dir.join(COMPILED_PATH); - let pack: Modpack = json5::from_str(&fs::read_to_string(dir.join(PACK_JSON5_PATH)).await?)?; - - fs::create_dir(&result_dir).await?; - if dir.join(OVERRIDES_PATH).exists() { - fs_extra::dir::copy( - dir.join(OVERRIDES_PATH), - result_dir.join(OVERRIDES_PATH), - &CopyOptions::new(), - )?; - } - let manifest = Manifest::try_from(pack)?; - fs::write( - result_dir.join(MANIFEST_PATH), - serde_json::to_string(&manifest)?, - ) - .await?; - - let result_zip = fs::File::create(dir.join(COMPILED_ZIP)) - .await? - .into_std() - .await; - let mut zip = zip::ZipWriter::new(&result_zip); - zip.create_from_directory(&result_dir)?; - - Ok(()) -} diff --git a/theseus/src/modpack/modrinth_api.rs b/theseus/src/modpack/modrinth_api.rs deleted file mode 100644 index 17013c649..000000000 --- a/theseus/src/modpack/modrinth_api.rs +++ /dev/null @@ -1,180 +0,0 @@ -use std::{collections::HashSet, convert::TryFrom, path::PathBuf}; - -use crate::launcher::ModLoader; - -use super::{ - manifest::{ManifestEnvs, ManifestHashes}, - pack::{ModpackEnv, ModpackFile, ModpackFileHashes, ModpackGame}, - ModpackError, ModpackResult, -}; -use async_trait::async_trait; -use bytes::Bytes; -use futures::future::try_join_all; -use serde::Deserialize; -use tokio::try_join; - -#[async_trait] -pub trait ModrinthAPI { - async fn get_latest_version( - &self, - project: &str, - channel: &str, - game: &ModpackGame, - ) -> ModpackResult>; - async fn get_version( - &self, - version: &str, - ) -> ModpackResult>; -} - -#[derive(Debug)] -pub struct ModrinthV1(pub String); - -#[derive(Debug, Deserialize)] -struct ModrinthV1Project { - title: String, - client_side: String, - server_side: String, -} - -#[derive(Debug, Deserialize)] -struct ModrinthV1ProjectVersion { - dependencies: HashSet, - game_versions: HashSet, - version_type: String, - files: Vec, - loaders: HashSet, -} - -#[derive(Clone, Debug, Deserialize)] -struct ModrinthV1ProjectVersionFile { - hashes: ManifestHashes, - url: String, - filename: String, -} - -impl From for ModpackFile { - fn from(file: ModrinthV1ProjectVersionFile) -> Self { - Self { - hashes: Some(ModpackFileHashes::from(file.hashes)), - downloads: HashSet::from([file.url]), - path: PathBuf::from(file.filename), - // WARNING: Since the sidedness of version 1 API requests is unknown, the environment is - // set here as both. - env: ModpackEnv::Both, - } - } -} - -#[async_trait] -impl ModrinthAPI for ModrinthV1 { - async fn get_latest_version( - &self, - project: &str, - channel: &str, - game: &ModpackGame, - ) -> ModpackResult> { - let domain = &self.0; - // Fetch metadata - let (project_json, versions_json): (Bytes, Bytes) = try_join!( - try_get_json(format!("{domain}/api/v1/mod/{project}")), - try_get_json(format!("{domain}/api/v1/mod/{project}/version")), - )?; - - let (mut project_deserializer, mut versions_deserializer) = ( - serde_json::Deserializer::from_slice(&project_json), - serde_json::Deserializer::from_slice(&versions_json), - ); - - let (project, versions) = ( - ModrinthV1Project::deserialize(&mut project_deserializer)?, - Vec::deserialize(&mut versions_deserializer)?, - ); - - let (game_version, loader) = match game { - ModpackGame::Minecraft(_, ModLoader::Vanilla) => Err(ModpackError::VersionError( - String::from("Modrinth V1 does not support vanilla projects"), - )), - ModpackGame::Minecraft(ref version, ref loader) => Ok((version, loader)), - // This guard is here for when Modrinth does support other games. - #[allow(unreachable_patterns)] - _ => Err(ModpackError::VersionError(String::from( - "Attempted to use Modrinth API V1 to install a non-Minecraft project!", - ))), - }?; - - let version: ModrinthV1ProjectVersion = versions - .into_iter() - .find(|it: &ModrinthV1ProjectVersion| { - let loader_str = match loader { - ModLoader::Fabric => "fabric", - ModLoader::Forge => "forge", - ModLoader::Vanilla => unreachable!(), - }; - it.version_type == channel - && it.game_versions.contains(game_version) - && it.loaders.contains(loader_str) - }) - .ok_or_else(|| { - ModpackError::VersionError(format!( - "Unable to find compatible version of mod {}", - project.title - )) - })?; - - // Project fields - let envs = ModpackEnv::try_from(ManifestEnvs { - client: serde_json::from_str(&project.client_side)?, - server: serde_json::from_str(&project.server_side)?, - })?; - - // Conversions - let files = version - .files - .iter() - .cloned() - .map(ModpackFile::from) - .collect::>(); - - let dep_futures = - version.dependencies.iter().map(|it| self.get_version(it)); - let deps = try_join_all(dep_futures) - .await? - .into_iter() - .flatten() - .collect::>(); - - Ok(files - .into_iter() - .chain(deps.into_iter()) - .map(|mut it| { - it.env = envs; - it - }) - .collect()) - } - - async fn get_version( - &self, - version: &str, - ) -> ModpackResult> { - let domain = &self.0; - let version_json = - try_get_json(format!("{domain}/api/v1/version/{version}")).await?; - let mut version_deserializer = - serde_json::Deserializer::from_slice(&version_json); - let version = - ModrinthV1ProjectVersion::deserialize(&mut version_deserializer)?; - - Ok(version - .files - .into_iter() - .map(ModpackFile::from) - .collect::>()) - } -} - -// Helpers -async fn try_get_json(url: String) -> ModpackResult { - Ok(reqwest::get(url).await?.error_for_status()?.bytes().await?) -} diff --git a/theseus/src/modpack/pack.rs b/theseus/src/modpack/pack.rs deleted file mode 100644 index 2209f9a38..000000000 --- a/theseus/src/modpack/pack.rs +++ /dev/null @@ -1,277 +0,0 @@ -use daedalus::download_file_mirrors; -use futures::future; -use serde::{Deserialize, Serialize}; -use std::{ - collections::HashSet, - hash::Hash, - iter::FromIterator, - path::{Path, PathBuf}, -}; -use tokio::fs; - -use super::{ - modrinth_api::{self, ModrinthV1}, - ModpackError, ModpackResult, -}; -use crate::launcher::ModLoader; - -pub const MODRINTH_DEFAULT_MODPACK_DOMAINS: &[&str] = &[ - "cdn.modrinth.com", - "edge.forgecdn.net", - "github.com", - "raw.githubusercontent.com", -]; -pub const MODRINTH_MODPACK_DOMAIN_WHITELIST_VAR: &str = "WHITELISTED_MODPACK_DOMAINS"; - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct Modpack { - pub game: ModpackGame, - pub version: String, - pub name: String, - pub summary: Option, - pub files: HashSet, -} - -impl Modpack { - pub fn new(game: ModpackGame, version: &str, name: &str, summary: Option<&str>) -> Self { - Self { - game, - version: String::from(version), - name: String::from(name), - summary: summary.map(String::from), - files: HashSet::new(), - } - } - - /// Download a modpack's files for a given side to a given destination - /// Assumes the destination exists and is a directory - pub async fn download_files(&self, dest: &Path, side: ModpackSide) -> ModpackResult<()> { - let handles = self.files.iter().cloned().map(move |file| { - let (dest, side) = (dest.to_owned(), side); - tokio::spawn(async move { file.fetch(&dest, side).await }) - }); - future::try_join_all(handles) - .await? - .into_iter() - .collect::>()?; - - // TODO Integrate instance format to save other metadata - Ok(()) - } - - pub async fn add_project( - &mut self, - project: &str, - base_path: &Path, - source: Option<&dyn modrinth_api::ModrinthAPI>, - channel: Option<&str>, - ) -> ModpackResult<()> { - let default_api = ModrinthV1(String::from("https://api.modrinth.com")); - let channel = channel.unwrap_or("release"); - let source = source.unwrap_or(&default_api); - - let files = source - .get_latest_version(project, channel, &self.game) - .await? - .into_iter() - .map(|mut it: ModpackFile| { - it.path = base_path.join(it.path); - it - }); - - self.files.extend(files); - Ok(()) - } - - pub async fn add_version( - &mut self, - version: &str, - base_path: &Path, - source: Option<&dyn modrinth_api::ModrinthAPI>, - ) -> ModpackResult<()> { - let default_api = ModrinthV1(String::from("https://api.modrinth.com")); - let source = source.unwrap_or(&default_api); - - let files = source - .get_version(version) - .await? - .into_iter() - .map(|mut it: ModpackFile| { - it.path = base_path.join(it.path); - it - }); - - self.files.extend(files); - Ok(()) - } - - pub async fn add_file( - &mut self, - source: reqwest::Url, - dest: &Path, - hashes: Option, - env: Option, - ) -> ModpackResult<()> { - let whitelisted_domains = std::env::var(MODRINTH_MODPACK_DOMAIN_WHITELIST_VAR) - .map(|it| serde_json::from_str::>(&it).ok().unwrap()) - .unwrap_or_else(|_| { - MODRINTH_DEFAULT_MODPACK_DOMAINS - .iter() - .cloned() - .map(String::from) - .collect::>() - }); - - if !whitelisted_domains - .iter() - .any(|it| it == source.host_str().unwrap()) - { - return Err(ModpackError::SourceWhitelistError(String::from( - source.host_str().unwrap(), - ))); - } - - let file = ModpackFile { - path: PathBuf::from(dest), - hashes, - env: env.unwrap_or(ModpackEnv::Both), - downloads: HashSet::from_iter([String::from(source)].iter().cloned()), - }; - - self.files.insert(file); - Ok(()) - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -#[non_exhaustive] -pub enum ModpackGame { - // TODO: Currently, the launcher does not support specifying mod loader versions, so I just - // store the loader here. - Minecraft(String, ModLoader), -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct ModpackFile { - pub path: PathBuf, - pub hashes: Option, - pub env: ModpackEnv, - pub downloads: HashSet, -} - -#[allow(clippy::derive_hash_xor_eq)] -impl Hash for ModpackFile { - fn hash(&self, state: &mut H) { - if let Some(ref hashes) = self.hashes { - hashes.sha1.hash(state); - } - self.path.hash(state); - } -} - -impl ModpackFile { - pub async fn fetch(&self, dest: &Path, side: ModpackSide) -> ModpackResult<()> { - if !self.env.supports(side) { - return Ok(()); - } - - let output = dest.join(&self.path); - - // HACK: Since Daedalus appends a file name to all mirrors and the manifest supplies full - // URLs, I'm supplying it with an empty string to avoid reinventing the wheel. - let bytes = download_file_mirrors( - "", - self.downloads - .iter() - .map(|it| it.as_str()) - .collect::>() - .as_slice(), - self.hashes.as_ref().map(|it| it.sha1.as_str()), - ) - .await?; - fs::create_dir_all(output.parent().unwrap()).await?; - fs::write(output, bytes).await?; - Ok(()) - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ModpackEnv { - ClientOnly, - ServerOnly, - Both, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum ModpackSide { - Client, - Server, -} - -impl ModpackEnv { - pub fn supports(&self, side: ModpackSide) -> bool { - match self { - Self::ClientOnly => side == ModpackSide::Client, - Self::ServerOnly => side == ModpackSide::Server, - Self::Both => true, - } - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct ModpackFileHashes { - pub sha1: String, -} - -#[cfg(test)] -mod tests { - use std::{ - collections::HashSet, - path::{Path, PathBuf}, - }; - - use super::*; - use crate::launcher::ModLoader; - - #[tokio::test] - async fn add_version() -> ModpackResult<()> { - const TEST_VERSION: &'static str = "TpnSObJ7"; - let mut test_pack = Modpack::new( - ModpackGame::Minecraft(String::from("1.16.5"), ModLoader::Fabric), - "0.1.0", - "Example Modpack", - None, - ); - test_pack - .add_version(TEST_VERSION, Path::new("mods/"), None) - .await?; - - assert_eq!( - test_pack, - Modpack { - game: ModpackGame::Minecraft(String::from("1.16.5"), ModLoader::Fabric), - version: String::from("0.1.0"), - name: String::from("Example Modpack"), - summary: None, - files: { - let mut files = HashSet::new(); - files.insert(ModpackFile { - path: PathBuf::from("mods/gravestones-v1.9.jar"), - hashes: Some(ModpackFileHashes { - sha1: String::from("3f0f6d523d218460310b345be03ab3f1d294e04d"), - }), - env: ModpackEnv::Both, - downloads: { - let mut downloads = HashSet::new(); - downloads.insert(String::from("https://cdn.modrinth.com/data/ssUbhMkL/versions/v1.9/gravestones-v1.9.jar")); - downloads - } - }); - files - }, - }, - ); - Ok(()) - } -} diff --git a/theseus/src/state/dirs.rs b/theseus/src/state/dirs.rs new file mode 100644 index 000000000..3ba115cfc --- /dev/null +++ b/theseus/src/state/dirs.rs @@ -0,0 +1,129 @@ +//! Theseus directory information +use std::path::PathBuf; +use tokio::fs; + +#[derive(Debug)] +pub struct DirectoryInfo { + pub config_dir: PathBuf, + pub working_dir: PathBuf, +} + +impl DirectoryInfo { + /// Get all paths needed for Theseus to operate properly + pub async fn init() -> crate::Result { + // Working directory + let working_dir = std::env::current_dir().map_err(|err| { + crate::Error::FSError(format!( + "Could not open working directory: {err}" + )) + })?; + + // Config directory + let config_dir = Self::env_path("THESEUS_CONFIG_DIR") + .or_else(|| Some(dirs::config_dir()?.join("theseus"))) + .ok_or(crate::Error::FSError( + "Could not find valid config dir".to_string(), + ))?; + + fs::create_dir_all(&config_dir).await.map_err(|err| { + crate::Error::FSError(format!( + "Error creating Theseus config directory: {err}" + )) + })?; + + Ok(Self { + config_dir, + working_dir, + }) + } + + /// Get the Minecraft instance metadata directory + #[inline] + pub fn metadata_dir(&self) -> PathBuf { + self.config_dir.join("meta") + } + + /// Get the Minecraft versions metadata directory + #[inline] + pub fn versions_dir(&self) -> PathBuf { + self.metadata_dir().join("versions") + } + + /// Get the metadata directory for a given version + #[inline] + pub fn version_dir(&self, version: &str) -> PathBuf { + self.versions_dir().join(version) + } + + /// Get the Minecraft libraries metadata directory + #[inline] + pub fn libraries_dir(&self) -> PathBuf { + self.metadata_dir().join("libraries") + } + + /// Get the Minecraft assets metadata directory + #[inline] + pub fn assets_dir(&self) -> PathBuf { + self.metadata_dir().join("assets") + } + + /// Get the assets index directory + #[inline] + pub fn assets_index_dir(&self) -> PathBuf { + self.assets_dir().join("indexes") + } + + /// Get the assets objects directory + #[inline] + pub fn objects_dir(&self) -> PathBuf { + self.assets_dir().join("objects") + } + + /// Get the directory for a specific object + #[inline] + pub fn object_dir(&self, hash: &str) -> PathBuf { + self.objects_dir().join(&hash[..2]).join(hash) + } + + /// Get the Minecraft legacy assets metadata directory + #[inline] + pub fn legacy_assets_dir(&self) -> PathBuf { + self.metadata_dir().join("resources") + } + + /// Get the Minecraft legacy assets metadata directory + #[inline] + pub fn natives_dir(&self) -> PathBuf { + self.metadata_dir().join("natives") + } + + /// Get the natives directory for a version of Minecraft + #[inline] + pub fn version_natives_dir(&self, version: &str) -> PathBuf { + self.natives_dir().join(version) + } + + /// Get the directory containing instance icons + #[inline] + pub fn icon_dir(&self) -> PathBuf { + self.config_dir.join("icons") + } + + /// Get the file containing the global database + #[inline] + pub fn database_file(&self) -> PathBuf { + self.config_dir.join("data.bin") + } + + /// Get the settings file for Theseus + #[inline] + pub fn settings_file(&self) -> PathBuf { + self.config_dir.join("settings.json") + } + + /// Get path from environment variable + #[inline] + fn env_path(name: &str) -> Option { + std::env::var_os(name).map(PathBuf::from) + } +} diff --git a/theseus/src/state/metadata.rs b/theseus/src/state/metadata.rs new file mode 100644 index 000000000..eacf59de8 --- /dev/null +++ b/theseus/src/state/metadata.rs @@ -0,0 +1,90 @@ +//! Theseus metadata +use crate::config::BINCODE_CONFIG; +use bincode::{Decode, Encode}; +use daedalus::{ + minecraft::{fetch_version_manifest, VersionManifest as MinecraftManifest}, + modded::{ + fetch_manifest as fetch_loader_manifest, Manifest as LoaderManifest, + }, +}; +use futures::prelude::*; +use std::collections::LinkedList; + +const METADATA_URL: &str = "https://meta.modrinth.com/gamedata"; +const METADATA_DB_FIELD: &[u8] = b"metadata"; + +#[derive(Encode, Decode, Debug)] +pub struct Metadata { + pub minecraft: MinecraftManifest, + pub forge: LoaderManifest, + pub fabric: LoaderManifest, +} + +impl Metadata { + fn get_manifest(name: &str) -> String { + format!("{METADATA_URL}/{name}/v0/manifest.json") + } + + async fn fetch() -> crate::Result { + let (minecraft, forge, fabric) = tokio::try_join! { + async { + let url = Self::get_manifest("minecraft"); + fetch_version_manifest(Some(&url)).await + }, + async { + let url = Self::get_manifest("forge"); + fetch_loader_manifest(&url).await + }, + async { + let url = Self::get_manifest("fabric"); + fetch_loader_manifest(&url).await + } + }?; + + Ok(Self { + minecraft, + forge, + fabric, + }) + } + + pub async fn init(db: &sled::Db) -> crate::Result { + let mut metadata = None; + + if let Some(ref meta_bin) = db.get(METADATA_DB_FIELD)? { + match bincode::decode_from_slice::( + &meta_bin, + *BINCODE_CONFIG, + ) { + Ok((meta, _)) => metadata = Some(meta), + Err(err) => { + log::warn!("Could not read launcher metadata: {err}") + } + } + } + + let mut fetch_futures = LinkedList::new(); + for _ in 0..3 { + fetch_futures.push_back(Self::fetch().boxed()); + } + + match future::select_ok(fetch_futures).await { + Ok(meta) => metadata = Some(meta.0), + Err(err) => log::warn!("Unable to fetch launcher metadata: {err}"), + } + + if let Some(meta) = metadata { + db.insert( + METADATA_DB_FIELD, + sled::IVec::from(bincode::encode_to_vec( + &meta, + *BINCODE_CONFIG, + )?), + )?; + db.flush_async().await?; + Ok(meta) + } else { + Err(crate::Error::NoValueFor(String::from("launcher metadata"))) + } + } +} diff --git a/theseus/src/state/mod.rs b/theseus/src/state/mod.rs new file mode 100644 index 000000000..645c8708a --- /dev/null +++ b/theseus/src/state/mod.rs @@ -0,0 +1,118 @@ +//! Theseus state management system +use crate::config::sled_config; +use std::sync::Arc; +use tokio::sync::{Mutex, OnceCell, RwLock, Semaphore}; + +// Submodules +mod dirs; +pub use self::dirs::*; + +mod metadata; +pub use metadata::*; + +mod settings; +pub use settings::*; + +mod profiles; +pub use profiles::*; + +// Global state +static LAUNCHER_STATE: OnceCell> = OnceCell::const_new(); +#[derive(Debug)] +pub struct State { + /// Database, used to store some information + pub(self) database: sled::Db, + /// Information on the location of files used in the launcher + pub directories: DirectoryInfo, + /// Semaphore used to limit concurrent I/O and avoid errors + pub io_semaphore: Semaphore, + /// Launcher metadata + pub metadata: Metadata, + /// Launcher configuration + pub settings: RwLock, + /// Launcher profile metadata + pub profiles: RwLock, +} + +impl State { + /// Get the current launcher state, initializing it if needed + pub async fn get() -> crate::Result> { + LAUNCHER_STATE + .get_or_try_init(|| async { + // Directories + let directories = DirectoryInfo::init().await?; + + // Database + // TODO: make database versioned + let database = + sled_config().path(directories.database_file()).open()?; + + // Settings + let settings = + Settings::init(&directories.settings_file()).await?; + + // Metadata + let metadata = Metadata::init(&database).await?; + + // Profiles + let profiles = Profiles::init(&database).await?; + + // Loose initializations + let io_semaphore = + Semaphore::new(settings.max_concurrent_downloads); + + Ok(Arc::new(Self { + database, + directories, + io_semaphore, + metadata, + settings: RwLock::new(settings), + profiles: RwLock::new(profiles), + })) + }) + .await + .map(Arc::clone) + } + + /// Synchronize in-memory state with persistent state + pub async fn sync() -> crate::Result<()> { + let state = Self::get().await?; + let batch = Arc::new(Mutex::new(sled::Batch::default())); + + let sync_settings = async { + let state = Arc::clone(&state); + + tokio::spawn(async move { + let reader = state.settings.read().await; + reader.sync(&state.directories.settings_file()).await?; + Ok::<_, crate::Error>(()) + }) + .await + .unwrap() + }; + + let sync_profiles = async { + let state = Arc::clone(&state); + let batch = Arc::clone(&batch); + + tokio::spawn(async move { + let profiles = state.profiles.read().await; + let mut batch = batch.lock().await; + + profiles.sync(&mut batch).await?; + Ok::<_, crate::Error>(()) + }) + .await + .unwrap() + }; + + tokio::try_join!(sync_settings, sync_profiles)?; + + state + .database + .apply_batch(Arc::try_unwrap(batch).unwrap().into_inner())?; + state.database.flush_async().await?; + + Ok(()) + } +} diff --git a/theseus/src/state/profiles.rs b/theseus/src/state/profiles.rs new file mode 100644 index 000000000..5b10b8d2e --- /dev/null +++ b/theseus/src/state/profiles.rs @@ -0,0 +1,340 @@ +use super::settings::{Hooks, MemorySettings, WindowSize}; +use crate::config::BINCODE_CONFIG; +use daedalus::modded::LoaderVersion; +use futures::prelude::*; +use serde::{Deserialize, Serialize}; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; +use tokio::fs; + +const PROFILE_JSON_PATH: &str = "profile.json"; +const PROFILE_SUBTREE: &[u8] = b"profiles"; + +#[derive(Debug)] +pub struct Profiles(pub HashMap>); + +// TODO: possibly add defaults to some of these values +pub const CURRENT_FORMAT_VERSION: u32 = 1; +pub const SUPPORTED_ICON_FORMATS: &[&'static str] = &[ + "bmp", "gif", "jpeg", "jpg", "jpe", "png", "svg", "svgz", "webp", "rgb", + "mp4", +]; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct Profile { + #[serde(skip)] + pub path: PathBuf, + pub metadata: ProfileMetadata, + #[serde(skip_serializing_if = "Option::is_none")] + pub java: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub memory: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub resolution: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub hooks: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct ProfileMetadata { + pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub icon: Option, + pub game_version: String, + #[serde(default)] + pub loader: ModLoader, + #[serde(skip_serializing_if = "Option::is_none")] + pub loader_version: Option, + pub format_version: u32, +} + +// TODO: Quilt? +#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum ModLoader { + Vanilla, + Forge, + Fabric, +} + +impl Default for ModLoader { + fn default() -> Self { + ModLoader::Vanilla + } +} + +impl std::fmt::Display for ModLoader { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + &Self::Vanilla => "Vanilla", + &Self::Forge => "Forge", + &Self::Fabric => "Fabric", + }) + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct JavaSettings { + #[serde(skip_serializing_if = "Option::is_none")] + pub install: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub extra_arguments: Option>, +} + +impl Profile { + pub async fn new( + name: String, + version: String, + path: PathBuf, + ) -> crate::Result { + if name.trim().is_empty() { + return Err(crate::Error::InputError(String::from( + "Empty name for instance!", + ))); + } + + Ok(Self { + path: path.canonicalize()?, + metadata: ProfileMetadata { + name, + icon: None, + game_version: version, + loader: ModLoader::Vanilla, + loader_version: None, + format_version: CURRENT_FORMAT_VERSION, + }, + java: None, + memory: None, + resolution: None, + hooks: None, + }) + } + + // TODO: deduplicate these builder methods + // They are flat like this in order to allow builder-style usage + pub fn with_name(&mut self, name: String) -> &mut Self { + self.metadata.name = name; + self + } + + pub async fn with_icon<'a>( + &'a mut self, + icon: &'a Path, + ) -> crate::Result<&'a mut Self> { + let ext = icon + .extension() + .and_then(std::ffi::OsStr::to_str) + .unwrap_or(""); + + if SUPPORTED_ICON_FORMATS.contains(&ext) { + let file_name = format!("icon.{ext}"); + fs::copy(icon, &self.path.join(&file_name)).await?; + self.metadata.icon = + Some(Path::new(&format!("./{file_name}")).to_owned()); + + Ok(self) + } else { + Err(crate::Error::InputError(format!( + "Unsupported image type: {ext}" + ))) + } + } + + pub fn with_game_version(&mut self, version: String) -> &mut Self { + self.metadata.game_version = version; + self + } + + pub fn with_loader( + &mut self, + loader: ModLoader, + version: Option, + ) -> &mut Self { + self.metadata.loader = loader; + self.metadata.loader_version = version; + self + } + + pub fn with_java_settings( + &mut self, + settings: Option, + ) -> &mut Self { + self.java = settings; + self + } + + pub fn with_memory( + &mut self, + settings: Option, + ) -> &mut Self { + self.memory = settings; + self + } + + pub fn with_resolution( + &mut self, + resolution: Option, + ) -> &mut Self { + self.resolution = resolution; + self + } + + pub fn with_hooks(&mut self, hooks: Option) -> &mut Self { + self.hooks = hooks; + self + } +} + +impl Profiles { + pub async fn init(db: &sled::Db) -> crate::Result { + let profile_db = db.get(PROFILE_SUBTREE)?.map_or( + Ok(Default::default()), + |bytes| { + bincode::decode_from_slice::, _>( + &bytes, + *BINCODE_CONFIG, + ) + .map(|it| it.0) + }, + )?; + + let profiles = stream::iter(profile_db.iter()) + .then(|it| async move { + let path = PathBuf::from(it); + let prof = match Self::read_profile_from_dir(&path).await { + Ok(prof) => Some(prof), + Err(err) => { + log::warn!("Error loading profile: {err}. Skipping..."); + None + } + }; + (path, prof) + }) + .collect::>>() + .await; + + Ok(Self(profiles)) + } + + pub fn insert(&mut self, profile: Profile) -> crate::Result<&Self> { + self.0.insert( + profile + .path + .canonicalize()? + .to_str() + .ok_or(crate::Error::UTFError(profile.path.clone()))? + .into(), + Some(profile), + ); + Ok(self) + } + + pub async fn insert_from<'a>( + &'a mut self, + path: &'a Path, + ) -> crate::Result<&Self> { + self.insert(Self::read_profile_from_dir(&path.canonicalize()?).await?) + } + + pub fn remove(&mut self, path: &Path) -> crate::Result<&Self> { + let path = PathBuf::from(path.canonicalize()?.to_str().unwrap()); + self.0.remove(&path); + Ok(self) + } + + pub async fn sync<'a>( + &'a self, + batch: &'a mut sled::Batch, + ) -> crate::Result<&Self> { + stream::iter(self.0.iter()) + .map(Ok::<_, crate::Error>) + .try_for_each_concurrent(None, |(path, profile)| async move { + let json = serde_json::to_vec_pretty(&profile)?; + + let json_path = + Path::new(path.to_str().unwrap()).join(PROFILE_JSON_PATH); + + fs::write(json_path, json).await?; + Ok::<_, crate::Error>(()) + }) + .await?; + + batch.insert( + PROFILE_SUBTREE, + bincode::encode_to_vec( + self.0.keys().collect::>(), + *BINCODE_CONFIG, + )?, + ); + Ok(self) + } + + async fn read_profile_from_dir(path: &Path) -> crate::Result { + let json = fs::read(path.join(PROFILE_JSON_PATH)).await?; + let mut profile = serde_json::from_slice::(&json)?; + profile.path = PathBuf::from(path); + Ok(profile) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use pretty_assertions::{assert_eq, assert_str_eq}; + use std::collections::HashSet; + + #[test] + fn profile_test() -> Result<(), serde_json::Error> { + let profile = Profile { + path: PathBuf::new(), + metadata: ProfileMetadata { + name: String::from("Example Pack"), + icon: None, + game_version: String::from("1.18.2"), + loader: ModLoader::Vanilla, + loader_version: None, + format_version: CURRENT_FORMAT_VERSION, + }, + java: Some(JavaSettings { + install: Some(PathBuf::from("/usr/bin/java")), + extra_arguments: Some(Vec::new()), + }), + memory: Some(MemorySettings { + minimum: None, + maximum: 8192, + }), + resolution: Some(WindowSize(1920, 1080)), + hooks: Some(Hooks { + pre_launch: HashSet::new(), + wrapper: None, + post_exit: HashSet::new(), + }), + }; + let json = serde_json::json!({ + "metadata": { + "name": "Example Pack", + "game_version": "1.18.2", + "format_version": 1u32, + "loader": "vanilla", + }, + "java": { + "extra_arguments": [], + "install": "/usr/bin/java", + }, + "memory": { + "maximum": 8192u32, + }, + "resolution": (1920u16, 1080u16), + "hooks": {}, + }); + + assert_eq!(serde_json::to_value(profile.clone())?, json.clone()); + assert_str_eq!( + format!("{:?}", serde_json::from_value::(json)?), + format!("{:?}", profile), + ); + Ok(()) + } +} diff --git a/theseus/src/state/settings.rs b/theseus/src/state/settings.rs new file mode 100644 index 000000000..863a3b9ac --- /dev/null +++ b/theseus/src/state/settings.rs @@ -0,0 +1,119 @@ +//! Theseus settings file +use serde::{Deserialize, Serialize}; +use std::{ + collections::HashSet, + path::{Path, PathBuf}, +}; +use tokio::fs; + +// TODO: convert to semver? +const CURRENT_FORMAT_VERSION: u32 = 1; + +// Types +/// Global Theseus settings +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Settings { + pub memory: MemorySettings, + pub game_resolution: WindowSize, + pub custom_java_args: Vec, + pub java_8_path: Option, + pub java_17_path: Option, + pub hooks: Hooks, + pub max_concurrent_downloads: usize, + pub version: u32, +} + +impl Default for Settings { + fn default() -> Self { + Self { + memory: MemorySettings::default(), + game_resolution: WindowSize::default(), + custom_java_args: Vec::new(), + java_8_path: None, + java_17_path: None, + hooks: Hooks::default(), + max_concurrent_downloads: 64, + version: CURRENT_FORMAT_VERSION, + } + } +} + +impl Settings { + pub async fn init(file: &Path) -> crate::Result { + if file.exists() { + fs::read(&file) + .await + .map_err(|err| { + crate::Error::FSError(format!( + "Error reading settings file: {err}" + )) + }) + .and_then(|it| { + serde_json::from_slice::(&it) + .map_err(crate::Error::from) + }) + } else { + Ok(Settings::default()) + } + } + + pub async fn sync(&self, to: &Path) -> crate::Result<()> { + fs::write(to, serde_json::to_vec_pretty(self)?) + .await + .map_err(|err| { + crate::Error::FSError(format!( + "Error saving settings to file: {err}" + )) + }) + } +} + +/// Minecraft memory settings +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +pub struct MemorySettings { + #[serde(skip_serializing_if = "Option::is_none")] + pub minimum: Option, + pub maximum: u32, +} + +impl Default for MemorySettings { + fn default() -> Self { + Self { + minimum: None, + maximum: 2048, + } + } +} + +/// Game window size +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +pub struct WindowSize(pub u16, pub u16); + +impl Default for WindowSize { + fn default() -> Self { + Self(854, 480) + } +} + +/// Game initialization hooks +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Hooks { + #[serde(skip_serializing_if = "HashSet::is_empty")] + pub pre_launch: HashSet, + #[serde(skip_serializing_if = "Option::is_none")] + pub wrapper: Option, + #[serde(skip_serializing_if = "HashSet::is_empty")] + pub post_exit: HashSet, +} + +impl Default for Hooks { + fn default() -> Self { + Self { + pre_launch: HashSet::::new(), + wrapper: None, + post_exit: HashSet::::new(), + } + } +} diff --git a/theseus/src/util.rs b/theseus/src/util.rs deleted file mode 100644 index 62633378a..000000000 --- a/theseus/src/util.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::path::{Path, PathBuf}; -use std::{env, io}; - -use path_clean::PathClean; - -// https://stackoverflow.com/a/54817755 -pub fn absolute_path(path: impl AsRef) -> io::Result { - let path = path.as_ref(); - - let absolute_path = if path.is_absolute() { - path.to_path_buf() - } else { - env::current_dir()?.join(path) - } - .clean(); - - Ok(absolute_path) -} diff --git a/theseus/src/util/fetch.rs b/theseus/src/util/fetch.rs new file mode 100644 index 000000000..fce3ce6cf --- /dev/null +++ b/theseus/src/util/fetch.rs @@ -0,0 +1,92 @@ +//! Functions for fetching infromation from the Internet +use crate::config::REQWEST_CLIENT; +use futures::prelude::*; +use std::{collections::LinkedList, convert::TryInto, path::Path, sync::Arc}; +use tokio::{ + fs::{self, File}, + io::AsyncWriteExt, + sync::{Semaphore, SemaphorePermit}, +}; + +const FETCH_ATTEMPTS: usize = 3; + +pub async fn fetch<'a>( + url: &str, + sha1: Option<&str>, + _permit: &SemaphorePermit<'a>, +) -> crate::Result { + let mut attempts = LinkedList::new(); + for _ in 0..FETCH_ATTEMPTS { + attempts.push_back( + async { + let content = REQWEST_CLIENT.get(url).send().await?; + let bytes = content.bytes().await?; + + if let Some(hash) = sha1 { + let actual_hash = sha1_async(bytes.clone()).await; + if actual_hash != hash { + return Err(crate::Error::HashError( + actual_hash, + String::from(hash), + )); + } + } + + Ok(bytes) + } + .boxed(), + ) + } + + log::debug!("Done downloading URL {url}"); + future::select_ok(attempts).map_ok(|it| it.0).await +} + +// This is implemented, as it will be useful in porting modpacks +// For now, allow it to be dead code +#[allow(dead_code)] +pub async fn fetch_mirrors( + urls: &[&str], + sha1: Option<&str>, + permits: u32, + sem: &Semaphore, +) -> crate::Result { + let _permits = sem.acquire_many(permits).await.unwrap(); + let sem = Arc::new(Semaphore::new(permits.try_into().unwrap())); + + future::select_ok(urls.into_iter().map(|url| { + let sha1 = sha1.map(String::from); + let url = String::from(*url); + let sem = Arc::clone(&sem); + + tokio::spawn(async move { + let permit = sem.acquire().await.unwrap(); + fetch(&url, sha1.as_deref(), &permit).await + }) + .map(Result::unwrap) + .boxed() + })) + .await + .map(|it| it.0) +} + +pub async fn write<'a>( + path: &Path, + bytes: &[u8], + _permit: &SemaphorePermit<'a>, +) -> crate::Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).await?; + } + + let mut file = File::create(path).await?; + log::debug!("Done writing file {}", path.display()); + file.write_all(bytes).await?; + Ok(()) +} + +async fn sha1_async(bytes: bytes::Bytes) -> String { + tokio::task::spawn_blocking(move || sha1::Sha1::from(bytes).hexdigest()) + .await + .unwrap() +} diff --git a/theseus/src/util/mod.rs b/theseus/src/util/mod.rs new file mode 100644 index 000000000..c664986d5 --- /dev/null +++ b/theseus/src/util/mod.rs @@ -0,0 +1,3 @@ +//! Theseus utility functions +pub mod fetch; +pub mod platform; diff --git a/theseus/src/util/platform.rs b/theseus/src/util/platform.rs new file mode 100644 index 000000000..b403d8844 --- /dev/null +++ b/theseus/src/util/platform.rs @@ -0,0 +1,60 @@ +//! Platform-related code +use daedalus::minecraft::{Os, OsRule}; +use regex::Regex; + +// OS detection +pub trait OsExt { + /// Get the OS of the current system + fn native() -> Self; +} + +impl OsExt for Os { + fn native() -> Self { + match std::env::consts::OS { + "windows" => Self::Windows, + "macos" => Self::Osx, + "linux" => Self::Linux, + _ => Self::Unknown, + } + } +} + +// Bit width +#[cfg(target_pointer_width = "64")] +pub const ARCH_WIDTH: &str = "64"; + +#[cfg(target_pointer_width = "32")] +pub const ARCH_WIDTH: &str = "32"; + +// Platform rule handling +pub fn os_rule(rule: &OsRule) -> bool { + let mut rule_match = true; + + if let Some(ref arch) = rule.arch { + rule_match &= match arch.as_str() { + "x86" => cfg!(any(target_arch = "x86", target_arch = "x86_64")), + "arm" => cfg!(target_arch = "arm"), + _ => true, + }; + } + + if let Some(name) = &rule.name { + rule_match &= &Os::native() == name; + } + + if let Some(version) = &rule.version { + if let Ok(regex) = Regex::new(version.as_str()) { + rule_match &= + regex.is_match(&sys_info::os_release().unwrap_or_default()); + } + } + + rule_match +} + +pub fn classpath_separator() -> &'static str { + match Os::native() { + Os::Osx | Os::Linux | Os::Unknown => ":", + Os::Windows => ";", + } +} diff --git a/theseus_cli/Cargo.toml b/theseus_cli/Cargo.toml index e0ee01dba..d51a57214 100644 --- a/theseus_cli/Cargo.toml +++ b/theseus_cli/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] theseus = { path = "../theseus" } -daedalus = "0.1.12" +daedalus = {version = "0.1.15", features = ["bincode"]} tokio = { version = "1", features = ["full"] } tokio-stream = { version = "0.1", features = ["fs"] } futures = "0.3" @@ -18,4 +18,7 @@ dialoguer = "0.10" eyre = "0.6" tabled = "0.5" dirs = "4.0" -uuid = {version = "0.8", features = ["v4", "serde"]} \ No newline at end of file +uuid = {version = "0.8", features = ["v4", "serde"]} +# TODO: merge logging with paris logging +pretty_env_logger = "0.4" +log = "0.4.14" diff --git a/theseus_cli/src/main.rs b/theseus_cli/src/main.rs index 580631805..6b92766d3 100644 --- a/theseus_cli/src/main.rs +++ b/theseus_cli/src/main.rs @@ -15,10 +15,12 @@ pub struct Args { #[tokio::main] async fn main() -> Result<()> { let args = argh::from_env::(); - theseus::init().await?; + pretty_env_logger::formatted_builder() + .filter_module("theseus", log::LevelFilter::Info) + .target(pretty_env_logger::env_logger::Target::Stderr) + .init(); args.dispatch() .inspect_err(|_| error!("An error has occurred!\n")) - .and_then(|_| async { Ok(theseus::save().await?) }) .await } diff --git a/theseus_cli/src/subcommands/profile.rs b/theseus_cli/src/subcommands/profile.rs index 3aacbc4b5..c39e67bef 100644 --- a/theseus_cli/src/subcommands/profile.rs +++ b/theseus_cli/src/subcommands/profile.rs @@ -4,15 +4,13 @@ use crate::util::{ }; use daedalus::modded::LoaderVersion; use eyre::{ensure, Result}; +use futures::prelude::*; use paris::*; use std::path::{Path, PathBuf}; use tabled::{Table, Tabled}; -use theseus::{ - data::{profiles::PROFILE_JSON_PATH, Metadata, Profile, Profiles}, - launcher::ModLoader, -}; +use theseus::prelude::*; use tokio::fs; -use tokio_stream::{wrappers::ReadDirStream, StreamExt}; +use tokio_stream::wrappers::ReadDirStream; use uuid::Uuid; #[derive(argh::FromArgs)] @@ -54,16 +52,19 @@ impl ProfileAdd { ); let profile = self.profile.canonicalize()?; - let json_path = profile.join(PROFILE_JSON_PATH); + let json_path = profile.join("profile.json"); + ensure!( json_path.exists(), "Profile json does not exist. Perhaps you wanted `profile init` or `profile fetch`?" ); ensure!( - Profiles::get().await.unwrap().0.get(&profile).is_none(), + !profile::is_managed(&profile).await?, "Profile already managed by Theseus. If the contents of the profile are invalid or missing, the profile can be regenerated using `profile init` or `profile fetch`" ); - Profiles::insert_from(profile).await?; + + profile::add_path(&profile).await?; + State::sync().await?; success!("Profile added!"); Ok(()) @@ -106,13 +107,15 @@ impl ProfileInit { _largs: &ProfileCommand, ) -> Result<()> { // TODO: validate inputs from args early + let state = State::get().await?; + if self.path.exists() { ensure!( self.path.is_dir(), "Attempted to create profile in something other than a folder!" ); ensure!( - !self.path.join(PROFILE_JSON_PATH).exists(), + !self.path.join("profile.json").exists(), "Profile already exists! Perhaps you want `profile add` instead?" ); if ReadDirStream::new(fs::read_dir(&self.path).await?) @@ -138,8 +141,6 @@ impl ProfileInit { &self.path.canonicalize()?.display() ); - let metadata = Metadata::get().await?; - // TODO: abstract default prompting let name = match &self.name { Some(name) => name.clone(), @@ -157,7 +158,7 @@ impl ProfileInit { let game_version = match &self.game_version { Some(version) => version.clone(), None => { - let default = &metadata.minecraft.latest.release; + let default = &state.metadata.minecraft.latest.release; prompt_async( String::from("Game version"), @@ -206,8 +207,8 @@ impl ProfileInit { }; let loader_data = match loader { - ModLoader::Forge => &metadata.forge, - ModLoader::Fabric => &metadata.fabric, + ModLoader::Forge => &state.metadata.forge, + ModLoader::Fabric => &state.metadata.fabric, _ => eyre::bail!("Could not get manifest for loader {loader}. This is a bug in the CLI!"), }; @@ -238,8 +239,6 @@ impl ProfileInit { .map(PathBuf::from), }; - // We don't really care if the profile already is managed, as getting this far means that the user probably wanted to re-create a profile - drop(metadata); let mut profile = Profile::new(name, game_version, self.path.clone()).await?; @@ -251,8 +250,8 @@ impl ProfileInit { profile.with_loader(loader, Some(loader_version)); } - Profiles::insert(profile).await?; - Profiles::save().await?; + profile::add(profile).await?; + State::sync().await?; success!( "Successfully created instance, it is now available to use with Theseus!" @@ -294,20 +293,39 @@ impl<'a> From<&'a Profile> for ProfileRow<'a> { } } +impl<'a> From<&'a Path> for ProfileRow<'a> { + fn from(it: &'a Path) -> Self { + Self { + name: "?", + path: it, + game_version: "?", + loader: &ModLoader::Vanilla, + loader_version: "?", + } + } +} + impl ProfileList { pub async fn run( &self, _args: &crate::Args, _largs: &ProfileCommand, ) -> Result<()> { - let profiles = Profiles::get().await?; - let profiles = profiles.0.values().map(ProfileRow::from); + let state = State::get().await?; + let profiles = state.profiles.read().await; + let profiles = profiles.0.iter().map(|(path, prof)| { + prof.as_ref().map_or_else( + || ProfileRow::from(path.as_path()), + ProfileRow::from, + ) + }); let table = Table::new(profiles).with(tabled::Style::psql()).with( tabled::Modify::new(tabled::Column(1..=1)) .with(tabled::MaxWidth::wrapping(40)), ); println!("{table}"); + Ok(()) } } @@ -329,10 +347,13 @@ impl ProfileRemove { ) -> Result<()> { let profile = self.profile.canonicalize()?; info!("Removing profile {} from Theseus", self.profile.display()); + if confirm_async(String::from("Do you wish to continue"), true).await? { - if Profiles::remove(&profile).await?.is_none() { + if !profile::is_managed(&profile).await? { warn!("Profile was not managed by Theseus!"); } else { + profile::remove(&profile).await?; + State::sync().await?; success!("Profile removed!"); } } else { @@ -372,24 +393,21 @@ impl ProfileRun { _largs: &ProfileCommand, ) -> Result<()> { info!("Starting profile at path {}...", self.profile.display()); - let ref profiles = Profiles::get().await?.0; let path = self.profile.canonicalize()?; - let profile = profiles - .get(&path) - .ok_or( - eyre::eyre!( - "Profile not managed by Theseus (if it exists, try using `profile add` first!)" - ) - )?; - let credentials = theseus::launcher::Credentials { + ensure!( + profile::is_managed(&path).await?, + "Profile not managed by Theseus (if it exists, try using `profile add` first!)", + ); + + let credentials = Credentials { id: self.id.clone(), username: self.name.clone(), access_token: self.token.clone(), }; - let mut proc = profile.run(&credentials).await?; - profile.wait_for(&mut proc).await?; + let mut proc = profile::run(&path, &credentials).await?; + profile::wait_for(&mut proc).await?; success!("Process exited successfully!"); Ok(()) From 53948c7a5ef6b573754d3c6a6969c0232160e336 Mon Sep 17 00:00:00 2001 From: Danielle Hutzley Date: Mon, 27 Jun 2022 16:08:43 -0700 Subject: [PATCH 2/7] Fix Nix Flake --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index e6399f1b1..43c6ba5dc 100644 --- a/flake.nix +++ b/flake.nix @@ -78,5 +78,5 @@ buildInputs = with deps; global ++ gui ++ shell; }; - }) + }); } From b223dc7cbabc9bc800c9ea650b7ef50854b2823c Mon Sep 17 00:00:00 2001 From: Danielle Date: Fri, 15 Jul 2022 15:39:38 +0000 Subject: [PATCH 3/7] Authentication (#37) * Initial authentication implementation * Store user info in the database, improve encapsulation in profiles * Add user list, remove unused dependencies, add spantraces * Implement user remove, update UUID crate * Add user set-default * Revert submodule macro usage * Make tracing significantly less verbose --- Cargo.lock | 1190 +++++++++++------------- flake.nix | 20 +- shell.nix | 8 - theseus/Cargo.toml | 44 +- theseus/src/api/auth.rs | 100 ++ theseus/src/api/mod.rs | 11 +- theseus/src/api/profile.rs | 68 +- theseus/src/error.rs | 54 +- theseus/src/launcher/args.rs | 34 +- theseus/src/launcher/auth.rs | 166 +++- theseus/src/launcher/download.rs | 20 +- theseus/src/launcher/mod.rs | 28 +- theseus/src/lib.rs | 6 +- theseus/src/state/dirs.rs | 7 +- theseus/src/state/metadata.rs | 7 +- theseus/src/state/mod.rs | 78 +- theseus/src/state/profiles.rs | 31 +- theseus/src/state/settings.rs | 10 +- theseus/src/state/users.rs | 79 ++ theseus/src/util/fetch.rs | 8 +- theseus/src/util/mod.rs | 20 + theseus_cli/Cargo.toml | 16 +- theseus_cli/src/main.rs | 48 +- theseus_cli/src/subcommands/mod.rs | 13 +- theseus_cli/src/subcommands/profile.rs | 76 +- theseus_cli/src/subcommands/user.rs | 178 ++++ theseus_cli/src/util.rs | 21 +- 27 files changed, 1490 insertions(+), 851 deletions(-) delete mode 100644 shell.nix create mode 100644 theseus/src/api/auth.rs create mode 100644 theseus/src/state/users.rs create mode 100644 theseus_cli/src/subcommands/user.rs diff --git a/Cargo.lock b/Cargo.lock index 3c54e629e..be86ee670 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -55,9 +64,9 @@ checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "argh" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb41d85d92dfab96cb95ab023c265c5e4261bb956c0fb49ca06d90c570f1958" +checksum = "f023c76cd7975f9969f8e29f0e461decbdc7f51048ce43427107a3d192f1c9bf" dependencies = [ "argh_derive", "argh_shared", @@ -65,9 +74,9 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be69f70ef5497dd6ab331a50bd95c6ac6b8f7f17a7967838332743fbd58dc3b5" +checksum = "48ad219abc0c06ca788aface2e3a1970587e3413ab70acd20e54b6ec524c1f8f" dependencies = [ "argh_shared", "heck 0.3.3", @@ -78,19 +87,24 @@ dependencies = [ [[package]] name = "argh_shared" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f8c380fa28aa1b36107cd97f0196474bb7241bb95a453c5c01a15ac74b2eac" +checksum = "38de00daab4eac7d753e97697066238d67ce9d7e2d823ab4f72fe14af29f3f33" [[package]] -name = "async-trait" -version = "0.1.56" +name = "async-tungstenite" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" dependencies = [ - "proc-macro2", - "quote", - "syn", + "futures-io", + "futures-util", + "log", + "native-tls", + "pin-project-lite", + "tokio", + "tokio-native-tls", + "tungstenite", ] [[package]] @@ -136,21 +150,25 @@ dependencies = [ ] [[package]] -name = "atty" -version = "0.2.14" +name = "autocfg" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "autocfg" -version = "1.1.0" +name = "backtrace" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.5.3", + "object", + "rustc-demangle", +] [[package]] name = "base64" @@ -158,6 +176,15 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bincode" version = "2.0.0-rc.1" @@ -189,34 +216,13 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -251,21 +257,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytemuck" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc" +checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" [[package]] name = "byteorder" @@ -337,9 +331,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.73" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" dependencies = [ "jobserver", ] @@ -371,9 +365,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.10.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +checksum = "295b6eb918a60a25fec0b23a5e633e74fddbaf7bb04411e65a10c366aca4b5cd" dependencies = [ "smallvec", ] @@ -394,7 +388,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.44", + "time 0.1.43", "winapi", ] @@ -430,10 +424,31 @@ dependencies = [ ] [[package]] -name = "color_quant" -version = "1.1.0" +name = "color-eyre" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] [[package]] name = "combine" @@ -460,26 +475,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "const_format" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2906f2480cdc015e998deac388331a0f1c1cd88744948c749513020c83c370bc" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -488,9 +483,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" dependencies = [ "core-foundation-sys", "libc", @@ -538,9 +533,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ "cfg-if", ] @@ -581,11 +576,11 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "2ccfd8c0ee4cce11e45b3fd6f9d5e69e0cc62912aa6a0cb1bf4617b0eba5a12f" dependencies = [ - "generic-array 0.14.5", + "generic-array", "typenum", ] @@ -638,7 +633,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1949fc56475cb37470a1abb5a113e6f70d48fbcc0c2c315a11b24040f81062" dependencies = [ - "bincode", + "bincode 2.0.0-rc.1", "bytes", "chrono", "reqwest", @@ -686,9 +681,9 @@ dependencies = [ [[package]] name = "dbus" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0a745c25b32caa56b82a3950f5fec7893a960f4c10ca3b02060b0c38d8c2ce" +checksum = "6f8bcdd56d2e5c4ed26a529c5a9029f5db8290d433497506f958eae3be148eb6" dependencies = [ "libc", "libdbus-sys", @@ -740,18 +735,9 @@ dependencies = [ [[package]] name = "diff" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" @@ -759,7 +745,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "crypto-common", ] @@ -825,19 +811,6 @@ dependencies = [ "dtoa", ] -[[package]] -name = "embed-resource" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" -dependencies = [ - "cc", - "rustc_version 0.4.0", - "toml", - "vswhom", - "winreg", -] - [[package]] name = "embed_plist" version = "1.2.2" @@ -852,26 +825,13 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "eyre" version = "0.6.8" @@ -882,12 +842,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fastrand" version = "1.7.0" @@ -909,24 +863,26 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if", "libc", "redox_syscall", - "winapi", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ + "cfg-if", "crc32fast", - "miniz_oxide", + "libc", + "miniz_oxide 0.4.4", ] [[package]] @@ -970,12 +926,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fs_extra" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" - [[package]] name = "futf" version = "0.1.5" @@ -988,9 +938,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -1003,9 +953,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -1013,15 +963,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -1030,9 +980,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-lite" @@ -1051,10 +1001,12 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ + "autocfg", + "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -1062,22 +1014,23 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ + "autocfg", "futures-channel", "futures-core", "futures-io", @@ -1087,6 +1040,8 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", + "proc-macro-hack", + "proc-macro-nested", "slab", ] @@ -1184,15 +1139,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.5" @@ -1216,15 +1162,21 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + [[package]] name = "gio" version = "0.15.12" @@ -1387,9 +1339,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.13" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" dependencies = [ "bytes", "fnv", @@ -1406,9 +1358,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" @@ -1461,9 +1413,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ "bytes", "http", @@ -1478,9 +1430,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.7.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" [[package]] name = "httpdate" @@ -1488,20 +1440,11 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "hyper" -version = "0.14.19" +version = "0.14.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" +checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" dependencies = [ "bytes", "futures-channel", @@ -1512,7 +1455,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.2", + "itoa 0.4.8", "pin-project-lite", "socket2", "tokio", @@ -1579,20 +1522,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "image" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-iter", - "num-rational", - "num-traits", -] - [[package]] name = "indenter" version = "0.3.3" @@ -1601,9 +1530,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", @@ -1638,9 +1567,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.5.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itoa" @@ -1722,9 +1651,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] @@ -1740,17 +1669,6 @@ dependencies = [ "treediff", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - [[package]] name = "kuchiki" version = "0.8.1" @@ -1771,9 +1689,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" [[package]] name = "libdbus-sys" @@ -1785,20 +1703,28 @@ dependencies = [ ] [[package]] -name = "lock_api" -version = "0.4.7" +name = "line-wrap" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.17" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ "cfg-if", ] @@ -1826,9 +1752,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "042f74a606175d72ca483e14e0873fe0f6c003f7af45865b17b16fdaface7203" +checksum = "47a4acb83c904844ca12aafeac6fff6f781cf9e220a985c1db94fd94123993aa" dependencies = [ "cc", "dirs-next", @@ -1846,12 +1772,6 @@ dependencies = [ "libc", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "markup5ever" version = "0.10.1" @@ -1883,9 +1803,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.5.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memoffset" @@ -1902,6 +1822,16 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.5.3" @@ -1913,21 +1843,31 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.4" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", ] [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -1960,6 +1900,34 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +[[package]] +name = "ndk-glue" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ndk-sys" version = "0.3.0" @@ -1993,10 +1961,19 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "ntapi" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" dependencies = [ "autocfg", "num-traits", @@ -2013,31 +1990,20 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ "hermit-abi", "libc", @@ -2113,22 +2079,25 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.12.0" +name = "object" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "once_cell" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" [[package]] name = "open" -version = "3.0.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360bcc8316bf6363aa3954c3ccc4de8add167b087e0259190a043c9514f910fe" +checksum = "f2423ffbf445b82e58c3b1543655968923dd06f85432f10be2bb4f1b7122f98c" dependencies = [ "pathdiff", "windows-sys", @@ -2136,41 +2105,29 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.40" +version = "0.10.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", - "openssl-macros", "openssl-sys", ] -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.74" +version = "0.9.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" dependencies = [ "autocfg", "cc", @@ -2209,6 +2166,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "owo-colors" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decf7381921fea4dcb2549c5667eda59b3ec297ab7e2b5fc33eac69d2e7da87b" + [[package]] name = "pango" version = "0.15.10" @@ -2263,17 +2226,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.5", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.3", + "parking_lot_core", ] [[package]] @@ -2290,31 +2243,12 @@ dependencies = [ "winapi", ] -[[package]] -name = "parking_lot_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-sys", -] - [[package]] name = "paste" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" -[[package]] -name = "path-clean" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" - [[package]] name = "pathdiff" version = "0.2.1" @@ -2336,40 +2270,6 @@ dependencies = [ "ucd-trie", ] -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - [[package]] name = "phf" version = "0.8.0" @@ -2419,7 +2319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand 0.8.5", + "rand 0.8.4", ] [[package]] @@ -2469,10 +2369,30 @@ dependencies = [ ] [[package]] -name = "pin-project-lite" -version = "0.2.9" +name = "pin-project" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -2482,9 +2402,23 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" + +[[package]] +name = "plist" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" +dependencies = [ + "base64", + "indexmap", + "line-wrap", + "serde", + "time 0.3.11", + "xml-rs", +] [[package]] name = "png" @@ -2507,14 +2441,14 @@ dependencies = [ "bitflags", "crc32fast", "deflate 1.0.0", - "miniz_oxide", + "miniz_oxide 0.5.3", ] [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "precomputed-hash" @@ -2534,16 +2468,6 @@ dependencies = [ "output_vt100", ] -[[package]] -name = "pretty_env_logger" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" -dependencies = [ - "env_logger", - "log", -] - [[package]] name = "proc-macro-crate" version = "1.1.3" @@ -2584,6 +2508,12 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + [[package]] name = "proc-macro2" version = "1.0.40" @@ -2593,17 +2523,11 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.20" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ "proc-macro2", ] @@ -2618,19 +2542,20 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc", + "rand_hc 0.2.0", "rand_pcg", ] [[package]] name = "rand" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", + "rand_hc 0.3.1", ] [[package]] @@ -2668,7 +2593,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.3", ] [[package]] @@ -2680,6 +2605,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core 0.6.3", +] + [[package]] name = "rand_pcg" version = "0.2.1" @@ -2713,16 +2647,16 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.3", "redox_syscall", "thiserror", ] [[package]] name = "regex" -version = "1.5.6" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -2740,9 +2674,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.26" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "remove_dir_all" @@ -2755,16 +2689,15 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.11" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", "hyper", @@ -2782,7 +2715,6 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", - "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2792,13 +2724,12 @@ dependencies = [ [[package]] name = "rfd" -version = "0.9.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f121348fd3b9035ed11be1f028e8944263c30641f8c5deacf57a4320782fb402" +checksum = "1f756b55bff8f256a1a8c24dbabb1430ac8110628e418a02e4a1c5ff67179f56" dependencies = [ "block", "dispatch", - "embed-resource", "glib-sys", "gobject-sys", "gtk-sys", @@ -2815,6 +2746,12 @@ dependencies = [ "windows 0.37.0", ] +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + [[package]] name = "rustc_version" version = "0.3.3" @@ -2830,7 +2767,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.10", + "semver 1.0.12", ] [[package]] @@ -2841,9 +2778,15 @@ checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "same-file" @@ -2856,12 +2799,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", - "windows-sys", + "winapi", ] [[package]] @@ -2878,9 +2821,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.6.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ "bitflags", "core-foundation", @@ -2891,9 +2834,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ "core-foundation-sys", "libc", @@ -2930,9 +2873,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" +checksum = "a2333e6df6d6598f2b1974829f853c2b4c5f4a6e503c10af918081aa6f8564e1" dependencies = [ "serde", ] @@ -2948,18 +2891,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" dependencies = [ "proc-macro2", "quote", @@ -2968,11 +2911,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "063bf466a64011ac24040a49009724ee60a57da1b437617ceb32e53ad61bfb19" dependencies = [ - "itoa 1.0.2", + "itoa 0.4.8", "ryu", "serde", ] @@ -2990,12 +2933,12 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa 0.4.8", "ryu", "serde", ] @@ -3056,30 +2999,20 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.8.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] name = "sha1" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" @@ -3089,7 +3022,7 @@ checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] @@ -3128,9 +3061,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "sled" @@ -3145,21 +3078,21 @@ dependencies = [ "fxhash", "libc", "log", - "parking_lot 0.11.2", + "parking_lot", "zstd", ] [[package]] name = "smallvec" -version = "1.8.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc88c725d61fc6c3132893370cac4a0200e3fedf5da8331c570664b1987f5ca2" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" dependencies = [ "libc", "winapi", @@ -3210,13 +3143,13 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26" dependencies = [ + "lazy_static", "new_debug_unreachable", - "once_cell", - "parking_lot 0.12.1", + "parking_lot", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3301,7 +3234,7 @@ version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ - "cfg-expr 0.10.3", + "cfg-expr 0.10.1", "heck 0.4.0", "pkg-config", "toml", @@ -3331,9 +3264,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.11.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfe4c782f0543f667ee3b732d026b2f1c64af39cd52e726dec1ea1f2d8f6b80" +checksum = "53da5dd98a3c605a3ca8fe967d7c50eba8a36072ff13e04e24402b2c492ac55a" dependencies = [ "bitflags", "cairo-rs", @@ -3351,7 +3284,6 @@ dependencies = [ "glib", "glib-sys", "gtk", - "image", "instant", "jni 0.19.0", "lazy_static", @@ -3362,15 +3294,13 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.11.2", + "parking_lot", "paste", - "png 0.17.5", "raw-window-handle", "scopeguard", "serde", "tao-core-video-sys", "unicode-segmentation", - "uuid 0.8.2", "windows 0.37.0", "windows-implement", "x11-dl", @@ -3401,12 +3331,13 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0" +version = "1.0.0-rc.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1ebb60bb8f246d5351ff9b7728fdfa7a6eba72baa722ab6021d553981caba1" +checksum = "81af088a87f908dab3a268f92e3c331e911bed6b1756bbfaeadedfe9dd40fe4f" dependencies = [ "anyhow", "attohttpc", + "bincode 1.3.3", "cocoa", "dirs-next", "embed_plist", @@ -3426,11 +3357,11 @@ dependencies = [ "os_info", "os_pipe", "percent-encoding", - "rand 0.8.5", + "rand 0.8.4", "raw-window-handle", "regex", "rfd", - "semver 1.0.10", + "semver 1.0.12", "serde", "serde_json", "serde_repr", @@ -3454,14 +3385,15 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b26eb3523e962b90012fedbfb744ca153d9be85e7981e00737e106d5323941" +checksum = "2f2b32e551ec810ba4ab2ad735de5e3576e54bf0322ab0f4b7ce41244bc65ecf" dependencies = [ "anyhow", "cargo_toml", "heck 0.4.0", - "semver 1.0.10", + "json-patch", + "semver 1.0.12", "serde_json", "tauri-utils", "winres", @@ -3469,32 +3401,35 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9468c5189188c820ef605dfe4937c768cb2918e9460c8093dc4ee2cbd717b262" +checksum = "f6f1f7928dd040fc03c94207adfad506c0cf5b152982fd1dc0a621f7fd777e22" dependencies = [ "base64", "brotli", "ico", + "json-patch", + "plist", "png 0.17.5", "proc-macro2", "quote", "regex", - "semver 1.0.10", + "semver 1.0.12", "serde", "serde_json", "sha2", "tauri-utils", "thiserror", + "time 0.3.11", "uuid 1.1.2", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e3ffddd7a274fc7baaa260888c971a0d95d2ef403aa16600c878b8b1c00ffe" +checksum = "e50b9f52871c088857360319a37472d59f4644f1ed004489599d62831a1b6996" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -3506,9 +3441,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.9.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7dc4db360bb40584187b6cb7834da736ce4ef2ab0914e2be98014444fa9920" +checksum = "dc343e974f76c0f5471da85f87510bb54dfc9a7664f3e649af58f49887965e43" dependencies = [ "gtk", "http", @@ -3525,14 +3460,14 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.9.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c876fb3a6e7c6fe2ac466b2a6ecd83658528844b4df0914558a9bc1501b31cf3" +checksum = "0cd6fe3f8dc12a9c409ee6da19379636525e0ff8da12897c04dc1e76b8c8ff62" dependencies = [ "cocoa", "gtk", "percent-encoding", - "rand 0.8.5", + "rand 0.8.4", "tauri-runtime", "tauri-utils", "uuid 1.1.2", @@ -3544,9 +3479,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727145cb55b8897fa9f2bcea4fad31dc39394703d037c9669b40f2d1c0c2d7f3" +checksum = "12ff4b68d9faeb57c9c727bf58c9c9768d2b67d8e84e62ce6146e7859a2e9c6b" dependencies = [ "brotli", "ctor", @@ -3559,24 +3494,25 @@ dependencies = [ "phf 0.10.1", "proc-macro2", "quote", - "semver 1.0.10", + "semver 1.0.12", "serde", "serde_json", "serde_with", "thiserror", "url", "walkdir", + "windows 0.37.0", ] [[package]] name = "tempfile" -version = "3.3.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if", - "fastrand", "libc", + "rand 0.8.4", "redox_syscall", "remove_dir_all", "winapi", @@ -3593,15 +3529,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - [[package]] name = "terminal_size" version = "0.1.17" @@ -3617,19 +3544,15 @@ name = "theseus" version = "0.1.0" dependencies = [ "argh", - "async-trait", - "bincode", + "async-tungstenite", + "bincode 2.0.0-rc.1", "bytes", "chrono", - "const_format", "daedalus", "dirs", - "fs_extra", "futures", - "json5", "log", "once_cell", - "path-clean", "pretty_assertions", "regex", "reqwest", @@ -3640,9 +3563,11 @@ dependencies = [ "sys-info", "thiserror", "tokio", - "uuid 0.8.2", + "tracing", + "tracing-error", + "url", + "uuid 1.1.2", "zip", - "zip-extensions", ] [[package]] @@ -3650,19 +3575,24 @@ name = "theseus_cli" version = "0.1.0" dependencies = [ "argh", + "color-eyre", "daedalus", "dialoguer", "dirs", "eyre", "futures", - "log", "paris", - "pretty_env_logger", "tabled", "theseus", "tokio", "tokio-stream", - "uuid 0.8.2", + "tracing", + "tracing-error", + "tracing-futures", + "tracing-subscriber", + "url", + "uuid 1.1.2", + "webbrowser", ] [[package]] @@ -3683,18 +3613,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", @@ -3712,12 +3642,11 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -3727,15 +3656,16 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ + "itoa 1.0.2", "libc", "num_threads", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" dependencies = [ "tinyvec_macros", ] @@ -3748,9 +3678,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.19.2" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ "bytes", "libc", @@ -3758,10 +3688,9 @@ dependencies = [ "mio", "num_cpus", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", "tokio-macros", "winapi", ] @@ -3800,16 +3729,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ "bytes", "futures-core", "futures-sink", + "log", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -3823,15 +3752,15 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" dependencies = [ "cfg-if", "pin-project-lite", @@ -3841,9 +3770,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" dependencies = [ "proc-macro2", "quote", @@ -3852,12 +3781,31 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.28" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ - "once_cell", - "valuable", + "lazy_static", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", ] [[package]] @@ -3873,9 +3821,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.11" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" dependencies = [ "ansi_term", "lazy_static", @@ -3904,6 +3852,26 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "native-tls", + "rand 0.8.4", + "sha-1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "typenum" version = "1.15.0" @@ -3912,15 +3880,15 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" [[package]] name = "unicode-ident" @@ -3930,18 +3898,18 @@ checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" -version = "0.1.20" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dee68f85cab8cf68dec42158baf3a79a1cdc065a8b103025965d6ccb7f6cbd" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" @@ -3949,12 +3917,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" - [[package]] name = "url" version = "2.2.2" @@ -3979,10 +3941,6 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.7", - "serde", -] [[package]] name = "uuid" @@ -3990,15 +3948,10 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.3", + "serde", ] -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - [[package]] name = "vcpkg" version = "0.2.15" @@ -4029,26 +3982,6 @@ version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "waker-fn" version = "1.1.0" @@ -4084,21 +4017,15 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4106,9 +4033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", @@ -4121,9 +4048,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.31" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" dependencies = [ "cfg-if", "js-sys", @@ -4133,9 +4060,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4143,9 +4070,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", @@ -4156,20 +4083,34 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "web-sys" -version = "0.3.58" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webbrowser" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +dependencies = [ + "jni 0.19.0", + "ndk-glue", + "url", + "web-sys", + "widestring", + "winapi", +] + [[package]] name = "webkit2gtk" version = "0.18.0" @@ -4255,10 +4196,16 @@ dependencies = [ ] [[package]] -name = "wildmatch" -version = "2.1.0" +name = "widestring" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c48bd20df7e4ced539c12f570f937c6b4884928a87fee70a479d72f031d4e0" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "wildmatch" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee583bdc5ff1cf9db20e9db5bb3ff4c3089a8f6b8b31aff265c9aba85812db86" [[package]] name = "winapi" @@ -4448,9 +4395,9 @@ checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" [[package]] name = "winreg" -version = "0.10.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ "winapi", ] @@ -4477,9 +4424,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.18.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b1ba327c7dd4292f46bf8e6ba8e6ec2db4443b2973c9d304a359d95e0aa856" +checksum = "38425583b1f8c16c074fa4f962f7f0ddd5cb2f6b241a494a26db5eca3ccd4fd7" dependencies = [ "block", "cocoa", @@ -4545,9 +4492,9 @@ checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" [[package]] name = "zeroize" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +checksum = "20b578acffd8516a6c3f2a1bdefc1ec37e547bb4e0fb8b6b01a4cafc886b4442" [[package]] name = "zip" @@ -4560,16 +4507,7 @@ dependencies = [ "crc32fast", "flate2", "thiserror", - "time 0.1.44", -] - -[[package]] -name = "zip-extensions" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c3c977bc3434ce2d4bcea8ad3c644672de0f2c402b72b9171ca80a8885d14" -dependencies = [ - "zip", + "time 0.1.43", ] [[package]] diff --git a/flake.nix b/flake.nix index 43c6ba5dc..703964f1a 100644 --- a/flake.nix +++ b/flake.nix @@ -38,8 +38,7 @@ gtk4 gdk-pixbuf atk webkitgtk dbus ]; shell = [ - toolchain - (with fenix; combine [toolchain default.clippy rust-analyzer]) + (with fenix; combine [toolchain default.clippy complete.rust-src rust-analyzer]) git jdk17 jdk8 ]; @@ -58,19 +57,10 @@ cli = utils.mkApp { drv = self.packages.${system}.theseus-cli; }; - cli-test = utils.mkApp { - drv = pkgs.writeShellApplication { - name = "theseus-test-cli"; - runtimeInputs = [ - (self.packages.${system}.theseus-cli.overrideAttrs (old: old // { - release = false; - })) - ]; - text = '' - DUMMY_ID="$(printf '%0.sa' {1..32})" - theseus_cli profile run -t "" -n "Test" -i "$DUMMY_ID" "$@" - ''; - }; + cli-dev = utils.mkApp { + drv = self.packages.${system}.theseus-cli.overrideAttrs (old: old // { + release = false; + }); }; }; diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 69a7fa416..000000000 --- a/shell.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ pkgs ? import {} }: - -pkgs.mkShell { - buildInputs = with pkgs; [ - rustc cargo clippy openssl pkg-config - gtk4 gdk-pixbuf atk webkitgtk - ]; -} diff --git a/theseus/Cargo.toml b/theseus/Cargo.toml index 619f96572..b87e99c4f 100644 --- a/theseus/Cargo.toml +++ b/theseus/Cargo.toml @@ -7,38 +7,32 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -thiserror = "1.0" -async-trait = "0.1.51" - -daedalus = { version = "0.1.16", features = ["bincode"] } - +bytes = "1" bincode = { version = "2.0.0-rc.1", features = ["serde"] } -sled = { version = "0.34.7", features = ["compression"] } - -reqwest = { version = "0.11", features = ["json"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -json5 = "0.4.1" -chrono = { version = "0.4", features = ["serde"] } -uuid = { version = "0.8", features = ["serde", "v4"] } -bytes = "1" -zip = "0.5" -zip-extensions = "0.6" sha1 = { version = "0.6.0", features = ["std"]} -path-clean = "0.1.0" -fs_extra = "1.2.0" +sled = { version = "0.34.7", features = ["compression"] } +url = "2.2" +uuid = { version = "1.1", features = ["serde", "v4"] } +zip = "0.5" + +chrono = { version = "0.4.19", features = ["serde"] } +daedalus = { version = "0.1.16", features = ["bincode"] } dirs = "4.0" - -regex = "1.5" - -tokio = { version = "1", features = ["full"] } -futures = "0.3" - -sys-info = "0.9.0" - +# TODO: possibly replace with tracing to have structured logging log = "0.4.14" -const_format = "0.2.22" +regex = "1.5" +sys-info = "0.9.0" +thiserror = "1.0" +tracing = "0.1" +tracing-error = "0.2" + +async-tungstenite = { version = "0.17", features = ["tokio-runtime", "tokio-native-tls"] } +futures = "0.3" once_cell = "1.9.0" +reqwest = { version = "0.11", features = ["json"] } +tokio = { version = "1", features = ["full"] } [dev-dependencies] argh = "0.1.6" diff --git a/theseus/src/api/auth.rs b/theseus/src/api/auth.rs new file mode 100644 index 000000000..8e9951824 --- /dev/null +++ b/theseus/src/api/auth.rs @@ -0,0 +1,100 @@ +//! Authentication flow interface +use crate::{launcher::auth as inner, State}; +use futures::prelude::*; +use tokio::sync::oneshot; + +pub use inner::Credentials; + +/// Authenticate a user with Hydra +/// To run this, you need to first spawn this function as a task, then +/// open a browser to the given URL and finally wait on the spawned future +/// with the ability to cancel in case the browser is closed before finishing +#[tracing::instrument] +pub async fn authenticate( + browser_url: oneshot::Sender, +) -> crate::Result { + let mut flow = inner::HydraAuthFlow::new().await?; + let state = State::get().await?; + let mut users = state.users.write().await; + + let url = flow.prepare_login_url().await?; + browser_url.send(url).map_err(|url| { + crate::ErrorKind::OtherError(format!( + "Error sending browser url to parent: {url}" + )) + })?; + + let credentials = flow.extract_credentials().await?; + users.insert(&credentials)?; + + if state.settings.read().await.default_user.is_none() { + let mut settings = state.settings.write().await; + settings.default_user = Some(credentials.id); + } + + Ok(credentials) +} + +/// Refresh some credentials using Hydra, if needed +#[tracing::instrument] +pub async fn refresh( + user: uuid::Uuid, + update_name: bool, +) -> crate::Result { + let state = State::get().await?; + let mut users = state.users.write().await; + + futures::future::ready(users.get(user)?.ok_or_else(|| { + crate::ErrorKind::OtherError(format!( + "Tried to refresh nonexistent user with ID {user}" + )) + .as_error() + })) + .and_then(|mut credentials| async move { + if chrono::offset::Utc::now() > credentials.expires { + inner::refresh_credentials(&mut credentials).await?; + if update_name { + inner::refresh_username(&mut credentials).await?; + } + } + users.insert(&credentials)?; + Ok(credentials) + }) + .await +} + +/// Remove a user account from the database +#[tracing::instrument] +pub async fn remove_user(user: uuid::Uuid) -> crate::Result<()> { + let state = State::get().await?; + let mut users = state.users.write().await; + + if state.settings.read().await.default_user == Some(user) { + let mut settings = state.settings.write().await; + settings.default_user = users + .0 + .first()? + .map(|it| uuid::Uuid::from_slice(&it.0)) + .transpose()?; + } + + users.remove(user)?; + Ok(()) +} + +/// Check if a user exists in Theseus +#[tracing::instrument] +pub async fn has_user(user: uuid::Uuid) -> crate::Result { + let state = State::get().await?; + let users = state.users.read().await; + + Ok(users.contains(user)?) +} + +/// Get a copy of the list of all user credentials +#[tracing::instrument] +pub async fn users() -> crate::Result> { + let state = State::get().await?; + let users = state.users.read().await; + users.iter().collect() +} diff --git a/theseus/src/api/mod.rs b/theseus/src/api/mod.rs index cdddd67b5..0d572b3b5 100644 --- a/theseus/src/api/mod.rs +++ b/theseus/src/api/mod.rs @@ -1,18 +1,17 @@ //! API for interacting with Theseus +pub mod auth; pub mod profile; pub mod data { - pub use crate::{ - launcher::Credentials, - state::{ - DirectoryInfo, Hooks, JavaSettings, MemorySettings, ModLoader, - ProfileMetadata, Settings, WindowSize, - }, + pub use crate::state::{ + DirectoryInfo, Hooks, JavaSettings, MemorySettings, ModLoader, + ProfileMetadata, Settings, WindowSize, }; } pub mod prelude { pub use crate::{ + auth::{self, Credentials}, data::*, profile::{self, Profile}, State, diff --git a/theseus/src/api/profile.rs b/theseus/src/api/profile.rs index 6b91592ca..68f059e08 100644 --- a/theseus/src/api/profile.rs +++ b/theseus/src/api/profile.rs @@ -1,14 +1,17 @@ //! Theseus profile management interface - pub use crate::{ state::{JavaSettings, Profile}, State, }; use daedalus as d; -use std::{future::Future, path::Path}; +use std::{ + future::Future, + path::{Path, PathBuf}, +}; use tokio::process::{Child, Command}; /// Add a profile to the in-memory state +#[tracing::instrument] pub async fn add(profile: Profile) -> crate::Result<()> { let state = State::get().await?; let mut profiles = state.profiles.write().await; @@ -18,6 +21,7 @@ pub async fn add(profile: Profile) -> crate::Result<()> { } /// Add a path as a profile in-memory +#[tracing::instrument] pub async fn add_path(path: &Path) -> crate::Result<()> { let state = State::get().await?; let mut profiles = state.profiles.write().await; @@ -27,6 +31,7 @@ pub async fn add_path(path: &Path) -> crate::Result<()> { } /// Remove a profile +#[tracing::instrument] pub async fn remove(path: &Path) -> crate::Result<()> { let state = State::get().await?; let mut profiles = state.profiles.write().await; @@ -36,19 +41,22 @@ pub async fn remove(path: &Path) -> crate::Result<()> { } /// Get a profile by path, +#[tracing::instrument] pub async fn get(path: &Path) -> crate::Result> { let state = State::get().await?; let profiles = state.profiles.read().await; profiles.0.get(path).map_or(Ok(None), |prof| match prof { Some(prof) => Ok(Some(prof.clone())), - None => Err(crate::Error::UnloadedProfileError( + None => Err(crate::ErrorKind::UnloadedProfileError( path.display().to_string(), - )), + ) + .as_error()), }) } /// Check if a profile is already managed by Theseus +#[tracing::instrument] pub async fn is_managed(profile: &Path) -> crate::Result { let state = State::get().await?; let profiles = state.profiles.read().await; @@ -56,6 +64,7 @@ pub async fn is_managed(profile: &Path) -> crate::Result { } /// Check if a profile is loaded +#[tracing::instrument] pub async fn is_loaded(profile: &Path) -> crate::Result { let state = State::get().await?; let profiles = state.profiles.read().await; @@ -75,29 +84,41 @@ pub async fn edit( where Fut: Future>, { - let state = State::get().await.unwrap(); + let state = State::get().await?; let mut profiles = state.profiles.write().await; match profiles.0.get_mut(path) { Some(&mut Some(ref mut profile)) => action(profile).await, - Some(&mut None) => Err(crate::Error::UnloadedProfileError( + Some(&mut None) => Err(crate::ErrorKind::UnloadedProfileError( path.display().to_string(), - )), - None => Err(crate::Error::UnmanagedProfileError( + ) + .as_error()), + None => Err(crate::ErrorKind::UnmanagedProfileError( path.display().to_string(), - )), + ) + .as_error()), } } +/// Get a copy of the profile set +#[tracing::instrument] +pub async fn list( +) -> crate::Result>> { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles.0.clone()) +} + /// Run Minecraft using a profile +#[tracing::instrument(skip_all)] pub async fn run( path: &Path, - credentials: &crate::launcher::Credentials, + credentials: &crate::auth::Credentials, ) -> crate::Result { let state = State::get().await.unwrap(); let settings = state.settings.read().await; let profile = get(path).await?.ok_or_else(|| { - crate::Error::OtherError(format!( + crate::ErrorKind::OtherError(format!( "Tried to run a nonexistent or unloaded profile at path {}!", path.display() )) @@ -110,7 +131,7 @@ pub async fn run( .iter() .find(|it| it.id == profile.metadata.game_version.as_ref()) .ok_or_else(|| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Invalid or unknown Minecraft version: {}", profile.metadata.game_version )) @@ -130,10 +151,11 @@ pub async fn run( .await?; if !result.success() { - return Err(crate::Error::LauncherError(format!( + return Err(crate::ErrorKind::LauncherError(format!( "Non-zero exit code for pre-launch hook: {}", result.code().unwrap_or(-1) - ))); + )) + .as_error()); } } @@ -153,7 +175,7 @@ pub async fn run( settings.java_8_path.as_ref() } .ok_or_else(|| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "No Java installed for version {}", version_info.java_version.map_or(8, |it| it.major_version), )) @@ -161,10 +183,11 @@ pub async fn run( }; if !java_install.exists() { - return Err(crate::Error::LauncherError(format!( + return Err(crate::ErrorKind::LauncherError(format!( "Could not find Java install: {}", java_install.display() - ))); + )) + .as_error()); } let ref java_args = profile @@ -195,21 +218,26 @@ pub async fn run( .await } +#[tracing::instrument] pub async fn kill(running: &mut Child) -> crate::Result<()> { running.kill().await?; wait_for(running).await } +#[tracing::instrument] pub async fn wait_for(running: &mut Child) -> crate::Result<()> { let result = running.wait().await.map_err(|err| { - crate::Error::LauncherError(format!("Error running minecraft: {err}")) + crate::ErrorKind::LauncherError(format!( + "Error running minecraft: {err}" + )) })?; match result.success() { - false => Err(crate::Error::LauncherError(format!( + false => Err(crate::ErrorKind::LauncherError(format!( "Minecraft exited with non-zero code {}", result.code().unwrap_or(-1) - ))), + )) + .as_error()), true => Ok(()), } } diff --git a/theseus/src/error.rs b/theseus/src/error.rs index 2ba5ccc82..f97822f0b 100644 --- a/theseus/src/error.rs +++ b/theseus/src/error.rs @@ -1,17 +1,25 @@ //! Theseus error type +use tracing_error::InstrumentError; + #[derive(thiserror::Error, Debug)] -pub enum Error { +pub enum ErrorKind { #[error("Filesystem error: {0}")] FSError(String), #[error("Serialization error (JSON): {0}")] JSONError(#[from] serde_json::Error), + #[error("Error parsing UUID: {0}")] + UUIDError(#[from] uuid::Error), + #[error("Serialization error (Bincode): {0}")] - EncodeError(#[from] bincode::error::DecodeError), + EncodeError(#[from] bincode::error::EncodeError), #[error("Deserialization error (Bincode): {0}")] - DecodeError(#[from] bincode::error::EncodeError), + DecodeError(#[from] bincode::error::DecodeError), + + #[error("Error parsing URL: {0}")] + URLError(#[from] url::ParseError), #[error("Database error: {0}")] DBError(#[from] sled::Error), @@ -22,6 +30,9 @@ pub enum Error { #[error("Metadata error: {0}")] MetadataError(#[from] daedalus::Error), + #[error("Minecraft authentication error: {0}")] + HydraError(String), + #[error("I/O error: {0}")] IOError(#[from] std::io::Error), @@ -31,6 +42,12 @@ pub enum Error { #[error("Error fetching URL: {0}")] FetchError(#[from] reqwest::Error), + #[error("Websocket error: {0}")] + WSError(#[from] async_tungstenite::tungstenite::Error), + + #[error("Websocket closed before {0} could be received!")] + WSClosedError(String), + #[error("Incorrect Sha1 hash for download: {0} != {1}")] HashError(String, String), @@ -52,4 +69,35 @@ pub enum Error { OtherError(String), } +#[derive(Debug)] +pub struct Error { + source: tracing_error::TracedError, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.source.source() + } +} + +impl std::fmt::Display for Error { + fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(fmt, "{}", self.source) + } +} + +impl> From for Error { + fn from(source: E) -> Self { + Self { + source: Into::::into(source).in_current_span(), + } + } +} + +impl ErrorKind { + pub fn as_error(self) -> Error { + self.into() + } +} + pub type Result = core::result::Result; diff --git a/theseus/src/launcher/args.rs b/theseus/src/launcher/args.rs index 4fadcb146..20d9becaf 100644 --- a/theseus/src/launcher/args.rs +++ b/theseus/src/launcher/args.rs @@ -40,10 +40,11 @@ pub fn get_class_paths( client_path .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified class path {} does not exist", client_path.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_string(), @@ -70,10 +71,11 @@ pub fn get_lib_path(libraries_path: &Path, lib: &str) -> crate::Result { path.push(get_path_from_artifact(lib.as_ref())?); let path = &path.canonicalize().map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Library file at path {} does not exist", path.to_string_lossy() )) + .as_error() })?; Ok(path.to_string_lossy().to_string()) @@ -104,10 +106,11 @@ pub fn get_jvm_arguments( "-Djava.library.path={}", &natives_path .canonicalize() - .map_err(|_| crate::Error::LauncherError(format!( + .map_err(|_| crate::ErrorKind::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() - )))? + )) + .as_error())? .to_string_lossy() .to_string() )); @@ -142,10 +145,11 @@ fn parse_jvm_argument( &natives_path .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() )) + .as_error() })? .to_string_lossy(), ) @@ -154,10 +158,11 @@ fn parse_jvm_argument( &libraries_path .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified libraries path {} does not exist", libraries_path.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_string(), @@ -239,7 +244,7 @@ fn parse_minecraft_argument( .replace("${auth_access_token}", access_token) .replace("${auth_session}", access_token) .replace("${auth_player_name}", username) - .replace("${auth_uuid}", &uuid.to_hyphenated().to_string()) + .replace("${auth_uuid}", &uuid.hyphenated().to_string()) .replace("${user_properties}", "{}") .replace("${user_type}", "mojang") .replace("${version_name}", version) @@ -249,10 +254,11 @@ fn parse_minecraft_argument( &game_directory .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified game directory {} does not exist", game_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), @@ -262,10 +268,11 @@ fn parse_minecraft_argument( &assets_directory .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), @@ -275,10 +282,11 @@ fn parse_minecraft_argument( &assets_directory .canonicalize() .map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), @@ -361,17 +369,19 @@ pub async fn get_processor_main_class( Ok(tokio::task::spawn_blocking(move || { let zipfile = std::fs::File::open(&path)?; let mut archive = zip::ZipArchive::new(zipfile).map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Cannot read processor at {}", path )) + .as_error() })?; let file = archive.by_name("META-INF/MANIFEST.MF").map_err(|_| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Cannot read processor manifest at {}", path )) + .as_error() })?; let reader = BufReader::new(file); diff --git a/theseus/src/launcher/auth.rs b/theseus/src/launcher/auth.rs index d05595754..b12d1d428 100644 --- a/theseus/src/launcher/auth.rs +++ b/theseus/src/launcher/auth.rs @@ -1,8 +1,168 @@ -//! Authentication flow -// TODO: Implement authentication -#[derive(Debug)] +//! Authentication flow based on Hydra +use async_tungstenite as ws; +use bincode::{Decode, Encode}; +use chrono::{prelude::*, Duration}; +use futures::prelude::*; +use once_cell::sync::*; +use serde::Deserialize; +use url::Url; + +pub const HYDRA_URL: Lazy = + Lazy::new(|| Url::parse("https://hydra.modrinth.com").unwrap()); + +// Socket messages +#[derive(Deserialize)] +struct ErrorJSON { + error: String, +} + +impl ErrorJSON { + pub fn unwrap<'a, T: Deserialize<'a>>(data: &'a [u8]) -> crate::Result { + if let Ok(err) = serde_json::from_slice::(data) { + Err(crate::ErrorKind::HydraError(err.error).as_error()) + } else { + Ok(serde_json::from_slice::(data)?) + } + } +} + +#[derive(Deserialize)] +struct LoginCodeJSON { + login_code: String, +} + +#[derive(Deserialize)] +struct TokenJSON { + token: String, + refresh_token: String, + expires_after: u32, +} + +#[derive(Deserialize)] +struct ProfileInfoJSON { + id: uuid::Uuid, + name: String, +} + +// Login information +#[derive(Encode, Decode)] pub struct Credentials { + #[bincode(with_serde)] pub id: uuid::Uuid, pub username: String, pub access_token: String, + pub refresh_token: String, + #[bincode(with_serde)] + pub expires: DateTime, + _ctor_scope: std::marker::PhantomData<()>, +} + +// Implementation +pub struct HydraAuthFlow { + socket: ws::WebSocketStream, +} + +impl HydraAuthFlow { + pub async fn new() -> crate::Result { + let sock_url = wrap_ref_builder!( + it = HYDRA_URL => + { it.set_scheme("wss").ok() } + ); + let (socket, _) = ws::tokio::connect_async(sock_url.clone()).await?; + Ok(Self { socket }) + } + + pub async fn prepare_login_url(&mut self) -> crate::Result { + let code_resp = self + .socket + .try_next() + .await? + .ok_or( + crate::ErrorKind::WSClosedError(String::from( + "login socket ID", + )) + .as_error(), + )? + .into_data(); + let code = ErrorJSON::unwrap::(&code_resp)?; + Ok(wrap_ref_builder!( + it = HYDRA_URL.join("login")? => + { it.query_pairs_mut().append_pair("id", &code.login_code); } + )) + } + + pub async fn extract_credentials(&mut self) -> crate::Result { + // Minecraft bearer token + let token_resp = self + .socket + .try_next() + .await? + .ok_or( + crate::ErrorKind::WSClosedError(String::from( + "login socket ID", + )) + .as_error(), + )? + .into_data(); + let token = ErrorJSON::unwrap::(&token_resp)?; + let expires = + Utc::now() + Duration::seconds(token.expires_after.into()); + + // Get account credentials + let info = fetch_info(&token.token).await?; + + // Return structure from response + Ok(Credentials { + username: info.name, + id: info.id, + refresh_token: token.refresh_token, + access_token: token.token, + expires, + _ctor_scope: std::marker::PhantomData, + }) + } +} + +pub async fn refresh_credentials( + credentials: &mut Credentials, +) -> crate::Result<()> { + let resp = crate::config::REQWEST_CLIENT + .post(HYDRA_URL.join("/refresh")?) + .json( + &serde_json::json!({ "refresh_token": credentials.refresh_token }), + ) + .send() + .await? + .error_for_status()? + .json::() + .await?; + + credentials.access_token = resp.token; + credentials.refresh_token = resp.refresh_token; + credentials.expires = + Utc::now() + Duration::seconds(resp.expires_after.into()); + + Ok(()) +} + +pub async fn refresh_username( + credentials: &mut Credentials, +) -> crate::Result<()> { + let info = fetch_info(&credentials.access_token).await?; + credentials.username = info.name; + Ok(()) +} + +// Helpers +async fn fetch_info(token: &str) -> crate::Result { + let url = + Url::parse("https://api.minecraftservices.com/minecraft/profile")?; + Ok(crate::config::REQWEST_CLIENT + .get(url) + .header(reqwest::header::AUTHORIZATION, format!("Bearer {token}")) + .send() + .await? + .error_for_status()? + .json::() + .await?) } diff --git a/theseus/src/launcher/download.rs b/theseus/src/launcher/download.rs index 224594757..af9a8d2e5 100644 --- a/theseus/src/launcher/download.rs +++ b/theseus/src/launcher/download.rs @@ -13,9 +13,9 @@ use daedalus::{ modded::LoaderVersion, }; use futures::prelude::*; -use std::sync::Arc; use tokio::{fs, sync::OnceCell}; +#[tracing::instrument(skip_all)] pub async fn download_minecraft( st: &State, version: &GameVersionInfo, @@ -33,6 +33,7 @@ pub async fn download_minecraft( Ok(()) } +#[tracing::instrument(skip_all, fields(version = version.id.as_str(), loader = ?loader))] pub async fn download_version_info( st: &State, version: &GameVersion, @@ -69,6 +70,7 @@ pub async fn download_version_info( Ok(res) } +#[tracing::instrument(skip_all)] pub async fn download_client( st: &State, version_info: &GameVersionInfo, @@ -78,9 +80,12 @@ pub async fn download_client( let client_download = version_info .downloads .get(&d::minecraft::DownloadType::Client) - .ok_or(crate::Error::LauncherError(format!( - "No client downloads exist for version {version}" - )))?; + .ok_or( + crate::ErrorKind::LauncherError(format!( + "No client downloads exist for version {version}" + )) + .as_error(), + )?; let path = st .directories .version_dir(version) @@ -99,6 +104,7 @@ pub async fn download_client( Ok(()) } +#[tracing::instrument(skip_all)] pub async fn download_assets_index( st: &State, version: &GameVersionInfo, @@ -126,6 +132,7 @@ pub async fn download_assets_index( Ok(res) } +#[tracing::instrument(skip(st, index))] pub async fn download_assets( st: &State, with_legacy: bool, @@ -180,16 +187,13 @@ pub async fn download_assets( Ok(()) } +#[tracing::instrument(skip(st, libraries))] pub async fn download_libraries( st: &State, libraries: &[Library], version: &str, ) -> crate::Result<()> { log::debug!("Loading libraries"); - let (libraries_dir, natives_dir) = ( - Arc::new(st.directories.libraries_dir()), - Arc::new(st.directories.version_natives_dir(version)), - ); tokio::try_join! { fs::create_dir_all(st.directories.libraries_dir()), diff --git a/theseus/src/launcher/mod.rs b/theseus/src/launcher/mod.rs index 93da54c32..21ede9cfb 100644 --- a/theseus/src/launcher/mod.rs +++ b/theseus/src/launcher/mod.rs @@ -6,11 +6,11 @@ use tokio::process::{Child, Command}; mod args; -mod auth; -pub use auth::Credentials; +pub mod auth; mod download; +#[tracing::instrument] pub fn parse_rule(rule: &d::minecraft::Rule) -> bool { use d::minecraft::{Rule, RuleAction}; @@ -44,6 +44,7 @@ macro_rules! processor_rules { } } +#[tracing::instrument(skip_all, fields(path = ?instance_path))] pub async fn launch_minecraft( game_version: &str, loader_version: &Option, @@ -64,7 +65,7 @@ pub async fn launch_minecraft( .versions .iter() .find(|it| it.id == game_version) - .ok_or(crate::Error::LauncherError(format!( + .ok_or(crate::ErrorKind::LauncherError(format!( "Invalid game version: {game_version}" )))?; @@ -115,8 +116,9 @@ pub async fn launch_minecraft( } } - let mut cp = processor.classpath.clone(); - cp.push(processor.jar.clone()); + let cp = wrap_ref_builder!(cp = processor.classpath.clone() => { + cp.push(processor.jar.clone()) + }); let child = Command::new("java") .arg("-cp") @@ -131,7 +133,7 @@ pub async fn launch_minecraft( )?) .await? .ok_or_else(|| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Could not find processor main class for {}", processor.jar )) @@ -145,16 +147,17 @@ pub async fn launch_minecraft( .output() .await .map_err(|err| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Error running processor: {err}", )) })?; if !child.status.success() { - return Err(crate::Error::LauncherError(format!( + return Err(crate::ErrorKind::LauncherError(format!( "Processor error: {}", String::from_utf8_lossy(&child.stderr) - ))); + )) + .as_error()); } } } @@ -163,9 +166,7 @@ pub async fn launch_minecraft( let args = version_info.arguments.clone().unwrap_or_default(); let mut command = match wrapper { Some(hook) => { - let mut cmd = Command::new(hook); - cmd.arg(java_install); - cmd + wrap_ref_builder!(it = Command::new(hook) => {it.arg(java_install)}) } None => Command::new(String::from(java_install.to_string_lossy())), }; @@ -203,10 +204,11 @@ pub async fn launch_minecraft( .stderr(Stdio::inherit()); command.spawn().map_err(|err| { - crate::Error::LauncherError(format!( + crate::ErrorKind::LauncherError(format!( "Error running Minecraft (minecraft-{} @ {}): {err}", &version.id, instance_path.display() )) + .as_error() }) } diff --git a/theseus/src/lib.rs b/theseus/src/lib.rs index 80baede2d..337eab2fb 100644 --- a/theseus/src/lib.rs +++ b/theseus/src/lib.rs @@ -4,15 +4,17 @@ Theseus is a library which provides utilities for launching minecraft, creating Modrinth mod packs, and launching Modrinth mod packs */ -#![warn(unused_import_braces, missing_debug_implementations)] +#![warn(unused_import_braces)] #![deny(unused_must_use)] +#[macro_use] +mod util; + mod api; mod config; mod error; mod launcher; mod state; -mod util; pub use api::*; pub use error::*; diff --git a/theseus/src/state/dirs.rs b/theseus/src/state/dirs.rs index 3ba115cfc..37a572392 100644 --- a/theseus/src/state/dirs.rs +++ b/theseus/src/state/dirs.rs @@ -10,10 +10,11 @@ pub struct DirectoryInfo { impl DirectoryInfo { /// Get all paths needed for Theseus to operate properly + #[tracing::instrument] pub async fn init() -> crate::Result { // Working directory let working_dir = std::env::current_dir().map_err(|err| { - crate::Error::FSError(format!( + crate::ErrorKind::FSError(format!( "Could not open working directory: {err}" )) })?; @@ -21,12 +22,12 @@ impl DirectoryInfo { // Config directory let config_dir = Self::env_path("THESEUS_CONFIG_DIR") .or_else(|| Some(dirs::config_dir()?.join("theseus"))) - .ok_or(crate::Error::FSError( + .ok_or(crate::ErrorKind::FSError( "Could not find valid config dir".to_string(), ))?; fs::create_dir_all(&config_dir).await.map_err(|err| { - crate::Error::FSError(format!( + crate::ErrorKind::FSError(format!( "Error creating Theseus config directory: {err}" )) })?; diff --git a/theseus/src/state/metadata.rs b/theseus/src/state/metadata.rs index eacf59de8..76f9713db 100644 --- a/theseus/src/state/metadata.rs +++ b/theseus/src/state/metadata.rs @@ -13,6 +13,7 @@ use std::collections::LinkedList; const METADATA_URL: &str = "https://meta.modrinth.com/gamedata"; const METADATA_DB_FIELD: &[u8] = b"metadata"; +// TODO: store as subtree in database #[derive(Encode, Decode, Debug)] pub struct Metadata { pub minecraft: MinecraftManifest, @@ -48,6 +49,7 @@ impl Metadata { }) } + #[tracing::instrument(skip_all)] pub async fn init(db: &sled::Db) -> crate::Result { let mut metadata = None; @@ -84,7 +86,10 @@ impl Metadata { db.flush_async().await?; Ok(meta) } else { - Err(crate::Error::NoValueFor(String::from("launcher metadata"))) + Err( + crate::ErrorKind::NoValueFor(String::from("launcher metadata")) + .as_error(), + ) } } } diff --git a/theseus/src/state/mod.rs b/theseus/src/state/mod.rs index 645c8708a..169f69f79 100644 --- a/theseus/src/state/mod.rs +++ b/theseus/src/state/mod.rs @@ -8,17 +8,19 @@ mod dirs; pub use self::dirs::*; mod metadata; -pub use metadata::*; - -mod settings; -pub use settings::*; +pub use self::metadata::*; mod profiles; -pub use profiles::*; +pub use self::profiles::*; + +mod settings; +pub use self::settings::*; + +mod users; +pub use self::users::*; // Global state static LAUNCHER_STATE: OnceCell> = OnceCell::const_new(); -#[derive(Debug)] pub struct State { /// Database, used to store some information pub(self) database: sled::Db, @@ -28,52 +30,62 @@ pub struct State { pub io_semaphore: Semaphore, /// Launcher metadata pub metadata: Metadata, + // TODO: settings API /// Launcher configuration pub settings: RwLock, /// Launcher profile metadata - pub profiles: RwLock, + pub(crate) profiles: RwLock, + /// Launcher user account info + pub(crate) users: RwLock, } impl State { + #[tracing::instrument] /// Get the current launcher state, initializing it if needed pub async fn get() -> crate::Result> { LAUNCHER_STATE - .get_or_try_init(|| async { - // Directories - let directories = DirectoryInfo::init().await?; + .get_or_try_init(|| { + async { + // Directories + let directories = DirectoryInfo::init().await?; - // Database - // TODO: make database versioned - let database = - sled_config().path(directories.database_file()).open()?; + // Database + // TODO: make database versioned + let database = sled_config() + .path(directories.database_file()) + .open()?; - // Settings - let settings = - Settings::init(&directories.settings_file()).await?; + // Settings + let settings = + Settings::init(&directories.settings_file()).await?; - // Metadata - let metadata = Metadata::init(&database).await?; + // Launcher data + let (metadata, profiles) = tokio::try_join! { + Metadata::init(&database), + Profiles::init(&database), + }?; + let users = Users::init(&database)?; - // Profiles - let profiles = Profiles::init(&database).await?; + // Loose initializations + let io_semaphore = + Semaphore::new(settings.max_concurrent_downloads); - // Loose initializations - let io_semaphore = - Semaphore::new(settings.max_concurrent_downloads); - - Ok(Arc::new(Self { - database, - directories, - io_semaphore, - metadata, - settings: RwLock::new(settings), - profiles: RwLock::new(profiles), - })) + Ok(Arc::new(Self { + database, + directories, + io_semaphore, + metadata, + settings: RwLock::new(settings), + profiles: RwLock::new(profiles), + users: RwLock::new(users), + })) + } }) .await .map(Arc::clone) } + #[tracing::instrument] /// Synchronize in-memory state with persistent state pub async fn sync() -> crate::Result<()> { let state = Self::get().await?; diff --git a/theseus/src/state/profiles.rs b/theseus/src/state/profiles.rs index 5b10b8d2e..36e8390d3 100644 --- a/theseus/src/state/profiles.rs +++ b/theseus/src/state/profiles.rs @@ -12,8 +12,7 @@ use tokio::fs; const PROFILE_JSON_PATH: &str = "profile.json"; const PROFILE_SUBTREE: &[u8] = b"profiles"; -#[derive(Debug)] -pub struct Profiles(pub HashMap>); +pub(crate) struct Profiles(pub HashMap>); // TODO: possibly add defaults to some of these values pub const CURRENT_FORMAT_VERSION: u32 = 1; @@ -84,15 +83,17 @@ pub struct JavaSettings { } impl Profile { + #[tracing::instrument] pub async fn new( name: String, version: String, path: PathBuf, ) -> crate::Result { if name.trim().is_empty() { - return Err(crate::Error::InputError(String::from( + return Err(crate::ErrorKind::InputError(String::from( "Empty name for instance!", - ))); + )) + .into()); } Ok(Self { @@ -114,11 +115,13 @@ impl Profile { // TODO: deduplicate these builder methods // They are flat like this in order to allow builder-style usage + #[tracing::instrument] pub fn with_name(&mut self, name: String) -> &mut Self { self.metadata.name = name; self } + #[tracing::instrument] pub async fn with_icon<'a>( &'a mut self, icon: &'a Path, @@ -136,17 +139,20 @@ impl Profile { Ok(self) } else { - Err(crate::Error::InputError(format!( + Err(crate::ErrorKind::InputError(format!( "Unsupported image type: {ext}" - ))) + )) + .into()) } } + #[tracing::instrument] pub fn with_game_version(&mut self, version: String) -> &mut Self { self.metadata.game_version = version; self } + #[tracing::instrument] pub fn with_loader( &mut self, loader: ModLoader, @@ -157,6 +163,7 @@ impl Profile { self } + #[tracing::instrument] pub fn with_java_settings( &mut self, settings: Option, @@ -165,6 +172,7 @@ impl Profile { self } + #[tracing::instrument] pub fn with_memory( &mut self, settings: Option, @@ -173,6 +181,7 @@ impl Profile { self } + #[tracing::instrument] pub fn with_resolution( &mut self, resolution: Option, @@ -181,6 +190,7 @@ impl Profile { self } + #[tracing::instrument] pub fn with_hooks(&mut self, hooks: Option) -> &mut Self { self.hooks = hooks; self @@ -188,6 +198,7 @@ impl Profile { } impl Profiles { + #[tracing::instrument(skip(db))] pub async fn init(db: &sled::Db) -> crate::Result { let profile_db = db.get(PROFILE_SUBTREE)?.map_or( Ok(Default::default()), @@ -218,19 +229,23 @@ impl Profiles { Ok(Self(profiles)) } + #[tracing::instrument(skip(self))] pub fn insert(&mut self, profile: Profile) -> crate::Result<&Self> { self.0.insert( profile .path .canonicalize()? .to_str() - .ok_or(crate::Error::UTFError(profile.path.clone()))? + .ok_or( + crate::ErrorKind::UTFError(profile.path.clone()).as_error(), + )? .into(), Some(profile), ); Ok(self) } + #[tracing::instrument(skip(self))] pub async fn insert_from<'a>( &'a mut self, path: &'a Path, @@ -238,12 +253,14 @@ impl Profiles { self.insert(Self::read_profile_from_dir(&path.canonicalize()?).await?) } + #[tracing::instrument(skip(self))] pub fn remove(&mut self, path: &Path) -> crate::Result<&Self> { let path = PathBuf::from(path.canonicalize()?.to_str().unwrap()); self.0.remove(&path); Ok(self) } + #[tracing::instrument(skip_all)] pub async fn sync<'a>( &'a self, batch: &'a mut sled::Batch, diff --git a/theseus/src/state/settings.rs b/theseus/src/state/settings.rs index 863a3b9ac..563998d11 100644 --- a/theseus/src/state/settings.rs +++ b/theseus/src/state/settings.rs @@ -19,6 +19,7 @@ pub struct Settings { pub custom_java_args: Vec, pub java_8_path: Option, pub java_17_path: Option, + pub default_user: Option, pub hooks: Hooks, pub max_concurrent_downloads: usize, pub version: u32, @@ -32,6 +33,7 @@ impl Default for Settings { custom_java_args: Vec::new(), java_8_path: None, java_17_path: None, + default_user: None, hooks: Hooks::default(), max_concurrent_downloads: 64, version: CURRENT_FORMAT_VERSION, @@ -40,14 +42,16 @@ impl Default for Settings { } impl Settings { + #[tracing::instrument] pub async fn init(file: &Path) -> crate::Result { if file.exists() { fs::read(&file) .await .map_err(|err| { - crate::Error::FSError(format!( + crate::ErrorKind::FSError(format!( "Error reading settings file: {err}" )) + .as_error() }) .and_then(|it| { serde_json::from_slice::(&it) @@ -58,13 +62,15 @@ impl Settings { } } + #[tracing::instrument(skip(self))] pub async fn sync(&self, to: &Path) -> crate::Result<()> { fs::write(to, serde_json::to_vec_pretty(self)?) .await .map_err(|err| { - crate::Error::FSError(format!( + crate::ErrorKind::FSError(format!( "Error saving settings to file: {err}" )) + .as_error() }) } } diff --git a/theseus/src/state/users.rs b/theseus/src/state/users.rs new file mode 100644 index 000000000..84d49ffe5 --- /dev/null +++ b/theseus/src/state/users.rs @@ -0,0 +1,79 @@ +//! User login info +use crate::{auth::Credentials, config::BINCODE_CONFIG}; + +const USER_DB_TREE: &[u8] = b"users"; + +/// The set of users stored in the launcher +#[derive(Clone)] +pub(crate) struct Users(pub(crate) sled::Tree); + +impl Users { + #[tracing::instrument(skip(db))] + pub fn init(db: &sled::Db) -> crate::Result { + Ok(Self(db.open_tree(USER_DB_TREE)?)) + } + + #[tracing::instrument(skip_all)] + pub fn insert( + &mut self, + credentials: &Credentials, + ) -> crate::Result<&Self> { + let id = credentials.id.as_bytes(); + self.0.insert( + id, + bincode::encode_to_vec(credentials, *BINCODE_CONFIG)?, + )?; + Ok(self) + } + + #[tracing::instrument(skip(self))] + pub fn contains(&self, id: uuid::Uuid) -> crate::Result { + Ok(self.0.contains_key(id.as_bytes())?) + } + + #[tracing::instrument(skip(self))] + pub fn get(&self, id: uuid::Uuid) -> crate::Result> { + self.0.get(id.as_bytes())?.map_or(Ok(None), |prof| { + bincode::decode_from_slice(&prof, *BINCODE_CONFIG) + .map_err(crate::Error::from) + .map(|it| Some(it.0)) + }) + } + + #[tracing::instrument(skip(self))] + pub fn remove(&mut self, id: uuid::Uuid) -> crate::Result<&Self> { + self.0.remove(id.as_bytes())?; + Ok(self) + } + + pub fn iter(&self) -> UserIter { + UserIter(self.0.iter().values(), false) + } +} + +alias_trait! { + pub UserInnerIter: Iterator>, Send, Sync +} + +/// An iterator over the set of users +#[derive(Debug)] +pub struct UserIter(I, bool); + +impl Iterator for UserIter { + type Item = crate::Result; + + #[tracing::instrument(skip(self))] + fn next(&mut self) -> Option { + if self.1 { + return None; + } + + let it = self.0.next()?; + let res = it.map_err(crate::Error::from).and_then(|it| { + Ok(bincode::decode_from_slice(&it, *BINCODE_CONFIG)?.0) + }); + + self.1 = res.is_err(); + Some(res) + } +} diff --git a/theseus/src/util/fetch.rs b/theseus/src/util/fetch.rs index fce3ce6cf..eea15f705 100644 --- a/theseus/src/util/fetch.rs +++ b/theseus/src/util/fetch.rs @@ -10,6 +10,7 @@ use tokio::{ const FETCH_ATTEMPTS: usize = 3; +#[tracing::instrument(skip(_permit))] pub async fn fetch<'a>( url: &str, sha1: Option<&str>, @@ -25,10 +26,11 @@ pub async fn fetch<'a>( if let Some(hash) = sha1 { let actual_hash = sha1_async(bytes.clone()).await; if actual_hash != hash { - return Err(crate::Error::HashError( + return Err(crate::ErrorKind::HashError( actual_hash, String::from(hash), - )); + ) + .into()); } } @@ -45,6 +47,7 @@ pub async fn fetch<'a>( // This is implemented, as it will be useful in porting modpacks // For now, allow it to be dead code #[allow(dead_code)] +#[tracing::instrument(skip(sem))] pub async fn fetch_mirrors( urls: &[&str], sha1: Option<&str>, @@ -70,6 +73,7 @@ pub async fn fetch_mirrors( .map(|it| it.0) } +#[tracing::instrument(skip(bytes, _permit))] pub async fn write<'a>( path: &Path, bytes: &[u8], diff --git a/theseus/src/util/mod.rs b/theseus/src/util/mod.rs index c664986d5..a0ac4cddb 100644 --- a/theseus/src/util/mod.rs +++ b/theseus/src/util/mod.rs @@ -1,3 +1,23 @@ //! Theseus utility functions pub mod fetch; pub mod platform; + +/// Wrap a builder which uses a mut reference into one which outputs an owned value +macro_rules! wrap_ref_builder { + ($id:ident = $init:expr => $transform:block) => {{ + let mut it = $init; + { + let $id = &mut it; + $transform; + } + it + }}; +} + +/// Alias a trait, used to avoid needing nightly features +macro_rules! alias_trait { + ($scope:vis $name:ident : $bound:path $(, $bounds:path)*) => { + $scope trait $name: $bound $(+ $bounds)* {} + impl $name for T {} + } +} diff --git a/theseus_cli/Cargo.toml b/theseus_cli/Cargo.toml index d51a57214..149288044 100644 --- a/theseus_cli/Cargo.toml +++ b/theseus_cli/Cargo.toml @@ -15,10 +15,16 @@ futures = "0.3" argh = "0.1" paris = { version = "1.5", features = ["macros", "no_logger"] } dialoguer = "0.10" -eyre = "0.6" tabled = "0.5" dirs = "4.0" -uuid = {version = "0.8", features = ["v4", "serde"]} -# TODO: merge logging with paris logging -pretty_env_logger = "0.4" -log = "0.4.14" +uuid = {version = "1.1", features = ["v4", "serde"]} +url = "2.2" + +color-eyre = "0.6" +eyre = "0.6" +tracing = "0.1" +tracing-error = "0.2" +tracing-futures = "0.2" +tracing-subscriber = {version = "0.3", features = ["env-filter"]} + +webbrowser = "0.7" \ No newline at end of file diff --git a/theseus_cli/src/main.rs b/theseus_cli/src/main.rs index 6b92766d3..ff868b4b4 100644 --- a/theseus_cli/src/main.rs +++ b/theseus_cli/src/main.rs @@ -1,26 +1,52 @@ use eyre::Result; use futures::TryFutureExt; use paris::*; +use tracing_error::ErrorLayer; +use tracing_futures::WithSubscriber; +use tracing_subscriber::prelude::*; +use tracing_subscriber::{fmt, EnvFilter}; -mod subcommands; +#[macro_use] mod util; -#[derive(argh::FromArgs)] +mod subcommands; + +#[derive(argh::FromArgs, Debug)] /// The official Modrinth CLI pub struct Args { #[argh(subcommand)] - pub subcommand: subcommands::SubCommand, + pub subcommand: subcommands::Subcommand, } -#[tokio::main] -async fn main() -> Result<()> { +#[tracing::instrument] +fn main() -> Result<()> { let args = argh::from_env::(); - pretty_env_logger::formatted_builder() - .filter_module("theseus", log::LevelFilter::Info) - .target(pretty_env_logger::env_logger::Target::Stderr) + + color_eyre::install()?; + let filter = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info"))?; + + let format = fmt::layer() + .without_time() + .with_writer(std::io::stderr) + .with_target(false) + .compact(); + + tracing_subscriber::registry() + .with(format) + .with(filter) + .with(ErrorLayer::default()) .init(); - args.dispatch() - .inspect_err(|_| error!("An error has occurred!\n")) - .await + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()? + .block_on( + async move { + args.dispatch() + .inspect_err(|_| error!("An error has occurred!\n")) + .await + } + .with_current_subscriber(), + ) } diff --git a/theseus_cli/src/subcommands/mod.rs b/theseus_cli/src/subcommands/mod.rs index 573e20f6d..04cc48080 100644 --- a/theseus_cli/src/subcommands/mod.rs +++ b/theseus_cli/src/subcommands/mod.rs @@ -1,17 +1,20 @@ use eyre::Result; mod profile; +mod user; -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand)] -pub enum SubCommand { +pub enum Subcommand { Profile(profile::ProfileCommand), + User(user::UserCommand), } impl crate::Args { pub async fn dispatch(&self) -> Result<()> { - match self.subcommand { - SubCommand::Profile(ref cmd) => cmd.dispatch(self).await, - } + dispatch!(self.subcommand, (self) => { + Subcommand::Profile, + Subcommand::User + }) } } diff --git a/theseus_cli/src/subcommands/profile.rs b/theseus_cli/src/subcommands/profile.rs index c39e67bef..859749bb3 100644 --- a/theseus_cli/src/subcommands/profile.rs +++ b/theseus_cli/src/subcommands/profile.rs @@ -1,27 +1,26 @@ //! Profile management subcommand use crate::util::{ - confirm_async, prompt_async, select_async, table_path_display, + confirm_async, prompt_async, select_async, table, table_path_display, }; use daedalus::modded::LoaderVersion; use eyre::{ensure, Result}; use futures::prelude::*; use paris::*; use std::path::{Path, PathBuf}; -use tabled::{Table, Tabled}; +use tabled::Tabled; use theseus::prelude::*; use tokio::fs; use tokio_stream::wrappers::ReadDirStream; -use uuid::Uuid; -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "profile")] -/// profile management +/// manage Minecraft instances pub struct ProfileCommand { #[argh(subcommand)] action: ProfileSubcommand, } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand)] pub enum ProfileSubcommand { Add(ProfileAdd), @@ -31,7 +30,7 @@ pub enum ProfileSubcommand { Run(ProfileRun), } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "add")] /// add a new profile to Theseus pub struct ProfileAdd { @@ -71,7 +70,7 @@ impl ProfileAdd { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "init")] /// create a new profile and manage it with Theseus pub struct ProfileInit { @@ -260,7 +259,7 @@ impl ProfileInit { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// list all managed profiles #[argh(subcommand, name = "list")] pub struct ProfileList {} @@ -311,16 +310,15 @@ impl ProfileList { _args: &crate::Args, _largs: &ProfileCommand, ) -> Result<()> { - let state = State::get().await?; - let profiles = state.profiles.read().await; - let profiles = profiles.0.iter().map(|(path, prof)| { + let profiles = profile::list().await?; + let rows = profiles.iter().map(|(path, prof)| { prof.as_ref().map_or_else( || ProfileRow::from(path.as_path()), ProfileRow::from, ) }); - let table = Table::new(profiles).with(tabled::Style::psql()).with( + let table = table(rows).with( tabled::Modify::new(tabled::Column(1..=1)) .with(tabled::MaxWidth::wrapping(40)), ); @@ -330,7 +328,7 @@ impl ProfileList { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// unmanage a profile #[argh(subcommand, name = "remove")] pub struct ProfileRemove { @@ -364,7 +362,7 @@ impl ProfileRemove { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// run a profile #[argh(subcommand, name = "run")] pub struct ProfileRun { @@ -372,18 +370,9 @@ pub struct ProfileRun { /// the profile to run profile: PathBuf, - // TODO: auth - #[argh(option, short = 't')] - /// the Minecraft token to use for player login. Should be replaced by auth when that is a thing. - token: String, - - #[argh(option, short = 'n')] - /// the uername to use for running the game - name: String, - - #[argh(option, short = 'i')] - /// the account id to use for running the game - id: Uuid, + #[argh(option)] + /// the user to authenticate with + user: Option, } impl ProfileRun { @@ -400,11 +389,18 @@ impl ProfileRun { "Profile not managed by Theseus (if it exists, try using `profile add` first!)", ); - let credentials = Credentials { - id: self.id.clone(), - username: self.name.clone(), - access_token: self.token.clone(), - }; + let id = future::ready(self.user.ok_or(())) + .or_else(|_| async move { + let state = State::get().await?; + let settings = state.settings.read().await; + + settings.default_user + .ok_or(eyre::eyre!( + "Could not find any users, please add one using the `user add` command." + )) + }) + .await?; + let credentials = auth::refresh(id, false).await?; let mut proc = profile::run(&path, &credentials).await?; profile::wait_for(&mut proc).await?; @@ -415,14 +411,14 @@ impl ProfileRun { } impl ProfileCommand { - pub async fn dispatch(&self, args: &crate::Args) -> Result<()> { - match &self.action { - ProfileSubcommand::Add(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Init(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::List(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Remove(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Run(ref cmd) => cmd.run(args, self).await, - } + pub async fn run(&self, args: &crate::Args) -> Result<()> { + dispatch!(&self.action, (args, self) => { + ProfileSubcommand::Add, + ProfileSubcommand::Init, + ProfileSubcommand::List, + ProfileSubcommand::Remove, + ProfileSubcommand::Run + }) } } diff --git a/theseus_cli/src/subcommands/user.rs b/theseus_cli/src/subcommands/user.rs new file mode 100644 index 000000000..36c813c94 --- /dev/null +++ b/theseus_cli/src/subcommands/user.rs @@ -0,0 +1,178 @@ +//! User management subcommand +use crate::util::{confirm_async, table}; +use eyre::Result; +use paris::*; +use tabled::Tabled; +use theseus::prelude::*; +use tokio::sync::oneshot; + +#[derive(argh::FromArgs, Debug)] +#[argh(subcommand, name = "user")] +/// manage Minecraft accounts +pub struct UserCommand { + #[argh(subcommand)] + action: UserSubcommand, +} + +#[derive(argh::FromArgs, Debug)] +#[argh(subcommand)] +pub enum UserSubcommand { + Add(UserAdd), + List(UserList), + Remove(UserRemove), + SetDefault(UserDefault), +} + +#[derive(argh::FromArgs, Debug)] +/// add a new user to Theseus +#[argh(subcommand, name = "add")] +pub struct UserAdd { + #[argh(option)] + /// the browser to authenticate using + browser: Option, +} + +impl UserAdd { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Adding new user account to Theseus"); + info!("A browser window will now open, follow the login flow there."); + + let (tx, rx) = oneshot::channel::(); + let flow = tokio::spawn(auth::authenticate(tx)); + + let url = rx.await?; + match self.browser { + Some(browser) => webbrowser::open_browser(browser, url.as_str()), + None => webbrowser::open(url.as_str()), + }?; + + let credentials = flow.await??; + State::sync().await?; + success!("Logged in user {}.", credentials.username); + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// list all known users +#[argh(subcommand, name = "list")] +pub struct UserList {} + +#[derive(Tabled)] +struct UserRow<'a> { + username: &'a str, + id: uuid::Uuid, + default: bool, +} + +impl<'a> UserRow<'a> { + pub fn from( + credentials: &'a Credentials, + default: Option, + ) -> Self { + Self { + username: &credentials.username, + id: credentials.id, + default: Some(credentials.id) == default, + } + } +} + +impl UserList { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + let state = State::get().await?; + let default = state.settings.read().await.default_user; + + let users = auth::users().await?; + let rows = users.iter().map(|user| UserRow::from(user, default)); + + let table = table(rows); + println!("{table}"); + + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// remove a user +#[argh(subcommand, name = "remove")] +pub struct UserRemove { + /// the user to remove + #[argh(positional)] + user: uuid::Uuid, +} + +impl UserRemove { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Removing user {}", self.user.as_hyphenated()); + + if confirm_async(String::from("Do you wish to continue"), true).await? { + if !auth::has_user(self.user).await? { + warn!("Profile was not managed by Theseus!"); + } else { + auth::remove_user(self.user).await?; + State::sync().await?; + success!("User removed!"); + } + } else { + error!("Aborted!"); + } + + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// set the default user +#[argh(subcommand, name = "set-default")] +pub struct UserDefault { + /// the user to set as default + #[argh(positional)] + user: uuid::Uuid, +} + +impl UserDefault { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Setting user {} as default", self.user.as_hyphenated()); + + // TODO: settings API + let state: std::sync::Arc = State::get().await?; + let mut settings = state.settings.write().await; + + if settings.default_user == Some(self.user) { + warn!("User is already the default!"); + } else { + settings.default_user = Some(self.user); + success!("User set as default!"); + } + + Ok(()) + } +} + +impl UserCommand { + pub async fn run(&self, args: &crate::Args) -> Result<()> { + dispatch!(&self.action, (args, self) => { + UserSubcommand::Add, + UserSubcommand::List, + UserSubcommand::Remove, + UserSubcommand::SetDefault + }) + } +} diff --git a/theseus_cli/src/util.rs b/theseus_cli/src/util.rs index b40391cd7..6fc27af08 100644 --- a/theseus_cli/src/util.rs +++ b/theseus_cli/src/util.rs @@ -1,6 +1,7 @@ use dialoguer::{Confirm, Input, Select}; use eyre::Result; use std::{borrow::Cow, path::Path}; +use tabled::{Table, Tabled}; // TODO: make primarily async to avoid copies @@ -56,7 +57,11 @@ pub async fn confirm_async(prompt: String, default: bool) -> Result { tokio::task::spawn_blocking(move || confirm(&prompt, default)).await? } -// Table display helpers +// Table helpers +pub fn table(rows: impl IntoIterator) -> Table { + Table::new(rows).with(tabled::Style::psql()) +} + pub fn table_path_display(path: &Path) -> String { let mut res = path.display().to_string(); @@ -67,6 +72,20 @@ pub fn table_path_display(path: &Path) -> String { res } +// Dispatch macros +macro_rules! dispatch { + ($on:expr, $args:tt => {$($option:path),+}) => { + match $on { + $($option (ref cmd) => dispatch!(@apply cmd => $args)),+ + } + }; + + (@apply $cmd:expr => ($($args:expr),*)) => {{ + use tracing_futures::WithSubscriber; + $cmd.run($($args),*).with_current_subscriber().await + }}; +} + // Internal helpers fn print_prompt(prompt: &str) { println!( From 855604c9e0649d7b1610dd1bc2c6b5fb9fdde4e6 Mon Sep 17 00:00:00 2001 From: Wuzado Date: Sat, 16 Jul 2022 19:52:30 +0200 Subject: [PATCH 4/7] Make Theseus compilable out of the box again, update Tauri to 1.0.4 Changes made: - migrate to Vite 3 (Svelte Kit errors out and forces you to migrate) - bumped unplugin-icons to 0.14.7 (Vite 3 support) - disable strict-peer-dependencies (changes needed in omorphia - unplugin-icons there requires Vite 2) - bumped Tauri to 1.0.4 (finally stable!) - removed useBootstrapper (removed in v1.0.0-rc.5) - migrated from create_window to setup (removed in v1.0.0-rc.7) - replaced %svelte% with %sveltekit% (renamed in SvelteKit 1.0.0-next.339) Notes: - Vite 3 exposes its dev server on port 5173. --- .idea/theseus.iml | 1 + Cargo.lock | 679 +++++---- theseus_gui/.npmrc | 1 + theseus_gui/package.json | 13 +- theseus_gui/pnpm-lock.yaml | 1854 +++++++++++++------------ theseus_gui/src-tauri/Cargo.toml | 4 +- theseus_gui/src-tauri/src/main.rs | 9 +- theseus_gui/src-tauri/tauri.conf.json | 6 +- theseus_gui/src/app.html | 4 +- theseus_gui/svelte.config.js | 21 +- theseus_gui/vite.config.js | 24 + 11 files changed, 1386 insertions(+), 1230 deletions(-) create mode 100644 theseus_gui/vite.config.js diff --git a/.idea/theseus.iml b/.idea/theseus.iml index b768ce958..34569b047 100644 --- a/.idea/theseus.iml +++ b/.idea/theseus.iml @@ -47,6 +47,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index be86ee670..a72f459ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,9 +64,9 @@ checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "argh" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f023c76cd7975f9969f8e29f0e461decbdc7f51048ce43427107a3d192f1c9bf" +checksum = "a7e7e4aa7e40747e023c0761dafcb42333a9517575bbf1241747f68dd3177a62" dependencies = [ "argh_derive", "argh_shared", @@ -74,9 +74,9 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ad219abc0c06ca788aface2e3a1970587e3413ab70acd20e54b6ec524c1f8f" +checksum = "69f2bd7ff6ed6414f4e5521bd509bae46454bbd513801767ced3f21a751ab4bc" dependencies = [ "argh_shared", "heck 0.3.3", @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "argh_shared" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38de00daab4eac7d753e97697066238d67ce9d7e2d823ab4f72fe14af29f3f33" +checksum = "47253b98986dafc7a3e1cf3259194f1f47ac61abb57a57f46ec09e48d004ecda" [[package]] name = "async-tungstenite" @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" @@ -165,7 +165,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide 0.5.3", + "miniz_oxide", "object", "rustc-demangle", ] @@ -176,15 +176,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bincode" version = "2.0.0-rc.1" @@ -257,9 +248,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "bytemuck" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53dfa917ec274df8ed3c572698f381a24eef2efba9492d797301b72b6db408a" [[package]] name = "byteorder" @@ -331,9 +328,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] @@ -365,9 +362,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295b6eb918a60a25fec0b23a5e633e74fddbaf7bb04411e65a10c366aca4b5cd" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" dependencies = [ "smallvec", ] @@ -388,7 +385,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.43", + "time 0.1.44", "winapi", ] @@ -425,9 +422,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" dependencies = [ "backtrace", "color-spantrace", @@ -450,6 +447,12 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "combine" version = "4.6.4" @@ -483,9 +486,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -533,9 +536,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -633,7 +636,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1949fc56475cb37470a1abb5a113e6f70d48fbcc0c2c315a11b24040f81062" dependencies = [ - "bincode 2.0.0-rc.1", + "bincode", "bytes", "chrono", "reqwest", @@ -811,6 +814,19 @@ dependencies = [ "dtoa", ] +[[package]] +name = "embed-resource" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" +dependencies = [ + "cc", + "rustc_version 0.4.0", + "toml", + "vswhom", + "winreg", +] + [[package]] name = "embed_plist" version = "1.2.2" @@ -825,9 +841,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.29" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] @@ -875,14 +891,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if", "crc32fast", - "libc", - "miniz_oxide 0.4.4", + "miniz_oxide", ] [[package]] @@ -938,9 +952,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -953,9 +967,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -963,15 +977,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -980,9 +994,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-lite" @@ -1001,12 +1015,10 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ - "autocfg", - "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -1014,23 +1026,22 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ - "autocfg", "futures-channel", "futures-core", "futures-io", @@ -1040,8 +1051,6 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] @@ -1162,13 +1171,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -1339,9 +1348,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.7" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -1358,9 +1367,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" [[package]] name = "heck" @@ -1413,9 +1422,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -1430,9 +1439,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.5.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1442,9 +1451,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.15" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ "bytes", "futures-channel", @@ -1455,7 +1464,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 0.4.8", + "itoa 1.0.2", "pin-project-lite", "socket2", "tokio", @@ -1522,6 +1531,20 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "indenter" version = "0.3.3" @@ -1530,9 +1553,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", @@ -1567,9 +1590,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" @@ -1651,9 +1674,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -1689,9 +1712,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.107" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libdbus-sys" @@ -1713,18 +1736,19 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] @@ -1752,9 +1776,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a4acb83c904844ca12aafeac6fff6f781cf9e220a985c1db94fd94123993aa" +checksum = "fff231a88fe2e9985f9d159a2f02986fe46daa0f6af976a0d934be4870cc9d02" dependencies = [ "cc", "dirs-next", @@ -1803,9 +1827,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1822,16 +1846,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - [[package]] name = "miniz_oxide" version = "0.5.3" @@ -1843,31 +1857,21 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.14" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -1960,20 +1964,11 @@ dependencies = [ "winrt-notification", ] -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", -] - [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -1991,19 +1986,30 @@ dependencies = [ ] [[package]] -name = "num-traits" -version = "0.2.14" +name = "num-rational" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -2095,9 +2101,9 @@ checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" [[package]] name = "open" -version = "2.1.3" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2423ffbf445b82e58c3b1543655968923dd06f85432f10be2bb4f1b7122f98c" +checksum = "360bcc8316bf6363aa3954c3ccc4de8add167b087e0259190a043c9514f910fe" dependencies = [ "pathdiff", "windows-sys", @@ -2105,29 +2111,41 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] [[package]] -name = "openssl-probe" -version = "0.1.4" +name = "openssl-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.71" +version = "0.9.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" +checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" dependencies = [ "autocfg", "cc", @@ -2226,7 +2244,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -2243,6 +2271,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + [[package]] name = "paste" version = "1.0.7" @@ -2319,7 +2360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand 0.8.4", + "rand 0.8.5", ] [[package]] @@ -2390,9 +2431,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -2402,9 +2443,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "plist" @@ -2441,14 +2482,14 @@ dependencies = [ "bitflags", "crc32fast", "deflate 1.0.0", - "miniz_oxide 0.5.3", + "miniz_oxide", ] [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "precomputed-hash" @@ -2508,12 +2549,6 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" version = "1.0.40" @@ -2525,9 +2560,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.10" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -2542,20 +2577,19 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", "rand_pcg", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -2593,7 +2627,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", ] [[package]] @@ -2605,15 +2639,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rand_pcg" version = "0.2.1" @@ -2647,7 +2672,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", "redox_syscall", "thiserror", ] @@ -2689,15 +2714,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.6" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", @@ -2715,6 +2741,7 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2724,12 +2751,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f756b55bff8f256a1a8c24dbabb1430ac8110628e418a02e4a1c5ff67179f56" +checksum = "f121348fd3b9035ed11be1f028e8944263c30641f8c5deacf57a4320782fb402" dependencies = [ "block", "dispatch", + "embed-resource", "glib-sys", "gobject-sys", "gtk-sys", @@ -2772,15 +2800,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" +checksum = "24c8ad4f0c00e1eb5bc7614d236a7f1300e3dbd76b68cac8e06fb00b015ad8d8" [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "safemem" @@ -2799,12 +2827,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi", + "windows-sys", ] [[package]] @@ -2821,9 +2849,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -2834,9 +2862,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -2891,18 +2919,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" dependencies = [ "proc-macro2", "quote", @@ -2911,11 +2939,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.71" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063bf466a64011ac24040a49009724ee60a57da1b437617ceb32e53ad61bfb19" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] @@ -2933,12 +2961,12 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] @@ -3010,9 +3038,18 @@ dependencies = [ [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" @@ -3061,9 +3098,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "sled" @@ -3078,21 +3115,21 @@ dependencies = [ "fxhash", "libc", "log", - "parking_lot", + "parking_lot 0.11.2", "zstd", ] [[package]] name = "smallvec" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "socket2" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi", @@ -3143,13 +3180,13 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ - "lazy_static", "new_debug_unreachable", - "parking_lot", + "once_cell", + "parking_lot 0.12.1", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3234,7 +3271,7 @@ version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ - "cfg-expr 0.10.1", + "cfg-expr 0.10.3", "heck 0.4.0", "pkg-config", "toml", @@ -3264,9 +3301,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.9.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53da5dd98a3c605a3ca8fe967d7c50eba8a36072ff13e04e24402b2c492ac55a" +checksum = "a71c32c2fa7bba46b01becf9cf470f6a781573af7e376c5e317a313ecce27545" dependencies = [ "bitflags", "cairo-rs", @@ -3284,6 +3321,7 @@ dependencies = [ "glib", "glib-sys", "gtk", + "image", "instant", "jni 0.19.0", "lazy_static", @@ -3294,30 +3332,19 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot", + "parking_lot 0.11.2", "paste", + "png 0.17.5", "raw-window-handle", "scopeguard", "serde", - "tao-core-video-sys", "unicode-segmentation", + "uuid 0.8.2", "windows 0.37.0", "windows-implement", "x11-dl", ] -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - [[package]] name = "tar" version = "0.4.38" @@ -3331,13 +3358,12 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-rc.14" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81af088a87f908dab3a268f92e3c331e911bed6b1756bbfaeadedfe9dd40fe4f" +checksum = "827f61bd3dd40276694be5c7ffc40d65b94ab00d9f8c1a4a4db07f2cdc306c83" dependencies = [ "anyhow", "attohttpc", - "bincode 1.3.3", "cocoa", "dirs-next", "embed_plist", @@ -3357,7 +3383,7 @@ dependencies = [ "os_info", "os_pipe", "percent-encoding", - "rand 0.8.4", + "rand 0.8.5", "raw-window-handle", "regex", "rfd", @@ -3385,9 +3411,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f2b32e551ec810ba4ab2ad735de5e3576e54bf0322ab0f4b7ce41244bc65ecf" +checksum = "acafb1c515c5d14234a294461bd43c723639a84891a45f6a250fd3441ad2e8ed" dependencies = [ "anyhow", "cargo_toml", @@ -3401,9 +3427,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f1f7928dd040fc03c94207adfad506c0cf5b152982fd1dc0a621f7fd777e22" +checksum = "16d62a3c8790d6cba686cea6e3f7f569d12c662c3274c2d165a4fd33e3871b72" dependencies = [ "base64", "brotli", @@ -3427,9 +3453,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50b9f52871c088857360319a37472d59f4644f1ed004489599d62831a1b6996" +checksum = "7296fa17996629f43081e1c66d554703900187ed900c5bf46f97f0bcfb069278" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -3441,14 +3467,15 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.6.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc343e974f76c0f5471da85f87510bb54dfc9a7664f3e649af58f49887965e43" +checksum = "4e4cff3b4d9469727fa2107c4b3d2eda110df1ba45103fb420178e536362fae4" dependencies = [ "gtk", "http", "http-range", "infer", + "raw-window-handle", "serde", "serde_json", "tauri-utils", @@ -3460,14 +3487,15 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.6.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd6fe3f8dc12a9c409ee6da19379636525e0ff8da12897c04dc1e76b8c8ff62" +checksum = "3fa8c4edaf01d8b556e7172c844b1b4dd3399adcd1a606bd520fc3e65f698546" dependencies = [ "cocoa", "gtk", "percent-encoding", - "rand 0.8.4", + "rand 0.8.5", + "raw-window-handle", "tauri-runtime", "tauri-utils", "uuid 1.1.2", @@ -3506,13 +3534,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand 0.8.4", "redox_syscall", "remove_dir_all", "winapi", @@ -3545,7 +3573,7 @@ version = "0.1.0" dependencies = [ "argh", "async-tungstenite", - "bincode 2.0.0-rc.1", + "bincode", "bytes", "chrono", "daedalus", @@ -3613,18 +3641,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -3642,11 +3670,12 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -3663,9 +3692,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -3678,19 +3707,21 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.16.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" +checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" dependencies = [ + "autocfg", "bytes", "libc", "memchr", "mio", "num_cpus", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", + "socket2", "tokio-macros", "winapi", ] @@ -3729,16 +3760,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -3752,15 +3783,15 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if", "pin-project-lite", @@ -3781,11 +3812,12 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" dependencies = [ - "lazy_static", + "once_cell", + "valuable", ] [[package]] @@ -3821,13 +3853,13 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.7" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" +checksum = "3a713421342a5a666b7577783721d3117f1b69a393df803ee17bb73b1e122a59" dependencies = [ "ansi_term", - "lazy_static", "matchers", + "once_cell", "regex", "sharded-slab", "smallvec", @@ -3854,9 +3886,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "tungstenite" -version = "0.17.2" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ "base64", "byteorder", @@ -3865,7 +3897,7 @@ dependencies = [ "httparse", "log", "native-tls", - "rand 0.8.4", + "rand 0.8.5", "sha-1", "thiserror", "url", @@ -3886,30 +3918,30 @@ checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" @@ -3941,6 +3973,9 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.7", +] [[package]] name = "uuid" @@ -3948,10 +3983,16 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -3982,6 +4023,26 @@ version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -4017,15 +4078,21 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4033,9 +4100,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -4048,9 +4115,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if", "js-sys", @@ -4060,9 +4127,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4070,9 +4137,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -4083,15 +4150,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", @@ -4395,9 +4462,9 @@ checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] @@ -4424,9 +4491,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38425583b1f8c16c074fa4f962f7f0ddd5cb2f6b241a494a26db5eca3ccd4fd7" +checksum = "ce19dddbd3ce01dc8f14eb6d4c8f914123bf8379aaa838f6da4f981ff7104a3f" dependencies = [ "block", "cocoa", @@ -4507,7 +4574,7 @@ dependencies = [ "crc32fast", "flate2", "thiserror", - "time 0.1.43", + "time 0.1.44", ] [[package]] diff --git a/theseus_gui/.npmrc b/theseus_gui/.npmrc index b6f27f135..2068f5480 100644 --- a/theseus_gui/.npmrc +++ b/theseus_gui/.npmrc @@ -1 +1,2 @@ engine-strict=true +strict-peer-dependencies=false diff --git a/theseus_gui/package.json b/theseus_gui/package.json index effb7c488..fb624e8bf 100644 --- a/theseus_gui/package.json +++ b/theseus_gui/package.json @@ -1,11 +1,11 @@ { "scripts": { "dev": "tauri dev", - "dev:web": "svelte-kit dev", - "kill:web": "kill-port 3000", + "dev:web": "vite", + "kill:web": "kill-port 5173", "tauri": "tauri", "build": "tauri build", - "build:web": "svelte-kit build", + "build:web": "vite build", "test": "cargo ../test --manifest-path ./src-tauri/Cargo.toml", "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. src", "check": "cargo check --manifest-path src-tauri/Cargo.toml && svelte-check --tsconfig ./tsconfig.json" @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/adapter-static": "next", "@sveltejs/kit": "next", - "@tauri-apps/cli": "^1.0.0-rc.5", + "@tauri-apps/cli": "^1.0.4", "@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/parser": "^5.10.1", "eslint": "^7.32.0", @@ -25,7 +25,8 @@ "svelte": "^3.46.0", "svelte-check": "^2.2.6", "tslib": "^2.3.1", - "typescript": "~4.5.4" + "typescript": "~4.5.4", + "vite": "^3.0.0" }, "type": "module", "dependencies": { @@ -37,6 +38,6 @@ "@tauri-apps/api": "^1.0.0-rc.1", "omorphia": "0.0.17", "svrollbar": "^0.10.4", - "unplugin-icons": "^0.13.2" + "unplugin-icons": "^0.14.7" } } diff --git a/theseus_gui/pnpm-lock.yaml b/theseus_gui/pnpm-lock.yaml index dd3d61c58..239c4f559 100644 --- a/theseus_gui/pnpm-lock.yaml +++ b/theseus_gui/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: '@fontsource/inter': ^4.5.4 @@ -9,7 +9,7 @@ specifiers: '@sveltejs/adapter-static': next '@sveltejs/kit': next '@tauri-apps/api': ^1.0.0-rc.1 - '@tauri-apps/cli': ^1.0.0-rc.5 + '@tauri-apps/cli': ^1.0.4 '@typescript-eslint/eslint-plugin': ^5.10.1 '@typescript-eslint/parser': ^5.10.1 eslint: ^7.32.0 @@ -24,35 +24,37 @@ specifiers: svrollbar: ^0.10.4 tslib: ^2.3.1 typescript: ~4.5.4 - unplugin-icons: ^0.13.2 + unplugin-icons: ^0.14.7 + vite: ^3.0.0 dependencies: - '@fontsource/inter': 4.5.4 - '@iconify-json/carbon': 1.1.1 - '@iconify-json/heroicons-outline': 1.1.1 - '@iconify-json/heroicons-solid': 1.1.1 - '@iconify-json/lucide': 1.1.5 - '@tauri-apps/api': 1.0.0-rc.1 - omorphia: 0.0.17_svelte@3.46.4 - svrollbar: 0.10.4 - unplugin-icons: 0.13.2 + '@fontsource/inter': 4.5.11 + '@iconify-json/carbon': 1.1.6 + '@iconify-json/heroicons-outline': 1.1.2 + '@iconify-json/heroicons-solid': 1.1.2 + '@iconify-json/lucide': 1.1.36 + '@tauri-apps/api': 1.0.2 + omorphia: 0.0.17_svelte@3.49.0+vite@3.0.0 + svrollbar: 0.10.5 + unplugin-icons: 0.14.7_vite@3.0.0 devDependencies: - '@sveltejs/adapter-static': 1.0.0-next.29 - '@sveltejs/kit': 1.0.0-next.314_svelte@3.46.4 - '@tauri-apps/cli': 1.0.0-rc.5 - '@typescript-eslint/eslint-plugin': 5.12.1_78ba2542c270c83b2a80bb1c125195b6 - '@typescript-eslint/parser': 5.12.1_eslint@7.32.0+typescript@4.5.5 + '@sveltejs/adapter-static': 1.0.0-next.37 + '@sveltejs/kit': 1.0.0-next.377_svelte@3.49.0+vite@3.0.0 + '@tauri-apps/cli': 1.0.4 + '@typescript-eslint/eslint-plugin': 5.30.6_vyqjobnklww3xdlzqlhkvlorlu + '@typescript-eslint/parser': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca eslint: 7.32.0 - eslint-config-prettier: 8.4.0_eslint@7.32.0 - eslint-plugin-svelte3: 3.4.0_eslint@7.32.0+svelte@3.46.4 + eslint-config-prettier: 8.5.0_eslint@7.32.0 + eslint-plugin-svelte3: 3.4.1_k4rvtr32uzrs6rwp57u73ssa6q kill-port-process: 3.0.1 - prettier: 2.5.1 - prettier-plugin-svelte: 2.6.0_prettier@2.5.1+svelte@3.46.4 - svelte: 3.46.4 - svelte-check: 2.4.5_svelte@3.46.4 - tslib: 2.3.1 + prettier: 2.7.1 + prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi + svelte: 3.49.0 + svelte-check: 2.8.0_svelte@3.49.0 + tslib: 2.4.0 typescript: 4.5.5 + vite: 3.0.0 packages: @@ -63,127 +65,173 @@ packages: find-up: 5.0.0 dev: false - /@antfu/utils/0.3.0: - resolution: {integrity: sha512-UU8TLr/EoXdg7OjMp0h9oDoIAVr+Z/oW9cpOxQQyrsz6Qzd2ms/1CdWx8fl2OQdFpxGmq5Vc4TwfLHId6nAZjA==} - dependencies: - '@types/throttle-debounce': 2.1.0 - dev: false - - /@antfu/utils/0.5.0: - resolution: {integrity: sha512-MrAQ/MrPSxbh1bBrmwJjORfJymw4IqSHFBXqvxaga3ZdDM+/zokYF8DjyJpSjY2QmpmgQrajDUBJOWrYeARfzA==} + /@antfu/utils/0.5.2: + resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} dev: false /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.16.10 + '@babel/highlight': 7.18.6 dev: true - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + /@babel/helper-validator-identifier/7.18.6: + resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} dev: true - /@babel/highlight/7.16.10: - resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-validator-identifier': 7.18.6 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@csstools/postcss-color-function/1.0.3_postcss@8.4.12: - resolution: {integrity: sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==} + /@csstools/postcss-cascade-layers/1.0.5_postcss@8.4.14: + resolution: {integrity: sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-font-format-keywords/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-hwb-function/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-ic-unit/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-is-pseudo-class/2.0.1_postcss@8.4.12: - resolution: {integrity: sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.12 + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /@csstools/postcss-normalize-display-values/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==} + /@csstools/postcss-color-function/1.1.1_postcss@8.4.14: + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.3 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-oklab-function/1.0.2_postcss@8.4.12: - resolution: {integrity: sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==} + /@csstools/postcss-font-format-keywords/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.12: + /@csstools/postcss-hwb-function/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-ic-unit/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-is-pseudo-class/2.0.7_postcss@8.4.14: + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: false + + /@csstools/postcss-normalize-display-values/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-oklab-function/1.1.1_postcss@8.4.14: + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.14: resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false + /@csstools/postcss-stepped-value-functions/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-trigonometric-functions/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-unset-value/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + dev: false + + /@csstools/selector-specificity/2.0.2_444rcjjorr3kpoqtvoodsr46pu: + resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + postcss-selector-parser: ^6.0.10 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: false + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.3 + debug: 4.3.4 espree: 7.3.1 - globals: 13.12.1 + globals: 13.16.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -193,8 +241,8 @@ packages: - supports-color dev: true - /@fontsource/inter/4.5.4: - resolution: {integrity: sha512-D0icTFpt9bWvB/OEXMztYf0bhUQZoDIYpsco5C7GVfxgKDRl8Jdn3N2aHHQqwjgRUUvRuyMv8HrRM8Hrt4U52w==} + /@fontsource/inter/4.5.11: + resolution: {integrity: sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==} dev: false /@humanwhocodes/config-array/0.5.0: @@ -202,7 +250,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.3 + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -212,53 +260,63 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@iconify-json/carbon/1.1.1: - resolution: {integrity: sha512-ClOYc+82CKlDAKH1tfDTJTzNz4oHhYD04ALA5uemw9PdWXg05yIJb9bxWjSz4UgdUbH5N/yd8s9hNPI3h6jnlg==} + /@iconify-json/carbon/1.1.6: + resolution: {integrity: sha512-3a/D7qzqBO6hsDmp6/k2eFfJzL1sw1yCQOq2yr86el2CzgMmQdKYROOyCCDNBxGn+dkkc/Rx1/8OEciakAJcFg==} dependencies: - '@iconify/types': 1.0.12 + '@iconify/types': 1.1.0 dev: false - /@iconify-json/heroicons-outline/1.1.1: - resolution: {integrity: sha512-Jy/aFbNQdszRxzhBvHB2AVu/IeMcK/YG3qJVf3XeqvBvhcPq/rWFEmo7jshzBclR/wbt9ylcBEUY1qRFcCXS9Q==} + /@iconify-json/heroicons-outline/1.1.2: + resolution: {integrity: sha512-XsOWcUhdvu3eNURW40hlC2Wrc0cSNWwD+p+UeX57h/qwwDzibIMLeBuqhz9d1FjxHeiM86WQUc4QFB1SK2BGVw==} dependencies: - '@iconify/types': 1.0.12 + '@iconify/types': 1.1.0 dev: false - /@iconify-json/heroicons-solid/1.1.1: - resolution: {integrity: sha512-yTq+PjF543FEp37gqLLQLMGBhZXaHJOY8wLPsWyQZzIDJ9h773ofvp32fgMh9YlgQT4MaeDH2VULvFBBCRmJgQ==} + /@iconify-json/heroicons-solid/1.1.2: + resolution: {integrity: sha512-hSh732CWFsi34qRfx3JO3UNFf7sg7xkzOUG9j9u1w+gcAOLVUWzpyums/H1KycuLphsHuuWZ9fpNq3HwMXCsuQ==} dependencies: - '@iconify/types': 1.0.12 + '@iconify/types': 1.1.0 dev: false - /@iconify-json/lucide/1.1.13: - resolution: {integrity: sha512-HFhWH/ky3AL7vA/XQZp1ED5bSG0+5sKt3UYbVRv4oUAL5q9yqoF3DEQLv5ZSDYrJzF/v+ienlHdu/pK696xB7A==} + /@iconify-json/lucide/1.1.36: + resolution: {integrity: sha512-b2CKgI50Am4Bh2VWJFQepz6yKXpBHA4GXCV/Cgzn6WX3UGEe1E6ETaY5EzxwE9KrRy96J3CamjDOyf+vduvDQg==} dependencies: - '@iconify/types': 1.0.12 + '@iconify/types': 1.1.0 dev: false - /@iconify-json/lucide/1.1.5: - resolution: {integrity: sha512-FOyVw5sdRyDpgR2wVxBxycAOSjVZPlZFaw5umn87JjdXB+L6MIab53Pnz7e/ub79jJTtofHZJ6OBAZ67Cw3Lzg==} - dependencies: - '@iconify/types': 1.0.12 + /@iconify/types/1.1.0: + resolution: {integrity: sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==} dev: false - /@iconify/types/1.0.12: - resolution: {integrity: sha512-6er6wSGF3hgc1JEZqiGpg21CTCjHBYOUwqLmb2Idzkjiw6ogalGP0ZMLVutCzah+0WB4yP+Zd2oVPN8jvJ+Ftg==} - dev: false - - /@iconify/utils/1.0.23: - resolution: {integrity: sha512-Ktdmpe4mkMXQAnnDUz3s6s5aY/BeVPwHC1d5IhG1bgrWVNWFQNUj8cQPMbHpNCSD9MRC5yGxm9/PGPpOWGJLAg==} + /@iconify/utils/1.0.33: + resolution: {integrity: sha512-vGeAqo7aGPxOQmGdVoXFUOuyN+0V7Lcrx2EvaiRjxUD1x6Om0Tvq2bdm7E24l2Pz++4S0mWMCVFXe/17EtKImQ==} dependencies: '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.3.0 - '@iconify/types': 1.0.12 - debug: 4.3.3 + '@antfu/utils': 0.5.2 + '@iconify/types': 1.1.0 + debug: 4.3.4 kolorist: 1.5.1 - local-pkg: 0.4.1 + local-pkg: 0.4.2 transitivePeerDependencies: - supports-color dev: false + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -277,79 +335,77 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@poppanator/sveltekit-svg/0.3.1_svelte@3.46.4: - resolution: {integrity: sha512-atwGnEYD3S18hrwvM4S55sAB2EKzbvLPVBWoL9KSVqPgbSfRvKQb6aBrA7gWOQVz3uoCwDujUvvlbxvzYxmthw==} + /@poppanator/sveltekit-svg/0.3.4_svelte@3.49.0: + resolution: {integrity: sha512-LehMKn91Ds82bHOWoQVhd2GuICk8IFrIGotgP3jBaxcYyxHLznkun9IgdWMZCpRsiaSbmKrW1HZ81p/UlfM/JA==} peerDependencies: svelte: 3.x dependencies: - svelte: 3.46.4 + svelte: 3.49.0 svgo: 2.8.0 dev: false - /@rollup/pluginutils/4.1.2: - resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 dev: true - /@sveltejs/adapter-static/1.0.0-next.29: - resolution: {integrity: sha512-0hjGnfT3BRyoHnzJ2w0/xL+xICRpKneDTm45ZzggiRrc0r71WJfF6toGeg8N4QUQnj8EJ3Itm453gsS1kt7VUQ==} + /@sveltejs/adapter-static/1.0.0-next.37: + resolution: {integrity: sha512-BDFkx4CGAd6pG4e3+zYjy/eM9UDbhkRgXqavUzCO5oT8xXao5TeprY1AIbdzjMTmFjsWdeSXE9TbIsT0iikpyQ==} dependencies: tiny-glob: 0.2.9 dev: true - /@sveltejs/kit/1.0.0-next.314_svelte@3.46.4: - resolution: {integrity: sha512-EkXjEd30XO8+AydBLARxAtI6Ak8V0KFSEJ07sNsrkGq9J70sWPL7yGenhGaeq6S852XZAqeyWd6uGQZmQLR4Wg==} - engines: {node: '>=14.13'} + /@sveltejs/kit/1.0.0-next.377_svelte@3.49.0+vite@3.0.0: + resolution: {integrity: sha512-DH2v2yUBUuDZ7vzjPXUd/yt1AMR3BIkZN0ubLAvS2C+q5Wbvk7ZvAJhfPZ3OYc3ZpQXe4ZGEcptOjvEYvd1lLA==} + engines: {node: '>=16.9'} hasBin: true peerDependencies: svelte: ^3.44.0 + vite: ^3.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 1.0.0-next.37_svelte@3.46.4+vite@2.9.1 + '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.0 + chokidar: 3.5.3 sade: 1.8.1 - svelte: 3.46.4 - vite: 2.9.1 + svelte: 3.49.0 + vite: 3.0.0 transitivePeerDependencies: - diff-match-patch - - less - - sass - - stylus - supports-color dev: true - /@sveltejs/vite-plugin-svelte/1.0.0-next.37_svelte@3.46.4+vite@2.9.1: - resolution: {integrity: sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==} - engines: {node: ^14.13.1 || >= 16} + /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.0: + resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==} + engines: {node: ^14.18.0 || >= 16} peerDependencies: diff-match-patch: ^1.0.5 svelte: ^3.44.0 - vite: ^2.7.0 + vite: ^3.0.0 peerDependenciesMeta: diff-match-patch: optional: true dependencies: - '@rollup/pluginutils': 4.1.2 - debug: 4.3.3 - kleur: 4.1.4 - magic-string: 0.25.7 - svelte: 3.46.4 - svelte-hmr: 0.14.9_svelte@3.46.4 - vite: 2.9.1 + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.2.2 + kleur: 4.1.5 + magic-string: 0.26.2 + svelte: 3.49.0 + svelte-hmr: 0.14.12_svelte@3.49.0 + vite: 3.0.0 transitivePeerDependencies: - supports-color dev: true - /@tauri-apps/api/1.0.0-rc.1: - resolution: {integrity: sha512-VBUOmfT8ea02JB/Qr+FHeaLnug5BRA7ro2pX47q0GZCbZsU9b+iPnOXl0ShJwT0melR7B6iamyhDwkHStMVfQA==} - engines: {node: '>= 12.13.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dependencies: - type-fest: 2.11.2 + /@tauri-apps/api/1.0.2: + resolution: {integrity: sha512-yuNW0oeJ1/ZA7wNF1KgxhHrSu5viPVzY/UgUczzN5ptLM8dH15Juy5rEGkoHfeXGju90Y/l22hi3BtIrp/za+w==} + engines: {node: '>= 12.22.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} dev: false - /@tauri-apps/cli-darwin-arm64/1.0.0-rc.5: - resolution: {integrity: sha512-X+3EIAUGfoL8uE6PBADZC8FcUISe4JPQCxXgaVv6ehoZGoCh/pFJF7AvBGTQxbnvngqM7Xce4Lmh63Io2/5ggw==} + /@tauri-apps/cli-darwin-arm64/1.0.4: + resolution: {integrity: sha512-hMVTPoinjKYV8fgviQ871ZnVipAVXJV3ZwfiK9FcE9/dkUCUtKtetfwnicRV6YDSFbWY9qAg+Sm0INrLT5Ky+A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -357,8 +413,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-darwin-x64/1.0.0-rc.5: - resolution: {integrity: sha512-fEpgOdAvKdq9C5/yip8RnwP1VS+nRrtKdzzplu4jY6njDVH/Vom8mg+EfXkCY5RveCaoskJMFgUvt10IGeZHBA==} + /@tauri-apps/cli-darwin-x64/1.0.4: + resolution: {integrity: sha512-6bR8WIqJdcutLLcmv4S+bkCRbLAwjl80zPL97vs7Zgum01aeygjUTaZS46fpeDgqF8nR8piFAZkz8Bnco6fbzw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -366,8 +422,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm-gnueabihf/1.0.0-rc.5: - resolution: {integrity: sha512-V7sWSBrpLyvkQxpkHIM8JltYqQhiTpThySDjO8POtrTqkRwM5BXORcCYhxTAKCedecfYK/RNUJ6Q0t7+3jS6DQ==} + /@tauri-apps/cli-linux-arm-gnueabihf/1.0.4: + resolution: {integrity: sha512-NNhz8Nh/CQvAPzR5bj1sC2CgpkUOjZg8Eg1i/Ta/pbrjgT0E/reD+12TGdkNuQNEOUQ1klWcdeHfAptWPicRgQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -375,8 +431,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-gnu/1.0.0-rc.5: - resolution: {integrity: sha512-HhM+2FInxtUAI/41LF4fDEzmhLQUq6DOoo7fLN94vgWlhsPyWZoDGP9pA043XbO86+4OX5JZUW1SnTVXMwEaMA==} + /@tauri-apps/cli-linux-arm64-gnu/1.0.4: + resolution: {integrity: sha512-chzpMgkZyu0MWF75DDiEV06XyI8LM7q0NMxRx7esJwZpypj4AG0Pj4+9Di38zYWZrfYqz/bWrCMPIV30vty1Gg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -384,8 +440,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-musl/1.0.0-rc.5: - resolution: {integrity: sha512-DhHdKOhf3+peA/sM0c9CpxK89cp8GVwOB5osFW55fxBZbD0mJFeL2SzjkgfGFqFu6Ci/ZiibQGfEp8XTC8OsYA==} + /@tauri-apps/cli-linux-arm64-musl/1.0.4: + resolution: {integrity: sha512-w+wbNoIOdHoV65Q/z29EK4KtFiNXfV+2lIsML/Hw0VEJEzl9FsqGelu1zAycq8hkoQhf0yPlD/m4FfAWnFzg6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -393,8 +449,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-gnu/1.0.0-rc.5: - resolution: {integrity: sha512-pZzsOHRGG/mdcn7fF/yOIOdeVzGxZUtZqvlGSd90ZM9Ps3//uYGCBHoNTbeSwp/V6+D0KVDaSCbm9lYlHoXcdA==} + /@tauri-apps/cli-linux-x64-gnu/1.0.4: + resolution: {integrity: sha512-TiVRk+VBYA2mE4DqwLu/WD6wTHewHVbdMUtfeXdwe/kabLqbJTWuswUv5T8JUp3mYFZKqlPhyi+qWSJOc0Ianw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -402,8 +458,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-musl/1.0.0-rc.5: - resolution: {integrity: sha512-COwWCbOhEjBlzGRGTa0ESO4/AiC0cBZ2UEPExRn++S+kWSPJ2vsyMdCLu3hiMy1ABSIRcQ4Vc68M1iVkLhOHHw==} + /@tauri-apps/cli-linux-x64-musl/1.0.4: + resolution: {integrity: sha512-TKdncZ6aFu9PfHakrrqg3XIoxgl510rN0tOTJuZ1WQT2nDD5zlP3Mo++FNIt6/TfjqayLcubIZp3dG9pU383dA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -411,8 +467,17 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-x64-msvc/1.0.0-rc.5: - resolution: {integrity: sha512-zzizUmPWvnWjj+IUCk36kVjS9j1Bg5JmnwOW5QdX26+a64q5vocmVimCgrfZ5STw3sDFXE++S55ghpzhhH5o+g==} + /@tauri-apps/cli-win32-ia32-msvc/1.0.4: + resolution: {integrity: sha512-KedA4LB/PsePE3BLm2gg/IIA4rLjbyBUzV2FTdpWqx8ws3OzL6BLDGRVJ+zXe/b9SddhhZk7Rqss6y+gtsWKsA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-x64-msvc/1.0.4: + resolution: {integrity: sha512-6m1Ie7+YeKdOY7aXZCw/Py30DeMEAukE2+WWuZgfxZTTG9QrnZO+DbaKtjuEG0A8HKHCz63+ZNxOTshS1ognEw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -420,19 +485,20 @@ packages: dev: true optional: true - /@tauri-apps/cli/1.0.0-rc.5: - resolution: {integrity: sha512-Q3D0R5YdZRA5EcL206hwwKCyXpet2mRDcfaRTU/IXwF73bS4AMja+JdAGfO2cyHuSvXd+b//Cgbei2zCG8M6hw==} + /@tauri-apps/cli/1.0.4: + resolution: {integrity: sha512-AqfbQUFU2jDYmkjiowl+Yv1yNkey/e+N23sKyDtXQQNvxE6ieR4voY4i6bShY97F+DbRVdjWcjGiLkWS3i4DHw==} engines: {node: '>= 10'} hasBin: true optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.0.0-rc.5 - '@tauri-apps/cli-darwin-x64': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm64-gnu': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm64-musl': 1.0.0-rc.5 - '@tauri-apps/cli-linux-x64-gnu': 1.0.0-rc.5 - '@tauri-apps/cli-linux-x64-musl': 1.0.0-rc.5 - '@tauri-apps/cli-win32-x64-msvc': 1.0.0-rc.5 + '@tauri-apps/cli-darwin-arm64': 1.0.4 + '@tauri-apps/cli-darwin-x64': 1.0.4 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.4 + '@tauri-apps/cli-linux-arm64-gnu': 1.0.4 + '@tauri-apps/cli-linux-arm64-musl': 1.0.4 + '@tauri-apps/cli-linux-x64-gnu': 1.0.4 + '@tauri-apps/cli-linux-x64-musl': 1.0.4 + '@tauri-apps/cli-win32-ia32-msvc': 1.0.4 + '@tauri-apps/cli-win32-x64-msvc': 1.0.4 dev: true /@trysound/sax/0.2.0: @@ -440,12 +506,12 @@ packages: engines: {node: '>=10.13.0'} dev: false - /@types/json-schema/7.0.9: - resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/17.0.19: - resolution: {integrity: sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==} + /@types/node/18.0.5: + resolution: {integrity: sha512-En7tneq+j0qAiVwysBD79y86MT3ModuoIJbe7JXp+sb5UAjInSShmK3nXXMioBzfF7rXC12hv12d4IyCVwN4dA==} dev: true /@types/pug/2.0.6: @@ -455,15 +521,11 @@ packages: /@types/sass/1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: - '@types/node': 17.0.19 + '@types/node': 18.0.5 dev: true - /@types/throttle-debounce/2.1.0: - resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} - dev: false - - /@typescript-eslint/eslint-plugin/5.12.1_78ba2542c270c83b2a80bb1c125195b6: - resolution: {integrity: sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==} + /@typescript-eslint/eslint-plugin/5.30.6_vyqjobnklww3xdlzqlhkvlorlu: + resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -473,24 +535,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.12.1_eslint@7.32.0+typescript@4.5.5 - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/type-utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - '@typescript-eslint/utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/parser': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/type-utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + debug: 4.3.4 eslint: 7.32.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 - semver: 7.3.5 + semver: 7.3.7 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==} + /@typescript-eslint/parser/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -499,26 +561,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/typescript-estree': 5.12.1_typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.5.5 + debug: 4.3.4 eslint: 7.32.0 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.12.1: - resolution: {integrity: sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==} + /@typescript-eslint/scope-manager/5.30.6: + resolution: {integrity: sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/visitor-keys': 5.12.1 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/visitor-keys': 5.30.6 dev: true - /@typescript-eslint/type-utils/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==} + /@typescript-eslint/type-utils/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -527,8 +589,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + debug: 4.3.4 eslint: 7.32.0 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 @@ -536,13 +598,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.12.1: - resolution: {integrity: sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==} + /@typescript-eslint/types/5.30.6: + resolution: {integrity: sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.12.1_typescript@4.5.5: - resolution: {integrity: sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==} + /@typescript-eslint/typescript-estree/5.30.6_typescript@4.5.5: + resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -550,28 +612,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/visitor-keys': 5.12.1 - debug: 4.3.3 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/visitor-keys': 5.30.6 + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.5 + semver: 7.3.7 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==} + /@typescript-eslint/utils/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/typescript-estree': 5.12.1_typescript@4.5.5 + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.5.5 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.32.0 @@ -580,11 +642,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.12.1: - resolution: {integrity: sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==} + /@typescript-eslint/visitor-keys/5.30.6: + resolution: {integrity: sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.12.1 + '@typescript-eslint/types': 5.30.6 eslint-visitor-keys: 3.3.0 dev: true @@ -602,6 +664,12 @@ packages: hasBin: true dev: true + /acorn/8.7.1: + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -611,8 +679,8 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.10.0: - resolution: {integrity: sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==} + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -620,13 +688,13 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true /ansi-regex/2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: false @@ -636,7 +704,7 @@ packages: dev: true /ansi-styles/2.2.1: - resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} dev: false @@ -668,7 +736,7 @@ packages: dev: true /array-union/1.0.2: - resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 @@ -680,12 +748,12 @@ packages: dev: true /array-uniq/1.0.3: - resolution: {integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=} + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: false /assignment/2.0.0: - resolution: {integrity: sha1-/9F7Ib9dayLnd7mJaBqBVFaj3T4=} + resolution: {integrity: sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==} dev: false /astral-regex/2.0.0: @@ -693,19 +761,19 @@ packages: engines: {node: '>=8'} dev: true - /autoprefixer/10.4.4_postcss@8.4.12: - resolution: {integrity: sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==} + /autoprefixer/10.4.7_postcss@8.4.14: + resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.20.2 - caniuse-lite: 1.0.30001324 + browserslist: 4.21.2 + caniuse-lite: 1.0.30001367 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -717,7 +785,7 @@ packages: engines: {node: '>=8'} /boolbase/1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false /brace-expansion/1.1.11: @@ -732,20 +800,19 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist/4.20.2: - resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} + /browserslist/4.21.2: + resolution: {integrity: sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001324 - electron-to-chromium: 1.4.103 - escalade: 3.1.1 - node-releases: 2.0.2 - picocolors: 1.0.0 + caniuse-lite: 1.0.30001367 + electron-to-chromium: 1.4.192 + node-releases: 2.0.6 + update-browserslist-db: 1.0.4_browserslist@4.21.2 dev: false /buffer-crc32/0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true /callsites/3.1.0: @@ -756,18 +823,18 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.20.2 - caniuse-lite: 1.0.30001324 + browserslist: 4.21.2 + caniuse-lite: 1.0.30001367 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite/1.0.30001324: - resolution: {integrity: sha512-/eYp1J6zYh1alySQB4uzYFkLmxxI8tk0kxldbNHXp8+v+rdMKdUBNjRLz7T7fz6Iox+1lIdYpc7rq6ZcXfTukg==} + /caniuse-lite/1.0.30001367: + resolution: {integrity: sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==} dev: false /chalk/1.1.3: - resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} dependencies: ansi-styles: 2.2.1 @@ -822,7 +889,7 @@ packages: dev: true /color-name/1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true /color-name/1.1.4: @@ -839,10 +906,10 @@ packages: dev: false /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /cross-spawn/5.1.0: - resolution: {integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=} + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 @@ -857,45 +924,45 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /css-blank-pseudo/3.0.3_postcss@8.4.12: + /css-blank-pseudo/3.0.3_postcss@8.4.14: resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /css-declaration-sorter/6.2.2_postcss@8.4.12: - resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} + /css-declaration-sorter/6.3.0_postcss@8.4.14: + resolution: {integrity: sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /css-has-pseudo/3.0.4_postcss@8.4.12: + /css-has-pseudo/3.0.4_postcss@8.4.14: resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /css-prefers-color-scheme/6.0.3_postcss@8.4.12: + /css-prefers-color-scheme/6.0.3_postcss@8.4.14: resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false /css-select/4.3.0: @@ -905,7 +972,7 @@ packages: css-what: 6.1.0 domhandler: 4.3.1 domutils: 2.8.0 - nth-check: 2.0.1 + nth-check: 2.1.1 dev: false /css-tree/1.1.3: @@ -921,8 +988,8 @@ packages: engines: {node: '>= 6'} dev: false - /cssdb/6.5.0: - resolution: {integrity: sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==} + /cssdb/6.6.3: + resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==} dev: false /cssesc/3.0.0: @@ -931,62 +998,62 @@ packages: hasBin: true dev: false - /cssnano-preset-default/5.2.7_postcss@8.4.12: - resolution: {integrity: sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==} + /cssnano-preset-default/5.2.12_postcss@8.4.14: + resolution: {integrity: sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.2.2_postcss@8.4.12 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-calc: 8.2.4_postcss@8.4.12 - postcss-colormin: 5.3.0_postcss@8.4.12 - postcss-convert-values: 5.1.0_postcss@8.4.12 - postcss-discard-comments: 5.1.1_postcss@8.4.12 - postcss-discard-duplicates: 5.1.0_postcss@8.4.12 - postcss-discard-empty: 5.1.1_postcss@8.4.12 - postcss-discard-overridden: 5.1.0_postcss@8.4.12 - postcss-merge-longhand: 5.1.4_postcss@8.4.12 - postcss-merge-rules: 5.1.1_postcss@8.4.12 - postcss-minify-font-values: 5.1.0_postcss@8.4.12 - postcss-minify-gradients: 5.1.1_postcss@8.4.12 - postcss-minify-params: 5.1.2_postcss@8.4.12 - postcss-minify-selectors: 5.2.0_postcss@8.4.12 - postcss-normalize-charset: 5.1.0_postcss@8.4.12 - postcss-normalize-display-values: 5.1.0_postcss@8.4.12 - postcss-normalize-positions: 5.1.0_postcss@8.4.12 - postcss-normalize-repeat-style: 5.1.0_postcss@8.4.12 - postcss-normalize-string: 5.1.0_postcss@8.4.12 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.12 - postcss-normalize-unicode: 5.1.0_postcss@8.4.12 - postcss-normalize-url: 5.1.0_postcss@8.4.12 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.12 - postcss-ordered-values: 5.1.1_postcss@8.4.12 - postcss-reduce-initial: 5.1.0_postcss@8.4.12 - postcss-reduce-transforms: 5.1.0_postcss@8.4.12 - postcss-svgo: 5.1.0_postcss@8.4.12 - postcss-unique-selectors: 5.1.1_postcss@8.4.12 + css-declaration-sorter: 6.3.0_postcss@8.4.14 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-calc: 8.2.4_postcss@8.4.14 + postcss-colormin: 5.3.0_postcss@8.4.14 + postcss-convert-values: 5.1.2_postcss@8.4.14 + postcss-discard-comments: 5.1.2_postcss@8.4.14 + postcss-discard-duplicates: 5.1.0_postcss@8.4.14 + postcss-discard-empty: 5.1.1_postcss@8.4.14 + postcss-discard-overridden: 5.1.0_postcss@8.4.14 + postcss-merge-longhand: 5.1.6_postcss@8.4.14 + postcss-merge-rules: 5.1.2_postcss@8.4.14 + postcss-minify-font-values: 5.1.0_postcss@8.4.14 + postcss-minify-gradients: 5.1.1_postcss@8.4.14 + postcss-minify-params: 5.1.3_postcss@8.4.14 + postcss-minify-selectors: 5.2.1_postcss@8.4.14 + postcss-normalize-charset: 5.1.0_postcss@8.4.14 + postcss-normalize-display-values: 5.1.0_postcss@8.4.14 + postcss-normalize-positions: 5.1.1_postcss@8.4.14 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.14 + postcss-normalize-string: 5.1.0_postcss@8.4.14 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.14 + postcss-normalize-unicode: 5.1.0_postcss@8.4.14 + postcss-normalize-url: 5.1.0_postcss@8.4.14 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.14 + postcss-ordered-values: 5.1.3_postcss@8.4.14 + postcss-reduce-initial: 5.1.0_postcss@8.4.14 + postcss-reduce-transforms: 5.1.0_postcss@8.4.14 + postcss-svgo: 5.1.0_postcss@8.4.14 + postcss-unique-selectors: 5.1.1_postcss@8.4.14 dev: false - /cssnano-utils/3.1.0_postcss@8.4.12: + /cssnano-utils/3.1.0_postcss@8.4.14: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /cssnano/5.1.7_postcss@8.4.12: - resolution: {integrity: sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==} + /cssnano/5.1.12_postcss@8.4.14: + resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.7_postcss@8.4.12 - lilconfig: 2.0.5 - postcss: 8.4.12 + cssnano-preset-default: 5.2.12_postcss@8.4.14 + lilconfig: 2.0.6 + postcss: 8.4.14 yaml: 1.10.2 dev: false @@ -997,8 +1064,8 @@ packages: css-tree: 1.1.3 dev: false - /debug/4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1012,6 +1079,11 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1031,35 +1103,35 @@ packages: esutils: 2.0.3 dev: true - /dom-serializer/1.3.2: - resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: - domelementtype: 2.2.0 + domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 dev: false - /domelementtype/2.2.0: - resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false /domhandler/4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: - domelementtype: 2.2.0 + domelementtype: 2.3.0 dev: false /domutils/2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: - dom-serializer: 1.3.2 - domelementtype: 2.2.0 + dom-serializer: 1.4.1 + domelementtype: 2.3.0 domhandler: 4.3.1 dev: false - /electron-to-chromium/1.4.103: - resolution: {integrity: sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==} + /electron-to-chromium/1.4.192: + resolution: {integrity: sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw==} dev: false /emoji-regex/8.0.0: @@ -1070,7 +1142,7 @@ packages: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 dev: true /entities/2.2.0: @@ -1078,216 +1150,195 @@ packages: dev: false /es6-promise/3.3.1: - resolution: {integrity: sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=} + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true - /esbuild-android-64/0.14.30: - resolution: {integrity: sha512-vdJ7t8A8msPfKpYUGUV/KaTQRiZ0vDa2XSTlzXVkGGVHLKPeb85PBUtYJcEgw3htW3IdX5i1t1IMdQCwJJgNAg==} + /esbuild-android-64/0.14.49: + resolution: {integrity: sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-android-arm64/0.14.30: - resolution: {integrity: sha512-BdgGfxeA5hBQNErLr7BWJUA8xjflEfyaARICy8e0OJYNSAwDbEzOf8LyiKWSrDcgV129mWhi3VpbNQvOIDEHcg==} + /esbuild-android-arm64/0.14.49: + resolution: {integrity: sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-darwin-64/0.14.30: - resolution: {integrity: sha512-VRaOXMMrsG5n53pl4qFZQdXy2+E0NoLP/QH3aDUI0+bQP+ZHDmbINKcDy2IX7GVFI9kqPS18iJNAs5a6/G2LZg==} + /esbuild-darwin-64/0.14.49: + resolution: {integrity: sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-darwin-arm64/0.14.30: - resolution: {integrity: sha512-qDez+fHMOrO9Oc9qjt/x+sy09RJVh62kik5tVybKRLmezeV4qczM9/sAYY57YN0aWLdHbcCj2YqJUWYJNsgKnw==} + /esbuild-darwin-arm64/0.14.49: + resolution: {integrity: sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-64/0.14.30: - resolution: {integrity: sha512-mec1jENcImVVagddZlGWsdAUwBnzR5cgnhzCxv+9fSMxKbx1uZYLLUAnLPp8m/i934zrumR1xGjJ5VoWdPlI2w==} + /esbuild-freebsd-64/0.14.49: + resolution: {integrity: sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-arm64/0.14.30: - resolution: {integrity: sha512-cpjbTs6Iok/AfeB0JgTzyUJTMStC1SQULmany5nHx6S4GTkSgaAHuJzZO0GcVWqghI4e0YL/bjXAhN5Mn6feNw==} + /esbuild-freebsd-arm64/0.14.49: + resolution: {integrity: sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-linux-32/0.14.30: - resolution: {integrity: sha512-liIONVT4F2kZmOMwtwASqZ8WkIjb5HHBR9HUffdHiuotSTF3CyZO+EJf+Og+SYYuuVIvt0qHNSFjBA/iSESteQ==} + /esbuild-linux-32/0.14.49: + resolution: {integrity: sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-64/0.14.30: - resolution: {integrity: sha512-LUnpzoMpRqFON5En4qEj6NWiyH6a1K+Y2qYNKrCy5qPTjDoG/EWeqMz69n8Uv7pRuvDKl3FNGJ1dufTrA5i0sw==} + /esbuild-linux-64/0.14.49: + resolution: {integrity: sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm/0.14.30: - resolution: {integrity: sha512-97T+bbXnpqf7mfIG49UR7ZSJFGgvc22byn74qw3Kx2GDCBSQoVFjyWuKOHGXp8nXk3XYrdFF+mQ8yQ7aNsgQvg==} + /esbuild-linux-arm/0.14.49: + resolution: {integrity: sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm64/0.14.30: - resolution: {integrity: sha512-DHZHn6FK5q/KL0fpNT/0jE38Nnyk2rXxKE9WENi95EXtqfOLPgE8tzjTZQNgpr61R95QX4ymQU26ni3IZk8buQ==} + /esbuild-linux-arm64/0.14.49: + resolution: {integrity: sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-mips64le/0.14.30: - resolution: {integrity: sha512-fLUzTFZ7uknC0aPTk7/lM7NmaG/9ZqE3SaHEphcaM009SZK/mDOvZugWi1ss6WGNhk13dUrhkfHcc4FSb9hYhg==} + /esbuild-linux-mips64le/0.14.49: + resolution: {integrity: sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-ppc64le/0.14.30: - resolution: {integrity: sha512-2Oudm2WEfj0dNU9bzIl5L/LrsMEmHWsOsYgJJqu8fDyUDgER+J1d33qz3cUdjsJk7gAENayIxDSpsuCszx0w3A==} + /esbuild-linux-ppc64le/0.14.49: + resolution: {integrity: sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-riscv64/0.14.30: - resolution: {integrity: sha512-RPMucPW47rV4t2jlelaE948iCRtbZf5RhifxSwzlpM1Mqdyu99MMNK0w4jFreGTmLN+oGomxIOxD6n+2E/XqHw==} + /esbuild-linux-riscv64/0.14.49: + resolution: {integrity: sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-s390x/0.14.30: - resolution: {integrity: sha512-OZ68r7ok6qO7hdwrwQn2p5jbIRRcUcVaAykB7e0uCA0ODwfeGunILM6phJtq2Oz4dlEEFvd+tSuma3paQKwt+A==} + /esbuild-linux-s390x/0.14.49: + resolution: {integrity: sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-netbsd-64/0.14.30: - resolution: {integrity: sha512-iyejQUKn0TzpPkufq8pSCxOg9NheycQbMbPCmjefTe9wYuUlBt1TcHvdoJnYbQzsAhAh1BNq+s0ycRsIJFZzaQ==} + /esbuild-netbsd-64/0.14.49: + resolution: {integrity: sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true - /esbuild-openbsd-64/0.14.30: - resolution: {integrity: sha512-UyK1MTMcy4j5fH260fsE1o6MVgWNhb62eCK2yCKCRazZv8Nqdc2WiP9ygjWidmEdCDS+A6MuVp9ozk9uoQtQpA==} + /esbuild-openbsd-64/0.14.49: + resolution: {integrity: sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true - /esbuild-sunos-64/0.14.30: - resolution: {integrity: sha512-aQRtRTNKHB4YuG+xXATe5AoRTNY48IJg5vjE8ElxfmjO9+KdX7MHFkTLhlKevCD6rNANtB3qOlSIeAiXTwHNqw==} + /esbuild-sunos-64/0.14.49: + resolution: {integrity: sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true - /esbuild-windows-32/0.14.30: - resolution: {integrity: sha512-9/fb1tPtpacMqxAXp3fGHowUDg/l9dVch5hKmCLEZC6PdGljh6h372zMdJwYfH0Bd5CCPT0Wx95uycBLJiqpXA==} + /esbuild-windows-32/0.14.49: + resolution: {integrity: sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-64/0.14.30: - resolution: {integrity: sha512-DHgITeUhPAnN9I5O6QBa1GVyPOhiYCn4S4TtQr7sO4+X0LNyqnlmA1M0qmGkUdDC1QQfjI8uQ4G/whdWb2pWIQ==} + /esbuild-windows-64/0.14.49: + resolution: {integrity: sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-arm64/0.14.30: - resolution: {integrity: sha512-F1kLyQH7zSgjh5eLxogGZN7C9+KNs9m+s7Q6WZoMmCWT/6j998zlaoECHyM8izJRRfsvw2eZlEa1jO6/IOU1AQ==} + /esbuild-windows-arm64/0.14.49: + resolution: {integrity: sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild/0.14.30: - resolution: {integrity: sha512-wCecQSBkIjp2xjuXY+wcXS/PpOQo9rFh4NAKPh4Pm9f3fuLcnxkR0rDzA+mYP88FtXIUcXUyYmaIgfrzRl55jA==} + /esbuild/0.14.49: + resolution: {integrity: sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.30 - esbuild-android-arm64: 0.14.30 - esbuild-darwin-64: 0.14.30 - esbuild-darwin-arm64: 0.14.30 - esbuild-freebsd-64: 0.14.30 - esbuild-freebsd-arm64: 0.14.30 - esbuild-linux-32: 0.14.30 - esbuild-linux-64: 0.14.30 - esbuild-linux-arm: 0.14.30 - esbuild-linux-arm64: 0.14.30 - esbuild-linux-mips64le: 0.14.30 - esbuild-linux-ppc64le: 0.14.30 - esbuild-linux-riscv64: 0.14.30 - esbuild-linux-s390x: 0.14.30 - esbuild-netbsd-64: 0.14.30 - esbuild-openbsd-64: 0.14.30 - esbuild-sunos-64: 0.14.30 - esbuild-windows-32: 0.14.30 - esbuild-windows-64: 0.14.30 - esbuild-windows-arm64: 0.14.30 - dev: true + esbuild-android-64: 0.14.49 + esbuild-android-arm64: 0.14.49 + esbuild-darwin-64: 0.14.49 + esbuild-darwin-arm64: 0.14.49 + esbuild-freebsd-64: 0.14.49 + esbuild-freebsd-arm64: 0.14.49 + esbuild-linux-32: 0.14.49 + esbuild-linux-64: 0.14.49 + esbuild-linux-arm: 0.14.49 + esbuild-linux-arm64: 0.14.49 + esbuild-linux-mips64le: 0.14.49 + esbuild-linux-ppc64le: 0.14.49 + esbuild-linux-riscv64: 0.14.49 + esbuild-linux-s390x: 0.14.49 + esbuild-netbsd-64: 0.14.49 + esbuild-openbsd-64: 0.14.49 + esbuild-sunos-64: 0.14.49 + esbuild-windows-32: 0.14.49 + esbuild-windows-64: 0.14.49 + esbuild-windows-arm64: 0.14.49 /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -1295,7 +1346,7 @@ packages: dev: false /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} /escape-string-regexp/4.0.0: @@ -1303,8 +1354,8 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier/8.4.0_eslint@7.32.0: - resolution: {integrity: sha512-CFotdUcMY18nGRo5KGsnNxpznzhkopOcOo0InID+sgQssPrzjvsyKZPvOgymTFeHrFuC3Tzdf2YndhXtULK9Iw==} + /eslint-config-prettier/8.5.0_eslint@7.32.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1312,15 +1363,15 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-svelte3/3.4.0_eslint@7.32.0+svelte@3.46.4: - resolution: {integrity: sha512-MIQUTuRv3o7LyQ+360qOc9mLT35j1I5YzHr04g/UDcvJTpg0X/kHWELY99ve869Rp/9wjqD7I26Aq5H8OH5RIg==} + /eslint-plugin-svelte3/3.4.1_k4rvtr32uzrs6rwp57u73ssa6q: + resolution: {integrity: sha512-7p59WG8qV8L6wLdl4d/c3mdjkgVglQCdv5XOTk/iNPBKXuuV+Q0eFP5Wa6iJd/G2M1qR3BkLPEzaANOqKAZczw==} engines: {node: '>=10'} peerDependencies: eslint: '>=6.0.0' svelte: ^3.2.0 dependencies: eslint: 7.32.0 - svelte: 3.46.4 + svelte: 3.49.0 dev: true /eslint-scope/5.1.1: @@ -1374,7 +1425,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.3 + debug: 4.3.4 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -1388,7 +1439,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.12.1 + globals: 13.16.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -1402,7 +1453,7 @@ packages: optionator: 0.9.1 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.5 + semver: 7.3.7 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.0 @@ -1500,14 +1551,14 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.5 /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true /fast-levenshtein/2.0.6: - resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true /fast-sort/2.2.0: @@ -1544,12 +1595,12 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.5 + flatted: 3.2.6 rimraf: 3.0.2 dev: true - /flatted/3.2.5: - resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + /flatted/3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true /fraction.js/4.2.0: @@ -1557,7 +1608,7 @@ packages: dev: false /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -1570,11 +1621,11 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} /functional-red-black-tree/1.0.1: - resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true /get-stream/3.0.0: - resolution: {integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=} + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} dev: true @@ -1584,7 +1635,7 @@ packages: dev: false /get-them-args/1.3.2: - resolution: {integrity: sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=} + resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} dev: true /glob-parent/5.1.2: @@ -1593,8 +1644,8 @@ packages: dependencies: is-glob: 4.0.3 - /glob/7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1603,8 +1654,8 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /globals/13.12.1: - resolution: {integrity: sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==} + /globals/13.16.0: + resolution: {integrity: sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -1627,11 +1678,11 @@ packages: dev: true /globby/6.1.0: - resolution: {integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=} + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: array-union: 1.0.2 - glob: 7.2.0 + glob: 7.2.3 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 @@ -1641,24 +1692,24 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /graceful-fs/4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true /has-ansi/2.0.0: - resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: false /has-flag/1.0.0: - resolution: {integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=} + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} engines: {node: '>=0.10.0'} dev: false /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true @@ -1674,12 +1725,12 @@ packages: function-bind: 1.1.1 /he/0.5.0: - resolution: {integrity: sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI=} + resolution: {integrity: sha512-DoufbNNOFzwRPy8uecq+j+VCPQ+JyDelHTmSgygrA5TsR8Cbw4Qcir5sGtWiusB4BdT89nmlaVDhSJOqC/33vw==} hasBin: true dev: false - /highlight.js/11.5.0: - resolution: {integrity: sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==} + /highlight.js/11.6.0: + resolution: {integrity: sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==} engines: {node: '>=12.0.0'} dev: false @@ -1707,12 +1758,12 @@ packages: dev: true /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -1721,7 +1772,7 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} /insane/2.6.2: - resolution: {integrity: sha1-wqtouz4AarRRVg0bRGkXMpwKgSA=} + resolution: {integrity: sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==} dependencies: assignment: 2.0.0 he: 0.5.0 @@ -1733,13 +1784,13 @@ packages: dependencies: binary-extensions: 2.2.0 - /is-core-module/2.8.1: - resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} /is-fullwidth-code-point/3.0.0: @@ -1758,7 +1809,7 @@ packages: engines: {node: '>=0.12.0'} /is-stream/1.1.0: - resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true @@ -1768,7 +1819,7 @@ packages: dev: false /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} /js-base64/2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -1795,7 +1846,7 @@ packages: dev: true /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true /kill-port-process/3.0.1: @@ -1807,8 +1858,8 @@ packages: pid-from-port: 1.1.3 dev: true - /kleur/4.1.4: - resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true @@ -1824,13 +1875,13 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: false - /local-pkg/0.4.1: - resolution: {integrity: sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==} + /local-pkg/0.4.2: + resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} dev: false @@ -1842,7 +1893,7 @@ packages: dev: false /lodash.memoize/4.1.2: - resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: false /lodash.merge/4.6.2: @@ -1850,11 +1901,11 @@ packages: dev: true /lodash.truncate/4.4.2: - resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true /lodash.uniq/4.5.0: - resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: false /lodash/4.17.21: @@ -1875,14 +1926,21 @@ packages: yallist: 4.0.0 dev: true - /magic-string/0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 dev: true - /marked/4.0.12: - resolution: {integrity: sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==} + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /marked/4.0.18: + resolution: {integrity: sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==} engines: {node: '>= 12'} hasBin: true dev: false @@ -1899,8 +1957,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromatch/4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 @@ -1921,15 +1979,15 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimist/1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true - /mkdirp/0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.5 + minimist: 1.2.6 dev: true /mri/1.2.0: @@ -1940,17 +1998,17 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /nanoid/3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true /natural-compare/1.4.0: - resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-releases/2.0.2: - resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: false /normalize-path/3.0.0: @@ -1958,7 +2016,7 @@ packages: engines: {node: '>=0.10.0'} /normalize-range/0.1.2: - resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} dev: false @@ -1968,7 +2026,7 @@ packages: dev: false /npm-run-path/2.0.2: - resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 @@ -1981,45 +2039,45 @@ packages: path-key: 3.1.1 dev: false - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: false /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: false - /omorphia/0.0.17_svelte@3.46.4: + /omorphia/0.0.17_svelte@3.49.0+vite@3.0.0: resolution: {integrity: sha512-MeOhG4VT7GHt/rNB37Fj2YSkVV813ZMgjImOtPilwxE9NNyJp220JU5Cy4/BxCRpdF2GOuokZPPIK+RO6mWRYA==} dependencies: - '@iconify-json/carbon': 1.1.1 - '@iconify-json/heroicons-outline': 1.1.1 - '@iconify-json/heroicons-solid': 1.1.1 - '@iconify-json/lucide': 1.1.13 - '@poppanator/sveltekit-svg': 0.3.1_svelte@3.46.4 - autoprefixer: 10.4.4_postcss@8.4.12 - cssnano: 5.1.7_postcss@8.4.12 - highlight.js: 11.5.0 + '@iconify-json/carbon': 1.1.6 + '@iconify-json/heroicons-outline': 1.1.2 + '@iconify-json/heroicons-solid': 1.1.2 + '@iconify-json/lucide': 1.1.36 + '@poppanator/sveltekit-svg': 0.3.4_svelte@3.49.0 + autoprefixer: 10.4.7_postcss@8.4.14 + cssnano: 5.1.12_postcss@8.4.14 + highlight.js: 11.6.0 insane: 2.6.2 - marked: 4.0.12 - postcss: 8.4.12 - postcss-easy-import: 4.0.0_postcss@8.4.12 - postcss-extend-rule: 4.0.0_postcss@8.4.12 - postcss-import: 14.1.0_postcss@8.4.12 - postcss-import-ext-glob: 2.0.1_postcss@8.4.12 - postcss-load-config: 3.1.4_postcss@8.4.12 - postcss-nested: 5.0.6_postcss@8.4.12 - postcss-preset-env: 7.4.3_postcss@8.4.12 - postcss-pxtorem: 6.0.0_postcss@8.4.12 + marked: 4.0.18 + postcss: 8.4.14 + postcss-easy-import: 4.0.0_postcss@8.4.14 + postcss-extend-rule: 4.0.0_postcss@8.4.14 + postcss-import: 14.1.0_postcss@8.4.14 + postcss-import-ext-glob: 2.0.1_postcss@8.4.14 + postcss-load-config: 3.1.4_postcss@8.4.14 + postcss-nested: 5.0.6_postcss@8.4.14 + postcss-preset-env: 7.7.2_postcss@8.4.14 + postcss-pxtorem: 6.0.0_postcss@8.4.14 postcss-strip-inline-comments: 0.1.5 sanitize.css: 13.0.0 - svelte-tiny-virtual-list: 2.0.1 + svelte-tiny-virtual-list: 2.0.5 svelte-use-click-outside: 1.0.0 throttle-debounce: 3.0.1 - unplugin-icons: 0.13.4 + unplugin-icons: 0.13.4_vite@3.0.0 transitivePeerDependencies: - '@svgr/core' - '@vue/compiler-sfc' @@ -2035,7 +2093,7 @@ packages: dev: false /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 @@ -2059,7 +2117,7 @@ packages: dev: true /p-finally/1.0.0: - resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true @@ -2090,11 +2148,11 @@ packages: dev: false /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} /path-key/2.0.1: - resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true @@ -2125,196 +2183,199 @@ packages: dev: true /pify/2.3.0: - resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: false /pify/3.0.0: - resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: false /pinkie-promise/2.0.1: - resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: false /pinkie/2.0.4: - resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: false - /postcss-attribute-case-insensitive/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==} + /postcss-attribute-case-insensitive/5.0.2_postcss@8.4.14: + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.0.2 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-calc/8.2.4_postcss@8.4.12: + /postcss-calc/8.2.4_postcss@8.4.14: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 dev: false - /postcss-clamp/4.1.0_postcss@8.4.12: + /postcss-clamp/4.1.0_postcss@8.4.14: resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-functional-notation/4.2.2_postcss@8.4.12: - resolution: {integrity: sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==} + /postcss-color-functional-notation/4.2.4_postcss@8.4.14: + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-color-hex-alpha/8.0.4_postcss@8.4.14: + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-hex-alpha/8.0.3_postcss@8.4.12: - resolution: {integrity: sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==} + /postcss-color-rebeccapurple/7.1.1_postcss@8.4.14: + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-rebeccapurple/7.0.2_postcss@8.4.12: - resolution: {integrity: sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /postcss-colormin/5.3.0_postcss@8.4.12: + /postcss-colormin/5.3.0_postcss@8.4.14: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 + browserslist: 4.21.2 caniuse-api: 3.0.0 colord: 2.9.2 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==} + /postcss-convert-values/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + browserslist: 4.21.2 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-media/8.0.0_postcss@8.4.12: - resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} - engines: {node: '>=10.0.0'} + /postcss-custom-media/8.0.2_postcss@8.4.14: + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 dev: false - /postcss-custom-properties/12.1.5_postcss@8.4.12: - resolution: {integrity: sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==} + /postcss-custom-properties/12.1.8_postcss@8.4.14: + resolution: {integrity: sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-selectors/6.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.2 - dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 - dev: false - - /postcss-dir-pseudo-class/6.0.4_postcss@8.4.12: - resolution: {integrity: sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==} + /postcss-custom-selectors/6.0.3_postcss@8.4.14: + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-discard-comments/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} + /postcss-dir-pseudo-class/6.0.5_postcss@8.4.14: + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: false + + /postcss-discard-comments/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-duplicates/5.1.0_postcss@8.4.12: + /postcss-discard-duplicates/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-empty/5.1.1_postcss@8.4.12: + /postcss-discard-empty/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-overridden/5.1.0_postcss@8.4.12: + /postcss-discard-overridden/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-double-position-gradients/3.1.1_postcss@8.4.12: - resolution: {integrity: sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==} + /postcss-double-position-gradients/3.1.2_postcss@8.4.14: + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-easy-import/4.0.0_postcss@8.4.12: + /postcss-easy-import/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-Nq5/zsnyMyzz1D7Y7TC1hawNLWQLlh4eJnsM9zlxtc8mAeY8edlvSO1UGs1hyQvNvzK3OJ1bgLjsuyTijyvBEQ==} engines: {node: '>=10.0.0'} peerDependencies: @@ -2325,121 +2386,121 @@ packages: lodash: 4.17.21 object-assign: 4.1.1 pify: 3.0.0 - postcss: 8.4.12 - postcss-import: 14.1.0_postcss@8.4.12 - resolve: 1.22.0 + postcss: 8.4.14 + postcss-import: 14.1.0_postcss@8.4.14 + resolve: 1.22.1 dev: false - /postcss-env-function/4.0.6_postcss@8.4.12: + /postcss-env-function/4.0.6_postcss@8.4.14: resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-extend-rule/4.0.0_postcss@8.4.12: + /postcss-extend-rule/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-3gjPWUDNYjkRjtcpoN8ppZRXG8vyAk4mYdkYOETacCkCLVguW5IpCXCO31cDk8SW2/rx0RogWcXm1Zu/EayDVg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.12 - postcss-nesting: 10.1.3_postcss@8.4.12 + postcss: 8.4.14 + postcss-nesting: 10.1.10_postcss@8.4.14 dev: false - /postcss-focus-visible/6.0.4_postcss@8.4.12: + /postcss-focus-visible/6.0.4_postcss@8.4.14: resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-focus-within/5.0.4_postcss@8.4.12: + /postcss-focus-within/5.0.4_postcss@8.4.14: resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-font-variant/5.0.0_postcss@8.4.12: + /postcss-font-variant/5.0.0_postcss@8.4.14: resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-gap-properties/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==} + /postcss-gap-properties/3.0.5_postcss@8.4.14: + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-image-set-function/4.0.6_postcss@8.4.12: - resolution: {integrity: sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==} + /postcss-image-set-function/4.0.7_postcss@8.4.14: + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-import-ext-glob/2.0.1_postcss@8.4.12: + /postcss-import-ext-glob/2.0.1_postcss@8.4.14: resolution: {integrity: sha512-cCvzsZBPuhLCOAfkPeBnJ31uz5azlAjNb5Aug1f2nlomgZK+WD7Uwfrk+epFU9PI20rsMAineDUK4Ty+jEQHcg==} peerDependencies: postcss: ^8.2.0 dependencies: fast-glob: 3.2.11 fast-sort: 2.2.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-import/14.1.0_postcss@8.4.12: + /postcss-import/14.1.0_postcss@8.4.14: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.0 + resolve: 1.22.1 dev: false - /postcss-initial/4.0.1_postcss@8.4.12: + /postcss-initial/4.0.1_postcss@8.4.14: resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-lab-function/4.1.2_postcss@8.4.12: - resolution: {integrity: sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==} + /postcss-lab-function/4.2.1_postcss@8.4.14: + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-load-config/3.1.4_postcss@8.4.12: + /postcss-load-config/3.1.4_postcss@8.4.14: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -2451,205 +2512,206 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.5 - postcss: 8.4.12 + lilconfig: 2.0.6 + postcss: 8.4.14 yaml: 1.10.2 dev: false - /postcss-logical/5.0.4_postcss@8.4.12: + /postcss-logical/5.0.4_postcss@8.4.14: resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-media-minmax/5.0.0_postcss@8.4.12: + /postcss-media-minmax/5.0.0_postcss@8.4.14: resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-merge-longhand/5.1.4_postcss@8.4.12: - resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} + /postcss-merge-longhand/5.1.6_postcss@8.4.14: + resolution: {integrity: sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 - stylehacks: 5.1.0_postcss@8.4.12 + stylehacks: 5.1.0_postcss@8.4.14 dev: false - /postcss-merge-rules/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==} + /postcss-merge-rules/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 + browserslist: 4.21.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-minify-font-values/5.1.0_postcss@8.4.12: + /postcss-minify-font-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients/5.1.1_postcss@8.4.12: + /postcss-minify-gradients/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.2 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params/5.1.2_postcss@8.4.12: - resolution: {integrity: sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==} + /postcss-minify-params/5.1.3_postcss@8.4.14: + resolution: {integrity: sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + browserslist: 4.21.2 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors/5.2.0_postcss@8.4.12: - resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} + /postcss-minify-selectors/5.2.1_postcss@8.4.14: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-nested/5.0.6_postcss@8.4.12: + /postcss-nested/5.0.6_postcss@8.4.14: resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-nesting/10.1.3_postcss@8.4.12: - resolution: {integrity: sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==} + /postcss-nesting/10.1.10_postcss@8.4.14: + resolution: {integrity: sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-normalize-charset/5.1.0_postcss@8.4.12: + /postcss-normalize-charset/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-normalize-display-values/5.1.0_postcss@8.4.12: + /postcss-normalize-display-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==} + /postcss-normalize-positions/5.1.1_postcss@8.4.14: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==} + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string/5.1.0_postcss@8.4.12: + /postcss-normalize-string/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.12: + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode/5.1.0_postcss@8.4.12: + /postcss-normalize-unicode/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 - postcss: 8.4.12 + browserslist: 4.21.2 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url/5.1.0_postcss@8.4.12: + /postcss-normalize-url/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace/5.1.1_postcss@8.4.12: + /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -2658,150 +2720,156 @@ packages: engines: {node: ^12 || ^14 || >=16} dev: false - /postcss-ordered-values/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} + /postcss-ordered-values/5.1.3_postcss@8.4.14: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-overflow-shorthand/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==} + /postcss-overflow-shorthand/3.0.4_postcss@8.4.14: + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 dev: false - /postcss-page-break/3.0.4_postcss@8.4.12: + /postcss-page-break/3.0.4_postcss@8.4.14: resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-place/7.0.4_postcss@8.4.12: - resolution: {integrity: sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==} + /postcss-place/7.0.5_postcss@8.4.14: + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-preset-env/7.4.3_postcss@8.4.12: - resolution: {integrity: sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==} + /postcss-preset-env/7.7.2_postcss@8.4.14: + resolution: {integrity: sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-color-function': 1.0.3_postcss@8.4.12 - '@csstools/postcss-font-format-keywords': 1.0.0_postcss@8.4.12 - '@csstools/postcss-hwb-function': 1.0.0_postcss@8.4.12 - '@csstools/postcss-ic-unit': 1.0.0_postcss@8.4.12 - '@csstools/postcss-is-pseudo-class': 2.0.1_postcss@8.4.12 - '@csstools/postcss-normalize-display-values': 1.0.0_postcss@8.4.12 - '@csstools/postcss-oklab-function': 1.0.2_postcss@8.4.12 - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - autoprefixer: 10.4.4_postcss@8.4.12 - browserslist: 4.20.2 - css-blank-pseudo: 3.0.3_postcss@8.4.12 - css-has-pseudo: 3.0.4_postcss@8.4.12 - css-prefers-color-scheme: 6.0.3_postcss@8.4.12 - cssdb: 6.5.0 - postcss: 8.4.12 - postcss-attribute-case-insensitive: 5.0.0_postcss@8.4.12 - postcss-clamp: 4.1.0_postcss@8.4.12 - postcss-color-functional-notation: 4.2.2_postcss@8.4.12 - postcss-color-hex-alpha: 8.0.3_postcss@8.4.12 - postcss-color-rebeccapurple: 7.0.2_postcss@8.4.12 - postcss-custom-media: 8.0.0_postcss@8.4.12 - postcss-custom-properties: 12.1.5_postcss@8.4.12 - postcss-custom-selectors: 6.0.0_postcss@8.4.12 - postcss-dir-pseudo-class: 6.0.4_postcss@8.4.12 - postcss-double-position-gradients: 3.1.1_postcss@8.4.12 - postcss-env-function: 4.0.6_postcss@8.4.12 - postcss-focus-visible: 6.0.4_postcss@8.4.12 - postcss-focus-within: 5.0.4_postcss@8.4.12 - postcss-font-variant: 5.0.0_postcss@8.4.12 - postcss-gap-properties: 3.0.3_postcss@8.4.12 - postcss-image-set-function: 4.0.6_postcss@8.4.12 - postcss-initial: 4.0.1_postcss@8.4.12 - postcss-lab-function: 4.1.2_postcss@8.4.12 - postcss-logical: 5.0.4_postcss@8.4.12 - postcss-media-minmax: 5.0.0_postcss@8.4.12 - postcss-nesting: 10.1.3_postcss@8.4.12 + '@csstools/postcss-cascade-layers': 1.0.5_postcss@8.4.14 + '@csstools/postcss-color-function': 1.1.1_postcss@8.4.14 + '@csstools/postcss-font-format-keywords': 1.0.1_postcss@8.4.14 + '@csstools/postcss-hwb-function': 1.0.2_postcss@8.4.14 + '@csstools/postcss-ic-unit': 1.0.1_postcss@8.4.14 + '@csstools/postcss-is-pseudo-class': 2.0.7_postcss@8.4.14 + '@csstools/postcss-normalize-display-values': 1.0.1_postcss@8.4.14 + '@csstools/postcss-oklab-function': 1.1.1_postcss@8.4.14 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + '@csstools/postcss-stepped-value-functions': 1.0.1_postcss@8.4.14 + '@csstools/postcss-trigonometric-functions': 1.0.2_postcss@8.4.14 + '@csstools/postcss-unset-value': 1.0.2_postcss@8.4.14 + autoprefixer: 10.4.7_postcss@8.4.14 + browserslist: 4.21.2 + css-blank-pseudo: 3.0.3_postcss@8.4.14 + css-has-pseudo: 3.0.4_postcss@8.4.14 + css-prefers-color-scheme: 6.0.3_postcss@8.4.14 + cssdb: 6.6.3 + postcss: 8.4.14 + postcss-attribute-case-insensitive: 5.0.2_postcss@8.4.14 + postcss-clamp: 4.1.0_postcss@8.4.14 + postcss-color-functional-notation: 4.2.4_postcss@8.4.14 + postcss-color-hex-alpha: 8.0.4_postcss@8.4.14 + postcss-color-rebeccapurple: 7.1.1_postcss@8.4.14 + postcss-custom-media: 8.0.2_postcss@8.4.14 + postcss-custom-properties: 12.1.8_postcss@8.4.14 + postcss-custom-selectors: 6.0.3_postcss@8.4.14 + postcss-dir-pseudo-class: 6.0.5_postcss@8.4.14 + postcss-double-position-gradients: 3.1.2_postcss@8.4.14 + postcss-env-function: 4.0.6_postcss@8.4.14 + postcss-focus-visible: 6.0.4_postcss@8.4.14 + postcss-focus-within: 5.0.4_postcss@8.4.14 + postcss-font-variant: 5.0.0_postcss@8.4.14 + postcss-gap-properties: 3.0.5_postcss@8.4.14 + postcss-image-set-function: 4.0.7_postcss@8.4.14 + postcss-initial: 4.0.1_postcss@8.4.14 + postcss-lab-function: 4.2.1_postcss@8.4.14 + postcss-logical: 5.0.4_postcss@8.4.14 + postcss-media-minmax: 5.0.0_postcss@8.4.14 + postcss-nesting: 10.1.10_postcss@8.4.14 postcss-opacity-percentage: 1.1.2 - postcss-overflow-shorthand: 3.0.3_postcss@8.4.12 - postcss-page-break: 3.0.4_postcss@8.4.12 - postcss-place: 7.0.4_postcss@8.4.12 - postcss-pseudo-class-any-link: 7.1.1_postcss@8.4.12 - postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.12 - postcss-selector-not: 5.0.0_postcss@8.4.12 + postcss-overflow-shorthand: 3.0.4_postcss@8.4.14 + postcss-page-break: 3.0.4_postcss@8.4.14 + postcss-place: 7.0.5_postcss@8.4.14 + postcss-pseudo-class-any-link: 7.1.6_postcss@8.4.14 + postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.14 + postcss-selector-not: 6.0.1_postcss@8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-pseudo-class-any-link/7.1.1_postcss@8.4.12: - resolution: {integrity: sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==} + /postcss-pseudo-class-any-link/7.1.6_postcss@8.4.14: + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-pxtorem/6.0.0_postcss@8.4.12: + /postcss-pxtorem/6.0.0_postcss@8.4.14: resolution: {integrity: sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-reduce-initial/5.1.0_postcss@8.4.12: + /postcss-reduce-initial/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 + browserslist: 4.21.2 caniuse-api: 3.0.0 - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-reduce-transforms/5.1.0_postcss@8.4.12: + /postcss-reduce-transforms/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.12: + /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-selector-not/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} + /postcss-selector-not/6.0.1_postcss@8.4.14: + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.2 dependencies: - balanced-match: 1.0.2 - postcss: 8.4.12 + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 dev: false /postcss-selector-parser/6.0.10: @@ -2813,29 +2881,29 @@ packages: dev: false /postcss-strip-inline-comments/0.1.5: - resolution: {integrity: sha1-f/a83BTmM+1M36AguuPt2tT4S5A=} + resolution: {integrity: sha512-4EW5hYyv2syFyIBahkXGhZppp9zb5wD5NJ2R65WjXnB5q8T0g4VyLBTevU6ZpxtaN4HkoYZhV03DGUf5Ptd4FA==} dependencies: postcss: 5.2.18 dev: false - /postcss-svgo/5.1.0_postcss@8.4.12: + /postcss-svgo/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false - /postcss-unique-selectors/5.1.1_postcss@8.4.12: + /postcss-unique-selectors/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false @@ -2853,11 +2921,11 @@ packages: supports-color: 3.2.3 dev: false - /postcss/8.4.12: - resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.1 + nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -2866,18 +2934,18 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte/2.6.0_prettier@2.5.1+svelte@3.46.4: - resolution: {integrity: sha512-NPSRf6Y5rufRlBleok/pqg4+1FyGsL0zYhkYP6hnueeL1J/uCm3OfOZPsLX4zqD9VAdcXfyEL2PYqGv8ZoOSfA==} + /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi: + resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 dependencies: - prettier: 2.5.1 - svelte: 3.46.4 + prettier: 2.7.1 + svelte: 3.49.0 dev: true - /prettier/2.5.1: - resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} + /prettier/2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -2888,7 +2956,7 @@ packages: dev: true /pseudomap/1.0.2: - resolution: {integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=} + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true /punycode/2.1.1: @@ -2900,7 +2968,7 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} /read-cache/1.0.0: - resolution: {integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=} + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: false @@ -2926,11 +2994,11 @@ packages: engines: {node: '>=4'} dev: true - /resolve/1.22.0: - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.8.1 + is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -2942,23 +3010,22 @@ packages: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 dev: true /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 dev: true - /rollup/2.67.3: - resolution: {integrity: sha512-G/x1vUwbGtP6O5ZM8/sWr8+p7YfZhI18pPqMRtMYMWSbHjKZ/ajHGiM+GWNTlWyOR0EHIdT8LHU+Z4ciIZ1oBw==} + /rollup/2.77.0: + resolution: {integrity: sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2973,11 +3040,11 @@ packages: dev: true /sander/0.5.1: - resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: es6-promise: 3.3.1 - graceful-fs: 4.2.9 - mkdirp: 0.5.5 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 rimraf: 2.7.1 dev: true @@ -2985,8 +3052,8 @@ packages: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true dependencies: @@ -2994,7 +3061,7 @@ packages: dev: true /shebang-command/1.2.0: - resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 @@ -3007,7 +3074,7 @@ packages: shebang-regex: 3.0.0 /shebang-regex/1.0.0: - resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true @@ -3033,11 +3100,11 @@ packages: dev: true /sorcery/0.10.0: - resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} hasBin: true dependencies: buffer-crc32: 0.2.13 - minimist: 1.2.5 + minimist: 1.2.6 sander: 0.5.1 sourcemap-codec: 1.4.8 dev: true @@ -3047,7 +3114,7 @@ packages: engines: {node: '>=0.10.0'} /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: false @@ -3056,21 +3123,17 @@ packages: engines: {node: '>=0.10.0'} dev: false - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: true - /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true /stable/0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: false /string-width/4.2.3: @@ -3083,7 +3146,7 @@ packages: dev: true /strip-ansi/3.0.1: - resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 @@ -3097,7 +3160,7 @@ packages: dev: true /strip-eof/1.0.0: - resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true @@ -3118,24 +3181,24 @@ packages: engines: {node: '>=8'} dev: true - /stylehacks/5.1.0_postcss@8.4.12: + /stylehacks/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.2 - postcss: 8.4.12 + browserslist: 4.21.2 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false /supports-color/2.0.0: - resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} dev: false /supports-color/3.2.3: - resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=} + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} engines: {node: '>=0.8.0'} dependencies: has-flag: 1.0.0 @@ -3159,21 +3222,20 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check/2.4.5_svelte@3.46.4: - resolution: {integrity: sha512-nRft8BbG2wcxyCdHDZ7X43xLcvDzua3xLwq6wzHGcAF3ka3Jyhv2rvgq0+SF9NwHLMefp9C2XkM6etzsxK/cMQ==} + /svelte-check/2.8.0_svelte@3.49.0: + resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==} hasBin: true peerDependencies: svelte: ^3.24.0 dependencies: + '@jridgewell/trace-mapping': 0.3.14 chokidar: 3.5.3 fast-glob: 3.2.11 import-fresh: 3.3.0 - minimist: 1.2.5 picocolors: 1.0.0 sade: 1.8.1 - source-map: 0.7.3 - svelte: 3.46.4 - svelte-preprocess: 4.10.3_svelte@3.46.4+typescript@4.5.5 + svelte: 3.49.0 + svelte-preprocess: 4.10.7_ut7ie4tqg2ygg3ru4utt6vrtaq typescript: 4.5.5 transitivePeerDependencies: - '@babel/core' @@ -3188,16 +3250,17 @@ packages: - sugarss dev: true - /svelte-hmr/0.14.9_svelte@3.46.4: - resolution: {integrity: sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==} + /svelte-hmr/0.14.12_svelte@3.49.0: + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: '>=3.19.0' dependencies: - svelte: 3.46.4 + svelte: 3.49.0 dev: true - /svelte-preprocess/4.10.3_svelte@3.46.4+typescript@4.5.5: - resolution: {integrity: sha512-ttw17lJfb/dx2ZJT9sesaXT5l7mPQ9Apx1H496Kli3Hkk7orIRGpOw6rCPkRNzr6ueVPqb4vzodS5x7sBFhKHw==} + /svelte-preprocess/4.10.7_ut7ie4tqg2ygg3ru4utt6vrtaq: + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true peerDependencies: @@ -3206,7 +3269,7 @@ packages: less: ^3.11.3 || ^4.0.0 node-sass: '*' postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 pug: ^3.0.0 sass: ^1.26.8 stylus: ^0.55.0 @@ -3240,25 +3303,24 @@ packages: '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 - magic-string: 0.25.7 + magic-string: 0.25.9 sorcery: 0.10.0 strip-indent: 3.0.0 - svelte: 3.46.4 + svelte: 3.49.0 typescript: 4.5.5 dev: true - /svelte-tiny-virtual-list/2.0.1: - resolution: {integrity: sha512-0X6k5cZxF9yRLfVJ1bfwQmfEMbd3OSNNM/tI9y44jYbsB/FkI2GEIKpeV5J8AQy87qFU9xnPLxxo3erQFfdC2A==} + /svelte-tiny-virtual-list/2.0.5: + resolution: {integrity: sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==} dev: false /svelte-use-click-outside/1.0.0: resolution: {integrity: sha512-tOWeMPxeIoW9RshS0WbogRhdYdbxcJV0ebkzSh1lwR7Ihl0hSZMmB4YyCHHoXJK4xcbxCCFh0AnQ1vkzGZfLVQ==} dev: false - /svelte/3.46.4: - resolution: {integrity: sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==} + /svelte/3.49.0: + resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==} engines: {node: '>= 8'} - dev: true /svgo/2.8.0: resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} @@ -3274,15 +3336,15 @@ packages: stable: 0.1.8 dev: false - /svrollbar/0.10.4: - resolution: {integrity: sha512-+DsnE0CoduoQ8TN6Zfzwgvo363QaBCUVsLVrkn2BAqJ3i7DHZmsblVSjfZojgIDrmCNuQK19zazvRXLWaXB3vA==} + /svrollbar/0.10.5: + resolution: {integrity: sha512-6I25pAolLYGNatYSahXMnm3eSPOtJq2YR/QxZ6NV/S+F4fDpunHL38gheqajCspLTkO1L7K3HuNED8jlTk+x/Q==} dev: false /table/6.8.0: resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.10.0 + ajv: 8.11.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -3290,7 +3352,7 @@ packages: dev: true /text-table/0.2.0: - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true /throttle-debounce/3.0.1: @@ -3315,8 +3377,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true /tsutils/3.21.0_typescript@4.5.5: @@ -3341,50 +3403,13 @@ packages: engines: {node: '>=10'} dev: true - /type-fest/2.11.2: - resolution: {integrity: sha512-reW2Y2Mpn0QNA/5fvtm5doROLwDPu2zOm5RtY7xQQS05Q7xgC8MOZ3yPNaP9m/s/sNjjFQtHo7VCNqYW2iI+Ig==} - engines: {node: '>=12.20'} - dev: false - /typescript/4.5.5: resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /unplugin-icons/0.13.2: - resolution: {integrity: sha512-Dwfn5DkKrp/BpZV0R/2wgU39j+kjkeuIQ54PmJ9LhXNpNAS+Huf6Fl/PUmUrlWOvMAz0uPo3y/5lQKZUBjBkBQ==} - peerDependencies: - '@svgr/core': '>=5.5.0' - '@vue/compiler-sfc': ^3.0.2 - vue-template-compiler: ^2.6.12 - vue-template-es2015-compiler: ^1.9.0 - peerDependenciesMeta: - '@svgr/core': - optional: true - '@vue/compiler-sfc': - optional: true - vue-template-compiler: - optional: true - vue-template-es2015-compiler: - optional: true - dependencies: - '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.5.0 - '@iconify/utils': 1.0.23 - debug: 4.3.3 - kolorist: 1.5.1 - local-pkg: 0.4.1 - unplugin: 0.3.3 - transitivePeerDependencies: - - esbuild - - rollup - - supports-color - - vite - - webpack - dev: false - - /unplugin-icons/0.13.4: + /unplugin-icons/0.13.4_vite@3.0.0: resolution: {integrity: sha512-gyp5H4WADnXEE1uk8+NW6gnnALOlSpU8M5GwzNCYbUgjM4QudjcFbacHKuuqETk4VeSJyzM9Z2ufbuZFMuxvuQ==} peerDependencies: '@svgr/core': '>=5.5.0' @@ -3402,12 +3427,12 @@ packages: optional: true dependencies: '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.5.0 - '@iconify/utils': 1.0.23 - debug: 4.3.3 + '@antfu/utils': 0.5.2 + '@iconify/utils': 1.0.33 + debug: 4.3.4 kolorist: 1.5.1 - local-pkg: 0.4.1 - unplugin: 0.4.0 + local-pkg: 0.4.2 + unplugin: 0.4.0_vite@3.0.0 transitivePeerDependencies: - esbuild - rollup @@ -3416,27 +3441,39 @@ packages: - webpack dev: false - /unplugin/0.3.3: - resolution: {integrity: sha512-WjZWpUqqcYPQ/efR00Zm2m1+J1LitwoZ4uhHV4VdZ+IpW0Nh/qnDYtVf+nLhozXdGxslMPecOshVR7NiWFl4gA==} + /unplugin-icons/0.14.7_vite@3.0.0: + resolution: {integrity: sha512-TrNnEdpaXMdiG5BsCgvU6cv/gSLYvIk1f8wGCGZmOo4wmi3nqYBuqIEuiXhmmyXdDZuRRpCaOzCnCYYZ5H7U8g==} peerDependencies: - esbuild: '>=0.13' - rollup: ^2.50.0 - vite: ^2.3.0 - webpack: 4 || 5 + '@svgr/core': '>=5.5.0' + '@vue/compiler-sfc': ^3.0.2 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 peerDependenciesMeta: - esbuild: + '@svgr/core': optional: true - rollup: + '@vue/compiler-sfc': optional: true - vite: + vue-template-compiler: optional: true - webpack: + vue-template-es2015-compiler: optional: true dependencies: - webpack-virtual-modules: 0.4.3 + '@antfu/install-pkg': 0.1.0 + '@antfu/utils': 0.5.2 + '@iconify/utils': 1.0.33 + debug: 4.3.4 + kolorist: 1.5.1 + local-pkg: 0.4.2 + unplugin: 0.7.2_vite@3.0.0 + transitivePeerDependencies: + - esbuild + - rollup + - supports-color + - vite + - webpack dev: false - /unplugin/0.4.0: + /unplugin/0.4.0_vite@3.0.0: resolution: {integrity: sha512-4ScITEmzlz1iZW3tkz+3L1V5k/xMQ6kjgm4lEXKxH0ozd8/OUWfiSA7RMRyrawsvq/t50JIzPpp1UyuSL/AXkA==} peerDependencies: esbuild: '>=0.13' @@ -3454,7 +3491,43 @@ packages: optional: true dependencies: chokidar: 3.5.3 - webpack-virtual-modules: 0.4.3 + vite: 3.0.0 + webpack-virtual-modules: 0.4.4 + dev: false + + /unplugin/0.7.2_vite@3.0.0: + resolution: {integrity: sha512-m7thX4jP8l5sETpLdUASoDOGOcHaOVtgNyrYlToyQUvILUtEzEnngRBrHnAX3IKqooJVmXpoa/CwQ/QqzvGaHQ==} + peerDependencies: + esbuild: '>=0.13' + rollup: ^2.50.0 + vite: ^2.3.0 || ^3.0.0-0 + webpack: 4 || 5 + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + dependencies: + acorn: 8.7.1 + chokidar: 3.5.3 + vite: 3.0.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.4.4 + dev: false + + /update-browserslist-db/1.0.4_browserslist@4.21.2: + resolution: {integrity: sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.2 + escalade: 3.1.1 + picocolors: 1.0.0 dev: false /uri-js/4.4.1: @@ -3464,21 +3537,22 @@ packages: dev: true /util-deprecate/1.0.2: - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite/2.9.1: - resolution: {integrity: sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==} - engines: {node: '>=12.2.0'} + /vite/3.0.0: + resolution: {integrity: sha512-M7phQhY3+fRZa0H+1WzI6N+/onruwPTBTMvaj7TzgZ0v2TE+N2sdLKxJOfOv9CckDWt5C4HmyQP81xB4dwRKzA==} + engines: {node: '>=14.18.0'} hasBin: true peerDependencies: less: '*' sass: '*' stylus: '*' + terser: ^5.4.0 peerDependenciesMeta: less: optional: true @@ -3486,17 +3560,23 @@ packages: optional: true stylus: optional: true + terser: + optional: true dependencies: - esbuild: 0.14.30 - postcss: 8.4.12 - resolve: 1.22.0 - rollup: 2.67.3 + esbuild: 0.14.49 + postcss: 8.4.14 + resolve: 1.22.1 + rollup: 2.77.0 optionalDependencies: fsevents: 2.3.2 - dev: true - /webpack-virtual-modules/0.4.3: - resolution: {integrity: sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==} + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: false + + /webpack-virtual-modules/0.4.4: + resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==} dev: false /which/1.3.1: @@ -3519,10 +3599,10 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} /yallist/2.1.2: - resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true /yallist/4.0.0: diff --git a/theseus_gui/src-tauri/Cargo.toml b/theseus_gui/src-tauri/Cargo.toml index b9b5e1155..077c58f66 100644 --- a/theseus_gui/src-tauri/Cargo.toml +++ b/theseus_gui/src-tauri/Cargo.toml @@ -8,12 +8,12 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.0.0-rc.3", features = [] } +tauri-build = { version = "1.0.4", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.0.0-rc.3", features = ["api-all"] } +tauri = { version = "1.0.4", features = ["api-all"] } [features] # by default Tauri runs in production mode diff --git a/theseus_gui/src-tauri/src/main.rs b/theseus_gui/src-tauri/src/main.rs index 508d67703..7d12ec114 100644 --- a/theseus_gui/src-tauri/src/main.rs +++ b/theseus_gui/src-tauri/src/main.rs @@ -13,8 +13,8 @@ fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![]) - .create_window("main", WindowUrl::default(), |win, webview| { - let win = win + .setup(|app| { + let _win = WindowBuilder::new(app, "main", WindowUrl::default()) .title("Modrinth") .resizable(true) .decorations(true) @@ -22,8 +22,9 @@ fn main() { .inner_size(800.0, 550.0) .min_inner_size(400.0, 200.0) .skip_taskbar(false) - .fullscreen(false); - return (win, webview); + .fullscreen(false) + .build()?; + Ok(()) }) .menu(Menu::with_items([ #[cfg(target_os = "macos")] diff --git a/theseus_gui/src-tauri/tauri.conf.json b/theseus_gui/src-tauri/tauri.conf.json index 271576c42..5b1f987fb 100644 --- a/theseus_gui/src-tauri/tauri.conf.json +++ b/theseus_gui/src-tauri/tauri.conf.json @@ -4,7 +4,7 @@ }, "build": { "distDir": "../build", - "devPath": "http://localhost:3000", + "devPath": "http://localhost:5173", "beforeDevCommand": "pnpm dev:web", "beforeBuildCommand": "pnpm run build:web" }, @@ -32,13 +32,11 @@ "shortDescription": "", "longDescription": "", "deb": { - "depends": [], - "useBootstrapper": false + "depends": [] }, "macOS": { "frameworks": [], "minimumSystemVersion": "", - "useBootstrapper": false, "exceptionDomain": "", "signingIdentity": null, "providerShortName": null, diff --git a/theseus_gui/src/app.html b/theseus_gui/src/app.html index c681abb47..9363c405a 100644 --- a/theseus_gui/src/app.html +++ b/theseus_gui/src/app.html @@ -3,9 +3,9 @@ - %svelte.head% + %sveltekit.head% - %svelte.body% + %sveltekit.body% diff --git a/theseus_gui/svelte.config.js b/theseus_gui/svelte.config.js index c4156a740..dc25f4b28 100644 --- a/theseus_gui/svelte.config.js +++ b/theseus_gui/svelte.config.js @@ -1,6 +1,5 @@ import adapter from '@sveltejs/adapter-static'; -import path from "path"; -import { preprocess, plugins } from 'omorphia/config/svelte.config' +import { preprocess } from 'omorphia/config/svelte.config' /** @type {import('@sveltejs/kit').Config} */ const config = { @@ -8,23 +7,7 @@ const config = { kit: { adapter: adapter({ fallback: '200.html', - }), - vite: { - plugins: [ - ...plugins, - ], - resolve: { - alias: { - $assets: path.resolve('./src/assets'), - $components: path.resolve('./src/components'), - $layout: path.resolve('./src/layout'), - $lib: path.resolve('./src/lib'), - $stores: path.resolve('./src/stores'), - $styles: path.resolve('./src/styles'), - $generated: path.resolve('./src/generated'), - }, - }, - } + }) } }; diff --git a/theseus_gui/vite.config.js b/theseus_gui/vite.config.js new file mode 100644 index 000000000..909dac278 --- /dev/null +++ b/theseus_gui/vite.config.js @@ -0,0 +1,24 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import path from "path"; +import { plugins } from 'omorphia/config/svelte.config' + +/** @type {import('vite').UserConfig} */ +const config = { + plugins: [ + sveltekit(), + ...plugins + ], + resolve: { + alias: { + $assets: path.resolve('./src/assets'), + $components: path.resolve('./src/components'), + $layout: path.resolve('./src/layout'), + $lib: path.resolve('./src/lib'), + $stores: path.resolve('./src/stores'), + $styles: path.resolve('./src/styles'), + $generated: path.resolve('./src/generated'), + }, + }, +}; + +export default config; From eeb2dc7fd8ac0570aa4d164b49705814250a6157 Mon Sep 17 00:00:00 2001 From: Wuzado Date: Mon, 1 Aug 2022 22:45:24 +0200 Subject: [PATCH 5/7] Update to the newest version of Omorphia --- .gitmodules | 3 + theseus_gui/generated/gameVersions.json | 1 + theseus_gui/generated/openapi.ts | 7876 +++++++++++++++++ theseus_gui/generated/state.json | 7 + theseus_gui/package.json | 10 +- theseus_gui/pnpm-lock.yaml | 1812 +++- theseus_gui/postcss.config.cjs | 2 +- theseus_gui/src-tauri/src/main.rs | 2 +- theseus_gui/src/app.html | 5 +- .../src/components/GlobalSettings.svelte | 38 +- .../src/components/WindowSettings.svelte | 10 +- theseus_gui/src/routes/__layout.svelte | 17 + .../library/instance/[id]/settings.svelte | 1 - theseus_gui/src/routes/settings.svelte | 1 - theseus_gui/src/stores/account.ts | 3 + theseus_gui/static/fonts/InterBold.woff2 | Bin 0 -> 17784 bytes theseus_gui/static/fonts/InterRegular.woff2 | Bin 0 -> 16708 bytes theseus_gui/static/fonts/InterSemiBold.woff2 | Bin 0 -> 17660 bytes theseus_gui/svelte.config.js | 12 +- theseus_gui/vite.config.js | 19 +- 20 files changed, 9420 insertions(+), 399 deletions(-) create mode 100644 .gitmodules create mode 100644 theseus_gui/generated/gameVersions.json create mode 100644 theseus_gui/generated/openapi.ts create mode 100644 theseus_gui/generated/state.json create mode 100644 theseus_gui/src/stores/account.ts create mode 100644 theseus_gui/static/fonts/InterBold.woff2 create mode 100644 theseus_gui/static/fonts/InterRegular.woff2 create mode 100644 theseus_gui/static/fonts/InterSemiBold.woff2 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..97fa51fbd --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "theseus_gui/locales"] + path = theseus_gui/locales + url = https://github.com/modrinth/translations diff --git a/theseus_gui/generated/gameVersions.json b/theseus_gui/generated/gameVersions.json new file mode 100644 index 000000000..550ff72d1 --- /dev/null +++ b/theseus_gui/generated/gameVersions.json @@ -0,0 +1 @@ +[{"version":"1.19.1","version_type":"release","date":"2022-07-27T09:25:33Z","major":true},{"version":"1.19.1-rc3","version_type":"snapshot","date":"2022-07-26T15:34:35Z","major":false},{"version":"1.19.1-rc2","version_type":"snapshot","date":"2022-07-21T16:25:50Z","major":false},{"version":"1.19.1-pre6","version_type":"snapshot","date":"2022-07-20T15:49:31Z","major":false},{"version":"1.19.1-pre5","version_type":"snapshot","date":"2022-07-15T11:51:44Z","major":false},{"version":"1.19.1-pre4","version_type":"snapshot","date":"2022-07-08T11:41:59Z","major":false},{"version":"1.19.1-pre3","version_type":"snapshot","date":"2022-07-06T14:50:46Z","major":false},{"version":"1.19.1-pre2","version_type":"snapshot","date":"2022-06-30T15:57:20Z","major":false},{"version":"1.19.1-rc1","version_type":"snapshot","date":"2022-06-23T16:32:41Z","major":false},{"version":"1.19.1-pre1","version_type":"snapshot","date":"2022-06-21T17:13:59Z","major":false},{"version":"22w24a","version_type":"snapshot","date":"2022-06-15T16:21:49Z","major":false},{"version":"1.19","version_type":"release","date":"2022-06-07T09:42:18Z","major":true},{"version":"1.19-rc2","version_type":"snapshot","date":"2022-06-03T11:47:25Z","major":false},{"version":"1.19-rc1","version_type":"snapshot","date":"2022-06-02T12:12:52Z","major":false},{"version":"1.19-pre5","version_type":"snapshot","date":"2022-06-01T10:56:23Z","major":false},{"version":"1.19-pre4","version_type":"snapshot","date":"2022-05-30T14:43:01Z","major":false},{"version":"1.19-pre3","version_type":"snapshot","date":"2022-05-25T09:56:47Z","major":false},{"version":"1.19-pre2","version_type":"snapshot","date":"2022-05-23T14:54:00Z","major":false},{"version":"1.19-pre1","version_type":"snapshot","date":"2022-05-18T13:51:54Z","major":false},{"version":"22w19a","version_type":"snapshot","date":"2022-05-12T15:36:11Z","major":false},{"version":"22w18a","version_type":"snapshot","date":"2022-05-04T14:41:35Z","major":false},{"version":"22w17a","version_type":"snapshot","date":"2022-04-27T15:54:15Z","major":false},{"version":"22w16b","version_type":"snapshot","date":"2022-04-20T17:25:32Z","major":false},{"version":"22w16a","version_type":"snapshot","date":"2022-04-20T14:37:07Z","major":false},{"version":"22w15a","version_type":"snapshot","date":"2022-04-13T15:41:17Z","major":false},{"version":"22w14a","version_type":"snapshot","date":"2022-04-06T13:37:12Z","major":false},{"version":"22w13oneblockatatime","version_type":"snapshot","date":"2022-04-01T11:56:58Z","major":false},{"version":"22w13a","version_type":"snapshot","date":"2022-03-31T14:53:25Z","major":false},{"version":"22w12a","version_type":"snapshot","date":"2022-03-24T16:15:02Z","major":false},{"version":"22w11a","version_type":"snapshot","date":"2022-03-16T15:55:38Z","major":false},{"version":"1.18.2","version_type":"release","date":"2022-02-28T10:42:45Z","major":true},{"version":"1.18.2-rc1","version_type":"snapshot","date":"2022-02-25T13:25:40Z","major":false},{"version":"1.18.2-pre3","version_type":"snapshot","date":"2022-02-23T15:23:12Z","major":false},{"version":"1.18.2-pre2","version_type":"snapshot","date":"2022-02-21T15:26:19Z","major":false},{"version":"1.18.2-pre1","version_type":"snapshot","date":"2022-02-18T16:00:32Z","major":false},{"version":"22w07a","version_type":"snapshot","date":"2022-02-16T16:13:58Z","major":false},{"version":"22w06a","version_type":"snapshot","date":"2022-02-09T16:47:48Z","major":false},{"version":"22w05a","version_type":"snapshot","date":"2022-02-02T16:08:39Z","major":false},{"version":"22w03a","version_type":"snapshot","date":"2022-01-19T16:04:59Z","major":false},{"version":"1.18.1","version_type":"release","date":"2021-12-10T08:23:00Z","major":false},{"version":"1.18.1-rc3","version_type":"snapshot","date":"2021-12-10T03:36:38Z","major":false},{"version":"1.18.1-rc2","version_type":"snapshot","date":"2021-12-08T12:29:36Z","major":false},{"version":"1.18.1-rc1","version_type":"snapshot","date":"2021-12-07T15:52:47Z","major":false},{"version":"1.18.1-pre1","version_type":"snapshot","date":"2021-12-03T13:45:38Z","major":false},{"version":"1.18","version_type":"release","date":"2021-11-30T09:16:29Z","major":false},{"version":"1.18-rc4","version_type":"snapshot","date":"2021-11-29T13:43:42Z","major":false},{"version":"1.18-rc3","version_type":"snapshot","date":"2021-11-26T15:51:56Z","major":false},{"version":"1.18-rc2","version_type":"snapshot","date":"2021-11-26T10:02:04Z","major":false},{"version":"1.18-rc1","version_type":"snapshot","date":"2021-11-25T14:28:49Z","major":false},{"version":"1.18-pre8","version_type":"snapshot","date":"2021-11-24T14:57:32Z","major":false},{"version":"1.18-pre7","version_type":"snapshot","date":"2021-11-23T16:37:41Z","major":false},{"version":"1.18-pre6","version_type":"snapshot","date":"2021-11-22T17:09:05Z","major":false},{"version":"1.18-pre5","version_type":"snapshot","date":"2021-11-19T15:47:09Z","major":false},{"version":"1.18-pre4","version_type":"snapshot","date":"2021-11-17T18:07:56Z","major":false},{"version":"1.18-pre3","version_type":"snapshot","date":"2021-11-17T16:04:25Z","major":false},{"version":"1.18-pre2","version_type":"snapshot","date":"2021-11-16T17:04:48Z","major":false},{"version":"1.18-pre1","version_type":"snapshot","date":"2021-11-11T16:14:06Z","major":false},{"version":"21w44a","version_type":"snapshot","date":"2021-11-03T16:14:34Z","major":false},{"version":"21w43a","version_type":"snapshot","date":"2021-10-27T14:38:55Z","major":false},{"version":"21w42a","version_type":"snapshot","date":"2021-10-20T12:41:25Z","major":false},{"version":"21w41a","version_type":"snapshot","date":"2021-10-13T15:23:23Z","major":false},{"version":"21w40a","version_type":"snapshot","date":"2021-10-07T11:17:50Z","major":false},{"version":"21w39a","version_type":"snapshot","date":"2021-09-29T16:27:05Z","major":false},{"version":"21w38a","version_type":"snapshot","date":"2021-09-23T14:36:06Z","major":false},{"version":"21w37a","version_type":"snapshot","date":"2021-09-15T16:04:30Z","major":false},{"version":"1.17.1","version_type":"release","date":"2021-07-06T12:01:34Z","major":true},{"version":"1.17.1-rc2","version_type":"snapshot","date":"2021-07-05T12:58:01Z","major":false},{"version":"1.17.1-rc1","version_type":"snapshot","date":"2021-07-01T15:23:37Z","major":false},{"version":"1.17.1-pre3","version_type":"snapshot","date":"2021-06-30T15:43:16Z","major":false},{"version":"1.17.1-pre2","version_type":"snapshot","date":"2021-06-29T15:14:12Z","major":false},{"version":"1.17.1-pre1","version_type":"snapshot","date":"2021-06-18T12:24:40Z","major":false},{"version":"1.17","version_type":"release","date":"2021-06-08T11:00:40Z","major":false},{"version":"1.17-rc2","version_type":"snapshot","date":"2021-06-07T11:46:28Z","major":false},{"version":"1.17-rc1","version_type":"snapshot","date":"2021-06-04T13:24:48Z","major":false},{"version":"1.17-pre5","version_type":"snapshot","date":"2021-06-03T17:01:28Z","major":false},{"version":"1.17-pre4","version_type":"snapshot","date":"2021-06-02T16:15:43Z","major":false},{"version":"1.17-pre3","version_type":"snapshot","date":"2021-06-01T15:43:46Z","major":false},{"version":"1.17-pre2","version_type":"snapshot","date":"2021-05-31T15:54:05Z","major":false},{"version":"1.17-pre1","version_type":"snapshot","date":"2021-05-27T09:39:21Z","major":false},{"version":"21w20a","version_type":"snapshot","date":"2021-05-19T15:22:02Z","major":false},{"version":"21w19a","version_type":"snapshot","date":"2021-05-12T11:19:15Z","major":false},{"version":"21w18a","version_type":"snapshot","date":"2021-05-05T15:24:35Z","major":false},{"version":"21w17a","version_type":"snapshot","date":"2021-04-28T13:54:05Z","major":false},{"version":"21w16a","version_type":"snapshot","date":"2021-04-21T16:41:14Z","major":false},{"version":"21w15a","version_type":"snapshot","date":"2021-04-14T13:41:34Z","major":false},{"version":"21w14a","version_type":"snapshot","date":"2021-04-07T14:04:09Z","major":false},{"version":"21w13a","version_type":"snapshot","date":"2021-03-31T16:17:46Z","major":false},{"version":"21w11a","version_type":"snapshot","date":"2021-03-17T15:05:50Z","major":false},{"version":"21w10a","version_type":"snapshot","date":"2021-03-10T15:24:38Z","major":false},{"version":"21w08b","version_type":"snapshot","date":"2021-02-25T11:46:34Z","major":false},{"version":"21w08a","version_type":"snapshot","date":"2021-02-24T14:38:51Z","major":false},{"version":"21w07a","version_type":"snapshot","date":"2021-02-17T16:35:40Z","major":false},{"version":"21w06a","version_type":"snapshot","date":"2021-02-10T17:13:54Z","major":false},{"version":"21w05b","version_type":"snapshot","date":"2021-02-04T15:09:29Z","major":false},{"version":"21w05a","version_type":"snapshot","date":"2021-02-03T15:56:54Z","major":false},{"version":"21w03a","version_type":"snapshot","date":"2021-01-20T14:56:29Z","major":false},{"version":"1.16.5","version_type":"release","date":"2021-01-14T16:05:32Z","major":true},{"version":"1.16.5-rc1","version_type":"snapshot","date":"2021-01-13T15:58:55Z","major":false},{"version":"20w51a","version_type":"snapshot","date":"2020-12-16T16:27:57Z","major":false},{"version":"20w49a","version_type":"snapshot","date":"2020-12-02T16:47:20Z","major":false},{"version":"20w48a","version_type":"snapshot","date":"2020-11-25T15:42:24Z","major":false},{"version":"20w46a","version_type":"snapshot","date":"2020-11-11T15:30:32Z","major":false},{"version":"20w45a","version_type":"snapshot","date":"2020-11-04T16:42:00Z","major":false},{"version":"1.16.4","version_type":"release","date":"2020-10-29T15:49:37Z","major":false},{"version":"1.16.4-rc1","version_type":"snapshot","date":"2020-10-27T16:31:08Z","major":false},{"version":"1.16.4-pre2","version_type":"snapshot","date":"2020-10-22T15:32:17Z","major":false},{"version":"1.16.4-pre1","version_type":"snapshot","date":"2020-10-13T14:36:07Z","major":false},{"version":"1.16.3","version_type":"release","date":"2020-09-10T13:42:37Z","major":false},{"version":"1.16.3-rc1","version_type":"snapshot","date":"2020-09-07T12:34:06Z","major":false},{"version":"1.16.2","version_type":"release","date":"2020-08-11T10:13:46Z","major":false},{"version":"1.16.2-rc2","version_type":"snapshot","date":"2020-08-10T11:43:36Z","major":false},{"version":"1.16.2-rc1","version_type":"snapshot","date":"2020-08-07T14:35:39Z","major":false},{"version":"1.16.2-pre3","version_type":"snapshot","date":"2020-08-06T16:44:52Z","major":false},{"version":"1.16.2-pre2","version_type":"snapshot","date":"2020-08-05T15:30:50Z","major":false},{"version":"1.16.2-pre1","version_type":"snapshot","date":"2020-07-29T13:19:05Z","major":false},{"version":"20w30a","version_type":"snapshot","date":"2020-07-22T15:05:15Z","major":false},{"version":"20w29a","version_type":"snapshot","date":"2020-07-15T14:13:47Z","major":false},{"version":"20w28a","version_type":"snapshot","date":"2020-07-08T15:10:40Z","major":false},{"version":"20w27a","version_type":"snapshot","date":"2020-07-01T15:07:35Z","major":false},{"version":"1.16.1","version_type":"release","date":"2020-06-24T10:31:40Z","major":true},{"version":"1.16","version_type":"release","date":"2020-06-23T16:20:52Z","major":false},{"version":"1.16-rc1","version_type":"snapshot","date":"2020-06-18T12:49:28Z","major":false},{"version":"1.16-pre8","version_type":"snapshot","date":"2020-06-17T14:45:23Z","major":false},{"version":"1.16-pre7","version_type":"snapshot","date":"2020-06-16T15:31:35Z","major":false},{"version":"1.16-pre6","version_type":"snapshot","date":"2020-06-15T16:57:57Z","major":false},{"version":"1.16-pre5","version_type":"snapshot","date":"2020-06-12T14:33:59Z","major":false},{"version":"1.16-pre4","version_type":"snapshot","date":"2020-06-11T15:45:55Z","major":false},{"version":"1.16-pre3","version_type":"snapshot","date":"2020-06-10T14:57:43Z","major":false},{"version":"1.16-pre2","version_type":"snapshot","date":"2020-06-05T10:47:59Z","major":false},{"version":"1.16-pre1","version_type":"snapshot","date":"2020-06-04T18:17:51Z","major":false},{"version":"20w22a","version_type":"snapshot","date":"2020-05-29T11:25:02Z","major":false},{"version":"20w21a","version_type":"snapshot","date":"2020-05-20T12:07:18Z","major":false},{"version":"20w20b","version_type":"snapshot","date":"2020-05-14T08:16:26Z","major":false},{"version":"20w20a","version_type":"snapshot","date":"2020-05-13T15:11:43Z","major":false},{"version":"20w19a","version_type":"snapshot","date":"2020-05-06T16:23:24Z","major":false},{"version":"20w18a","version_type":"snapshot","date":"2020-04-29T15:16:34Z","major":false},{"version":"20w17a","version_type":"snapshot","date":"2020-04-22T13:47:50Z","major":false},{"version":"20w16a","version_type":"snapshot","date":"2020-04-15T14:13:01Z","major":false},{"version":"20w15a","version_type":"snapshot","date":"2020-04-08T12:29:24Z","major":false},{"version":"20w14a","version_type":"snapshot","date":"2020-04-02T14:28:06Z","major":false},{"version":"20w14infinite","version_type":"snapshot","date":"2020-04-01T12:47:08Z","major":false},{"version":"20w13b","version_type":"snapshot","date":"2020-03-26T13:00:34Z","major":false},{"version":"20w13a","version_type":"snapshot","date":"2020-03-25T17:05:33Z","major":false},{"version":"20w12a","version_type":"snapshot","date":"2020-03-18T16:42:06Z","major":false},{"version":"20w11a","version_type":"snapshot","date":"2020-03-11T16:28:27Z","major":false},{"version":"20w10a","version_type":"snapshot","date":"2020-03-04T16:21:41Z","major":false},{"version":"20w09a","version_type":"snapshot","date":"2020-02-26T16:43:08Z","major":false},{"version":"20w08a","version_type":"snapshot","date":"2020-02-19T13:30:09Z","major":false},{"version":"20w07a","version_type":"snapshot","date":"2020-02-14T13:20:49Z","major":false},{"version":"20w06a","version_type":"snapshot","date":"2020-02-05T16:05:22Z","major":false},{"version":"1.15.2","version_type":"release","date":"2020-01-17T10:03:52Z","major":false},{"version":"1.15.2-pre2","version_type":"snapshot","date":"2020-01-16T12:35:57Z","major":false},{"version":"1.15.2-pre1","version_type":"snapshot","date":"2020-01-14T16:19:31Z","major":false},{"version":"1.15.1","version_type":"release","date":"2019-12-16T10:29:47Z","major":false},{"version":"1.15.1-pre1","version_type":"snapshot","date":"2019-12-12T14:02:30Z","major":false},{"version":"1.15","version_type":"release","date":"2019-12-09T13:13:38Z","major":false},{"version":"1.15-pre7","version_type":"snapshot","date":"2019-12-09T12:14:11Z","major":false},{"version":"1.15-pre6","version_type":"snapshot","date":"2019-12-06T12:04:30Z","major":false},{"version":"1.15-pre5","version_type":"snapshot","date":"2019-12-05T13:20:00Z","major":false},{"version":"1.15-pre4","version_type":"snapshot","date":"2019-12-03T12:24:24Z","major":false},{"version":"1.15-pre3","version_type":"snapshot","date":"2019-11-28T17:17:50Z","major":false},{"version":"1.15-pre2","version_type":"snapshot","date":"2019-11-25T18:09:38Z","major":false},{"version":"1.15-pre1","version_type":"snapshot","date":"2019-11-21T17:01:17Z","major":false},{"version":"19w46b","version_type":"snapshot","date":"2019-11-14T13:29:24Z","major":false},{"version":"19w46a","version_type":"snapshot","date":"2019-11-13T16:37:46Z","major":false},{"version":"19w45b","version_type":"snapshot","date":"2019-11-08T12:42:44Z","major":false},{"version":"19w45a","version_type":"snapshot","date":"2019-11-07T16:19:20Z","major":false},{"version":"19w44a","version_type":"snapshot","date":"2019-10-30T15:31:44Z","major":false},{"version":"19w42a","version_type":"snapshot","date":"2019-10-16T15:30:39Z","major":false},{"version":"19w41a","version_type":"snapshot","date":"2019-10-09T15:21:35Z","major":false},{"version":"19w40a","version_type":"snapshot","date":"2019-10-02T13:40:26Z","major":false},{"version":"19w39a","version_type":"snapshot","date":"2019-09-27T10:13:33Z","major":false},{"version":"19w38b","version_type":"snapshot","date":"2019-09-18T14:59:13Z","major":false},{"version":"19w38a","version_type":"snapshot","date":"2019-09-18T10:03:22Z","major":false},{"version":"19w37a","version_type":"snapshot","date":"2019-09-11T11:46:44Z","major":false},{"version":"19w36a","version_type":"snapshot","date":"2019-09-04T11:19:34Z","major":false},{"version":"19w35a","version_type":"snapshot","date":"2019-08-28T15:01:44Z","major":false},{"version":"19w34a","version_type":"snapshot","date":"2019-08-22T12:06:21Z","major":false},{"version":"1.14.4","version_type":"release","date":"2019-07-19T09:25:47Z","major":true},{"version":"1.14.4-pre7","version_type":"snapshot","date":"2019-07-18T11:32:36Z","major":false},{"version":"1.14.4-pre6","version_type":"snapshot","date":"2019-07-15T12:39:49Z","major":false},{"version":"1.14.4-pre5","version_type":"snapshot","date":"2019-07-11T10:52:33Z","major":false},{"version":"1.14.4-pre4","version_type":"snapshot","date":"2019-07-10T12:53:29Z","major":false},{"version":"1.14.4-pre3","version_type":"snapshot","date":"2019-07-08T11:21:42Z","major":false},{"version":"1.14.4-pre2","version_type":"snapshot","date":"2019-07-04T14:41:05Z","major":false},{"version":"1.14.4-pre1","version_type":"snapshot","date":"2019-07-03T13:01:01Z","major":false},{"version":"1.14.3","version_type":"release","date":"2019-06-24T12:52:52Z","major":false},{"version":"1.14.3-pre4","version_type":"snapshot","date":"2019-06-19T11:44:29Z","major":false},{"version":"1.14.3-pre3","version_type":"snapshot","date":"2019-06-14T08:03:33Z","major":false},{"version":"1.14.3-pre2","version_type":"snapshot","date":"2019-06-07T09:11:29Z","major":false},{"version":"1.14.3-pre1","version_type":"snapshot","date":"2019-06-03T14:34:20Z","major":false},{"version":"1.14.2","version_type":"release","date":"2019-05-27T11:48:25Z","major":false},{"version":"1.14.2-pre4","version_type":"snapshot","date":"2019-05-27T07:21:11Z","major":false},{"version":"1.14.2-pre3","version_type":"snapshot","date":"2019-05-22T13:12:51Z","major":false},{"version":"1.14.2-pre2","version_type":"snapshot","date":"2019-05-17T12:21:03Z","major":false},{"version":"1.14.2-pre1","version_type":"snapshot","date":"2019-05-16T15:40:25Z","major":false},{"version":"1.14.1","version_type":"release","date":"2019-05-13T11:10:12Z","major":false},{"version":"1.14.1-pre2","version_type":"snapshot","date":"2019-05-09T14:01:04Z","major":false},{"version":"1.14.1-pre1","version_type":"snapshot","date":"2019-05-07T14:44:42Z","major":false},{"version":"1.14","version_type":"release","date":"2019-04-23T14:52:44Z","major":false},{"version":"1.14-pre5","version_type":"snapshot","date":"2019-04-18T11:05:19Z","major":false},{"version":"1.14-pre4","version_type":"snapshot","date":"2019-04-17T15:31:12Z","major":false},{"version":"1.14-pre3","version_type":"snapshot","date":"2019-04-16T13:57:10Z","major":false},{"version":"1.14-pre2","version_type":"snapshot","date":"2019-04-12T11:38:53Z","major":false},{"version":"1.14-pre1","version_type":"snapshot","date":"2019-04-10T14:24:16Z","major":false},{"version":"19w14b","version_type":"snapshot","date":"2019-04-05T10:33:58Z","major":false},{"version":"19w14a","version_type":"snapshot","date":"2019-04-03T13:45:00Z","major":false},{"version":"3D-Shareware-v1.34","version_type":"snapshot","date":"2019-04-01T11:18:08Z","major":false},{"version":"19w13b","version_type":"snapshot","date":"2019-03-29T16:53:22Z","major":false},{"version":"19w13a","version_type":"snapshot","date":"2019-03-27T15:15:31Z","major":false},{"version":"19w12b","version_type":"snapshot","date":"2019-03-21T15:20:01Z","major":false},{"version":"19w12a","version_type":"snapshot","date":"2019-03-20T16:47:34Z","major":false},{"version":"19w11b","version_type":"snapshot","date":"2019-03-14T14:26:23Z","major":false},{"version":"19w11a","version_type":"snapshot","date":"2019-03-13T13:59:29Z","major":false},{"version":"19w09a","version_type":"snapshot","date":"2019-02-27T14:44:30Z","major":false},{"version":"19w08b","version_type":"snapshot","date":"2019-02-21T13:38:09Z","major":false},{"version":"19w08a","version_type":"snapshot","date":"2019-02-20T14:56:58Z","major":false},{"version":"19w07a","version_type":"snapshot","date":"2019-02-13T16:12:08Z","major":false},{"version":"19w06a","version_type":"snapshot","date":"2019-02-06T16:24:13Z","major":false},{"version":"19w05a","version_type":"snapshot","date":"2019-01-30T15:16:49Z","major":false},{"version":"19w04b","version_type":"snapshot","date":"2019-01-25T12:20:15Z","major":false},{"version":"19w04a","version_type":"snapshot","date":"2019-01-24T15:31:52Z","major":false},{"version":"19w03c","version_type":"snapshot","date":"2019-01-18T11:27:13Z","major":false},{"version":"19w03b","version_type":"snapshot","date":"2019-01-17T16:43:27Z","major":false},{"version":"19w03a","version_type":"snapshot","date":"2019-01-16T16:45:02Z","major":false},{"version":"19w02a","version_type":"snapshot","date":"2019-01-09T15:52:07Z","major":false},{"version":"18w50a","version_type":"snapshot","date":"2018-12-12T14:58:13Z","major":false},{"version":"18w49a","version_type":"snapshot","date":"2018-12-05T12:24:30Z","major":false},{"version":"18w48b","version_type":"snapshot","date":"2018-11-30T10:37:31Z","major":false},{"version":"18w48a","version_type":"snapshot","date":"2018-11-29T13:11:38Z","major":false},{"version":"18w47b","version_type":"snapshot","date":"2018-11-23T10:46:41Z","major":false},{"version":"18w47a","version_type":"snapshot","date":"2018-11-21T15:45:22Z","major":false},{"version":"18w46a","version_type":"snapshot","date":"2018-11-15T13:43:14Z","major":false},{"version":"18w45a","version_type":"snapshot","date":"2018-11-07T14:40:06Z","major":false},{"version":"18w44a","version_type":"snapshot","date":"2018-10-31T15:29:16Z","major":false},{"version":"18w43c","version_type":"snapshot","date":"2018-10-26T08:40:46Z","major":false},{"version":"18w43b","version_type":"snapshot","date":"2018-10-24T15:02:30Z","major":false},{"version":"18w43a","version_type":"snapshot","date":"2018-10-24T10:52:16Z","major":false},{"version":"1.13.2","version_type":"release","date":"2018-10-22T11:41:07Z","major":true},{"version":"1.13.2-pre2","version_type":"snapshot","date":"2018-10-18T14:46:12Z","major":false},{"version":"1.13.2-pre1","version_type":"snapshot","date":"2018-10-16T13:40:58Z","major":false},{"version":"1.13.1","version_type":"release","date":"2018-08-22T14:03:42Z","major":false},{"version":"1.13.1-pre2","version_type":"snapshot","date":"2018-08-20T13:52:09Z","major":false},{"version":"1.13.1-pre1","version_type":"snapshot","date":"2018-08-16T13:08:44Z","major":false},{"version":"18w33a","version_type":"snapshot","date":"2018-08-15T14:28:56Z","major":false},{"version":"18w32a","version_type":"snapshot","date":"2018-08-08T13:16:57Z","major":false},{"version":"18w31a","version_type":"snapshot","date":"2018-08-01T12:54:44Z","major":false},{"version":"18w30b","version_type":"snapshot","date":"2018-07-26T16:06:57Z","major":false},{"version":"18w30a","version_type":"snapshot","date":"2018-07-25T14:29:31Z","major":false},{"version":"1.13","version_type":"release","date":"2018-07-18T15:11:46Z","major":false},{"version":"1.13-pre10","version_type":"snapshot","date":"2018-07-17T14:48:06Z","major":false},{"version":"1.13-pre9","version_type":"snapshot","date":"2018-07-16T14:17:42Z","major":false},{"version":"1.13-pre8","version_type":"snapshot","date":"2018-07-13T11:45:00Z","major":false},{"version":"1.13-pre7","version_type":"snapshot","date":"2018-07-10T14:21:42Z","major":false},{"version":"1.13-pre6","version_type":"snapshot","date":"2018-07-04T12:36:00Z","major":false},{"version":"1.13-pre5","version_type":"snapshot","date":"2018-06-28T13:58:53Z","major":false},{"version":"1.13-pre4","version_type":"snapshot","date":"2018-06-26T13:00:55Z","major":false},{"version":"1.13-pre3","version_type":"snapshot","date":"2018-06-21T12:57:11Z","major":false},{"version":"1.13-pre2","version_type":"snapshot","date":"2018-06-15T09:20:00Z","major":false},{"version":"1.13-pre1","version_type":"snapshot","date":"2018-06-04T15:17:34Z","major":false},{"version":"18w22c","version_type":"snapshot","date":"2018-05-31T13:53:15Z","major":false},{"version":"18w22b","version_type":"snapshot","date":"2018-05-30T13:48:58Z","major":false},{"version":"18w22a","version_type":"snapshot","date":"2018-05-29T13:23:55Z","major":false},{"version":"18w21b","version_type":"snapshot","date":"2018-05-25T10:09:09Z","major":false},{"version":"18w21a","version_type":"snapshot","date":"2018-05-23T13:11:49Z","major":false},{"version":"18w20c","version_type":"snapshot","date":"2018-05-17T14:06:56Z","major":false},{"version":"18w20b","version_type":"snapshot","date":"2018-05-16T14:35:35Z","major":false},{"version":"18w20a","version_type":"snapshot","date":"2018-05-15T14:02:25Z","major":false},{"version":"18w19b","version_type":"snapshot","date":"2018-05-09T10:00:51Z","major":false},{"version":"18w19a","version_type":"snapshot","date":"2018-05-08T13:05:19Z","major":false},{"version":"18w16a","version_type":"snapshot","date":"2018-04-19T14:46:35Z","major":false},{"version":"18w15a","version_type":"snapshot","date":"2018-04-11T14:54:22Z","major":false},{"version":"18w14b","version_type":"snapshot","date":"2018-04-05T14:44:02Z","major":false},{"version":"18w14a","version_type":"snapshot","date":"2018-04-04T14:36:14Z","major":false},{"version":"18w11a","version_type":"snapshot","date":"2018-03-13T15:10:59Z","major":false},{"version":"18w10d","version_type":"snapshot","date":"2018-03-09T15:19:12Z","major":false},{"version":"18w10c","version_type":"snapshot","date":"2018-03-08T15:29:23Z","major":false},{"version":"18w10b","version_type":"snapshot","date":"2018-03-07T15:56:01Z","major":false},{"version":"18w10a","version_type":"snapshot","date":"2018-03-06T15:54:24Z","major":false},{"version":"18w09a","version_type":"snapshot","date":"2018-03-01T14:15:10Z","major":false},{"version":"18w08b","version_type":"snapshot","date":"2018-02-22T15:44:49Z","major":false},{"version":"18w08a","version_type":"snapshot","date":"2018-02-21T14:59:00Z","major":false},{"version":"18w07c","version_type":"snapshot","date":"2018-02-16T13:23:32Z","major":false},{"version":"18w07b","version_type":"snapshot","date":"2018-02-15T14:28:42Z","major":false},{"version":"18w07a","version_type":"snapshot","date":"2018-02-14T17:34:13Z","major":false},{"version":"18w06a","version_type":"snapshot","date":"2018-02-09T12:09:55Z","major":false},{"version":"18w05a","version_type":"snapshot","date":"2018-01-31T13:32:09Z","major":false},{"version":"18w03b","version_type":"snapshot","date":"2018-01-17T15:09:14Z","major":false},{"version":"18w03a","version_type":"snapshot","date":"2018-01-17T14:25:24Z","major":false},{"version":"18w02a","version_type":"snapshot","date":"2018-01-10T11:54:55Z","major":false},{"version":"18w01a","version_type":"snapshot","date":"2018-01-03T13:29:30Z","major":false},{"version":"17w50a","version_type":"snapshot","date":"2017-12-11T15:28:08Z","major":false},{"version":"17w49b","version_type":"snapshot","date":"2017-12-07T15:29:54Z","major":false},{"version":"17w49a","version_type":"snapshot","date":"2017-12-06T14:24:30Z","major":false},{"version":"17w48a","version_type":"snapshot","date":"2017-11-27T15:36:33Z","major":false},{"version":"17w47b","version_type":"snapshot","date":"2017-11-23T15:30:12Z","major":false},{"version":"17w47a","version_type":"snapshot","date":"2017-11-22T12:40:05Z","major":false},{"version":"17w46a","version_type":"snapshot","date":"2017-11-15T15:21:55Z","major":false},{"version":"17w45b","version_type":"snapshot","date":"2017-11-10T10:07:02Z","major":false},{"version":"17w45a","version_type":"snapshot","date":"2017-11-08T15:48:00Z","major":false},{"version":"17w43b","version_type":"snapshot","date":"2017-10-26T13:36:22Z","major":false},{"version":"17w43a","version_type":"snapshot","date":"2017-10-25T14:43:50Z","major":false},{"version":"1.12.2","version_type":"release","date":"2017-09-18T08:39:46Z","major":true},{"version":"1.12.2-pre2","version_type":"snapshot","date":"2017-09-15T08:21:17Z","major":false},{"version":"1.12.2-pre1","version_type":"snapshot","date":"2017-09-13T13:33:31Z","major":false},{"version":"1.12.1","version_type":"release","date":"2017-08-03T12:40:39Z","major":false},{"version":"1.12.1-pre1","version_type":"snapshot","date":"2017-08-02T10:53:55Z","major":false},{"version":"17w31a","version_type":"snapshot","date":"2017-08-01T09:41:23Z","major":false},{"version":"1.12","version_type":"release","date":"2017-06-02T13:50:27Z","major":false},{"version":"1.12-pre7","version_type":"snapshot","date":"2017-05-31T10:56:41Z","major":false},{"version":"1.12-pre6","version_type":"snapshot","date":"2017-05-29T11:45:12Z","major":false},{"version":"1.12-pre5","version_type":"snapshot","date":"2017-05-19T07:43:28Z","major":false},{"version":"1.12-pre4","version_type":"snapshot","date":"2017-05-18T12:28:16Z","major":false},{"version":"1.12-pre3","version_type":"snapshot","date":"2017-05-17T14:09:18Z","major":false},{"version":"1.12-pre2","version_type":"snapshot","date":"2017-05-11T12:11:12Z","major":false},{"version":"1.12-pre1","version_type":"snapshot","date":"2017-05-10T11:37:17Z","major":false},{"version":"17w18b","version_type":"snapshot","date":"2017-05-04T13:40:22Z","major":false},{"version":"17w18a","version_type":"snapshot","date":"2017-05-03T14:50:23Z","major":false},{"version":"17w17b","version_type":"snapshot","date":"2017-04-27T13:24:23Z","major":false},{"version":"17w17a","version_type":"snapshot","date":"2017-04-26T13:48:23Z","major":false},{"version":"17w16b","version_type":"snapshot","date":"2017-04-21T12:02:59Z","major":false},{"version":"17w16a","version_type":"snapshot","date":"2017-04-20T13:58:35Z","major":false},{"version":"17w15a","version_type":"snapshot","date":"2017-04-12T09:30:50Z","major":false},{"version":"17w14a","version_type":"snapshot","date":"2017-04-05T13:58:01Z","major":false},{"version":"17w13b","version_type":"snapshot","date":"2017-03-31T11:06:35Z","major":false},{"version":"17w13a","version_type":"snapshot","date":"2017-03-30T09:32:19Z","major":false},{"version":"17w06a","version_type":"snapshot","date":"2017-02-08T13:16:29Z","major":false},{"version":"1.11.2","version_type":"release","date":"2016-12-21T09:29:12Z","major":true},{"version":"1.11.1","version_type":"release","date":"2016-12-20T14:05:34Z","major":false},{"version":"16w50a","version_type":"snapshot","date":"2016-12-15T14:38:52Z","major":false},{"version":"1.11","version_type":"release","date":"2016-11-14T14:34:40Z","major":false},{"version":"1.11-pre1","version_type":"snapshot","date":"2016-11-08T13:42:50Z","major":false},{"version":"16w44a","version_type":"snapshot","date":"2016-11-03T14:17:11Z","major":false},{"version":"16w43a","version_type":"snapshot","date":"2016-10-27T09:00:51Z","major":false},{"version":"16w42a","version_type":"snapshot","date":"2016-10-19T11:17:47Z","major":false},{"version":"16w41a","version_type":"snapshot","date":"2016-10-13T14:28:35Z","major":false},{"version":"16w40a","version_type":"snapshot","date":"2016-10-06T13:57:59Z","major":false},{"version":"16w39c","version_type":"snapshot","date":"2016-09-30T14:11:48Z","major":false},{"version":"16w39b","version_type":"snapshot","date":"2016-09-29T14:39:39Z","major":false},{"version":"16w39a","version_type":"snapshot","date":"2016-09-28T13:32:06Z","major":false},{"version":"16w38a","version_type":"snapshot","date":"2016-09-20T12:40:49Z","major":false},{"version":"16w36a","version_type":"snapshot","date":"2016-09-08T14:55:10Z","major":false},{"version":"16w35a","version_type":"snapshot","date":"2016-09-01T13:13:38Z","major":false},{"version":"16w33a","version_type":"snapshot","date":"2016-08-17T12:48:57Z","major":false},{"version":"16w32b","version_type":"snapshot","date":"2016-08-11T14:34:29Z","major":false},{"version":"16w32a","version_type":"snapshot","date":"2016-08-10T12:30:10Z","major":false},{"version":"1.10.2","version_type":"release","date":"2016-06-23T09:17:32Z","major":true},{"version":"1.10.1","version_type":"release","date":"2016-06-22T10:13:22Z","major":false},{"version":"1.10","version_type":"release","date":"2016-06-08T13:06:18Z","major":false},{"version":"1.10-pre2","version_type":"snapshot","date":"2016-06-07T14:56:34Z","major":false},{"version":"1.10-pre1","version_type":"snapshot","date":"2016-06-02T14:45:16Z","major":false},{"version":"16w21b","version_type":"snapshot","date":"2016-05-26T12:47:22Z","major":false},{"version":"16w21a","version_type":"snapshot","date":"2016-05-25T13:12:09Z","major":false},{"version":"16w20a","version_type":"snapshot","date":"2016-05-18T12:45:14Z","major":false},{"version":"1.9.4","version_type":"release","date":"2016-05-10T10:17:16Z","major":true},{"version":"1.9.3","version_type":"release","date":"2016-05-10T08:33:35Z","major":false},{"version":"1.9.3-pre3","version_type":"snapshot","date":"2016-05-03T09:28:11Z","major":false},{"version":"1.9.3-pre2","version_type":"snapshot","date":"2016-04-27T13:33:20Z","major":false},{"version":"1.9.3-pre1","version_type":"snapshot","date":"2016-04-21T12:41:42Z","major":false},{"version":"16w15b","version_type":"snapshot","date":"2016-04-13T13:56:41Z","major":false},{"version":"16w15a","version_type":"snapshot","date":"2016-04-11T14:38:28Z","major":false},{"version":"16w14a","version_type":"snapshot","date":"2016-04-07T12:47:51Z","major":false},{"version":"1.RV-Pre1","version_type":"snapshot","date":"2016-03-31T16:18:53Z","major":false},{"version":"1.9.2","version_type":"release","date":"2016-03-30T15:23:55Z","major":false},{"version":"1.9.1","version_type":"release","date":"2016-03-30T13:43:07Z","major":false},{"version":"1.9.1-pre3","version_type":"snapshot","date":"2016-03-11T09:20:36Z","major":false},{"version":"1.9.1-pre2","version_type":"snapshot","date":"2016-03-10T15:06:03Z","major":false},{"version":"1.9.1-pre1","version_type":"snapshot","date":"2016-03-09T16:27:29Z","major":false},{"version":"1.9","version_type":"release","date":"2016-02-29T13:49:54Z","major":false},{"version":"1.9-pre4","version_type":"snapshot","date":"2016-02-26T15:21:11Z","major":false},{"version":"1.9-pre3","version_type":"snapshot","date":"2016-02-24T15:52:36Z","major":false},{"version":"1.9-pre2","version_type":"snapshot","date":"2016-02-18T17:41:00Z","major":false},{"version":"1.9-pre1","version_type":"snapshot","date":"2016-02-17T15:23:19Z","major":false},{"version":"16w07b","version_type":"snapshot","date":"2016-02-16T15:22:39Z","major":false},{"version":"16w07a","version_type":"snapshot","date":"2016-02-15T15:48:46Z","major":false},{"version":"16w06a","version_type":"snapshot","date":"2016-02-10T15:06:41Z","major":false},{"version":"16w05b","version_type":"snapshot","date":"2016-02-04T15:28:02Z","major":false},{"version":"16w05a","version_type":"snapshot","date":"2016-02-03T15:48:38Z","major":false},{"version":"16w04a","version_type":"snapshot","date":"2016-01-28T15:37:24Z","major":false},{"version":"16w03a","version_type":"snapshot","date":"2016-01-20T14:29:24Z","major":false},{"version":"16w02a","version_type":"snapshot","date":"2016-01-13T15:15:16Z","major":false},{"version":"15w51b","version_type":"snapshot","date":"2015-12-17T15:30:41Z","major":false},{"version":"15w51a","version_type":"snapshot","date":"2015-12-17T14:02:37Z","major":false},{"version":"15w50a","version_type":"snapshot","date":"2015-12-09T15:35:57Z","major":false},{"version":"15w49b","version_type":"snapshot","date":"2015-12-03T15:23:22Z","major":false},{"version":"1.8.9","version_type":"release","date":"2015-12-03T09:24:39Z","major":true},{"version":"15w49a","version_type":"snapshot","date":"2015-12-02T15:09:37Z","major":false},{"version":"15w47c","version_type":"snapshot","date":"2015-11-20T12:46:56Z","major":false},{"version":"15w47b","version_type":"snapshot","date":"2015-11-19T14:48:03Z","major":false},{"version":"15w47a","version_type":"snapshot","date":"2015-11-18T15:53:41Z","major":false},{"version":"15w46a","version_type":"snapshot","date":"2015-11-12T12:11:47Z","major":false},{"version":"15w45a","version_type":"snapshot","date":"2015-11-05T13:04:07Z","major":false},{"version":"15w44b","version_type":"snapshot","date":"2015-10-30T11:23:17Z","major":false},{"version":"15w44a","version_type":"snapshot","date":"2015-10-28T15:09:36Z","major":false},{"version":"15w43c","version_type":"snapshot","date":"2015-10-23T15:35:55Z","major":false},{"version":"15w43b","version_type":"snapshot","date":"2015-10-22T14:11:58Z","major":false},{"version":"15w43a","version_type":"snapshot","date":"2015-10-21T15:28:52Z","major":false},{"version":"15w42a","version_type":"snapshot","date":"2015-10-14T13:25:14Z","major":false},{"version":"15w41b","version_type":"snapshot","date":"2015-10-07T14:07:26Z","major":false},{"version":"15w41a","version_type":"snapshot","date":"2015-10-07T13:19:53Z","major":false},{"version":"15w40b","version_type":"snapshot","date":"2015-09-30T14:13:54Z","major":false},{"version":"15w40a","version_type":"snapshot","date":"2015-09-30T13:13:54Z","major":false},{"version":"15w39c","version_type":"snapshot","date":"2015-09-23T13:13:54Z","major":false},{"version":"15w39b","version_type":"snapshot","date":"2015-09-21T15:09:52Z","major":false},{"version":"15w39a","version_type":"snapshot","date":"2015-09-21T13:16:32Z","major":false},{"version":"15w38b","version_type":"snapshot","date":"2015-09-17T14:22:31Z","major":false},{"version":"15w38a","version_type":"snapshot","date":"2015-09-16T14:22:31Z","major":false},{"version":"15w37a","version_type":"snapshot","date":"2015-09-10T14:22:31Z","major":false},{"version":"15w36d","version_type":"snapshot","date":"2015-09-04T14:22:31Z","major":false},{"version":"15w36c","version_type":"snapshot","date":"2015-09-02T16:07:22Z","major":false},{"version":"15w36b","version_type":"snapshot","date":"2015-09-02T15:36:25Z","major":false},{"version":"15w36a","version_type":"snapshot","date":"2015-09-02T14:46:40Z","major":false},{"version":"15w35e","version_type":"snapshot","date":"2015-08-28T18:14:02Z","major":false},{"version":"15w35d","version_type":"snapshot","date":"2015-08-28T16:25:35Z","major":false},{"version":"15w35c","version_type":"snapshot","date":"2015-08-28T11:21:00Z","major":false},{"version":"15w35b","version_type":"snapshot","date":"2015-08-24T15:39:18Z","major":false},{"version":"15w35a","version_type":"snapshot","date":"2015-08-24T14:19:31Z","major":false},{"version":"15w34d","version_type":"snapshot","date":"2015-08-21T15:27:55Z","major":false},{"version":"15w34c","version_type":"snapshot","date":"2015-08-21T12:45:20Z","major":false},{"version":"15w34b","version_type":"snapshot","date":"2015-08-20T14:00:03Z","major":false},{"version":"15w34a","version_type":"snapshot","date":"2015-08-19T12:56:01Z","major":false},{"version":"15w33c","version_type":"snapshot","date":"2015-08-14T13:10:46Z","major":false},{"version":"15w33b","version_type":"snapshot","date":"2015-08-12T15:29:11Z","major":false},{"version":"15w33a","version_type":"snapshot","date":"2015-08-12T14:05:07Z","major":false},{"version":"15w32c","version_type":"snapshot","date":"2015-08-07T14:08:17Z","major":false},{"version":"15w32b","version_type":"snapshot","date":"2015-08-06T13:51:47Z","major":false},{"version":"15w32a","version_type":"snapshot","date":"2015-08-05T12:22:42Z","major":false},{"version":"15w31c","version_type":"snapshot","date":"2015-07-31T13:45:08Z","major":false},{"version":"15w31b","version_type":"snapshot","date":"2015-07-30T13:38:32Z","major":false},{"version":"15w31a","version_type":"snapshot","date":"2015-07-29T13:24:33Z","major":false},{"version":"1.8.8","version_type":"release","date":"2015-07-27T10:31:28Z","major":false},{"version":"1.8.7","version_type":"release","date":"2015-06-05T10:10:44Z","major":false},{"version":"1.8.6","version_type":"release","date":"2015-05-25T10:31:19Z","major":false},{"version":"1.8.5","version_type":"release","date":"2015-05-22T11:15:28Z","major":false},{"version":"1.8.4","version_type":"release","date":"2015-04-17T11:37:50Z","major":false},{"version":"15w14a","version_type":"snapshot","date":"2015-04-01T07:08:00Z","major":false},{"version":"1.8.3","version_type":"release","date":"2015-02-20T14:00:09Z","major":false},{"version":"1.8.2","version_type":"release","date":"2015-02-19T15:47:29Z","major":false},{"version":"1.8.2-pre7","version_type":"snapshot","date":"2015-02-16T13:01:35Z","major":false},{"version":"1.8.2-pre6","version_type":"snapshot","date":"2015-01-30T11:58:24Z","major":false},{"version":"1.8.2-pre5","version_type":"snapshot","date":"2015-01-26T15:03:24Z","major":false},{"version":"1.8.2-pre4","version_type":"snapshot","date":"2015-01-16T14:19:59Z","major":false},{"version":"1.8.2-pre3","version_type":"snapshot","date":"2015-01-15T16:44:33Z","major":false},{"version":"1.8.2-pre2","version_type":"snapshot","date":"2015-01-15T15:07:31Z","major":false},{"version":"1.8.2-pre1","version_type":"snapshot","date":"2014-12-18T11:29:41Z","major":false},{"version":"1.8.1","version_type":"release","date":"2014-11-24T14:13:31Z","major":false},{"version":"1.8.1-pre5","version_type":"snapshot","date":"2014-11-19T14:30:48Z","major":false},{"version":"1.8.1-pre4","version_type":"snapshot","date":"2014-11-06T14:10:50Z","major":false},{"version":"1.8.1-pre3","version_type":"snapshot","date":"2014-10-23T12:59:42Z","major":false},{"version":"1.8.1-pre2","version_type":"snapshot","date":"2014-10-16T14:19:27Z","major":false},{"version":"1.8.1-pre1","version_type":"snapshot","date":"2014-10-15T13:25:11Z","major":false},{"version":"1.8","version_type":"release","date":"2014-09-02T08:24:35Z","major":false},{"version":"1.8-pre3","version_type":"snapshot","date":"2014-08-28T09:40:54Z","major":false},{"version":"1.8-pre2","version_type":"snapshot","date":"2014-08-25T14:52:18Z","major":false},{"version":"1.8-pre1","version_type":"snapshot","date":"2014-08-21T13:56:26Z","major":false},{"version":"14w34d","version_type":"snapshot","date":"2014-08-20T12:46:59Z","major":false},{"version":"14w34c","version_type":"snapshot","date":"2014-08-19T15:31:24Z","major":false},{"version":"14w34b","version_type":"snapshot","date":"2014-08-18T15:14:28Z","major":false},{"version":"14w34a","version_type":"snapshot","date":"2014-08-18T14:14:11Z","major":false},{"version":"14w33c","version_type":"snapshot","date":"2014-08-15T18:00:26Z","major":false},{"version":"14w33b","version_type":"snapshot","date":"2014-08-15T16:23:51Z","major":false},{"version":"14w33a","version_type":"snapshot","date":"2014-08-13T15:08:14Z","major":false},{"version":"14w32d","version_type":"snapshot","date":"2014-08-08T15:13:41Z","major":false},{"version":"14w32c","version_type":"snapshot","date":"2014-08-08T14:11:20Z","major":false},{"version":"14w32b","version_type":"snapshot","date":"2014-08-07T14:45:17Z","major":false},{"version":"14w32a","version_type":"snapshot","date":"2014-08-06T14:01:16Z","major":false},{"version":"14w31a","version_type":"snapshot","date":"2014-07-30T15:38:05Z","major":false},{"version":"14w30c","version_type":"snapshot","date":"2014-07-24T14:39:09Z","major":false},{"version":"14w30b","version_type":"snapshot","date":"2014-07-23T15:03:03Z","major":false},{"version":"14w30a","version_type":"snapshot","date":"2014-07-23T13:15:42Z","major":false},{"version":"14w29b","version_type":"snapshot","date":"2014-07-16T17:27:40Z","major":false},{"version":"14w29a","version_type":"snapshot","date":"2014-07-16T15:18:17Z","major":false},{"version":"14w28b","version_type":"snapshot","date":"2014-07-10T14:28:48Z","major":false},{"version":"14w28a","version_type":"snapshot","date":"2014-07-09T15:42:36Z","major":false},{"version":"14w27b","version_type":"snapshot","date":"2014-07-02T18:34:56Z","major":false},{"version":"14w27a","version_type":"snapshot","date":"2014-07-02T16:07:20Z","major":false},{"version":"14w26c","version_type":"snapshot","date":"2014-06-26T15:05:03Z","major":false},{"version":"14w26b","version_type":"snapshot","date":"2014-06-25T15:08:39Z","major":false},{"version":"14w26a","version_type":"snapshot","date":"2014-06-25T13:59:27Z","major":false},{"version":"14w25b","version_type":"snapshot","date":"2014-06-19T12:29:48Z","major":false},{"version":"14w25a","version_type":"snapshot","date":"2014-06-18T15:52:28Z","major":false},{"version":"14w21b","version_type":"snapshot","date":"2014-05-22T15:17:55Z","major":false},{"version":"14w21a","version_type":"snapshot","date":"2014-05-22T14:44:33Z","major":false},{"version":"14w20b","version_type":"snapshot","date":"2014-05-15T16:47:21Z","major":false},{"version":"14w20a","version_type":"snapshot","date":"2014-05-15T14:01:20Z","major":false},{"version":"1.7.10","version_type":"release","date":"2014-05-14T17:29:23Z","major":true},{"version":"1.7.10-pre4","version_type":"snapshot","date":"2014-05-14T16:29:23Z","major":false},{"version":"1.7.10-pre3","version_type":"snapshot","date":"2014-05-14T15:29:23Z","major":false},{"version":"1.7.10-pre2","version_type":"snapshot","date":"2014-05-14T14:29:23Z","major":false},{"version":"1.7.10-pre1","version_type":"snapshot","date":"2014-05-14T13:29:23Z","major":false},{"version":"14w19a","version_type":"snapshot","date":"2014-05-08T14:24:19Z","major":false},{"version":"14w18b","version_type":"snapshot","date":"2014-05-02T11:38:17Z","major":false},{"version":"14w18a","version_type":"snapshot","date":"2014-04-30T10:25:35Z","major":false},{"version":"14w17a","version_type":"snapshot","date":"2014-04-24T15:44:49Z","major":false},{"version":"14w11b","version_type":"snapshot","date":"2014-04-14T14:36:19Z","major":false},{"version":"1.7.9","version_type":"release","date":"2014-04-14T13:29:23Z","major":false},{"version":"1.7.8","version_type":"release","date":"2014-04-09T07:58:16Z","major":false},{"version":"1.7.7","version_type":"release","date":"2014-04-09T07:52:16Z","major":false},{"version":"1.7.6","version_type":"release","date":"2014-04-09T07:52:06Z","major":false},{"version":"14w11a","version_type":"snapshot","date":"2014-03-13T14:02:50Z","major":false},{"version":"1.7.6-pre2","version_type":"snapshot","date":"2014-03-08T11:00:01Z","major":false},{"version":"1.7.6-pre1","version_type":"snapshot","date":"2014-03-08T11:00:00Z","major":false},{"version":"14w10c","version_type":"snapshot","date":"2014-03-07T13:49:55Z","major":false},{"version":"14w10b","version_type":"snapshot","date":"2014-03-06T16:25:39Z","major":false},{"version":"14w10a","version_type":"snapshot","date":"2014-03-06T14:23:04Z","major":false},{"version":"14w08a","version_type":"snapshot","date":"2014-02-26T17:00:00Z","major":false},{"version":"1.7.5","version_type":"release","date":"2014-02-26T09:22:17Z","major":false},{"version":"14w07a","version_type":"snapshot","date":"2014-02-14T11:05:07Z","major":false},{"version":"14w06b","version_type":"snapshot","date":"2014-02-06T17:30:42Z","major":false},{"version":"14w06a","version_type":"snapshot","date":"2014-02-06T14:30:17Z","major":false},{"version":"14w05b","version_type":"snapshot","date":"2014-01-31T14:05:50Z","major":false},{"version":"14w05a","version_type":"snapshot","date":"2014-01-30T15:32:41Z","major":false},{"version":"14w04b","version_type":"snapshot","date":"2014-01-24T15:48:46Z","major":false},{"version":"14w04a","version_type":"snapshot","date":"2014-01-23T15:26:13Z","major":false},{"version":"14w03b","version_type":"snapshot","date":"2014-01-16T16:36:19Z","major":false},{"version":"14w03a","version_type":"snapshot","date":"2014-01-16T14:45:13Z","major":false},{"version":"14w02c","version_type":"snapshot","date":"2014-01-10T15:42:36Z","major":false},{"version":"14w02b","version_type":"snapshot","date":"2014-01-09T15:45:55Z","major":false},{"version":"14w02a","version_type":"snapshot","date":"2014-01-09T14:44:41Z","major":false},{"version":"1.7.4","version_type":"release","date":"2013-12-09T12:28:10Z","major":false},{"version":"1.7.3","version_type":"release","date":"2013-12-06T13:55:34Z","major":false},{"version":"13w49a","version_type":"snapshot","date":"2013-12-05T14:34:41Z","major":false},{"version":"13w48b","version_type":"snapshot","date":"2013-11-26T18:36:08Z","major":false},{"version":"13w48a","version_type":"snapshot","date":"2013-11-25T16:53:39Z","major":false},{"version":"13w47e","version_type":"snapshot","date":"2013-11-22T15:16:38Z","major":false},{"version":"13w47d","version_type":"snapshot","date":"2013-11-22T13:51:15Z","major":false},{"version":"13w47c","version_type":"snapshot","date":"2013-11-21T17:10:33Z","major":false},{"version":"13w47b","version_type":"snapshot","date":"2013-11-21T16:57:41Z","major":false},{"version":"13w47a","version_type":"snapshot","date":"2013-11-21T15:59:58Z","major":false},{"version":"1.7.2","version_type":"release","date":"2013-10-25T13:00:00Z","major":false},{"version":"1.7.1","version_type":"snapshot","date":"2013-10-23T12:01:07Z","major":false},{"version":"1.7","version_type":"snapshot","date":"2013-10-22T15:04:05Z","major":false},{"version":"13w43a","version_type":"snapshot","date":"2013-10-21T16:34:47Z","major":false},{"version":"13w42b","version_type":"snapshot","date":"2013-10-18T16:34:08Z","major":false},{"version":"13w42a","version_type":"snapshot","date":"2013-10-17T18:33:05Z","major":false},{"version":"13w41b","version_type":"snapshot","date":"2013-10-11T15:09:17Z","major":false},{"version":"13w41a","version_type":"snapshot","date":"2013-10-10T14:21:43Z","major":false},{"version":"13w39b","version_type":"snapshot","date":"2013-09-27T12:15:58Z","major":false},{"version":"13w39a","version_type":"snapshot","date":"2013-09-26T15:11:19Z","major":false},{"version":"13w38c","version_type":"snapshot","date":"2013-09-20T15:11:34Z","major":false},{"version":"13w38b","version_type":"snapshot","date":"2013-09-20T13:45:40Z","major":false},{"version":"13w38a","version_type":"snapshot","date":"2013-09-19T16:34:21Z","major":false},{"version":"1.6.4","version_type":"release","date":"2013-09-19T15:52:37Z","major":true},{"version":"13w37b","version_type":"snapshot","date":"2013-09-13T10:54:42Z","major":false},{"version":"1.6.3","version_type":"snapshot","date":"2013-09-13T10:54:41Z","major":false},{"version":"13w37a","version_type":"snapshot","date":"2013-09-12T14:23:14Z","major":false},{"version":"13w36b","version_type":"snapshot","date":"2013-09-06T12:31:58Z","major":false},{"version":"13w36a","version_type":"snapshot","date":"2013-09-05T13:05:40Z","major":false},{"version":"1.6.2","version_type":"release","date":"2013-07-05T13:09:02Z","major":false},{"version":"1.6.1","version_type":"release","date":"2013-06-28T14:48:41Z","major":false},{"version":"1.6","version_type":"snapshot","date":"2013-06-25T13:08:56Z","major":false},{"version":"13w26a","version_type":"snapshot","date":"2013-06-24T16:06:06Z","major":false},{"version":"13w25c","version_type":"snapshot","date":"2013-06-20T15:23:37Z","major":false},{"version":"13w25b","version_type":"snapshot","date":"2013-06-18T15:13:27Z","major":false},{"version":"13w25a","version_type":"snapshot","date":"2013-06-17T14:08:06Z","major":false},{"version":"13w24b","version_type":"snapshot","date":"2013-06-14T12:19:13Z","major":false},{"version":"13w24a","version_type":"snapshot","date":"2013-06-13T15:32:23Z","major":false},{"version":"13w23b","version_type":"snapshot","date":"2013-06-08T00:32:01Z","major":false},{"version":"13w23a","version_type":"snapshot","date":"2013-06-07T16:04:20Z","major":false},{"version":"13w22a","version_type":"snapshot","date":"2013-05-30T14:38:40Z","major":false},{"version":"13w21b","version_type":"snapshot","date":"2013-05-27T08:50:42Z","major":false},{"version":"13w21a","version_type":"snapshot","date":"2013-05-23T15:38:28Z","major":false},{"version":"13w19a","version_type":"snapshot","date":"2013-05-10T14:48:02Z","major":false},{"version":"13w18c","version_type":"snapshot","date":"2013-05-03T09:19:35Z","major":false},{"version":"13w18b","version_type":"snapshot","date":"2013-05-02T17:12:25Z","major":false},{"version":"13w18a","version_type":"snapshot","date":"2013-05-02T15:45:59Z","major":false},{"version":"13w17a","version_type":"snapshot","date":"2013-04-25T15:50:00Z","major":false},{"version":"1.5.2","version_type":"release","date":"2013-04-25T15:45:00Z","major":true},{"version":"13w16b","version_type":"snapshot","date":"2013-04-23T21:51:22Z","major":false},{"version":"13w16a","version_type":"snapshot","date":"2013-04-21T12:49:30Z","major":false},{"version":"1.5.1","version_type":"release","date":"2013-03-20T10:00:00Z","major":false},{"version":"1.5","version_type":"snapshot","date":"2013-03-06T22:00:00Z","major":false},{"version":"1.4.7","version_type":"release","date":"2012-12-27T22:00:00Z","major":true},{"version":"1.4.6","version_type":"release","date":"2012-12-19T22:00:01Z","major":false},{"version":"1.4.5","version_type":"release","date":"2012-12-19T22:00:00Z","major":false},{"version":"1.4.4","version_type":"release","date":"2012-12-13T22:00:00Z","major":false},{"version":"1.4.3","version_type":"snapshot","date":"2012-11-30T22:00:00Z","major":false},{"version":"1.4.2","version_type":"release","date":"2012-11-24T22:00:00Z","major":false},{"version":"1.4.1","version_type":"snapshot","date":"2012-11-22T22:00:00Z","major":false},{"version":"1.4","version_type":"snapshot","date":"2012-11-18T22:00:00Z","major":false},{"version":"1.3.2","version_type":"release","date":"2012-08-15T22:00:00Z","major":true},{"version":"1.3.1","version_type":"release","date":"2012-07-31T22:00:00Z","major":false},{"version":"1.3","version_type":"snapshot","date":"2012-07-25T22:00:00Z","major":false},{"version":"1.2.5","version_type":"release","date":"2012-03-29T22:00:00Z","major":true},{"version":"1.2.4","version_type":"release","date":"2012-03-21T22:00:00Z","major":false},{"version":"1.2.3","version_type":"release","date":"2012-03-01T22:00:00Z","major":false},{"version":"1.2.2","version_type":"release","date":"2012-02-29T22:00:01Z","major":false},{"version":"1.2.1","version_type":"release","date":"2012-02-29T22:00:00Z","major":false},{"version":"1.1","version_type":"release","date":"2012-01-11T22:00:00Z","major":true},{"version":"1.0","version_type":"release","date":"2011-11-17T22:00:00Z","major":false},{"version":"b1.8.1","version_type":"beta","date":"2011-09-18T22:00:00Z","major":false},{"version":"b1.8","version_type":"beta","date":"2011-09-14T22:00:00Z","major":false},{"version":"b1.7.3","version_type":"beta","date":"2011-07-07T22:00:00Z","major":true},{"version":"b1.7.2","version_type":"beta","date":"2011-06-30T22:00:00Z","major":false},{"version":"b1.7","version_type":"beta","date":"2011-06-29T22:00:00Z","major":false},{"version":"b1.6.6","version_type":"beta","date":"2011-05-30T22:00:00Z","major":false},{"version":"b1.6.5","version_type":"beta","date":"2011-05-27T22:00:00Z","major":false},{"version":"b1.6.4","version_type":"beta","date":"2011-05-25T22:00:04Z","major":false},{"version":"b1.6.3","version_type":"beta","date":"2011-05-25T22:00:03Z","major":false},{"version":"b1.6.2","version_type":"beta","date":"2011-05-25T22:00:02Z","major":false},{"version":"b1.6.1","version_type":"beta","date":"2011-05-25T22:00:01Z","major":false},{"version":"b1.6","version_type":"beta","date":"2011-05-25T22:00:00Z","major":false},{"version":"b1.5_01","version_type":"beta","date":"2011-04-19T22:00:00Z","major":false},{"version":"b1.5","version_type":"beta","date":"2011-04-18T22:00:00Z","major":false},{"version":"b1.4_01","version_type":"beta","date":"2011-04-04T22:00:00Z","major":false},{"version":"b1.4","version_type":"beta","date":"2011-03-30T22:00:00Z","major":false},{"version":"b1.3_01","version_type":"beta","date":"2011-02-22T22:00:00Z","major":false},{"version":"b1.3b","version_type":"beta","date":"2011-02-21T22:00:00Z","major":false},{"version":"b1.2_02","version_type":"beta","date":"2011-01-20T22:00:00Z","major":false},{"version":"b1.2_01","version_type":"beta","date":"2011-01-13T22:00:00Z","major":false},{"version":"b1.2","version_type":"beta","date":"2011-01-12T22:00:00Z","major":false},{"version":"b1.1_02","version_type":"beta","date":"2010-12-21T22:00:01Z","major":false},{"version":"b1.1_01","version_type":"beta","date":"2010-12-21T22:00:00Z","major":false},{"version":"b1.0.2","version_type":"beta","date":"2010-12-20T22:00:00Z","major":false},{"version":"b1.0_01","version_type":"beta","date":"2010-12-19T22:00:01Z","major":false},{"version":"b1.0","version_type":"beta","date":"2010-12-19T22:00:00Z","major":false},{"version":"a1.2.6","version_type":"alpha","date":"2010-12-02T22:00:00Z","major":false},{"version":"a1.2.5","version_type":"alpha","date":"2010-11-30T22:00:00Z","major":false},{"version":"a1.2.4_01","version_type":"alpha","date":"2010-11-29T22:00:00Z","major":false},{"version":"a1.2.3_04","version_type":"alpha","date":"2010-11-25T22:00:00Z","major":false},{"version":"a1.2.3_02","version_type":"alpha","date":"2010-11-24T22:00:00Z","major":false},{"version":"a1.2.3_01","version_type":"alpha","date":"2010-11-23T22:00:01Z","major":false},{"version":"a1.2.3","version_type":"alpha","date":"2010-11-23T22:00:00Z","major":false},{"version":"a1.2.2b","version_type":"alpha","date":"2010-11-09T22:00:01Z","major":false},{"version":"a1.2.2a","version_type":"alpha","date":"2010-11-09T22:00:00Z","major":false},{"version":"a1.2.1_01","version_type":"alpha","date":"2010-11-04T22:00:01Z","major":false},{"version":"a1.2.1","version_type":"alpha","date":"2010-11-04T22:00:00Z","major":false},{"version":"a1.2.0_02","version_type":"alpha","date":"2010-11-03T22:00:00Z","major":false},{"version":"a1.2.0_01","version_type":"alpha","date":"2010-10-30T22:00:00Z","major":false},{"version":"a1.2.0","version_type":"alpha","date":"2010-10-29T22:00:00Z","major":false},{"version":"a1.1.2_01","version_type":"alpha","date":"2010-09-22T22:00:00Z","major":false},{"version":"a1.1.2","version_type":"alpha","date":"2010-09-19T22:00:00Z","major":false},{"version":"a1.1.0","version_type":"alpha","date":"2010-09-12T22:00:00Z","major":false},{"version":"a1.0.17_04","version_type":"alpha","date":"2010-08-22T22:00:00Z","major":false},{"version":"a1.0.17_02","version_type":"alpha","date":"2010-08-19T22:00:00Z","major":false},{"version":"a1.0.16","version_type":"alpha","date":"2010-08-11T22:00:00Z","major":false},{"version":"a1.0.15","version_type":"alpha","date":"2010-08-03T22:00:00Z","major":false},{"version":"a1.0.14","version_type":"alpha","date":"2010-07-29T22:00:00Z","major":false},{"version":"a1.0.11","version_type":"alpha","date":"2010-07-22T22:00:00Z","major":false},{"version":"a1.0.5_01","version_type":"alpha","date":"2010-07-12T22:00:00Z","major":false},{"version":"a1.0.4","version_type":"alpha","date":"2010-07-08T22:00:00Z","major":false},{"version":"inf-20100618","version_type":"alpha","date":"2010-06-15T22:00:00Z","major":false},{"version":"c0.30_01c","version_type":"alpha","date":"2009-12-21T22:00:00Z","major":false},{"version":"c0.0.13a","version_type":"alpha","date":"2009-05-30T22:00:00Z","major":false},{"version":"c0.0.13a_03","version_type":"alpha","date":"2009-05-21T22:00:00Z","major":false},{"version":"c0.0.11a","version_type":"alpha","date":"2009-05-16T22:00:00Z","major":false},{"version":"rd-161348","version_type":"alpha","date":"2009-05-16T11:48:00Z","major":false},{"version":"rd-160052","version_type":"alpha","date":"2009-05-15T22:52:00Z","major":false},{"version":"rd-20090515","version_type":"alpha","date":"2009-05-14T22:00:00Z","major":false},{"version":"rd-132328","version_type":"alpha","date":"2009-05-13T21:28:00Z","major":false},{"version":"rd-132211","version_type":"alpha","date":"2009-05-13T20:11:00Z","major":false}] \ No newline at end of file diff --git a/theseus_gui/generated/openapi.ts b/theseus_gui/generated/openapi.ts new file mode 100644 index 000000000..81edc34f1 --- /dev/null +++ b/theseus_gui/generated/openapi.ts @@ -0,0 +1,7876 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/search": { + get: operations["searchProjects"]; + }; + "/project/{id|slug}": { + get: operations["getProject"]; + delete: operations["deleteProject"]; + patch: operations["modifyProject"]; + }; + "/projects": { + get: operations["getProjects"]; + }; + "/project": { + post: operations["createProject"]; + }; + "/project/{id|slug}/check": { + get: operations["checkProjectValidity"]; + }; + "/project/{id|slug}/gallery": { + /** Modrinth allows you to upload files of up to 5MiB to a project's gallery. */ + post: operations["addGalleryImage"]; + delete: operations["deleteGalleryImage"]; + patch: operations["modifyGalleryImage"]; + }; + "/project/{id|slug}/dependencies": { + get: operations["getDependencies"]; + }; + "/project/{id|slug}/follow": { + post: operations["followProject"]; + delete: operations["unfollowProject"]; + }; + "/project/{id|slug}/version": { + get: operations["getProjectVersions"]; + }; + "/version/{id}": { + get: operations["getVersion"]; + delete: operations["deleteVersion"]; + patch: operations["modifyVersion"]; + }; + "/version": { + /** Project files are attached. `.mrpack` and `.jar` files are accepted. */ + post: operations["createVersion"]; + }; + "/versions": { + get: operations["getVersions"]; + }; + "/version/{id}/file": { + /** Project files are attached. `.mrpack` and `.jar` files are accepted. */ + post: operations["addFilesToVersion"]; + }; + "/version_file/{hash}": { + get: operations["versionFromHash"]; + delete: operations["deleteFileFromHash"]; + }; + "/version_file/{hash}/update": { + post: operations["getLatestVersionFromHash"]; + }; + "/version_files": { + /** This is the same as [`/version_file/{hash}`](#operation/versionFromHash) except it accepts multiple hashes. */ + post: operations["versionsFromHashes"]; + }; + "/version_files/update": { + /** This is the same as [`/version_file/{hash}/update`](#operation/getLatestVersionFromHash) except it accepts multiple hashes. */ + post: operations["getLatestVersionsFromHashes"]; + }; + "/user/{id|username}": { + get: operations["getUser"]; + delete: operations["deleteUser"]; + patch: operations["modifyUser"]; + }; + "/user": { + get: operations["getUserFromAuth"]; + }; + "/users": { + get: operations["getUsers"]; + }; + "/user/{id|username}/icon": { + /** By default, Modrinth uses a user's GitHub icon. This route allows it to be changed to a custom one. The new avatar may be up to 2MiB in size. */ + patch: operations["changeUserIcon"]; + }; + "/user/{id|username}/projects": { + get: operations["getUserProjects"]; + }; + "/user/{id|username}/notifications": { + /** Notifications can be project updates or team invites */ + get: operations["getNotifications"]; + }; + "/user/{id|username}/follows": { + get: operations["getFollowedProjects"]; + }; + "/report": { + get: operations["getReports"]; + /** Bring a project, user, or version to the attention of the moderators by reporting it. You must be logged in to report anything. */ + post: operations["submitReport"]; + }; + "/project/{id|slug}/members": { + get: operations["getProjectTeamMembers"]; + }; + "/team/{id}/members": { + get: operations["getTeamMembers"]; + post: operations["addTeamMember"]; + }; + "/team/{id}/join": { + post: operations["joinTeam"]; + }; + "/team/{team_id}/members/{user_id}": { + delete: operations["deleteTeamMember"]; + patch: operations["modifyTeamMember"]; + }; + "/team/{id}/owner": { + post: operations["transferTeamOwnership"]; + }; + "/tag/category": { + /** Gets an array of categories, their icons, and applicable project types */ + get: operations["categoryList"]; + }; + "/tag/loader": { + /** Gets an array of loaders, their icons, and supported project types */ + get: operations["loaderList"]; + }; + "/tag/game_version": { + /** Gets an array of game versions and information about them */ + get: operations["versionList"]; + }; + "/tag/license": { + /** Gets an array of licenses and information about them */ + get: operations["licenseList"]; + }; + "/tag/donation_platform": { + /** Gets an array of donation platforms and information about them */ + get: operations["donationPlatformList"]; + }; + "/tag/report_type": { + /** Gets an array of valid report types */ + get: operations["reportTypeList"]; + }; + "/moderation/projects": { + get: operations["getModerationProjects"]; + }; +} + +export interface components { + schemas: { + BaseVersion: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: "required" | "optional" | "incompatible" | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + }; + EditableVersion: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: "required" | "optional" | "incompatible" | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & { + /** + * @description The hash format and the hash of the new primary file + * @example [ + * "sha1", + * "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj" + * ] + */ + primary_file?: string[]; + }; + CreatableVersion: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: "required" | "optional" | "incompatible" | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + file_parts: string[]; + /** @description The multipart field name of the primary file */ + primary_file?: string; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + Version: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: "required" | "optional" | "incompatible" | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + BaseProject: { + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + }; + ServerRenderedProject: { + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }; + ProjectResult: ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & { + /** + * @description The ID of the project + * @example AABBCCDD + */ + project_id: string; + /** + * @description The username of the project's author + * @example my_user + */ + author: string; + /** + * @description A list of the minecraft versions supported by the project + * @example [ + * "1.8", + * "1.8.9" + * ] + */ + versions: string[]; + /** @description The total number of users following the project */ + follows: number; + /** + * Format: date-time + * @description The date the project was created + */ + date_created: string; + /** + * Format: date-time + * @description The date the project was last modified + */ + date_modified: string; + /** + * @description The latest version of minecraft that this project supports + * @example 1.8.9 + */ + latest_version?: string; + /** + * @description The license of the project + * @example mit + */ + license: string; + /** + * @description All gallery images attached to the project + * @example [ + * "https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png", + * "https://cdn.modrinth.com/data/AABBCCDD/images/c21776867afb6046fdc3c21dbcf5cc50ae27a236.png" + * ] + */ + gallery?: string[]; + }; + NonSearchProject: { + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }; + ModifiableProject: ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & { + /** + * @description The license ID of a project, retrieved from the license tag route + * @example lgpl-3 + */ + license_id?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + license_url?: string | null; + }; + EditableProject: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & { + /** + * @description The license ID of a project, retrieved from the license tag route + * @example lgpl-3 + */ + license_id?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + license_url?: string | null; + }) & { + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status?: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The title of the moderators' message for the project */ + moderation_message?: string | null; + /** @description The body of the moderators' message for the project */ + moderation_message_body?: string | null; + }; + CreatableProject: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & { + /** + * @description The license ID of a project, retrieved from the license tag route + * @example lgpl-3 + */ + license_id?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + license_url?: string | null; + }) & + ({ + /** + * @example modpack + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description A list of initial versions to upload with the created project (required unless `is_draft` is true) */ + initial_versions?: ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & { + /** + * @description The hash format and the hash of the new primary file + * @example [ + * "sha1", + * "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj" + * ] + */ + primary_file?: string[]; + })[]; + /** + * @description Whether the project should be saved as a draft instead of being sent to moderation for review + * @example true + */ + is_draft?: boolean; + gallery_items?: ({ + /** @description The name of the multipart item where the gallery media is located */ + item?: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured?: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + } | null)[]; + } & { + slug: unknown; + title: unknown; + description: unknown; + body: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + license_id: unknown; + }); + Project: ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }); + ProjectDependencyList: { + /** @description Projects that the project depends upon */ + projects?: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + /** @description Versions that the project depends upon */ + versions?: ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }))[]; + }; + SearchResults: { + /** @description The list of results */ + hits: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & { + /** + * @description The ID of the project + * @example AABBCCDD + */ + project_id: string; + /** + * @description The username of the project's author + * @example my_user + */ + author: string; + /** + * @description A list of the minecraft versions supported by the project + * @example [ + * "1.8", + * "1.8.9" + * ] + */ + versions: string[]; + /** @description The total number of users following the project */ + follows: number; + /** + * Format: date-time + * @description The date the project was created + */ + date_created: string; + /** + * Format: date-time + * @description The date the project was last modified + */ + date_modified: string; + /** + * @description The latest version of minecraft that this project supports + * @example 1.8.9 + */ + latest_version?: string; + /** + * @description The license of the project + * @example mit + */ + license: string; + /** + * @description All gallery images attached to the project + * @example [ + * "https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png", + * "https://cdn.modrinth.com/data/AABBCCDD/images/c21776867afb6046fdc3c21dbcf5cc50ae27a236.png" + * ] + */ + gallery?: string[]; + })[]; + /** + * @description The number of results that were skipped by the query + * @example 0 + */ + offset: number; + /** + * @description The number of results that were returned by the query + * @example 10 + */ + limit: number; + /** + * @description The total number of results that match the query + * @example 10 + */ + total_hits: number; + }; + EditableUser: { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + }; + User: { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + Notification: { + /** + * @description The id of the notification + * @example UUVVWWXX + */ + id: string; + /** + * @description The id of the user who received the notification + * @example EEFFGGHH + */ + user_id: string; + /** + * @description The type of notification + * @example project_update + * @enum {string} + */ + type?: "project_update" | "team_invite"; + /** + * @description The title of the notification + * @example **My Project** has been updated! + */ + title: string; + /** + * @description The body text of the notification + * @example The project, My Project, has released a new version: 1.0.0 + */ + text: string; + /** + * @description A link to the related project or version + * @example mod/AABBCCDD/version/IIJJKKLL + */ + link: string; + /** + * @description Whether the notification has been read or not + * @example false + */ + read: boolean; + /** + * Format: date-time + * @description The time at which the notification was created + */ + created: string; + /** @description A list of actions that can be performed */ + actions: ({ [key: string]: unknown } | null)[]; + }; + CreatableReport: { + /** + * @description The type of the report being sent + * @example copyright + */ + report_type: string; + /** + * @description The ID of the item (project, version, or user) being reported + * @example EEFFGGHH + */ + item_id: string; + /** + * @description The type of the item being reported + * @example project + * @enum {string} + */ + item_type: "project" | "user" | "version"; + /** + * @description The extended explanation of the report + * @example This is a reupload of my mod, AABBCCDD! + */ + body: string; + }; + Report: { + /** + * @description The type of the report being sent + * @example copyright + */ + report_type: string; + /** + * @description The ID of the item (project, version, or user) being reported + * @example EEFFGGHH + */ + item_id: string; + /** + * @description The type of the item being reported + * @example project + * @enum {string} + */ + item_type: "project" | "user" | "version"; + /** + * @description The extended explanation of the report + * @example This is a reupload of my mod, AABBCCDD! + */ + body: string; + } & { + /** + * @description The ID of the user who reported the item + * @example UUVVWWXX + */ + reporter: string; + /** + * Format: date-time + * @description The time at which the report was created + */ + created: string; + }; + TeamMember: { + /** + * @description The ID of the team this team member is a member of + * @example MMNNOOPP + */ + team_id: string; + user: { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + /** + * @description The user's role on the team + * @example Member + */ + role: string; + /** + * Format: bitflag + * @description The user's permissions in bitflag format (requires authorization to view) + * + * In order from first to eighth bit, the bits are: + * - UPLOAD_VERSION + * - DELETE_VERSION + * - EDIT_DETAILS + * - EDIT_BODY + * - MANAGE_INVITES + * - REMOVE_MEMBER + * - EDIT_MEMBER + * - DELETE_PROJECT + * + * @example 127 + */ + permissions?: number; + /** + * @description Whether or not the user has accepted to be on the team (requires authorization to view) + * @example true + */ + accepted: boolean; + }; + CategoryTag: { + /** + * @description The SVG icon of a category + * @example + */ + icon: string; + /** + * @description The name of the category + * @example adventure + */ + name: string; + /** + * @description The project type this category is applicable to + * @example mod + */ + project_type: string; + }; + LoaderTag: { + /** + * @description The SVG icon of a loader + * @example + */ + icon: string; + /** + * @description The name of the loader + * @example fabric + */ + name: string; + /** + * @description The project types that this loader is applicable to + * @example [ + * "mod", + * "modpack" + * ] + */ + supported_project_types: string[]; + }; + GameVersionTag: { + /** + * @description The name/number of the game version + * @example 1.18.1 + */ + version: string; + /** + * @description The type of the game version + * @example release + * @enum {string} + */ + version_type: "release" | "snapshot" | "alpha" | "beta"; + /** + * Format: date-time + * @description The date of the game version release + */ + date: string; + /** + * @description Whether or not this is a major version, used for Featured Versions + * @example true + */ + major: boolean; + }; + LicenseTag: { + /** + * @description The short identifier of the license + * @example lgpl-3 + */ + short: string; + /** + * @description The full name of the license + * @example GNU Lesser General Public License v3 + */ + name: string; + }; + DonationPlatformTag: { + /** + * @description The short identifier of the donation platform + * @example bmac + */ + short: string; + /** + * @description The full name of the donation platform + * @example Buy Me a Coffee + */ + name: string; + }; + InvalidInputError: { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + AuthError: { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + parameters: { + /** @description The ID or slug of the project */ + ProjectIdentifier: string; + /** @description The ID or username of the user */ + UserIdentifier: string; + /** @description The ID of the version */ + VersionIdentifier: string; + /** @description The ID of the team */ + TeamIdentifier: string; + /** @description The algorithm of the hash */ + AlgorithmIdentifier: "sha1" | "sha512"; + /** @description The hash of the file, considering its byte content, and encoded in hexadecimal */ + FileHashIdentifier: string; + }; +} + +export interface operations { + searchProjects: { + parameters: { + query: { + /** The query to search for */ + query?: string; + /** The recommended way of filtering search results. [Learn more about using facets.](/docs/tutorials/api_search) */ + facets?: string[][]; + /** The sorting method used for sorting search results */ + index?: "relevance" | "downloads" | "follows" | "newest" | "updated"; + /** The offset into the search. Skips this number of results */ + offset?: number; + /** The number of results returned by the search */ + limit?: number; + /** A list of filters relating to the properties of a project. Use filters when there isn't an available facet for your needs. [More information](https://docs.meilisearch.com/reference/features/filtering.html) */ + filters?: string; + /** @deprecated A list of filters relating to the versions of a project. Use of facets for filtering by version is recommended */ + version?: string; + }; + }; + responses: { + /** Search results */ + 200: { + content: { + "application/json": { + /** @description The list of results */ + hits: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & { + /** + * @description The ID of the project + * @example AABBCCDD + */ + project_id: string; + /** + * @description The username of the project's author + * @example my_user + */ + author: string; + /** + * @description A list of the minecraft versions supported by the project + * @example [ + * "1.8", + * "1.8.9" + * ] + */ + versions: string[]; + /** @description The total number of users following the project */ + follows: number; + /** + * Format: date-time + * @description The date the project was created + */ + date_created: string; + /** + * Format: date-time + * @description The date the project was last modified + */ + date_modified: string; + /** + * @description The latest version of minecraft that this project supports + * @example 1.8.9 + */ + latest_version?: string; + /** + * @description The license of the project + * @example mit + */ + license: string; + /** + * @description All gallery images attached to the project + * @example [ + * "https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png", + * "https://cdn.modrinth.com/data/AABBCCDD/images/c21776867afb6046fdc3c21dbcf5cc50ae27a236.png" + * ] + */ + gallery?: string[]; + })[]; + /** + * @description The number of results that were skipped by the query + * @example 0 + */ + offset: number; + /** + * @description The number of results that were returned by the query + * @example 10 + */ + limit: number; + /** + * @description The total number of results that match the query + * @example 10 + */ + total_hits: number; + }; + }; + }; + /** Invalid request */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + }; + }; + getProject: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }); + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + }; + deleteProject: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Project deleted successfully */ + 204: never; + /** The requested project was not found */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No valid authorization to delete this project */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + }; + modifyProject: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Project modified successfully */ + 204: never; + /** No authorization to edit this project */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + /** Modified project fields */ + requestBody: { + content: { + "application/json": (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & { + /** + * @description The license ID of a project, retrieved from the license tag route + * @example lgpl-3 + */ + license_id?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + license_url?: string | null; + }) & { + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status?: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The title of the moderators' message for the project */ + moderation_message?: string | null; + /** @description The body of the moderators' message for the project */ + moderation_message_body?: string | null; + }; + }; + }; + }; + getProjects: { + parameters: { + query: { + /** The IDs of the projects */ + ids: string[]; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + }; + }; + }; + }; + createProject: { + responses: { + /** Project successfully created */ + 200: { + content: { + "application/json": ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }); + }; + }; + /** Invalid request */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to create a project */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + /** New project */ + requestBody: { + content: { + "multipart/form-data": { + data: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & { + /** + * @description The license ID of a project, retrieved from the license tag route + * @example lgpl-3 + */ + license_id?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + license_url?: string | null; + }) & + ({ + /** + * @example modpack + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description A list of initial versions to upload with the created project (required unless `is_draft` is true) */ + initial_versions?: ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & { + /** + * @description The hash format and the hash of the new primary file + * @example [ + * "sha1", + * "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj" + * ] + */ + primary_file?: string[]; + })[]; + /** + * @description Whether the project should be saved as a draft instead of being sent to moderation for review + * @example true + */ + is_draft?: boolean; + gallery_items?: ({ + /** @description The name of the multipart item where the gallery media is located */ + item?: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured?: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + } | null)[]; + } & { + slug: unknown; + title: unknown; + description: unknown; + body: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + license_id: unknown; + }); + /** + * Format: binary + * @description Project icon file + * @enum {string} + */ + icon?: + | "*.png" + | "*.jpg" + | "*.jpeg" + | "*.bmp" + | "*.gif" + | "*.webp" + | "*.svg" + | "*.svgz" + | "*.rgb"; + }; + }; + }; + }; + checkProjectValidity: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** @example AABBCCDD */ + id?: string; + }; + }; + }; + /** The requested project was not found */ + 404: unknown; + }; + }; + /** Modrinth allows you to upload files of up to 5MiB to a project's gallery. */ + addGalleryImage: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + query: { + /** Image extension */ + ext: + | "png" + | "jpg" + | "jpeg" + | "bmp" + | "gif" + | "webp" + | "svg" + | "svgz" + | "rgb"; + /** Whether an image is featured */ + featured: boolean; + /** Title of the image */ + title?: string; + /** Description of the image */ + description?: string; + }; + }; + responses: { + /** Gallery image successfully created */ + 204: never; + /** Invalid request */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to create a gallery image */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + /** New gallery image */ + requestBody: { + content: { + "image/*": string; + }; + }; + }; + deleteGalleryImage: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + query: { + /** URL link of the image to delete */ + url: string; + }; + }; + responses: { + /** Gallery image deleted successfully */ + 204: never; + /** Invalid URL or project specified */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to delete this gallery image */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + }; + modifyGalleryImage: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + query: { + /** URL link of the image to modify */ + url: string; + /** Whether the image is featured */ + featured: boolean; + /** New title of the image */ + title?: string; + /** New description of the image */ + description?: string; + }; + }; + responses: { + /** Gallery image modified successfully */ + 204: never; + /** No authorization to edit this gallery image */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + }; + getDependencies: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** @description Projects that the project depends upon */ + projects?: (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + /** @description Versions that the project depends upon */ + versions?: ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }))[]; + }; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + }; + followProject: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 204: never; + /** You are already following the specified project or the requested project was not found */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to follow a project */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + }; + unfollowProject: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 204: never; + /** You are not following the specified project or the requested project was not found */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to unfollow a project */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + }; + getProjectVersions: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + query: { + /** The types of loaders to filter for */ + loaders?: string[]; + /** The game versions to filter for */ + game_versions?: string[]; + /** Allows to filter for featured or non-featured versions only */ + featured?: boolean; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }))[]; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + }; + getVersion: { + parameters: { + path: { + /** The ID of the version */ + id: string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + /** The requested version was not found or no authorization to see this version */ + 404: unknown; + }; + }; + deleteVersion: { + parameters: { + path: { + /** The ID of the version */ + id: string; + }; + }; + responses: { + /** Version deleted successfully */ + 204: never; + /** No authorization to delete this version */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested version was not found or no authorization to see this version */ + 404: unknown; + }; + }; + modifyVersion: { + parameters: { + path: { + /** The ID of the version */ + id: string; + }; + }; + responses: { + /** Version modified successfully */ + 204: never; + /** No authorization to edit this version */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested version was not found or no authorization to see this version */ + 404: unknown; + }; + /** Modified version fields */ + requestBody: { + content: { + "application/json": { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & { + /** + * @description The hash format and the hash of the new primary file + * @example [ + * "sha1", + * "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj" + * ] + */ + primary_file?: string[]; + }; + }; + }; + }; + /** Project files are attached. `.mrpack` and `.jar` files are accepted. */ + createVersion: { + responses: { + /** Version successfully created */ + 200: { + content: { + "application/json": { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + /** Invalid request */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to create this version */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + /** New version */ + requestBody: { + content: { + "multipart/form-data": { + data: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + file_parts: string[]; + /** @description The multipart field name of the primary file */ + primary_file?: string; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + }; + }; + getVersions: { + parameters: { + query: { + /** The IDs of the versions */ + ids: string[]; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": ({ + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }))[]; + }; + }; + }; + }; + /** Project files are attached. `.mrpack` and `.jar` files are accepted. */ + addFilesToVersion: { + parameters: { + path: { + /** The ID of the version */ + id: string; + }; + }; + responses: { + /** Version modified successfully */ + 204: never; + /** No authorization to modify this version */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested version was not found or no authorization to see this version */ + 404: unknown; + }; + /** New version files */ + requestBody: { + content: { + "multipart/form-data": { + /** @enum {object} */ + data?: {}; + }; + }; + }; + }; + versionFromHash: { + parameters: { + path: { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + }; + query: { + /** The algorithm of the hash */ + algorithm: "sha1" | "sha512"; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + /** The requested version file was not found or no authorization to see this version */ + 404: unknown; + }; + }; + deleteFileFromHash: { + parameters: { + path: { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + }; + query: { + /** The algorithm of the hash */ + algorithm: "sha1" | "sha512"; + }; + }; + responses: { + /** Expected response to a valid request */ + 204: never; + /** No authorization to delete this version */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested version was not found */ + 404: unknown; + }; + }; + getLatestVersionFromHash: { + parameters: { + path: { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + }; + query: { + /** The algorithm of the hash */ + algorithm: "sha1" | "sha512"; + }; + }; + responses: { + /** Latest version retrieved successfully */ + 200: { + content: { + "application/json": { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + /** Input is invalid */ + 400: unknown; + /** The requested version was not found or no authorization to see this version */ + 404: unknown; + }; + /** Parameters of the updated version requested */ + requestBody: { + content: { + "application/json": { + loaders: string[]; + /** + * @example [ + * "1.18", + * "1.18.1" + * ] + */ + game_versions: string[]; + }; + }; + }; + }; + /** This is the same as [`/version_file/{hash}`](#operation/versionFromHash) except it accepts multiple hashes. */ + versionsFromHashes: { + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + your_hash_here?: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + }; + /** Input is invalid */ + 400: unknown; + }; + /** Hashes and algorithm of the versions requested */ + requestBody: { + content: { + "application/json": { + /** + * @example [ + * "ea0f38408102e4d2efd53c2cc11b88b711996b48d8922f76ea6abf731219c5bd1efe39ddf9cce77c54d49a62ff10fb685c00d2e4c524ab99d20f6296677ab2c4", + * "925a5c4899affa4098d997dfa4a4cb52c636d539e94bc489d1fa034218cb96819a70eb8b01647a39316a59fcfe223c1a8c05ed2e2ae5f4c1e75fa48f6af1c960" + * ] + */ + hashes: string[]; + /** + * @example sha512 + * @enum {string} + */ + algorithm: "sha1" | "sha512"; + }; + }; + }; + }; + /** This is the same as [`/version_file/{hash}/update`](#operation/getLatestVersionFromHash) except it accepts multiple hashes. */ + getLatestVersionsFromHashes: { + responses: { + /** Latest versions retrieved successfully */ + 200: { + content: { + "application/json": { + your_hash_here?: { + /** + * @description The name of this version + * @example Version 1.0.0 + */ + name?: string; + /** + * @description The version number. Ideally will follow semantic versioning + * @example 1.0.0 + */ + version_number?: string; + /** + * @description The changelog for this version + * @example List of changes in this version: ... + */ + changelog?: string | null; + /** @description A list of specific versions of projects that this version depends on */ + dependencies?: ({ + /** + * @description The ID of the version that this version depends on + * @example IIJJKKLL + */ + version_id?: string | null; + /** + * @description The ID of the project that this version depends on + * @example QQRRSSTT + */ + project_id?: string | null; + /** + * @description The type of dependency that this version has + * @example required + * @enum {string} + */ + dependency_type: + | "required" + | "optional" + | "incompatible" + | "embedded"; + } | null)[]; + /** + * @description A list of versions of Minecraft that this version supports + * @example [ + * "1.16.5", + * "1.17.1" + * ] + */ + game_versions?: string[]; + /** + * @description The release channel for this version + * @example release + * @enum {string} + */ + version_type?: "release" | "beta" | "alpha"; + /** + * @description The mod loaders that this version supports + * @example [ + * "fabric", + * "forge" + * ] + */ + loaders?: string[]; + /** + * @description Whether the version is featured or not + * @example true + */ + featured?: boolean; + } & ({ + /** + * @description The ID of the version, encoded as a base62 string + * @example IIJJKKLL + */ + id: string; + /** + * @description The ID of the project this version is for + * @example AABBCCDD + */ + project_id: string; + /** + * @description The ID of the author who published this version + * @example EEFFGGHH + */ + author_id: string; + /** Format: date-time */ + date_published: string; + /** @description The number of times this version has been downloaded */ + downloads: number; + /** + * @deprecated + * @description A link to the changelog for this version + * @example null + */ + changelog_url?: string | null; + /** @description A list of files available for download for this version */ + files: { + /** @description A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ + hashes: { + /** @example 93ecf5fe02914fb53d94aa3d28c1fb562e23985f8e4d48b9038422798618761fe208a31ca9b723667a4e05de0d91a3f86bcd8d018f6a686c39550e21b198d96f */ + sha512?: string; + /** @example c84dd4b3580c02b79958a0590afd5783d80ef504 */ + sha1?: string; + }; + /** + * @description A direct link to the file + * @example https://cdn.modrinth.com/data/AABBCCDD/versions/1.0.0/my_file.jar + */ + url: string; + /** + * @description The name of the file + * @example my_file.jar + */ + filename: string; + /** @example false */ + primary: boolean; + /** + * @description The size of the file in bytes + * @example 1097270 + */ + size: number; + }[]; + } & { + name: unknown; + version_number: unknown; + game_versions: unknown; + version_type: unknown; + loaders: unknown; + featured: unknown; + }); + }; + }; + }; + /** Input is invalid */ + 400: unknown; + }; + /** Parameters of the updated version requested */ + requestBody: { + content: { + "application/json": { + /** + * @example [ + * "ea0f38408102e4d2efd53c2cc11b88b711996b48d8922f76ea6abf731219c5bd1efe39ddf9cce77c54d49a62ff10fb685c00d2e4c524ab99d20f6296677ab2c4", + * "925a5c4899affa4098d997dfa4a4cb52c636d539e94bc489d1fa034218cb96819a70eb8b01647a39316a59fcfe223c1a8c05ed2e2ae5f4c1e75fa48f6af1c960" + * ] + */ + hashes: string[]; + /** + * @example sha512 + * @enum {string} + */ + algorithm: "sha1" | "sha512"; + /** + * @example [ + * "fabric" + * ] + */ + loaders: string[]; + /** + * @example [ + * "1.18", + * "1.18.1" + * ] + */ + game_versions: string[]; + }; + }; + }; + }; + getUser: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + }; + deleteUser: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** User deleted successfully */ + 204: never; + /** No authorization to delete this user */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + }; + modifyUser: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** User modified successfully */ + 204: never; + /** No authorization to modify this user */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + /** Modified user fields */ + requestBody: { + content: { + "application/json": { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + }; + }; + }; + }; + getUserFromAuth: { + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + }; + }; + /** No authorization token given */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + }; + getUsers: { + parameters: { + query: { + /** The IDs of the users */ + ids: string[]; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": ({ + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + })[]; + }; + }; + }; + }; + /** By default, Modrinth uses a user's GitHub icon. This route allows it to be changed to a custom one. The new avatar may be up to 2MiB in size. */ + changeUserIcon: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** Avatar changed successfully */ + 204: never; + /** Invalid format for new icon */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + requestBody: { + content: { + "multipart/form-data": {}; + }; + }; + }; + getUserProjects: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + }; + /** Notifications can be project updates or team invites */ + getNotifications: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The id of the notification + * @example UUVVWWXX + */ + id: string; + /** + * @description The id of the user who received the notification + * @example EEFFGGHH + */ + user_id: string; + /** + * @description The type of notification + * @example project_update + * @enum {string} + */ + type?: "project_update" | "team_invite"; + /** + * @description The title of the notification + * @example **My Project** has been updated! + */ + title: string; + /** + * @description The body text of the notification + * @example The project, My Project, has released a new version: 1.0.0 + */ + text: string; + /** + * @description A link to the related project or version + * @example mod/AABBCCDD/version/IIJJKKLL + */ + link: string; + /** + * @description Whether the notification has been read or not + * @example false + */ + read: boolean; + /** + * Format: date-time + * @description The time at which the notification was created + */ + created: string; + /** @description A list of actions that can be performed */ + actions: ({ [key: string]: unknown } | null)[]; + }[]; + }; + }; + /** No authorization to get this user's notifications */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + }; + getFollowedProjects: { + parameters: { + path: { + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + }; + }; + /** No authorization to get this user's followed projects */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested user was not found */ + 404: unknown; + }; + }; + getReports: { + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": ({ + /** + * @description The type of the report being sent + * @example copyright + */ + report_type: string; + /** + * @description The ID of the item (project, version, or user) being reported + * @example EEFFGGHH + */ + item_id: string; + /** + * @description The type of the item being reported + * @example project + * @enum {string} + */ + item_type: "project" | "user" | "version"; + /** + * @description The extended explanation of the report + * @example This is a reupload of my mod, AABBCCDD! + */ + body: string; + } & { + /** + * @description The ID of the user who reported the item + * @example UUVVWWXX + */ + reporter: string; + /** + * Format: date-time + * @description The time at which the report was created + */ + created: string; + })[]; + }; + }; + }; + }; + /** Bring a project, user, or version to the attention of the moderators by reporting it. You must be logged in to report anything. */ + submitReport: { + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The type of the report being sent + * @example copyright + */ + report_type: string; + /** + * @description The ID of the item (project, version, or user) being reported + * @example EEFFGGHH + */ + item_id: string; + /** + * @description The type of the item being reported + * @example project + * @enum {string} + */ + item_type: "project" | "user" | "version"; + /** + * @description The extended explanation of the report + * @example This is a reupload of my mod, AABBCCDD! + */ + body: string; + } & { + /** + * @description The ID of the user who reported the item + * @example UUVVWWXX + */ + reporter: string; + /** + * Format: date-time + * @description The time at which the report was created + */ + created: string; + }; + }; + }; + /** Invalid request */ + 400: { + content: { + "application/json": { + /** + * @description The name of the error + * @example invalid_input + */ + error: string; + /** + * @description The contents of the error + * @example Error while parsing multipart payload + */ + description: string; + }; + }; + }; + /** No authorization to submit a report */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + }; + /** The report to be sent */ + requestBody: { + content: { + "application/json": { + /** + * @description The type of the report being sent + * @example copyright + */ + report_type: string; + /** + * @description The ID of the item (project, version, or user) being reported + * @example EEFFGGHH + */ + item_id: string; + /** + * @description The type of the item being reported + * @example project + * @enum {string} + */ + item_type: "project" | "user" | "version"; + /** + * @description The extended explanation of the report + * @example This is a reupload of my mod, AABBCCDD! + */ + body: string; + }; + }; + }; + }; + getProjectTeamMembers: { + parameters: { + path: { + /** The ID or slug of the project */ + "id|slug": string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The ID of the team this team member is a member of + * @example MMNNOOPP + */ + team_id: string; + user: { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + /** + * @description The user's role on the team + * @example Member + */ + role: string; + /** + * Format: bitflag + * @description The user's permissions in bitflag format (requires authorization to view) + * + * In order from first to eighth bit, the bits are: + * - UPLOAD_VERSION + * - DELETE_VERSION + * - EDIT_DETAILS + * - EDIT_BODY + * - MANAGE_INVITES + * - REMOVE_MEMBER + * - EDIT_MEMBER + * - DELETE_PROJECT + * + * @example 127 + */ + permissions?: number; + /** + * @description Whether or not the user has accepted to be on the team (requires authorization to view) + * @example true + */ + accepted: boolean; + }[]; + }; + }; + /** The requested project was not found or no authorization to see this project */ + 404: unknown; + }; + }; + getTeamMembers: { + parameters: { + path: { + /** The ID of the team */ + id: string; + }; + }; + responses: { + /** Expected response to a valid request */ + 200: { + content: { + "application/json": { + /** + * @description The ID of the team this team member is a member of + * @example MMNNOOPP + */ + team_id: string; + user: { + /** + * @description The user's username + * @example my_user + */ + username: string; + /** + * @description The user's display name + * @example My User + */ + name?: string | null; + /** + * Format: email + * @description The user's email (only your own is ever displayed) + */ + email?: string | null; + /** + * @description A description of the user + * @example My short biography + */ + bio?: string; + } & { + /** + * @description The user's id + * @example EEFFGGHH + */ + id: string; + /** + * @description The user's github id + * @example 11223344 + */ + github_id: number; + /** + * @description The user's avatar url + * @example https://avatars.githubusercontent.com/u/11223344?v=1 + */ + avatar_url: string; + /** + * Format: date-time + * @description The time at which the user was created + */ + created: string; + /** + * @description The user's role + * @example developer + * @enum {string} + */ + role: "admin" | "moderator" | "developer"; + }; + /** + * @description The user's role on the team + * @example Member + */ + role: string; + /** + * Format: bitflag + * @description The user's permissions in bitflag format (requires authorization to view) + * + * In order from first to eighth bit, the bits are: + * - UPLOAD_VERSION + * - DELETE_VERSION + * - EDIT_DETAILS + * - EDIT_BODY + * - MANAGE_INVITES + * - REMOVE_MEMBER + * - EDIT_MEMBER + * - DELETE_PROJECT + * + * @example 127 + */ + permissions?: number; + /** + * @description Whether or not the user has accepted to be on the team (requires authorization to view) + * @example true + */ + accepted: boolean; + }[]; + }; + }; + }; + }; + addTeamMember: { + parameters: { + path: { + /** The ID of the team */ + id: string; + }; + }; + responses: { + /** User has been successfully invited to the team */ + 204: never; + /** No authorization to modify this team */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested team was not found */ + 404: unknown; + }; + /** User to be added (must be the ID, usernames cannot be used here) */ + requestBody: { + content: { + "application/json": { + /** @example EEFFGGHH */ + user_id: string; + }; + }; + }; + }; + joinTeam: { + parameters: { + path: { + /** The ID of the team */ + id: string; + }; + }; + responses: { + /** Team has successfully been joined */ + 204: never; + /** No authorization to join this team */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested team was not found */ + 404: unknown; + }; + }; + deleteTeamMember: { + parameters: { + path: { + /** The ID of the team */ + id: string; + /** The ID or username of the user */ + "id|username": string; + }; + }; + responses: { + /** User has been removed from the team successfully */ + 204: never; + /** No authorization to remove this member from the team */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested team was not found */ + 404: unknown; + }; + }; + modifyTeamMember: { + parameters: { + path: { + /** The ID of the team */ + id: string; + /** The ID of the user to modify */ + user_id: string; + }; + }; + responses: { + /** Roles/permissions have been updated successfully */ + 204: never; + /** No authorization to change this member's roles/permissions */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested team was not found */ + 404: unknown; + }; + /** Contents to be modified */ + requestBody: { + content: { + "application/json": { + /** @example Contributor */ + role?: string; + /** + * Format: bitflag + * @description The user's permissions in bitflag format + * + * In order from first to eighth bit, the bits are: + * - UPLOAD_VERSION + * - DELETE_VERSION + * - EDIT_DETAILS + * - EDIT_BODY + * - MANAGE_INVITES + * - REMOVE_MEMBER + * - EDIT_MEMBER + * - DELETE_PROJECT + * + * @example 127 + */ + permissions?: number; + }; + }; + }; + }; + transferTeamOwnership: { + parameters: { + path: { + /** The ID of the team */ + id: string; + }; + }; + responses: { + /** Ownership has successfully been transferred */ + 204: never; + /** No authorization to transfer ownership of this team */ + 401: { + content: { + "application/json": { + /** + * @description The name of the error + * @example unauthorized + */ + error: string; + /** + * @description The contents of the error + * @example Authentication Error: Invalid Authentication Credentials + */ + description: string; + }; + }; + }; + /** The requested team was not found */ + 404: unknown; + }; + /** New owner's ID */ + requestBody: { + content: { + "application/json": { + /** @example EEFFGGHH */ + user_id: string; + }; + }; + }; + }; + /** Gets an array of categories, their icons, and applicable project types */ + categoryList: { + responses: { + /** List of categories */ + 200: { + content: { + "application/json": { + /** + * @description The SVG icon of a category + * @example + */ + icon: string; + /** + * @description The name of the category + * @example adventure + */ + name: string; + /** + * @description The project type this category is applicable to + * @example mod + */ + project_type: string; + }[]; + }; + }; + }; + }; + /** Gets an array of loaders, their icons, and supported project types */ + loaderList: { + responses: { + /** List of loaders */ + 200: { + content: { + "application/json": { + /** + * @description The SVG icon of a loader + * @example + */ + icon: string; + /** + * @description The name of the loader + * @example fabric + */ + name: string; + /** + * @description The project types that this loader is applicable to + * @example [ + * "mod", + * "modpack" + * ] + */ + supported_project_types: string[]; + }[]; + }; + }; + }; + }; + /** Gets an array of game versions and information about them */ + versionList: { + responses: { + /** List of game versions */ + 200: { + content: { + "application/json": { + /** + * @description The name/number of the game version + * @example 1.18.1 + */ + version: string; + /** + * @description The type of the game version + * @example release + * @enum {string} + */ + version_type: "release" | "snapshot" | "alpha" | "beta"; + /** + * Format: date-time + * @description The date of the game version release + */ + date: string; + /** + * @description Whether or not this is a major version, used for Featured Versions + * @example true + */ + major: boolean; + }[]; + }; + }; + }; + }; + /** Gets an array of licenses and information about them */ + licenseList: { + responses: { + /** List of licenses */ + 200: { + content: { + "application/json": { + /** + * @description The short identifier of the license + * @example lgpl-3 + */ + short: string; + /** + * @description The full name of the license + * @example GNU Lesser General Public License v3 + */ + name: string; + }[]; + }; + }; + }; + }; + /** Gets an array of donation platforms and information about them */ + donationPlatformList: { + responses: { + /** List of donation platforms */ + 200: { + content: { + "application/json": { + /** + * @description The short identifier of the donation platform + * @example bmac + */ + short: string; + /** + * @description The full name of the donation platform + * @example Buy Me a Coffee + */ + name: string; + }[]; + }; + }; + }; + }; + /** Gets an array of valid report types */ + reportTypeList: { + responses: { + /** List of report types */ + 200: { + content: { + "application/json": string[]; + }; + }; + }; + }; + getModerationProjects: { + responses: { + /** List of report types */ + 200: { + content: { + "application/json": (({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description A long form description of the project + * @example A long body describing my project in detail + */ + body?: string; + /** + * @description An optional link to where to submit bugs or issues with the project + * @example https://github.com/my_user/my_project/issues + */ + issues_url?: string | null; + /** + * @description An optional link to the source code of the project + * @example https://github.com/my_user/my_project + */ + source_url?: string | null; + /** + * @description An optional link to the project's wiki page or other relevant information + * @example https://github.com/my_user/my_project/wiki + */ + wiki_url?: string | null; + /** + * @description An optional invite link to the project's discord + * @example https://discord.gg/AaBbCcDd + */ + discord_url?: string | null; + /** @description A list of donation links for the project */ + donation_urls?: ({ + /** + * @description The ID of the donation platform + * @example patreon + */ + id?: string; + /** + * @description The donation platform this link is to + * @example Patreon + */ + platform?: string; + /** + * @description The URL of the donation platform and user + * @example https://www.patreon.com/my_user + */ + url?: string; + } | null)[]; + }) & + ({ + /** + * @description The slug of a project, used for vanity URLs + * @example my_project + */ + slug?: string; + /** + * @description The title or name of the project + * @example My Project + */ + title?: string; + /** + * @description A short description of the project + * @example A short description + */ + description?: string; + /** + * @description A list of the categories that the project is in + * @example [ + * "technology", + * "adventure", + * "fabric" + * ] + */ + categories?: string[]; + /** + * @description The client side support of the project + * @example required + * @enum {string} + */ + client_side?: "required" | "optional" | "unsupported"; + /** + * @description The server side support of the project + * @example optional + * @enum {string} + */ + server_side?: "required" | "optional" | "unsupported"; + } & { + /** + * @description The project type of the project + * @example mod + * @enum {string} + */ + project_type: "mod" | "modpack"; + /** @description The total number of downloads of the project */ + downloads: number; + /** + * @description The URL of the project's icon + * @example https://cdn.modrinth.com/data/AABBCCDD/b46513nd83hb4792a9a0e1fn28fgi6090c1842639.png + */ + icon_url?: string | null; + }) & + ({ + /** + * @description The ID of the project, encoded as a base62 string + * @example AABBCCDD + */ + id: string; + /** + * @description The ID of the team that has ownership of this project + * @example MMNNOOPP + */ + team: string; + /** + * @deprecated + * @description The link to the long description of the project (only present for old projects) + * @default null + * @example null + */ + body_url?: string | null; + /** + * @description A message that a moderator sent regarding the project + * @example null + */ + moderator_message?: { + /** @description The message that a moderator has left for the project */ + message?: string; + /** @description The longer body of the message that a moderator has left for the project */ + body?: string | null; + } | null; + /** + * Format: date-time + * @description The date the project was published + */ + published: string; + /** + * Format: date-time + * @description The date the project was last updated + */ + updated: string; + /** @description The total number of users following the project */ + followers: number; + /** + * @description The status of the project + * @example approved + * @enum {string} + */ + status: + | "approved" + | "rejected" + | "draft" + | "unlisted" + | "archived" + | "processing" + | "unknown"; + /** @description The license of the project */ + license?: { + /** + * @description The license id of a project, retrieved from the licenses get route + * @example lgpl-3 + */ + id?: string; + /** + * @description The long name of a license + * @example GNU Lesser General Public License v3 + */ + name?: string; + /** + * @description The URL to this license + * @example https://cdn.modrinth.com/licenses/lgpl-3.txt + */ + url?: string | null; + }; + /** + * @description A list of the version IDs of the project (will never be empty unless `draft` status) + * @example [ + * "IIJJKKLL", + * "QQRRSSTT" + * ] + */ + versions?: string[]; + /** @description A list of images that have been uploaded to the project's gallery */ + gallery?: ({ + /** + * @description The URL of the gallery image + * @example https://cdn.modrinth.com/data/AABBCCDD/images/009b7d8d6e8bf04968a29421117c59b3efe2351a.png + */ + url: string; + /** + * @description Whether the image is featured in the gallery + * @example true + */ + featured: boolean; + /** + * @description The title of the gallery image + * @example My awesome screenshot! + */ + title?: string | null; + /** + * @description The description of the gallery image + * @example This awesome screenshot shows all of the blocks in my mod! + */ + description?: string | null; + /** + * Format: date-time + * @description The date and time the gallery image was created + */ + created: string; + } | null)[]; + } & { + title: unknown; + description: unknown; + categories: unknown; + client_side: unknown; + server_side: unknown; + slug: unknown; + body: unknown; + }))[]; + }; + }; + }; + }; +} + +export interface external {} diff --git a/theseus_gui/generated/state.json b/theseus_gui/generated/state.json new file mode 100644 index 000000000..1b299d8ad --- /dev/null +++ b/theseus_gui/generated/state.json @@ -0,0 +1,7 @@ +{ + "lastGenerated": "2022-08-01T14:34:27.819Z", + "options": { + "gameVersions": true, + "openapi": true + } +} \ No newline at end of file diff --git a/theseus_gui/package.json b/theseus_gui/package.json index fb624e8bf..d70af806c 100644 --- a/theseus_gui/package.json +++ b/theseus_gui/package.json @@ -24,6 +24,7 @@ "prettier-plugin-svelte": "^2.5.0", "svelte": "^3.46.0", "svelte-check": "^2.2.6", + "svelte-intl-precompile": "^0.11.1", "tslib": "^2.3.1", "typescript": "~4.5.4", "vite": "^3.0.0" @@ -35,9 +36,10 @@ "@iconify-json/heroicons-outline": "^1.1.1", "@iconify-json/heroicons-solid": "^1.1.1", "@iconify-json/lucide": "^1.1.5", - "@tauri-apps/api": "^1.0.0-rc.1", - "omorphia": "0.0.17", - "svrollbar": "^0.10.4", - "unplugin-icons": "^0.14.7" + "@tauri-apps/api": "^1.0.2", + "omorphia": "0.0.67", + "svrollbar": "^0.12.0", + "unplugin-icons": "^0.14.7", + "highlight.js": "11.5.1" } } diff --git a/theseus_gui/pnpm-lock.yaml b/theseus_gui/pnpm-lock.yaml index 239c4f559..a79c9788e 100644 --- a/theseus_gui/pnpm-lock.yaml +++ b/theseus_gui/pnpm-lock.yaml @@ -8,20 +8,22 @@ specifiers: '@iconify-json/lucide': ^1.1.5 '@sveltejs/adapter-static': next '@sveltejs/kit': next - '@tauri-apps/api': ^1.0.0-rc.1 + '@tauri-apps/api': ^1.0.2 '@tauri-apps/cli': ^1.0.4 '@typescript-eslint/eslint-plugin': ^5.10.1 '@typescript-eslint/parser': ^5.10.1 eslint: ^7.32.0 eslint-config-prettier: ^8.3.0 eslint-plugin-svelte3: ^3.2.1 + highlight.js: 11.5.1 kill-port-process: ^3.0.1 - omorphia: 0.0.17 + omorphia: 0.0.67 prettier: ^2.5.1 prettier-plugin-svelte: ^2.5.0 svelte: ^3.46.0 svelte-check: ^2.2.6 - svrollbar: ^0.10.4 + svelte-intl-precompile: ^0.11.1 + svrollbar: ^0.12.0 tslib: ^2.3.1 typescript: ~4.5.4 unplugin-icons: ^0.14.7 @@ -29,35 +31,45 @@ specifiers: dependencies: '@fontsource/inter': 4.5.11 - '@iconify-json/carbon': 1.1.6 + '@iconify-json/carbon': 1.1.7 '@iconify-json/heroicons-outline': 1.1.2 '@iconify-json/heroicons-solid': 1.1.2 - '@iconify-json/lucide': 1.1.36 + '@iconify-json/lucide': 1.1.38 '@tauri-apps/api': 1.0.2 - omorphia: 0.0.17_svelte@3.49.0+vite@3.0.0 - svrollbar: 0.10.5 - unplugin-icons: 0.14.7_vite@3.0.0 + omorphia: 0.0.67_svelte@3.49.0+vite@3.0.4 + svrollbar: 0.12.0 + unplugin-icons: 0.14.8_vite@3.0.4 devDependencies: - '@sveltejs/adapter-static': 1.0.0-next.37 - '@sveltejs/kit': 1.0.0-next.377_svelte@3.49.0+vite@3.0.0 - '@tauri-apps/cli': 1.0.4 - '@typescript-eslint/eslint-plugin': 5.30.6_vyqjobnklww3xdlzqlhkvlorlu - '@typescript-eslint/parser': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + '@sveltejs/adapter-static': 1.0.0-next.38 + '@sveltejs/kit': 1.0.0-next.401_svelte@3.49.0+vite@3.0.4 + '@tauri-apps/cli': 1.0.5 + '@typescript-eslint/eslint-plugin': 5.31.0_4jrpqvszkjcwtaspamifhp3x7e + '@typescript-eslint/parser': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca eslint: 7.32.0 eslint-config-prettier: 8.5.0_eslint@7.32.0 eslint-plugin-svelte3: 3.4.1_k4rvtr32uzrs6rwp57u73ssa6q - kill-port-process: 3.0.1 + highlight.js: 11.5.1 + kill-port-process: 3.1.0 prettier: 2.7.1 prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi svelte: 3.49.0 svelte-check: 2.8.0_svelte@3.49.0 + svelte-intl-precompile: 0.11.1_svelte@3.49.0 tslib: 2.4.0 typescript: 4.5.5 - vite: 3.0.0 + vite: 3.0.4 packages: + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.14 + dev: true + /@antfu/install-pkg/0.1.0: resolution: {integrity: sha512-VaIJd3d1o7irZfK1U0nvBsHMyjkuyMP3HKYVV53z8DKyulkHKmjhhtccXO51WSPeeSHIeoJEoNOKavYpS7jkZw==} dependencies: @@ -75,11 +87,146 @@ packages: '@babel/highlight': 7.18.6 dev: true + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.18.8: + resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.18.9: + resolution: {integrity: sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.18.9 + '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 + '@babel/helper-module-transforms': 7.18.9 + '@babel/helpers': 7.18.9 + '@babel/parser': 7.18.9 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.18.9: + resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.9 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.9: + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.18.8 + '@babel/core': 7.18.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.18.9: + resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.6 + '@babel/types': 7.18.9 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.9 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.9 + dev: true + + /@babel/helper-module-transforms/7.18.9: + resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.18.6 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.18.9: + resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.9 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.9 + dev: true + /@babel/helper-validator-identifier/7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.18.9: + resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -89,6 +236,56 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/parser/7.18.9: + resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.18.9 + dev: true + + /@babel/runtime/7.18.9: + resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: false + + /@babel/template/7.18.6: + resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.18.9 + '@babel/types': 7.18.9 + dev: true + + /@babel/traverse/7.18.9: + resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.18.9 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.18.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.18.9 + '@babel/types': 7.18.9 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.18.9: + resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.18.6 + to-fast-properties: 2.0.0 + dev: true + /@csstools/postcss-cascade-layers/1.0.5_postcss@8.4.14: resolution: {integrity: sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==} engines: {node: ^12 || ^14 || >=16} @@ -231,7 +428,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 7.3.1 - globals: 13.16.0 + globals: 13.17.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -245,6 +442,34 @@ packages: resolution: {integrity: sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==} dev: false + /@formatjs/ecma402-abstract/1.11.8: + resolution: {integrity: sha512-fgLqyWlwmTEuqV/TSLEL/t9JOmHNLFvCdgzXB0jc2w+WOItPCOJ1T0eyN6fQBQKRPfSqqNlu+kWj7ijcOVTVVQ==} + dependencies: + '@formatjs/intl-localematcher': 0.2.28 + tslib: 2.4.0 + dev: true + + /@formatjs/icu-messageformat-parser/2.1.4: + resolution: {integrity: sha512-3PqMvKWV1oyok0BuiXUAHIaotdhdTJw6OICqCZbfUgKT+ZRwRWO4IlCgvXJeCITaKS5p+PY0XXKjf/vUyIpWjQ==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.8 + '@formatjs/icu-skeleton-parser': 1.3.10 + tslib: 2.4.0 + dev: true + + /@formatjs/icu-skeleton-parser/1.3.10: + resolution: {integrity: sha512-kXJmtLDqFF5aLTf8IxdJXnhrIX1Qb4Qp3a9jqRecGDYfzOa9hMhi9U0nKyhrJJ4cXxBzptcgb+LWkyeHL6nlBQ==} + dependencies: + '@formatjs/ecma402-abstract': 1.11.8 + tslib: 2.4.0 + dev: true + + /@formatjs/intl-localematcher/0.2.28: + resolution: {integrity: sha512-FLsc6Gifs1np/8HnCn/7Q+lHMmenrD5fuDhRT82yj0gi9O19kfaFwjQUw1gZsyILuRyT93GuzdifHj7TKRhBcw==} + dependencies: + tslib: 2.4.0 + dev: true + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -260,8 +485,14 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@iconify-json/carbon/1.1.6: - resolution: {integrity: sha512-3a/D7qzqBO6hsDmp6/k2eFfJzL1sw1yCQOq2yr86el2CzgMmQdKYROOyCCDNBxGn+dkkc/Rx1/8OEciakAJcFg==} + /@iconify-json/carbon/1.1.7: + resolution: {integrity: sha512-QULSpNWKaX4auIbjITDynfALdJYvOOy/xZb+aLOqCgvpBcmbz5tbqvow4r25FWtVsi4FHVpNQ8vyJZXsD1Hlxg==} + dependencies: + '@iconify/types': 1.1.0 + dev: false + + /@iconify-json/fa-regular/1.1.2: + resolution: {integrity: sha512-sC6bRUcdLru0hDOTIosTgElBEMCnpvJkwGmGz/9TCrmb3ALoXjhu/ZzzXpBdQnnwtmqASPLdSpeWxcfwgHquCQ==} dependencies: '@iconify/types': 1.1.0 dev: false @@ -278,8 +509,14 @@ packages: '@iconify/types': 1.1.0 dev: false - /@iconify-json/lucide/1.1.36: - resolution: {integrity: sha512-b2CKgI50Am4Bh2VWJFQepz6yKXpBHA4GXCV/Cgzn6WX3UGEe1E6ETaY5EzxwE9KrRy96J3CamjDOyf+vduvDQg==} + /@iconify-json/lucide/1.1.38: + resolution: {integrity: sha512-0sDKnWign8yc3ndWczI4QliSMUi/AUngwlufprDJlR7feXILzpEfp5yyYlfPRE7gQrup6ey8dMX1vDaT8bet/g==} + dependencies: + '@iconify/types': 1.1.0 + dev: false + + /@iconify-json/simple-icons/1.1.20: + resolution: {integrity: sha512-IP5yZAoRU82fR5szwbBLnECWgY4JuZDgqEEXzioaOFygqZRP8Ku9ONgPK/qe2vwsUB6RWM5jTm0S4KHtMiTOEQ==} dependencies: '@iconify/types': 1.1.0 dev: false @@ -301,11 +538,408 @@ packages: - supports-color dev: false + /@jimp/bmp/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + bmp-js: 0.1.0 + dev: false + + /@jimp/core/0.16.1: + resolution: {integrity: sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/utils': 0.16.1 + any-base: 1.1.0 + buffer: 5.7.1 + exif-parser: 0.1.12 + file-type: 9.0.0 + load-bmfont: 1.4.1 + mkdirp: 0.5.6 + phin: 2.9.3 + pixelmatch: 4.0.2 + tinycolor2: 1.4.2 + dev: false + + /@jimp/custom/0.16.1: + resolution: {integrity: sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/core': 0.16.1 + dev: false + + /@jimp/gif/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + gifwrap: 0.9.4 + omggif: 1.0.10 + dev: false + + /@jimp/jpeg/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + jpeg-js: 0.4.2 + dev: false + + /@jimp/plugin-blit/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-blur/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-circle/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-color/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + tinycolor2: 1.4.2 + dev: false + + /@jimp/plugin-contain/0.16.1_hdurtz6n4amigqqh6fpopmgoni: + resolution: {integrity: sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-cover/0.16.1_huj753jw6x6ymgmn4r5xrmstcq: + resolution: {integrity: sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-crop/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-displace/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-dither/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-fisheye/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-flip/0.16.1_ebpr3hwfcslp7e7vflcwddbwma: + resolution: {integrity: sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-rotate': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-rotate': 0.16.1_g72lzg55x5a4ao4td3uebcztme + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-gaussian/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-invert/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-mask/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-normalize/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-print/0.16.1_kgi3mefd5odb2o5kccttl2e6zq: + resolution: {integrity: sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + load-bmfont: 1.4.1 + dev: false + + /@jimp/plugin-resize/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-rotate/0.16.1_g72lzg55x5a4ao4td3uebcztme: + resolution: {integrity: sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-scale/0.16.1_yobdog5u6yhkf7jbdico3cvr4i: + resolution: {integrity: sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-shadow/0.16.1_qjkavnenl6bwqbeu6ngq3leqp4: + resolution: {integrity: sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blur': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-threshold/0.16.1_5qgih43agfe2q6apq4cf7aqzei: + resolution: {integrity: sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color': '>=0.8.0' + '@jimp/plugin-resize': '>=0.8.0' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-color': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugins/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-blur': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-circle': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-color': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-contain': 0.16.1_hdurtz6n4amigqqh6fpopmgoni + '@jimp/plugin-cover': 0.16.1_huj753jw6x6ymgmn4r5xrmstcq + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-displace': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-dither': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-fisheye': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-flip': 0.16.1_ebpr3hwfcslp7e7vflcwddbwma + '@jimp/plugin-gaussian': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-invert': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-mask': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-normalize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-print': 0.16.1_kgi3mefd5odb2o5kccttl2e6zq + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-rotate': 0.16.1_g72lzg55x5a4ao4td3uebcztme + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/plugin-shadow': 0.16.1_qjkavnenl6bwqbeu6ngq3leqp4 + '@jimp/plugin-threshold': 0.16.1_5qgih43agfe2q6apq4cf7aqzei + timm: 1.7.1 + dev: false + + /@jimp/png/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + pngjs: 3.4.0 + dev: false + + /@jimp/tiff/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + utif: 2.0.1 + dev: false + + /@jimp/types/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/bmp': 0.16.1_@jimp+custom@0.16.1 + '@jimp/custom': 0.16.1 + '@jimp/gif': 0.16.1_@jimp+custom@0.16.1 + '@jimp/jpeg': 0.16.1_@jimp+custom@0.16.1 + '@jimp/png': 0.16.1_@jimp+custom@0.16.1 + '@jimp/tiff': 0.16.1_@jimp+custom@0.16.1 + timm: 1.7.1 + dev: false + + /@jimp/utils/0.16.1: + resolution: {integrity: sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==} + dependencies: + '@babel/runtime': 7.18.9 + regenerator-runtime: 0.13.9 + dev: false + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.14 + dev: true + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 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.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -352,31 +986,32 @@ packages: picomatch: 2.3.1 dev: true - /@sveltejs/adapter-static/1.0.0-next.37: - resolution: {integrity: sha512-BDFkx4CGAd6pG4e3+zYjy/eM9UDbhkRgXqavUzCO5oT8xXao5TeprY1AIbdzjMTmFjsWdeSXE9TbIsT0iikpyQ==} + /@sveltejs/adapter-static/1.0.0-next.38: + resolution: {integrity: sha512-O1b264K62E3OrUnsFxMjKn3CUJF50fxGcW0rWk8fa5kjzskPsSyTxS3jnWNryFaVJ3oSUtx57m4qFW43S1910Q==} dependencies: tiny-glob: 0.2.9 dev: true - /@sveltejs/kit/1.0.0-next.377_svelte@3.49.0+vite@3.0.0: - resolution: {integrity: sha512-DH2v2yUBUuDZ7vzjPXUd/yt1AMR3BIkZN0ubLAvS2C+q5Wbvk7ZvAJhfPZ3OYc3ZpQXe4ZGEcptOjvEYvd1lLA==} + /@sveltejs/kit/1.0.0-next.401_svelte@3.49.0+vite@3.0.4: + resolution: {integrity: sha512-VrpFtSSu1ADRVWWDxLl218GKf9l+TA7tNCCAmVFAuJdj5zVxPgJflu4Dh1p5C4efKP+x1v6W5nvxmNkbZLPoag==} engines: {node: '>=16.9'} hasBin: true + requiresBuild: true peerDependencies: svelte: ^3.44.0 vite: ^3.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.0 + '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.4 chokidar: 3.5.3 sade: 1.8.1 svelte: 3.49.0 - vite: 3.0.0 + vite: 3.0.4 transitivePeerDependencies: - diff-match-patch - supports-color dev: true - /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.0: + /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.4: resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -394,7 +1029,7 @@ packages: magic-string: 0.26.2 svelte: 3.49.0 svelte-hmr: 0.14.12_svelte@3.49.0 - vite: 3.0.0 + vite: 3.0.4 transitivePeerDependencies: - supports-color dev: true @@ -404,8 +1039,8 @@ packages: engines: {node: '>= 12.22.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} dev: false - /@tauri-apps/cli-darwin-arm64/1.0.4: - resolution: {integrity: sha512-hMVTPoinjKYV8fgviQ871ZnVipAVXJV3ZwfiK9FcE9/dkUCUtKtetfwnicRV6YDSFbWY9qAg+Sm0INrLT5Ky+A==} + /@tauri-apps/cli-darwin-arm64/1.0.5: + resolution: {integrity: sha512-oxpFb9ZeMiC3xPUJ9NsXWCnnwFSVkPbJUvDKpc9IaoDIUpsMTV72W4P0Nh0uQRbyhx4modPpstt7+ONypNVYNg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -413,8 +1048,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-darwin-x64/1.0.4: - resolution: {integrity: sha512-6bR8WIqJdcutLLcmv4S+bkCRbLAwjl80zPL97vs7Zgum01aeygjUTaZS46fpeDgqF8nR8piFAZkz8Bnco6fbzw==} + /@tauri-apps/cli-darwin-x64/1.0.5: + resolution: {integrity: sha512-hRNYC6L9edz2dEqK33tssPylF2ti6x6udidBlGWc5GSoeEb/05qKMEA1MESQYKBG+4q+wjJvACA2vvz6AfgJ3Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -422,8 +1057,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm-gnueabihf/1.0.4: - resolution: {integrity: sha512-NNhz8Nh/CQvAPzR5bj1sC2CgpkUOjZg8Eg1i/Ta/pbrjgT0E/reD+12TGdkNuQNEOUQ1klWcdeHfAptWPicRgQ==} + /@tauri-apps/cli-linux-arm-gnueabihf/1.0.5: + resolution: {integrity: sha512-hc/Jp3TtFpxB8XVkLEwWy7MNcUBlS8rNCafQBUt4KSElXB+/oGo50jPO+wd5GSMSOR59UCzH08v11P0b+sAa/w==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -431,8 +1066,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-gnu/1.0.4: - resolution: {integrity: sha512-chzpMgkZyu0MWF75DDiEV06XyI8LM7q0NMxRx7esJwZpypj4AG0Pj4+9Di38zYWZrfYqz/bWrCMPIV30vty1Gg==} + /@tauri-apps/cli-linux-arm64-gnu/1.0.5: + resolution: {integrity: sha512-btFlkD2PG+yzJBZzWeJmyCy8ZV+iys2Jl66Fs4g9lSi3KrBDnyfQ26RpGZb2pRfkkcVP8/x1WSfByO+Rj+PTBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -440,8 +1075,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-musl/1.0.4: - resolution: {integrity: sha512-w+wbNoIOdHoV65Q/z29EK4KtFiNXfV+2lIsML/Hw0VEJEzl9FsqGelu1zAycq8hkoQhf0yPlD/m4FfAWnFzg6Q==} + /@tauri-apps/cli-linux-arm64-musl/1.0.5: + resolution: {integrity: sha512-p5JFdWab2AWhfgAZW/mgOLu+YiIJXKV0NdATGmdiBgQCMmz1k/FM8iOFApCgGbo3/zkR58cJ7Z7hyWmQ07M6Pw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -449,8 +1084,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-gnu/1.0.4: - resolution: {integrity: sha512-TiVRk+VBYA2mE4DqwLu/WD6wTHewHVbdMUtfeXdwe/kabLqbJTWuswUv5T8JUp3mYFZKqlPhyi+qWSJOc0Ianw==} + /@tauri-apps/cli-linux-x64-gnu/1.0.5: + resolution: {integrity: sha512-fOXR635AXxwSO7MCfBhMLnGpcg1H83XGw9ocuyg4jjvtE8QoYPwC4ksfb5lLhDVMui9iIKY93NAK3EkQiSGGmQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -458,8 +1093,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-musl/1.0.4: - resolution: {integrity: sha512-TKdncZ6aFu9PfHakrrqg3XIoxgl510rN0tOTJuZ1WQT2nDD5zlP3Mo++FNIt6/TfjqayLcubIZp3dG9pU383dA==} + /@tauri-apps/cli-linux-x64-musl/1.0.5: + resolution: {integrity: sha512-8be4zJVkuMs427JqONhFx5Ia5zWsQ5tbZXd80C3dHNL+5/3VIOK6nGQ0iijyZSLXiE9JKEH2jp1EHB+1TVJRcw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -467,8 +1102,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-ia32-msvc/1.0.4: - resolution: {integrity: sha512-KedA4LB/PsePE3BLm2gg/IIA4rLjbyBUzV2FTdpWqx8ws3OzL6BLDGRVJ+zXe/b9SddhhZk7Rqss6y+gtsWKsA==} + /@tauri-apps/cli-win32-ia32-msvc/1.0.5: + resolution: {integrity: sha512-WpnIfzS1e4InGhvd1IDSKC3w6kbI5c6oJgMmtkMTBlhjhiZXhZmQF4XA784A5Y13pzsbXnbNJKOp8DuPVkoTRQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -476,8 +1111,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-x64-msvc/1.0.4: - resolution: {integrity: sha512-6m1Ie7+YeKdOY7aXZCw/Py30DeMEAukE2+WWuZgfxZTTG9QrnZO+DbaKtjuEG0A8HKHCz63+ZNxOTshS1ognEw==} + /@tauri-apps/cli-win32-x64-msvc/1.0.5: + resolution: {integrity: sha512-8iEhVD3X4LZfrlxEPOV+mAj4QrJrEqKTICiJnwmgjvhYQOOsNHzg5kca7pcBbqcgorQOBydLpfGJtxWRusVPaw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -485,20 +1120,20 @@ packages: dev: true optional: true - /@tauri-apps/cli/1.0.4: - resolution: {integrity: sha512-AqfbQUFU2jDYmkjiowl+Yv1yNkey/e+N23sKyDtXQQNvxE6ieR4voY4i6bShY97F+DbRVdjWcjGiLkWS3i4DHw==} + /@tauri-apps/cli/1.0.5: + resolution: {integrity: sha512-vbY+MwK+xN65x0R/o16UQPxBtJl8pmzVzC0TZKokZfmeOkomoqOEOinSwznAMeyR1ZMJW+fXVgJCPvGsRQ0LGg==} engines: {node: '>= 10'} hasBin: true optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.0.4 - '@tauri-apps/cli-darwin-x64': 1.0.4 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.4 - '@tauri-apps/cli-linux-arm64-gnu': 1.0.4 - '@tauri-apps/cli-linux-arm64-musl': 1.0.4 - '@tauri-apps/cli-linux-x64-gnu': 1.0.4 - '@tauri-apps/cli-linux-x64-musl': 1.0.4 - '@tauri-apps/cli-win32-ia32-msvc': 1.0.4 - '@tauri-apps/cli-win32-x64-msvc': 1.0.4 + '@tauri-apps/cli-darwin-arm64': 1.0.5 + '@tauri-apps/cli-darwin-x64': 1.0.5 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.5 + '@tauri-apps/cli-linux-arm64-gnu': 1.0.5 + '@tauri-apps/cli-linux-arm64-musl': 1.0.5 + '@tauri-apps/cli-linux-x64-gnu': 1.0.5 + '@tauri-apps/cli-linux-x64-musl': 1.0.5 + '@tauri-apps/cli-win32-ia32-msvc': 1.0.5 + '@tauri-apps/cli-win32-x64-msvc': 1.0.5 dev: true /@trysound/sax/0.2.0: @@ -510,10 +1145,18 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/18.0.5: - resolution: {integrity: sha512-En7tneq+j0qAiVwysBD79y86MT3ModuoIJbe7JXp+sb5UAjInSShmK3nXXMioBzfF7rXC12hv12d4IyCVwN4dA==} + /@types/node/16.9.1: + resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} + dev: false + + /@types/node/18.6.3: + resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==} dev: true + /@types/offscreencanvas/2019.7.0: + resolution: {integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==} + dev: false + /@types/pug/2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true @@ -521,11 +1164,11 @@ packages: /@types/sass/1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: - '@types/node': 18.0.5 + '@types/node': 18.6.3 dev: true - /@typescript-eslint/eslint-plugin/5.30.6_vyqjobnklww3xdlzqlhkvlorlu: - resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} + /@typescript-eslint/eslint-plugin/5.31.0_4jrpqvszkjcwtaspamifhp3x7e: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -535,10 +1178,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca - '@typescript-eslint/utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/parser': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca debug: 4.3.4 eslint: 7.32.0 functional-red-black-tree: 1.0.1 @@ -551,8 +1194,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: - resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} + /@typescript-eslint/parser/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -561,9 +1204,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.5.5 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.5.5 debug: 4.3.4 eslint: 7.32.0 typescript: 4.5.5 @@ -571,16 +1214,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.30.6: - resolution: {integrity: sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==} + /@typescript-eslint/scope-manager/5.31.0: + resolution: {integrity: sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/visitor-keys': 5.30.6 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 dev: true - /@typescript-eslint/type-utils/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: - resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} + /@typescript-eslint/type-utils/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -589,7 +1232,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.30.6_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca debug: 4.3.4 eslint: 7.32.0 tsutils: 3.21.0_typescript@4.5.5 @@ -598,13 +1241,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.30.6: - resolution: {integrity: sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==} + /@typescript-eslint/types/5.31.0: + resolution: {integrity: sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.30.6_typescript@4.5.5: - resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} + /@typescript-eslint/typescript-estree/5.31.0_typescript@4.5.5: + resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -612,8 +1255,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/visitor-keys': 5.30.6 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -624,16 +1267,16 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.30.6_sgaiclxgc5mltnpgmg7py4v6ca: - resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} + /@typescript-eslint/utils/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.5.5 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.5.5 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.32.0 @@ -642,11 +1285,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.30.6: - resolution: {integrity: sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==} + /@typescript-eslint/visitor-keys/5.31.0: + resolution: {integrity: sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/types': 5.31.0 eslint-visitor-keys: 3.3.0 dev: true @@ -664,8 +1307,8 @@ packages: hasBin: true dev: true - /acorn/8.7.1: - resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} hasBin: true dev: false @@ -693,20 +1336,9 @@ packages: engines: {node: '>=6'} dev: true - /ansi-regex/2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false - /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - - /ansi-styles/2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -722,6 +1354,10 @@ packages: color-convert: 2.0.1 dev: true + /any-base/1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + dev: false + /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -735,6 +1371,9 @@ packages: sprintf-js: 1.0.3 dev: true + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /array-union/1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} @@ -761,15 +1400,15 @@ packages: engines: {node: '>=8'} dev: true - /autoprefixer/10.4.7_postcss@8.4.14: - resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} + /autoprefixer/10.4.8_postcss@8.4.14: + resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.2 - caniuse-lite: 1.0.30001367 + browserslist: 4.21.3 + caniuse-lite: 1.0.30001373 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -777,13 +1416,39 @@ packages: postcss-value-parser: 4.2.0 dev: false + /babel-plugin-precompile-intl/0.5.1: + resolution: {integrity: sha512-ki0llx5xZT1jQeLUIILVlAaaJQl/Jk+YTCXQZXoqjdwdUeAd2FTAOUWOYKk0W4KC+ONGFqtYfKmyjZkm5hlhpw==} + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-plugin-utils': 7.18.9 + '@formatjs/icu-messageformat-parser': 2.1.4 + transitivePeerDependencies: + - supports-color + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /bmp-js/0.1.0: + resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} + dev: false + /boolbase/1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false @@ -800,21 +1465,32 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist/4.21.2: - resolution: {integrity: sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==} + /browserslist/4.21.3: + resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001367 - electron-to-chromium: 1.4.192 + caniuse-lite: 1.0.30001373 + electron-to-chromium: 1.4.206 node-releases: 2.0.6 - update-browserslist-db: 1.0.4_browserslist@4.21.2 - dev: false + update-browserslist-db: 1.0.5_browserslist@4.21.3 /buffer-crc32/0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true + /buffer-equal/0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + dev: false + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -823,26 +1499,14 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.2 - caniuse-lite: 1.0.30001367 + browserslist: 4.21.3 + caniuse-lite: 1.0.30001373 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite/1.0.30001367: - resolution: {integrity: sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==} - dev: false - - /chalk/1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false + /caniuse-lite/1.0.30001373: + resolution: {integrity: sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==} /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -875,6 +1539,17 @@ packages: optionalDependencies: fsevents: 2.3.2 + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /cli-progress/3.11.2: + resolution: {integrity: sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==} + engines: {node: '>=4'} + dependencies: + string-width: 4.2.3 + dev: false + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -886,7 +1561,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -894,7 +1568,21 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color/4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false /colord/2.9.2: resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==} @@ -908,6 +1596,12 @@ packages: /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + dev: true + /cross-spawn/5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -1075,6 +1769,18 @@ packages: dependencies: ms: 2.1.2 + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -1089,6 +1795,11 @@ packages: engines: {node: '>=8'} dev: true + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: false + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1111,6 +1822,10 @@ packages: entities: 2.2.0 dev: false + /dom-walk/0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: false + /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false @@ -1130,13 +1845,17 @@ packages: domhandler: 4.3.1 dev: false - /electron-to-chromium/1.4.192: - resolution: {integrity: sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw==} - dev: false + /electron-to-chromium/1.4.206: + resolution: {integrity: sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==} /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} @@ -1153,201 +1872,201 @@ packages: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true - /esbuild-android-64/0.14.49: - resolution: {integrity: sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==} + /esbuild-android-64/0.14.51: + resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true optional: true - /esbuild-android-arm64/0.14.49: - resolution: {integrity: sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==} + /esbuild-android-arm64/0.14.51: + resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true optional: true - /esbuild-darwin-64/0.14.49: - resolution: {integrity: sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==} + /esbuild-darwin-64/0.14.51: + resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /esbuild-darwin-arm64/0.14.49: - resolution: {integrity: sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==} + /esbuild-darwin-arm64/0.14.51: + resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /esbuild-freebsd-64/0.14.49: - resolution: {integrity: sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==} + /esbuild-freebsd-64/0.14.51: + resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /esbuild-freebsd-arm64/0.14.49: - resolution: {integrity: sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==} + /esbuild-freebsd-arm64/0.14.51: + resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /esbuild-linux-32/0.14.49: - resolution: {integrity: sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==} + /esbuild-linux-32/0.14.51: + resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true optional: true - /esbuild-linux-64/0.14.49: - resolution: {integrity: sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==} + /esbuild-linux-64/0.14.51: + resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /esbuild-linux-arm/0.14.49: - resolution: {integrity: sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==} + /esbuild-linux-arm/0.14.51: + resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /esbuild-linux-arm64/0.14.49: - resolution: {integrity: sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==} + /esbuild-linux-arm64/0.14.51: + resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /esbuild-linux-mips64le/0.14.49: - resolution: {integrity: sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==} + /esbuild-linux-mips64le/0.14.51: + resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true optional: true - /esbuild-linux-ppc64le/0.14.49: - resolution: {integrity: sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==} + /esbuild-linux-ppc64le/0.14.51: + resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /esbuild-linux-riscv64/0.14.49: - resolution: {integrity: sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==} + /esbuild-linux-riscv64/0.14.51: + resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /esbuild-linux-s390x/0.14.49: - resolution: {integrity: sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==} + /esbuild-linux-s390x/0.14.51: + resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /esbuild-netbsd-64/0.14.49: - resolution: {integrity: sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==} + /esbuild-netbsd-64/0.14.51: + resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true optional: true - /esbuild-openbsd-64/0.14.49: - resolution: {integrity: sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==} + /esbuild-openbsd-64/0.14.51: + resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true optional: true - /esbuild-sunos-64/0.14.49: - resolution: {integrity: sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==} + /esbuild-sunos-64/0.14.51: + resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true optional: true - /esbuild-windows-32/0.14.49: - resolution: {integrity: sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==} + /esbuild-windows-32/0.14.51: + resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /esbuild-windows-64/0.14.49: - resolution: {integrity: sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==} + /esbuild-windows-64/0.14.51: + resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /esbuild-windows-arm64/0.14.49: - resolution: {integrity: sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==} + /esbuild-windows-arm64/0.14.51: + resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /esbuild/0.14.49: - resolution: {integrity: sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==} + /esbuild/0.14.51: + resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.49 - esbuild-android-arm64: 0.14.49 - esbuild-darwin-64: 0.14.49 - esbuild-darwin-arm64: 0.14.49 - esbuild-freebsd-64: 0.14.49 - esbuild-freebsd-arm64: 0.14.49 - esbuild-linux-32: 0.14.49 - esbuild-linux-64: 0.14.49 - esbuild-linux-arm: 0.14.49 - esbuild-linux-arm64: 0.14.49 - esbuild-linux-mips64le: 0.14.49 - esbuild-linux-ppc64le: 0.14.49 - esbuild-linux-riscv64: 0.14.49 - esbuild-linux-s390x: 0.14.49 - esbuild-netbsd-64: 0.14.49 - esbuild-openbsd-64: 0.14.49 - esbuild-sunos-64: 0.14.49 - esbuild-windows-32: 0.14.49 - esbuild-windows-64: 0.14.49 - esbuild-windows-arm64: 0.14.49 + esbuild-android-64: 0.14.51 + esbuild-android-arm64: 0.14.51 + esbuild-darwin-64: 0.14.51 + esbuild-darwin-arm64: 0.14.51 + esbuild-freebsd-64: 0.14.51 + esbuild-freebsd-arm64: 0.14.51 + esbuild-linux-32: 0.14.51 + esbuild-linux-64: 0.14.51 + esbuild-linux-arm: 0.14.51 + esbuild-linux-arm64: 0.14.51 + esbuild-linux-mips64le: 0.14.51 + esbuild-linux-ppc64le: 0.14.51 + esbuild-linux-riscv64: 0.14.51 + esbuild-linux-s390x: 0.14.51 + esbuild-netbsd-64: 0.14.51 + esbuild-openbsd-64: 0.14.51 + esbuild-sunos-64: 0.14.51 + esbuild-windows-32: 0.14.51 + esbuild-windows-64: 0.14.51 + esbuild-windows-arm64: 0.14.51 /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /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==} @@ -1439,7 +2158,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.16.0 + globals: 13.17.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -1539,6 +2258,33 @@ packages: strip-final-newline: 2.0.0 dev: false + /exif-parser/0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + dev: false + + /expand-template/2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /fast-average-color-node/2.4.0: + resolution: {integrity: sha512-Vxh2JQWwHETAuIQM966/ULLprPIe78UrvyV+AUYJxyj4nBHwl4QYG6Ym77ZPDO4mYExVk0axKmU5EGXv7uAlaw==} + engines: {node: '>= 12'} + dependencies: + fast-average-color: 9.1.1 + node-fetch: 2.6.7 + sharp: 0.30.7 + transitivePeerDependencies: + - encoding + dev: false + + /fast-average-color/9.1.1: + resolution: {integrity: sha512-PJizLBcGb/jqUzrH66385te4+GcOK7wcUiCDvBUszdpzc/pvV1kwifvvsFygV3mS+7qwnWmK9/BrZniaOOC9ag==} + engines: {node: '>= 12'} + dependencies: + '@types/offscreencanvas': 2019.7.0 + dev: false + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -1577,6 +2323,11 @@ packages: flat-cache: 3.0.4 dev: true + /file-type/9.0.0: + resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} + engines: {node: '>=6'} + dev: false + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1607,6 +2358,10 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1624,6 +2379,11 @@ packages: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-stream/3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -1638,6 +2398,17 @@ packages: resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} dev: true + /gifwrap/0.9.4: + resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} + dependencies: + image-q: 4.0.0 + omggif: 1.0.10 + dev: false + + /github-from-package/0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1654,8 +2425,20 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /globals/13.16.0: - resolution: {integrity: sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==} + /global/4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: false + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals/13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -1663,7 +2446,6 @@ packages: /globalyzer/0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -1690,24 +2472,11 @@ packages: /globrex/0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /has-ansi/2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - - /has-flag/1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - dev: false - /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1729,16 +2498,19 @@ packages: hasBin: true dev: false - /highlight.js/11.6.0: - resolution: {integrity: sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==} + /highlight.js/11.5.1: + resolution: {integrity: sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==} engines: {node: '>=12.0.0'} - dev: false /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: false + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} @@ -1749,6 +2521,12 @@ packages: engines: {node: '>= 4'} dev: true + /image-q/4.0.0: + resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} + dependencies: + '@types/node': 16.9.1 + dev: false + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1771,6 +2549,10 @@ packages: /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + /insane/2.6.2: resolution: {integrity: sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==} dependencies: @@ -1778,6 +2560,10 @@ packages: he: 0.5.0 dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1796,7 +2582,10 @@ packages: /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true + + /is-function/1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: false /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -1821,8 +2610,18 @@ packages: /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /js-base64/2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + /jimp/0.16.1: + resolution: {integrity: sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugins': 0.16.1_@jimp+custom@0.16.1 + '@jimp/types': 0.16.1_@jimp+custom@0.16.1 + regenerator-runtime: 0.13.9 + dev: false + + /jpeg-js/0.4.2: + resolution: {integrity: sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==} dev: false /js-tokens/4.0.0: @@ -1837,6 +2636,18 @@ packages: esprima: 4.0.1 dev: true + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -1849,8 +2660,14 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /kill-port-process/3.0.1: - resolution: {integrity: sha512-WAmjirZm4sL6Ooprf3AOQuwGHa83jMwsGPRl3qwbOswzP7OzUGI/Z76n/1gVfe2RUJXZmgo5Bf0VFLID0mk0hQ==} + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /kill-port-process/3.1.0: + resolution: {integrity: sha512-sVODd2xDGzN3OaLGhHcJPiaRwWK0QZc+bD5YQTo3Xgh1AUg1AZgDYDeqRI6ILg4AhWrmSpupGwQEFK1G0Sy2fw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -1880,6 +2697,19 @@ packages: engines: {node: '>=10'} dev: false + /load-bmfont/1.4.1: + resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + dependencies: + buffer-equal: 0.0.1 + mime: 1.6.0 + parse-bmfont-ascii: 1.0.6 + parse-bmfont-binary: 1.0.6 + parse-bmfont-xml: 1.1.4 + phin: 2.9.3 + xhr: 2.6.0 + xtend: 4.0.2 + dev: false + /local-pkg/0.4.2: resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} @@ -1924,7 +2754,6 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /magic-string/0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -1964,11 +2793,34 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mime/3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: false + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /min-document/2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: false + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1981,14 +2833,16 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - dev: true + + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.6 - dev: true /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -2003,13 +2857,39 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /napi-build-utils/1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /node-abi/3.22.0: + resolution: {integrity: sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.7 + dev: false + + /node-addon-api/5.0.0: + resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==} + dev: false + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: false /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -2050,19 +2930,29 @@ packages: engines: {node: '>=0.10.0'} dev: false - /omorphia/0.0.17_svelte@3.49.0+vite@3.0.0: - resolution: {integrity: sha512-MeOhG4VT7GHt/rNB37Fj2YSkVV813ZMgjImOtPilwxE9NNyJp220JU5Cy4/BxCRpdF2GOuokZPPIK+RO6mWRYA==} + /omggif/1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + dev: false + + /omorphia/0.0.67_svelte@3.49.0+vite@3.0.4: + resolution: {integrity: sha512-2MOdJ9OYaA2XuPMpca132tPTs7uU4tYTXhpJLOQmrEPgXxOQa1oDPu9BD0edndfFxJK2uCIOhciLf3NpT7kJoA==} + engines: {node: '>=16.5.0'} dependencies: - '@iconify-json/carbon': 1.1.6 + '@iconify-json/carbon': 1.1.7 + '@iconify-json/fa-regular': 1.1.2 '@iconify-json/heroicons-outline': 1.1.2 '@iconify-json/heroicons-solid': 1.1.2 - '@iconify-json/lucide': 1.1.36 + '@iconify-json/lucide': 1.1.38 + '@iconify-json/simple-icons': 1.1.20 '@poppanator/sveltekit-svg': 0.3.4_svelte@3.49.0 - autoprefixer: 10.4.7_postcss@8.4.14 + cli-progress: 3.11.2 cssnano: 5.1.12_postcss@8.4.14 - highlight.js: 11.6.0 + fast-average-color-node: 2.4.0 + highlight.js: 11.5.1 insane: 2.6.2 + jimp: 0.16.1 marked: 4.0.18 + openapi-typescript: 5.4.1 postcss: 8.4.14 postcss-easy-import: 4.0.0_postcss@8.4.14 postcss-extend-rule: 4.0.0_postcss@8.4.14 @@ -2072,15 +2962,16 @@ packages: postcss-nested: 5.0.6_postcss@8.4.14 postcss-preset-env: 7.7.2_postcss@8.4.14 postcss-pxtorem: 6.0.0_postcss@8.4.14 - postcss-strip-inline-comments: 0.1.5 sanitize.css: 13.0.0 svelte-tiny-virtual-list: 2.0.5 svelte-use-click-outside: 1.0.0 throttle-debounce: 3.0.1 - unplugin-icons: 0.13.4_vite@3.0.0 + undici: 5.8.0 + unplugin-icons: 0.14.8_vite@3.0.4 transitivePeerDependencies: - '@svgr/core' - '@vue/compiler-sfc' + - encoding - esbuild - rollup - supports-color @@ -2104,6 +2995,19 @@ packages: mimic-fn: 2.1.0 dev: false + /openapi-typescript/5.4.1: + resolution: {integrity: sha512-AGB2QiZPz4rE7zIwV3dRHtoUC/CWHhUjuzGXvtmMQN2AFV8xCTLKcZUHLcdPQmt/83i22nRE7+TxXOXkK+gf4Q==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + js-yaml: 4.1.0 + mime: 3.0.0 + prettier: 2.7.1 + tiny-glob: 0.2.9 + undici: 5.8.0 + yargs-parser: 21.0.1 + dev: false + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -2135,6 +3039,10 @@ packages: p-limit: 3.1.0 dev: false + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2142,6 +3050,25 @@ packages: callsites: 3.1.0 dev: true + /parse-bmfont-ascii/1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + dev: false + + /parse-bmfont-binary/1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + dev: false + + /parse-bmfont-xml/1.1.4: + resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} + dependencies: + xml-parse-from-string: 1.0.1 + xml2js: 0.4.23 + dev: false + + /parse-headers/2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: false + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2163,11 +3090,20 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-starts-with/2.0.0: + resolution: {integrity: sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==} + engines: {node: '>=8'} + dev: true + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /phin/2.9.3: + resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} + dev: false + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -2204,6 +3140,18 @@ packages: engines: {node: '>=0.10.0'} dev: false + /pixelmatch/4.0.2: + resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} + hasBin: true + dependencies: + pngjs: 3.4.0 + dev: false + + /pngjs/3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: false + /postcss-attribute-case-insensitive/5.0.2_postcss@8.4.14: resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} engines: {node: ^12 || ^14 || >=16} @@ -2270,7 +3218,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.14 @@ -2283,7 +3231,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -2552,7 +3500,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.14 postcss: 8.4.14 @@ -2587,7 +3535,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 cssnano-utils: 3.1.0_postcss@8.4.14 postcss: 8.4.14 postcss-value-parser: 4.2.0 @@ -2689,7 +3637,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -2777,8 +3725,8 @@ packages: '@csstools/postcss-stepped-value-functions': 1.0.1_postcss@8.4.14 '@csstools/postcss-trigonometric-functions': 1.0.2_postcss@8.4.14 '@csstools/postcss-unset-value': 1.0.2_postcss@8.4.14 - autoprefixer: 10.4.7_postcss@8.4.14 - browserslist: 4.21.2 + autoprefixer: 10.4.8_postcss@8.4.14 + browserslist: 4.21.3 css-blank-pseudo: 3.0.3_postcss@8.4.14 css-has-pseudo: 3.0.4_postcss@8.4.14 css-prefers-color-scheme: 6.0.3_postcss@8.4.14 @@ -2839,7 +3787,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 caniuse-api: 3.0.0 postcss: 8.4.14 dev: false @@ -2880,12 +3828,6 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-strip-inline-comments/0.1.5: - resolution: {integrity: sha512-4EW5hYyv2syFyIBahkXGhZppp9zb5wD5NJ2R65WjXnB5q8T0g4VyLBTevU6ZpxtaN4HkoYZhV03DGUf5Ptd4FA==} - dependencies: - postcss: 5.2.18 - dev: false - /postcss-svgo/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} @@ -2911,16 +3853,6 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss/5.2.18: - resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} - engines: {node: '>=0.12'} - dependencies: - chalk: 1.1.3 - js-base64: 2.6.4 - source-map: 0.5.7 - supports-color: 3.2.3 - dev: false - /postcss/8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} @@ -2929,6 +3861,33 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /prebuild-install/7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.6 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.22.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /precompile-intl-runtime/0.7.0_svelte@3.49.0: + resolution: {integrity: sha512-Zics5Ia/YAb8zE+hkFnkOdJBfdJ1mrCY++pvenIyz6y9lVh0Gz/SW4tQ1TBcn8eFMPRqURqMVUot6dp09PZYOA==} + peerDependencies: + svelte: ^3.37.0 + dependencies: + svelte: 3.49.0 + dev: true + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2948,7 +3907,11 @@ packages: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true - dev: true + + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -2959,6 +3922,13 @@ packages: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -2967,18 +3937,41 @@ packages: /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.6 + strip-json-comments: 2.0.1 + dev: false + /read-cache/1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: false + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: false + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -3020,8 +4013,8 @@ packages: glob: 7.2.3 dev: true - /rollup/2.77.0: - resolution: {integrity: sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==} + /rollup/2.77.2: + resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: @@ -3039,6 +4032,14 @@ packages: mri: 1.2.0 dev: true + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + /sander/0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: @@ -3052,13 +4053,36 @@ packages: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - dev: true + + /sharp/0.30.7: + resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} + engines: {node: '>=12.13.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.1 + node-addon-api: 5.0.0 + prebuild-install: 7.1.1 + semver: 7.3.7 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false /shebang-command/1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -3085,6 +4109,24 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get/4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3113,11 +4155,6 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map/0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3143,13 +4180,11 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /strip-ansi/3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: - ansi-regex: 2.1.1 + safe-buffer: 5.2.1 dev: false /strip-ansi/6.0.1: @@ -3157,6 +4192,10 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + + /strip-bom/5.0.0: + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} + engines: {node: '>=12'} dev: true /strip-eof/1.0.0: @@ -3176,6 +4215,11 @@ packages: min-indent: 1.0.1 dev: true + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3187,23 +4231,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /supports-color/2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false - - /supports-color/3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - dependencies: - has-flag: 1.0.0 - dev: false - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3259,6 +4291,20 @@ packages: svelte: 3.49.0 dev: true + /svelte-intl-precompile/0.11.1_svelte@3.49.0: + resolution: {integrity: sha512-P91cUUtaTkCjZiQBlcfPDaS0U9yTJSXTKsqK83bq2iLSvPFkb/JHNMPwEG+aph11CY6Y4GcZI1rsB905GG7tmw==} + dependencies: + babel-plugin-precompile-intl: 0.5.1 + js-yaml: 4.1.0 + json5: 2.2.1 + path-starts-with: 2.0.0 + precompile-intl-runtime: 0.7.0_svelte@3.49.0 + strip-bom: 5.0.0 + transitivePeerDependencies: + - supports-color + - svelte + dev: true + /svelte-preprocess/4.10.7_ut7ie4tqg2ygg3ru4utt6vrtaq: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} @@ -3336,8 +4382,8 @@ packages: stable: 0.1.8 dev: false - /svrollbar/0.10.5: - resolution: {integrity: sha512-6I25pAolLYGNatYSahXMnm3eSPOtJq2YR/QxZ6NV/S+F4fDpunHL38gheqajCspLTkO1L7K3HuNED8jlTk+x/Q==} + /svrollbar/0.12.0: + resolution: {integrity: sha512-okH0sz8bGtw+tgOfN1mpEtbveifxROcE3mbUMBJ1RQz8Q+1rVr+nVG7EAJ9b0G80cGDu7dskjAWuzj3iru0k5g==} dev: false /table/6.8.0: @@ -3351,6 +4397,26 @@ packages: strip-ansi: 6.0.1 dev: true + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -3360,11 +4426,23 @@ packages: engines: {node: '>=10'} dev: false + /timm/1.7.1: + resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} + dev: false + /tiny-glob/0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: globalyzer: 0.1.0 globrex: 0.1.2 + + /tinycolor2/1.4.2: + resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} + dev: false + + /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: @@ -3373,6 +4451,10 @@ packages: dependencies: is-number: 7.0.0 + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true @@ -3391,6 +4473,12 @@ packages: typescript: 4.5.5 dev: true + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3409,8 +4497,13 @@ packages: hasBin: true dev: true - /unplugin-icons/0.13.4_vite@3.0.0: - resolution: {integrity: sha512-gyp5H4WADnXEE1uk8+NW6gnnALOlSpU8M5GwzNCYbUgjM4QudjcFbacHKuuqETk4VeSJyzM9Z2ufbuZFMuxvuQ==} + /undici/5.8.0: + resolution: {integrity: sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==} + engines: {node: '>=12.18'} + dev: false + + /unplugin-icons/0.14.8_vite@3.0.4: + resolution: {integrity: sha512-YxLC0Uxec+ayl8ju3CXmRX4Jg7IF8Tu2cRyq/okXwMK6fM140SPae332ByTlul1E/I7I0PXYSVVn8SlGunM/2g==} peerDependencies: '@svgr/core': '>=5.5.0' '@vue/compiler-sfc': ^3.0.2 @@ -3432,7 +4525,7 @@ packages: debug: 4.3.4 kolorist: 1.5.1 local-pkg: 0.4.2 - unplugin: 0.4.0_vite@3.0.0 + unplugin: 0.8.0_vite@3.0.4 transitivePeerDependencies: - esbuild - rollup @@ -3441,62 +4534,8 @@ packages: - webpack dev: false - /unplugin-icons/0.14.7_vite@3.0.0: - resolution: {integrity: sha512-TrNnEdpaXMdiG5BsCgvU6cv/gSLYvIk1f8wGCGZmOo4wmi3nqYBuqIEuiXhmmyXdDZuRRpCaOzCnCYYZ5H7U8g==} - peerDependencies: - '@svgr/core': '>=5.5.0' - '@vue/compiler-sfc': ^3.0.2 - vue-template-compiler: ^2.6.12 - vue-template-es2015-compiler: ^1.9.0 - peerDependenciesMeta: - '@svgr/core': - optional: true - '@vue/compiler-sfc': - optional: true - vue-template-compiler: - optional: true - vue-template-es2015-compiler: - optional: true - dependencies: - '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.5.2 - '@iconify/utils': 1.0.33 - debug: 4.3.4 - kolorist: 1.5.1 - local-pkg: 0.4.2 - unplugin: 0.7.2_vite@3.0.0 - transitivePeerDependencies: - - esbuild - - rollup - - supports-color - - vite - - webpack - dev: false - - /unplugin/0.4.0_vite@3.0.0: - resolution: {integrity: sha512-4ScITEmzlz1iZW3tkz+3L1V5k/xMQ6kjgm4lEXKxH0ozd8/OUWfiSA7RMRyrawsvq/t50JIzPpp1UyuSL/AXkA==} - peerDependencies: - esbuild: '>=0.13' - rollup: ^2.50.0 - vite: ^2.3.0 - webpack: 4 || 5 - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - dependencies: - chokidar: 3.5.3 - vite: 3.0.0 - webpack-virtual-modules: 0.4.4 - dev: false - - /unplugin/0.7.2_vite@3.0.0: - resolution: {integrity: sha512-m7thX4jP8l5sETpLdUASoDOGOcHaOVtgNyrYlToyQUvILUtEzEnngRBrHnAX3IKqooJVmXpoa/CwQ/QqzvGaHQ==} + /unplugin/0.8.0_vite@3.0.4: + resolution: {integrity: sha512-OzOkJ9XOPlD1Cph6qy/p4i/KSUbs76GToXjH/STHpfo6D7y+EqpfAL6G6HaoOw5QLkt9+KWwcxYUmPFkDf1upQ==} peerDependencies: esbuild: '>=0.13' rollup: ^2.50.0 @@ -3512,23 +4551,22 @@ packages: webpack: optional: true dependencies: - acorn: 8.7.1 + acorn: 8.8.0 chokidar: 3.5.3 - vite: 3.0.0 + vite: 3.0.4 webpack-sources: 3.2.3 webpack-virtual-modules: 0.4.4 dev: false - /update-browserslist-db/1.0.4_browserslist@4.21.2: - resolution: {integrity: sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==} + /update-browserslist-db/1.0.5_browserslist@4.21.3: + resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.2 + browserslist: 4.21.3 escalade: 3.1.1 picocolors: 1.0.0 - dev: false /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3536,6 +4574,12 @@ packages: punycode: 2.1.1 dev: true + /utif/2.0.1: + resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + dependencies: + pako: 1.0.11 + dev: false + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -3544,9 +4588,9 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite/3.0.0: - resolution: {integrity: sha512-M7phQhY3+fRZa0H+1WzI6N+/onruwPTBTMvaj7TzgZ0v2TE+N2sdLKxJOfOv9CckDWt5C4HmyQP81xB4dwRKzA==} - engines: {node: '>=14.18.0'} + /vite/3.0.4: + resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==} + engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: less: '*' @@ -3563,13 +4607,17 @@ packages: terser: optional: true dependencies: - esbuild: 0.14.49 + esbuild: 0.14.51 postcss: 8.4.14 resolve: 1.22.1 - rollup: 2.77.0 + rollup: 2.77.2 optionalDependencies: fsevents: 2.3.2 + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -3579,6 +4627,13 @@ packages: resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==} dev: false + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -3601,19 +4656,54 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /xhr/2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: false + + /xml-parse-from-string/1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + dev: false + + /xml2js/0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + /yallist/2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: false + /yargs-parser/21.0.1: + resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + engines: {node: '>=12'} + dev: false + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/theseus_gui/postcss.config.cjs b/theseus_gui/postcss.config.cjs index af2bac4cd..1c456ce2c 100644 --- a/theseus_gui/postcss.config.cjs +++ b/theseus_gui/postcss.config.cjs @@ -1 +1 @@ -module.exports = require('omorphia/config/postcss.config.cjs') \ No newline at end of file +module.exports = require('omorphia/config/postcss.cjs') \ No newline at end of file diff --git a/theseus_gui/src-tauri/src/main.rs b/theseus_gui/src-tauri/src/main.rs index 7d12ec114..0b9c7db0e 100644 --- a/theseus_gui/src-tauri/src/main.rs +++ b/theseus_gui/src-tauri/src/main.rs @@ -9,7 +9,7 @@ use tauri::{ }; fn main() { - let ctx = tauri::generate_context!(); + let ctx = tauri::generate_context!(); // Run `pnpm build:web` (builds the web app) to get rid of the error. tauri::Builder::default() .invoke_handler(tauri::generate_handler![]) diff --git a/theseus_gui/src/app.html b/theseus_gui/src/app.html index 9363c405a..f88fd6183 100644 --- a/theseus_gui/src/app.html +++ b/theseus_gui/src/app.html @@ -3,9 +3,12 @@ + + + %sveltekit.head% - + %sveltekit.body% diff --git a/theseus_gui/src/components/GlobalSettings.svelte b/theseus_gui/src/components/GlobalSettings.svelte index c7b4633f1..91f985cf9 100644 --- a/theseus_gui/src/components/GlobalSettings.svelte +++ b/theseus_gui/src/components/GlobalSettings.svelte @@ -1,5 +1,5 @@
- + - - + + - +
diff --git a/theseus_gui/svelte.config.js b/theseus_gui/svelte.config.js index 35d2e9284..d9572d71c 100644 --- a/theseus_gui/svelte.config.js +++ b/theseus_gui/svelte.config.js @@ -4,17 +4,22 @@ import path from 'path'; /** @type {import('@sveltejs/kit').Config} */ const config = { - preprocess: [ preprocess ], - kit: { - adapter: adapter({ - fallback: '200.html', - }), + preprocess: [preprocess], + kit: { + adapter: adapter({ + fallback: '200.html' + }), - alias: { - $generated: path.resolve('./generated'), - $stores: path.resolve('./src/stores'), - } + alias: { + $generated: path.resolve('./generated'), + $stores: path.resolve('./src/stores'), + $assets: path.resolve('./src/assets'), + $components: path.resolve('./src/components'), + $layout: path.resolve('./src/layout'), + $lib: path.resolve('./src/lib'), + $styles: path.resolve('./src/styles') } + } }; export default config; diff --git a/theseus_gui/vite.config.js b/theseus_gui/vite.config.js index 79f8627a6..c8fac45ce 100644 --- a/theseus_gui/vite.config.js +++ b/theseus_gui/vite.config.js @@ -1,39 +1,28 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import path from "path"; +import path from 'path'; import { plugins } from 'omorphia/config/vite'; import precompileIntl from 'svelte-intl-precompile/sveltekit-plugin'; import { Generator } from 'omorphia/plugins'; /** @type {import('vite').UserConfig} */ const config = { - plugins: [ - sveltekit(), - ...plugins, - precompileIntl('locales'), - Generator({ - gameVersions: true, - openapi: true, - }), - ], - optimizeDeps: { - include: ["highlight.js/lib/core"], - }, - resolve: { - alias: { - $assets: path.resolve('./src/assets'), - $components: path.resolve('./src/components'), - $layout: path.resolve('./src/layout'), - $lib: path.resolve('./src/lib'), - $stores: path.resolve('./src/stores'), - $styles: path.resolve('./src/styles'), - $generated: path.resolve('./src/generated'), - }, - }, - server: { - fs: { - allow: ['generated'], - }, - }, + plugins: [ + sveltekit(), + ...plugins, + precompileIntl('locales'), + Generator({ + gameVersions: true, + openapi: true + }) + ], + optimizeDeps: { + include: ['highlight.js/lib/core'] + }, + server: { + fs: { + allow: ['generated'] + } + } }; export default config; From 13c417fceec6ffd4192d95a48c149eb0bf150930 Mon Sep 17 00:00:00 2001 From: venashial Date: Wed, 3 Aug 2022 00:24:44 -0700 Subject: [PATCH 7/7] Run `pnpm format` --- theseus_gui/src/app.d.ts | 8 +- theseus_gui/src/app.html | 22 +- theseus_gui/src/components/CardRow.svelte | 87 +++--- .../src/components/GlobalSettings.svelte | 100 +++---- theseus_gui/src/components/Instance.svelte | 153 ++++++----- .../src/components/TitledSection.svelte | 72 ++--- theseus_gui/src/components/VerticalNav.svelte | 48 ++-- .../src/components/WindowSettings.svelte | 14 +- theseus_gui/src/global.d.ts | 10 +- theseus_gui/src/hooks.ts | 8 +- theseus_gui/src/layout/Page.svelte | 80 +++--- theseus_gui/src/layout/Sidebar.svelte | 252 +++++++++--------- theseus_gui/src/layout/StatusBar.svelte | 110 ++++---- theseus_gui/src/routes/index.svelte | 40 ++- theseus_gui/src/routes/library/index.svelte | 3 - .../library/instance/[id]/__layout.svelte | 65 ++--- .../library/instance/[id]/settings.svelte | 13 +- theseus_gui/src/routes/settings.svelte | 5 +- theseus_gui/src/stores/account.ts | 4 +- theseus_gui/src/styles/components.postcss | 32 +-- theseus_gui/src/styles/global.postcss | 18 +- 21 files changed, 579 insertions(+), 565 deletions(-) diff --git a/theseus_gui/src/app.d.ts b/theseus_gui/src/app.d.ts index 7090ee710..f5cdcd668 100644 --- a/theseus_gui/src/app.d.ts +++ b/theseus_gui/src/app.d.ts @@ -3,11 +3,11 @@ // See https://kit.svelte.dev/docs/typescript // for information about these interfaces declare namespace App { - interface Locals {} + interface Locals {} - interface Platform {} + interface Platform {} - interface Session {} + interface Session {} - interface Stuff {} + interface Stuff {} } diff --git a/theseus_gui/src/app.html b/theseus_gui/src/app.html index f88fd6183..3510174a7 100644 --- a/theseus_gui/src/app.html +++ b/theseus_gui/src/app.html @@ -1,14 +1,14 @@ - - - - - - - %sveltekit.head% - - - %sveltekit.body% - + + + + + + + %sveltekit.head% + + + %sveltekit.body% + diff --git a/theseus_gui/src/components/CardRow.svelte b/theseus_gui/src/components/CardRow.svelte index f46fb33a2..ffec75d1a 100644 --- a/theseus_gui/src/components/CardRow.svelte +++ b/theseus_gui/src/components/CardRow.svelte @@ -1,54 +1,53 @@
-
{title}
-
- -
+
{title}
+
+ +
- \ No newline at end of file + + &__items { + display: flex; + grid-gap: 1rem; + align-items: flex-start; + overflow-x: auto; + padding: 0 1rem; + + /* Hide scrollbar */ + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } + } + + &:nth-of-type(even) { + background-color: hsla(0, 0%, 0%, 0.2); + } + } + diff --git a/theseus_gui/src/components/GlobalSettings.svelte b/theseus_gui/src/components/GlobalSettings.svelte index 91f985cf9..514af9196 100644 --- a/theseus_gui/src/components/GlobalSettings.svelte +++ b/theseus_gui/src/components/GlobalSettings.svelte @@ -1,58 +1,58 @@
- - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - -
- - - -
-
- - - - - - - - - -
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + +
+ + + +
+
+ + + + + + + + + +
diff --git a/theseus_gui/src/components/TitledSection.svelte b/theseus_gui/src/components/TitledSection.svelte index be2873e10..c6cde6ab8 100644 --- a/theseus_gui/src/components/TitledSection.svelte +++ b/theseus_gui/src/components/TitledSection.svelte @@ -1,49 +1,49 @@
-
- {#if toggleable}{title} - {:else}{title} - {/if} -
-
- {#if !toggleable || enabled}{/if} -
+
+ {#if toggleable}{title} + {:else}{title} + {/if} +
+
+ {#if !toggleable || enabled}{/if} +
diff --git a/theseus_gui/src/components/VerticalNav.svelte b/theseus_gui/src/components/VerticalNav.svelte index 42db1d812..b8e2a1a52 100644 --- a/theseus_gui/src/components/VerticalNav.svelte +++ b/theseus_gui/src/components/VerticalNav.svelte @@ -1,36 +1,34 @@
- {#each items as item (item.href)} - - - {item.label} - - {/each} + {#each items as item (item.href)} + + + {item.label} + + {/each}
diff --git a/theseus_gui/src/components/WindowSettings.svelte b/theseus_gui/src/components/WindowSettings.svelte index 2d2e2f059..fdef7ba00 100644 --- a/theseus_gui/src/components/WindowSettings.svelte +++ b/theseus_gui/src/components/WindowSettings.svelte @@ -1,14 +1,14 @@
- - - - - - + + + + + +
\ No newline at end of file + :global(.v-thumb) { + margin: 4px auto 4px auto !important; + } + diff --git a/theseus_gui/src/layout/Sidebar.svelte b/theseus_gui/src/layout/Sidebar.svelte index 16483c325..bb5f11bb8 100644 --- a/theseus_gui/src/layout/Sidebar.svelte +++ b/theseus_gui/src/layout/Sidebar.svelte @@ -1,144 +1,146 @@ diff --git a/theseus_gui/src/routes/library/instance/[id]/settings.svelte b/theseus_gui/src/routes/library/instance/[id]/settings.svelte index 2110068d1..29ff9f067 100644 --- a/theseus_gui/src/routes/library/instance/[id]/settings.svelte +++ b/theseus_gui/src/routes/library/instance/[id]/settings.svelte @@ -1,18 +1,17 @@
- - - + + +