diff --git a/.config/devenv.yml b/.config/devenv.yml index 5e3ca24e8d..3c980914a9 100644 --- a/.config/devenv.yml +++ b/.config/devenv.yml @@ -13,8 +13,6 @@ redis: host: firefish_redis port: 6379 -id: 'aid' - #allowedPrivateNetworks: [ # '10.69.1.0/24' #] diff --git a/Cargo.lock b/Cargo.lock index 5d3dba3b9d..0a1d9aad18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.18" @@ -77,6 +83,29 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "argon2" version = "0.5.3" @@ -114,7 +143,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -125,7 +154,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -143,6 +172,29 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + [[package]] name = "backend-rs" version = "0.0.0" @@ -154,15 +206,19 @@ dependencies = [ "cuid2", "emojis", "idna", + "image", "macro_rs", "napi", "napi-build", "napi-derive", + "nom-exif", "once_cell", + "openssl", "pretty_assertions", "rand", "redis", "regex", + "reqwest", "rmp-serde", "sea-orm", "serde", @@ -240,6 +296,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -255,6 +317,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" + [[package]] name = "bitvec" version = "1.0.1" @@ -315,10 +383,16 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "syn_derive", ] +[[package]] +name = "built" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41bfbdb21256b87a8b5e80fab81a8eed158178e812fd7ba451907518b2742f16" + [[package]] name = "bumpalo" version = "3.16.0" @@ -347,12 +421,24 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" + [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.6.0" @@ -361,9 +447,24 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] [[package]] name = "cfg-if" @@ -379,9 +480,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -402,6 +503,12 @@ dependencies = [ "inout", ] +[[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.7" @@ -427,6 +534,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -457,6 +574,34 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.11" @@ -472,6 +617,12 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -484,12 +635,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -577,13 +728,22 @@ dependencies = [ [[package]] name = "emojis" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee61eb945bff65ee7d19d157d39c67c33290ff0742907413fd5eefd29edc979" +checksum = "9f619a926616ae7149a0d82610b051134a0d6c4ae2962d990c06c847a445c5d9" dependencies = [ "phf", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -617,18 +777,53 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + [[package]] name = "finl_unicode" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" +[[package]] +name = "flate2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4556222738635b7a3417ae6130d8f52201e45a0c4d1a907f0826383adb5f85e7" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flume" version = "0.11.0" @@ -640,6 +835,27 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -763,12 +979,51 @@ dependencies = [ "wasi", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "h2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -806,6 +1061,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -845,6 +1106,102 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -878,6 +1235,45 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "2.2.6" @@ -896,7 +1292,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -908,6 +1304,23 @@ dependencies = [ "generic-array", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itertools" version = "0.12.1" @@ -923,6 +1336,21 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.69" @@ -950,12 +1378,29 @@ dependencies = [ "spin 0.5.2", ] +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libloading" version = "0.8.3" @@ -991,9 +1436,9 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1005,6 +1450,15 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "macro_rs" version = "0.0.0" @@ -1013,10 +1467,20 @@ dependencies = [ "napi", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "thiserror", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "md-5" version = "0.10.6" @@ -1033,6 +1497,12 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1046,6 +1516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", + "simd-adler32", ] [[package]] @@ -1061,9 +1532,9 @@ dependencies = [ [[package]] name = "napi" -version = "2.16.2" +version = "2.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d04890ef4ec001fad791be785b8b920e2a3f5a6b1188e7a81dfa6197c0dee4" +checksum = "da1edd9510299935e4f52a24d1e69ebd224157e3e962c6c847edec5c2e4f786f" dependencies = [ "bitflags 2.5.0", "chrono", @@ -1084,23 +1555,23 @@ checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a" [[package]] name = "napi-derive" -version = "2.16.2" +version = "2.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff4a63f26a7aa9fa25df6ea36675890115972b207ae516e86bd0c47e31eba39" +checksum = "e5a6de411b6217dbb47cd7a8c48684b162309ff48a77df9228c082400dd5b030" dependencies = [ "cfg-if", "convert_case", "napi-derive-backend", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "napi-derive-backend" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e76afe642e2424ebe465406e328e4316d82af1f79256231d4b0f184c67550a" +checksum = "c3e35868d43b178b0eb9c17bd018960b1b5dd1732a7d47c23debe8f5c4caf498" dependencies = [ "convert_case", "once_cell", @@ -1108,7 +1579,7 @@ dependencies = [ "quote", "regex", "semver", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1120,6 +1591,30 @@ dependencies = [ "libloading", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nom" version = "7.1.3" @@ -1130,6 +1625,24 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom-exif" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da85c96824dc1b583f55fd2c39e53b04482b4c199f25db27868db334bf06407" +dependencies = [ + "chrono", + "nom", + "regex", + "thiserror", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1197,6 +1710,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -1264,6 +1788,60 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "300.2.3+3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + [[package]] name = "ordered-float" version = "3.9.2" @@ -1290,11 +1868,11 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1305,9 +1883,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -1315,15 +1893,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -1376,6 +1954,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1415,6 +2013,19 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1443,7 +2054,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit", + "toml_edit 0.21.1", ] [[package]] @@ -1472,13 +2083,32 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.60", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -1499,6 +2129,21 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quote" version = "1.0.36" @@ -1544,6 +2189,76 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redis" version = "0.25.3" @@ -1568,6 +2283,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "regex" version = "1.10.4" @@ -1606,6 +2330,58 @@ dependencies = [ "bytecheck", ] +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.0", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.1.2", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.8" @@ -1716,9 +2492,9 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -1729,9 +2505,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "ring", "rustls-webpki", @@ -1747,6 +2523,22 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -1769,6 +2561,15 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -1791,11 +2592,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1832,11 +2633,11 @@ version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "sea-bae", - "syn 2.0.58", + "syn 2.0.60", "unicode-ident", ] @@ -1879,6 +2680,29 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "security-framework" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.22" @@ -1887,35 +2711,56 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -1978,9 +2823,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -1995,6 +2840,21 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simdutf8" version = "0.1.4" @@ -2112,7 +2972,7 @@ dependencies = [ "percent-encoding", "rust_decimal", "rustls", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", @@ -2149,7 +3009,7 @@ checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ "dotenvy", "either", - "heck", + "heck 0.4.1", "hex", "once_cell", "proc-macro2", @@ -2322,11 +3182,11 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2348,9 +3208,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -2366,7 +3226,47 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", ] [[package]] @@ -2375,6 +3275,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "tempfile" version = "3.10.1" @@ -2389,22 +3295,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2417,6 +3323,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.36" @@ -2490,7 +3407,17 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] @@ -2504,11 +3431,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.12", +] + [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -2518,9 +3474,50 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", ] +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.7", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.40" @@ -2541,7 +3538,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2579,6 +3576,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" @@ -2656,6 +3659,17 @@ dependencies = [ "serde", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" @@ -2668,12 +3682,27 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2707,10 +3736,22 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -2729,7 +3770,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2740,19 +3781,35 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "whoami" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "redox_syscall", + "redox_syscall 0.4.1", "wasite", ] @@ -2935,6 +3992,25 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wyz" version = "0.5.1" @@ -2967,7 +4043,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2975,3 +4051,27 @@ name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 056f1006b8..74d032aeae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,36 +5,40 @@ resolver = "2" [workspace.dependencies] macro_rs = { path = "packages/macro-rs" } -napi = { version = "2.16.2", default-features = false } -napi-derive = "2.16.2" +napi = { version = "2.16.4", default-features = false } +napi-derive = "2.16.3" napi-build = "2.1.3" argon2 = "0.5.3" basen = "0.1.0" bcrypt = "0.15.1" -chrono = "0.4.37" +chrono = "0.4.38" convert_case = "0.6.0" cuid2 = "0.1.2" -emojis = "0.6.1" +emojis = "0.6.2" idna = "0.5.0" +image = "0.25.1" +nom-exif = "1.2.0" once_cell = "1.19.0" +openssl = "0.10.64" pretty_assertions = "1.4.0" -proc-macro2 = "1.0.79" +proc-macro2 = "1.0.81" quote = "1.0.36" rand = "0.8.5" redis = "0.25.3" regex = "1.10.4" +reqwest = "0.12.4" rmp-serde = "1.2.0" sea-orm = "0.12.15" -serde = "1.0.197" -serde_json = "1.0.115" +serde = "1.0.198" +serde_json = "1.0.116" serde_yaml = "0.9.34" strum = "0.26.2" -syn = "2.0.58" -thiserror = "1.0.58" +syn = "2.0.60" +thiserror = "1.0.59" tokio = "1.37.0" tracing = "0.1.40" -tracing-subscriber = "0.3.1" +tracing-subscriber = "0.3.18" url = "2.5.0" urlencoding = "2.1.3" diff --git a/Dockerfile b/Dockerfile index 65c37e32b7..0327411cba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM docker.io/node:20-alpine as build WORKDIR /firefish # Install compilation dependencies -RUN apk update && apk add --no-cache build-base linux-headers curl ca-certificates python3 +RUN apk update && apk add --no-cache build-base linux-headers curl ca-certificates python3 perl RUN curl --proto '=https' --tlsv1.2 --silent --show-error --fail https://sh.rustup.rs | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" @@ -34,6 +34,7 @@ RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm install - # Copy in the rest of the rust files COPY packages/backend-rs packages/backend-rs/ +# COPY packages/macro-rs packages/macro-rs/ # Compile backend-rs RUN NODE_ENV='production' pnpm run --filter backend-rs build diff --git a/docs/changelog.md b/docs/changelog.md index 844c45b706..457a8b5a11 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ Critical security updates are indicated by the :warning: icon. - Server administrators should check [notice-for-admins.md](./notice-for-admins.md) as well. - Third-party client/bot developers may want to check [api-change.md](./api-change.md) as well. +## Unreleased + +- Add features to share links to an account in the three dots menu on the profile page +- Improve server logs +- Fix bugs + ## [v20240424](https://firefish.dev/firefish/firefish/-/merge_requests/10765/commits) - Improve the usability of the feature to prevent forgetting to write alt texts diff --git a/docs/downgrade.sql b/docs/downgrade.sql index 44222f818f..eed0079c3b 100644 --- a/docs/downgrade.sql +++ b/docs/downgrade.sql @@ -1,6 +1,7 @@ BEGIN; DELETE FROM "migrations" WHERE name IN ( + 'AlterAkaType1714099399879', 'AddDriveFileUsage1713451569342', 'ConvertCwVarcharToText1713225866247', 'FixChatFileConstraint1712855579316', @@ -24,6 +25,13 @@ DELETE FROM "migrations" WHERE name IN ( 'RemoveNativeUtilsMigration1705877093218' ); +-- alter-aka-type +ALTER TABLE "user" RENAME COLUMN "alsoKnownAs" TO "alsoKnownAsOld"; +ALTER TABLE "user" ADD COLUMN "alsoKnownAs" text; +UPDATE "user" SET "alsoKnownAs" = array_to_string("alsoKnownAsOld", ','); +COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too'; +ALTER TABLE "user" DROP COLUMN "alsoKnownAsOld"; + -- AddDriveFileUsage ALTER TABLE "drive_file" DROP COLUMN "usageHint"; DROP TYPE "drive_file_usage_hint_enum"; diff --git a/locales/bg-BG.yml b/locales/bg-BG.yml index 45bd1eb465..75bb03773d 100644 --- a/locales/bg-BG.yml +++ b/locales/bg-BG.yml @@ -19,7 +19,7 @@ deleteAndEditConfirm: Сигурни ли сте, че искате да изт copyUsername: Копиране на потребителското име searchUser: Търсене на потребител reply: Отговор -showMore: Покажи още +showMore: Показване на повече loadMore: Зареди още followRequestAccepted: Заявката за последване е приета importAndExport: Импорт/експорт на данни @@ -336,6 +336,10 @@ _pages: title: Заглавие my: Моите страници pageSetting: Настройки на страницата + url: Адрес на страницата + summary: Кратко обобщение + alignCenter: Центриране на елементите + variables: Променливи _deck: _columns: notifications: Известия @@ -398,7 +402,7 @@ sendMessage: Изпращане на съобщение jumpToPrevious: Премини към предишно newer: по-ново older: по-старо -showLess: Покажи по-малко +showLess: Показване на по-малко youGotNewFollower: те последва receiveFollowRequest: Заявка за последване получена mention: Споменаване @@ -754,7 +758,7 @@ _feeds: general: Общи metadata: Метаданни disk: Диск -featured: Препоръчани +featured: Препоръчано yearsOld: на {age} години reload: Опресняване invites: Покани @@ -940,3 +944,11 @@ showGapBetweenNotesInTimeline: Показване на празнина межд lookup: Поглеждане media: Мултимедия welcomeBackWithName: Добре дошли отново, {name} +reduceUiAnimation: Намаляване на UI анимациите +clickToFinishEmailVerification: Моля, натиснете [{ok}], за да завършите потвърждаването + на ел. поща. +_cw: + show: Показване на съдържанието +remoteFollow: Отдалечено последване +messagingUnencryptedInfo: Чатовете във Firefish не са шифровани от край до край. Не + споделяйте чувствителна информация през Firefish. diff --git a/locales/en-US.yml b/locales/en-US.yml index 7ccda1426c..fa2a0b11ce 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1011,6 +1011,8 @@ isSystemAccount: "This account is created and automatically operated by the syst Please do not moderate, edit, delete, or otherwise tamper with this account, or it may break your server." typeToConfirm: "Please enter {x} to confirm" +useThisAccountConfirm: "Do you want to continue with this account?" +inputAccountId: "Please input your account (e.g., @firefish@info.firefish.dev)" deleteAccount: "Delete account" document: "Documentation" numberOfPageCache: "Number of cached pages" @@ -1157,6 +1159,9 @@ addRe: "Add \"re:\" at the beginning of comment in reply to a post with a conten confirm: "Confirm" importZip: "Import ZIP" exportZip: "Export ZIP" +getQrCode: "Show QR code" +remoteFollow: "Remote follow" +copyRemoteFollowUrl: "Copy remote follow URL" emojiPackCreator: "Emoji pack creator" indexable: "Indexable" indexableDescription: "Allow built-in search to show your public posts" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 6367dda9f4..5d7a1ecef8 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -928,6 +928,8 @@ colored: "Coloré" label: "Étiquette" localOnly: "Local seulement" account: "Comptes" +getQrCode: "Obtenir le code QR" + _emailUnavailable: used: "Adresse non disponible" format: "Le format de cette adresse de courriel est invalide" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 4535492e7d..be780444a4 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -1825,6 +1825,7 @@ _notification: reacted: mereaksi postinganmu renoted: memposting ulang postinganmu voted: memilih di angketmu + andCountUsers: dan {count} lebih banyak pengguna {acted} _deck: alwaysShowMainColumn: "Selalu tampilkan kolom utama" columnAlign: "Luruskan kolom" @@ -2267,3 +2268,13 @@ markLocalFilesNsfwByDefaultDescription: Terlepas dari pengaturan ini, pengguna d menghapus sendiri tanda NSFW. Berkas yang ada tidak berpengaruh. noteEditHistory: Riwayat penyuntingan kiriman media: Media +antennaLimit: Jumlah antena maksimum yang dapat dibuat oleh setiap pengguna +showAddFileDescriptionAtFirstPost: Buka formulir secara otomatis untuk menulis deskripsi + ketika mencoba mengirim berkas tanpa deskripsi +remoteFollow: Ikuti jarak jauh +foldNotification: Kelompokkan notifikasi yang sama +getQrCode: Tampilkan kode QR +cannotEditVisibility: Kamu tidak bisa menyunting keterlihatan +useThisAccountConfirm: Apakah kamu ingin melanjutkan dengan akun ini? +inputAccountId: Silakan memasukkan akunmu (misalnya, @firefish@info.firefish.dev) +copyRemoteFollowUrl: Salin URL ikuti jarak jauh diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fef91cb81b..7bd3db376d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1902,6 +1902,7 @@ _notification: reacted: がリアクションしました renoted: がブーストしました voted: が投票しました + andCountUsers: と{count}人が{acted}しました _deck: alwaysShowMainColumn: "常にメインカラムを表示" columnAlign: "カラムの寄せ" @@ -2059,3 +2060,10 @@ markLocalFilesNsfwByDefaultDescription: この設定が有効でも、ユーザ noteEditHistory: 編集履歴 showAddFileDescriptionAtFirstPost: 説明の無い添付ファイルを投稿しようとした際に説明を書く画面を自動で開く antennaLimit: 各ユーザーが作れるアンテナの最大数 +inputAccountId: 'あなたのアカウントを入力してください(例: @firefish@info.firefish.dev)' +remoteFollow: リモートフォロー +cannotEditVisibility: 公開範囲は変更できません +useThisAccountConfirm: このアカウントで操作を続けますか? +getQrCode: QRコードを表示 +copyRemoteFollowUrl: リモートからフォローするURLをコピー +foldNotification: 同じ種類の通知をまとめて表示する diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index bfc0915101..7642fc80db 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -879,6 +879,8 @@ driveCapOverrideCaption: "输入 0 或以下的值将容量重置为默认值。 requireAdminForView: "您需要使用管理员账号登录才能查看。" isSystemAccount: "该账号由系统自动创建。请不要修改、编辑、删除或以其它方式篡改这个账号,否则可能会破坏您的服务器。" typeToConfirm: "输入 {x} 以确认操作" +useThisAccountConfirm: "您想使用此帐户继续执行此操作吗?" +inputAccountId: "请输入您的帐户(例如 @firefish@info.firefish.dev )" deleteAccount: "删除账号" document: "文档" numberOfPageCache: "缓存页数" @@ -1974,6 +1976,9 @@ origin: 起源 confirm: 确认 importZip: 导入 ZIP exportZip: 导出 ZIP +getQrCode: "获取二维码" +remoteFollow: "远程关注" +copyRemoteFollowUrl: "复制远程关注 URL" emojiPackCreator: 表情包创建工具 objectStorageS3ForcePathStyleDesc: 打开此选项可构建格式为 "s3.amazonaws.com//" 而非 ".s3.amazonaws.com" 的端点 URL。 diff --git a/package.json b/package.json index 0e5f0e77ab..0cb06c2bbb 100644 --- a/package.json +++ b/package.json @@ -45,11 +45,11 @@ "js-yaml": "4.1.0" }, "devDependencies": { - "@biomejs/biome": "1.6.4", - "@biomejs/cli-darwin-arm64": "^1.6.4", - "@biomejs/cli-darwin-x64": "^1.6.4", - "@biomejs/cli-linux-arm64": "^1.6.4", - "@biomejs/cli-linux-x64": "^1.6.4", + "@biomejs/biome": "1.7.1", + "@biomejs/cli-darwin-arm64": "^1.7.1", + "@biomejs/cli-darwin-x64": "^1.7.1", + "@biomejs/cli-linux-arm64": "^1.7.1", + "@biomejs/cli-linux-x64": "^1.7.1", "@types/node": "20.12.7", "execa": "8.0.1", "pnpm": "8.15.7", diff --git a/packages/backend-rs/Cargo.toml b/packages/backend-rs/Cargo.toml index 22c786c6d5..c1b511b992 100644 --- a/packages/backend-rs/Cargo.toml +++ b/packages/backend-rs/Cargo.toml @@ -24,10 +24,14 @@ chrono = { workspace = true } cuid2 = { workspace = true } emojis = { workspace = true } idna = { workspace = true } +image = { workspace = true } +nom-exif = { workspace = true } once_cell = { workspace = true } +openssl = { workspace = true, features = ["vendored"] } rand = { workspace = true } redis = { workspace = true } regex = { workspace = true } +reqwest = { workspace = true, features = ["blocking"] } rmp-serde = { workspace = true } sea-orm = { workspace = true, features = ["sqlx-postgres", "runtime-tokio-rustls"] } serde = { workspace = true, features = ["derive"] } diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts index c0f0406e74..5b9d0ee894 100644 --- a/packages/backend-rs/index.d.ts +++ b/packages/backend-rs/index.d.ts @@ -248,6 +248,11 @@ export function sqlLikeEscape(src: string): string export function safeForSql(src: string): boolean /** Convert milliseconds to a human readable string */ export function formatMilliseconds(milliseconds: number): string +export interface ImageSize { + width: number + height: number +} +export function getImageSizeFromUrl(url: string): Promise /** TODO: handle name collisions better */ export interface NoteLikeForGetNoteSummary { fileIds: Array @@ -1012,10 +1017,10 @@ export interface User { isDeleted: boolean driveCapacityOverrideMb: number | null movedToUri: string | null - alsoKnownAs: string | null speakAsCat: boolean emojiModPerm: UserEmojimodpermEnum isIndexable: boolean + alsoKnownAs: Array | null } export interface UserGroup { id: string @@ -1144,6 +1149,7 @@ export interface Webhook { export function initializeRustLogger(): void export function watchNote(watcherId: string, noteAuthorId: string, noteId: string): Promise export function unwatchNote(watcherId: string, noteId: string): Promise +export function publishToChannelStream(channelId: string, userId: string): void export enum ChatEvent { Message = 'message', Read = 'read', @@ -1151,6 +1157,31 @@ export enum ChatEvent { Typing = 'typing' } export function publishToChatStream(senderUserId: string, receiverUserId: string, kind: ChatEvent, object: any): void +export enum ChatIndexEvent { + Message = 'message', + Read = 'read' +} +export function publishToChatIndexStream(userId: string, kind: ChatIndexEvent, object: any): void +export interface PackedEmoji { + id: string + aliases: Array + name: string + category: string | null + host: string | null + url: string + license: string | null + width: number | null + height: number | null +} +export function publishToBroadcastStream(emoji: PackedEmoji): void +export function publishToGroupChatStream(groupId: string, kind: ChatEvent, object: any): void +export interface AbuseUserReportLike { + id: string + targetUserId: string + reporterId: string + comment: string +} +export function publishToModerationStream(moderatorId: string, report: AbuseUserReportLike): void export function getTimestamp(id: string): number /** * The generated ID results in the form of `[8 chars timestamp] + [cuid2]`. diff --git a/packages/backend-rs/index.js b/packages/backend-rs/index.js index 1c3a2f4195..b351840dfe 100644 --- a/packages/backend-rs/index.js +++ b/packages/backend-rs/index.js @@ -310,7 +310,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initializeRustLogger, watchNote, unwatchNote, ChatEvent, publishToChatStream, getTimestamp, genId, genIdAt, secureRndstr } = nativeBinding +const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, addNoteToAntenna, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, AntennaSrcEnum, DriveFileUsageHintEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initializeRustLogger, watchNote, unwatchNote, publishToChannelStream, ChatEvent, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, getTimestamp, genId, genIdAt, secureRndstr } = nativeBinding module.exports.SECOND = SECOND module.exports.MINUTE = MINUTE @@ -337,6 +337,7 @@ module.exports.isUnicodeEmoji = isUnicodeEmoji module.exports.sqlLikeEscape = sqlLikeEscape module.exports.safeForSql = safeForSql module.exports.formatMilliseconds = formatMilliseconds +module.exports.getImageSizeFromUrl = getImageSizeFromUrl module.exports.getNoteSummary = getNoteSummary module.exports.toMastodonId = toMastodonId module.exports.fromMastodonId = fromMastodonId @@ -364,8 +365,14 @@ module.exports.UserProfileMutingnotificationtypesEnum = UserProfileMutingnotific module.exports.initializeRustLogger = initializeRustLogger module.exports.watchNote = watchNote module.exports.unwatchNote = unwatchNote +module.exports.publishToChannelStream = publishToChannelStream module.exports.ChatEvent = ChatEvent module.exports.publishToChatStream = publishToChatStream +module.exports.ChatIndexEvent = ChatIndexEvent +module.exports.publishToChatIndexStream = publishToChatIndexStream +module.exports.publishToBroadcastStream = publishToBroadcastStream +module.exports.publishToGroupChatStream = publishToGroupChatStream +module.exports.publishToModerationStream = publishToModerationStream module.exports.getTimestamp = getTimestamp module.exports.genId = genId module.exports.genIdAt = genIdAt diff --git a/packages/backend-rs/src/misc/get_image_size.rs b/packages/backend-rs/src/misc/get_image_size.rs new file mode 100644 index 0000000000..9c55846424 --- /dev/null +++ b/packages/backend-rs/src/misc/get_image_size.rs @@ -0,0 +1,200 @@ +use crate::misc::redis_cache::{get_cache, set_cache, CacheError}; +use crate::util::http_client; +use image::{io::Reader, ImageError, ImageFormat}; +use nom_exif::{parse_jpeg_exif, EntryValue, ExifTag}; +use std::io::Cursor; +use tokio::sync::Mutex; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("Redis cache error: {0}")] + CacheErr(#[from] CacheError), + #[error("Reqwest error: {0}")] + ReqwestErr(#[from] reqwest::Error), + #[error("Image decoding error: {0}")] + ImageErr(#[from] ImageError), + #[error("Image decoding error: {0}")] + IoErr(#[from] std::io::Error), + #[error("Exif extraction error: {0}")] + ExifErr(#[from] nom_exif::Error), + #[error("Emoji meta attempt limit exceeded: {0}")] + TooManyAttempts(String), + #[error("Unsupported image type: {0}")] + UnsupportedImageErr(String), +} + +const BROWSER_SAFE_IMAGE_TYPES: [ImageFormat; 8] = [ + ImageFormat::Png, + ImageFormat::Jpeg, + ImageFormat::Gif, + ImageFormat::WebP, + ImageFormat::Tiff, + ImageFormat::Bmp, + ImageFormat::Ico, + ImageFormat::Avif, +]; + +static MTX_GUARD: Mutex<()> = Mutex::const_new(()); + +#[derive(Debug, PartialEq)] +#[crate::export(object)] +pub struct ImageSize { + pub width: u32, + pub height: u32, +} + +#[crate::export] +pub async fn get_image_size_from_url(url: &str) -> Result { + let attempted: bool; + + { + let _ = MTX_GUARD.lock().await; + + let key = format!("fetchImage:{}", url); + attempted = get_cache::(&key)?.is_some(); + + if !attempted { + set_cache(&key, &true, 10 * 60)?; + } + } + + if attempted { + tracing::warn!("attempt limit exceeded: {}", url); + return Err(Error::TooManyAttempts(url.to_string())); + } + + tracing::info!("retrieving image size from {}", url); + + let image_bytes = http_client()?.get(url).send().await?.bytes().await?; + let reader = Reader::new(Cursor::new(&image_bytes)).with_guessed_format()?; + + let format = reader.format(); + if format.is_none() || !BROWSER_SAFE_IMAGE_TYPES.contains(&format.unwrap()) { + return Err(Error::UnsupportedImageErr(format!("{:?}", format))); + } + + let size = reader.into_dimensions()?; + + let res = ImageSize { + width: size.0, + height: size.1, + }; + + if format.unwrap() != ImageFormat::Jpeg { + return Ok(res); + } + + // handle jpeg orientation + // https://magnushoff.com/articles/jpeg-orientation/ + + let exif = parse_jpeg_exif(&*image_bytes)?; + if exif.is_none() { + return Ok(res); + } + + let orientation = exif.unwrap().get_value(&ExifTag::Orientation)?; + let rotated = + orientation.is_some() && matches!(orientation.unwrap(), EntryValue::U32(v) if v >= 5); + + if !rotated { + return Ok(res); + } + + Ok(ImageSize { + width: size.1, + height: size.0, + }) +} + +#[cfg(test)] +mod unit_test { + use super::{get_image_size_from_url, ImageSize}; + use crate::misc::redis_cache::delete_cache; + use pretty_assertions::assert_eq; + + #[tokio::test] + async fn test_get_image_size() { + let png_url_1 = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/splash.png"; + let png_url_2 = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/notification-badges/at.png"; + let png_url_3 = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/api-doc.png"; + let rotated_jpeg_url = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/test/resources/rotate.jpg"; + let webp_url_1 = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/custom/assets/badges/error.webp"; + let webp_url_2 = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/screenshots/1.webp"; + let ico_url = "https://firefish.dev/firefish/firefish/-/raw/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/favicon.ico"; + let gif_url = "https://firefish.dev/firefish/firefish/-/raw/b9c3dfbd3d473cb2cee20c467eeae780bc401271/packages/backend/test/resources/anime.gif"; + let mp3_url = "https://firefish.dev/firefish/firefish/-/blob/5891a90f71a8b9d5ea99c683ade7e485c685d642/packages/backend/assets/sounds/aisha/1.mp3"; + + // Delete caches in case you run this test multiple times + // (should be disabled in CI tasks) + delete_cache(&format!("fetchImage:{}", png_url_1)).unwrap(); + delete_cache(&format!("fetchImage:{}", png_url_2)).unwrap(); + delete_cache(&format!("fetchImage:{}", png_url_3)).unwrap(); + delete_cache(&format!("fetchImage:{}", rotated_jpeg_url)).unwrap(); + delete_cache(&format!("fetchImage:{}", webp_url_1)).unwrap(); + delete_cache(&format!("fetchImage:{}", webp_url_2)).unwrap(); + delete_cache(&format!("fetchImage:{}", ico_url)).unwrap(); + delete_cache(&format!("fetchImage:{}", gif_url)).unwrap(); + delete_cache(&format!("fetchImage:{}", mp3_url)).unwrap(); + + let png_size_1 = ImageSize { + width: 1024, + height: 1024, + }; + let png_size_2 = ImageSize { + width: 96, + height: 96, + }; + let png_size_3 = ImageSize { + width: 1024, + height: 354, + }; + let rotated_jpeg_size = ImageSize { + width: 256, + height: 512, + }; + let webp_size_1 = ImageSize { + width: 256, + height: 256, + }; + let webp_size_2 = ImageSize { + width: 1080, + height: 2340, + }; + let ico_size = ImageSize { + width: 256, + height: 256, + }; + let gif_size = ImageSize { + width: 256, + height: 256, + }; + + assert_eq!( + png_size_1, + get_image_size_from_url(png_url_1).await.unwrap() + ); + assert_eq!( + png_size_2, + get_image_size_from_url(png_url_2).await.unwrap() + ); + assert_eq!( + png_size_3, + get_image_size_from_url(png_url_3).await.unwrap() + ); + assert_eq!( + rotated_jpeg_size, + get_image_size_from_url(rotated_jpeg_url).await.unwrap() + ); + assert_eq!( + webp_size_1, + get_image_size_from_url(webp_url_1).await.unwrap() + ); + assert_eq!( + webp_size_2, + get_image_size_from_url(webp_url_2).await.unwrap() + ); + assert_eq!(ico_size, get_image_size_from_url(ico_url).await.unwrap()); + assert_eq!(gif_size, get_image_size_from_url(gif_url).await.unwrap()); + assert!(get_image_size_from_url(mp3_url).await.is_err()); + } +} diff --git a/packages/backend-rs/src/misc/mod.rs b/packages/backend-rs/src/misc/mod.rs index 049c744f62..0ba15dc8e4 100644 --- a/packages/backend-rs/src/misc/mod.rs +++ b/packages/backend-rs/src/misc/mod.rs @@ -6,6 +6,7 @@ pub mod convert_host; pub mod emoji; pub mod escape_sql; pub mod format_milliseconds; +pub mod get_image_size; pub mod get_note_summary; pub mod mastodon_id; pub mod meta; diff --git a/packages/backend-rs/src/misc/redis_cache.rs b/packages/backend-rs/src/misc/redis_cache.rs index d4924bb646..81ac840b8d 100644 --- a/packages/backend-rs/src/misc/redis_cache.rs +++ b/packages/backend-rs/src/misc/redis_cache.rs @@ -3,7 +3,7 @@ use redis::{Commands, RedisError}; use serde::{Deserialize, Serialize}; #[derive(thiserror::Error, Debug)] -pub enum Error { +pub enum CacheError { #[error("Redis error: {0}")] RedisError(#[from] RedisError), #[error("Data serialization error: {0}")] @@ -12,27 +12,37 @@ pub enum Error { DeserializeError(#[from] rmp_serde::decode::Error), } +fn prefix_key(key: &str) -> String { + redis_key(format!("cache:{}", key)) +} + pub fn set_cache Deserialize<'a> + Serialize>( key: &str, value: &V, expire_seconds: u64, -) -> Result<(), Error> { +) -> Result<(), CacheError> { redis_conn()?.set_ex( - redis_key(key), + prefix_key(key), rmp_serde::encode::to_vec(&value)?, expire_seconds, )?; Ok(()) } -pub fn get_cache Deserialize<'a> + Serialize>(key: &str) -> Result, Error> { - let serialized_value: Option> = redis_conn()?.get(redis_key(key))?; +pub fn get_cache Deserialize<'a> + Serialize>( + key: &str, +) -> Result, CacheError> { + let serialized_value: Option> = redis_conn()?.get(prefix_key(key))?; Ok(match serialized_value { Some(v) => Some(rmp_serde::from_slice::(v.as_ref())?), None => None, }) } +pub fn delete_cache(key: &str) -> Result<(), CacheError> { + Ok(redis_conn()?.del(prefix_key(key))?) +} + #[cfg(test)] mod unit_test { use super::{get_cache, set_cache}; diff --git a/packages/backend-rs/src/model/entity/user.rs b/packages/backend-rs/src/model/entity/user.rs index f8a2b09324..3ceac93fb5 100644 --- a/packages/backend-rs/src/model/entity/user.rs +++ b/packages/backend-rs/src/model/entity/user.rs @@ -71,14 +71,14 @@ pub struct Model { pub drive_capacity_override_mb: Option, #[sea_orm(column_name = "movedToUri")] pub moved_to_uri: Option, - #[sea_orm(column_name = "alsoKnownAs", column_type = "Text", nullable)] - pub also_known_as: Option, #[sea_orm(column_name = "speakAsCat")] pub speak_as_cat: bool, #[sea_orm(column_name = "emojiModPerm")] pub emoji_mod_perm: UserEmojimodpermEnum, #[sea_orm(column_name = "isIndexable")] pub is_indexable: bool, + #[sea_orm(column_name = "alsoKnownAs")] + pub also_known_as: Option>, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] diff --git a/packages/backend-rs/src/service/log.rs b/packages/backend-rs/src/service/log.rs index 789400b4c2..07966b77ad 100644 --- a/packages/backend-rs/src/service/log.rs +++ b/packages/backend-rs/src/service/log.rs @@ -13,7 +13,7 @@ pub fn initialize_logger() { "info" => Level::INFO, "debug" => Level::DEBUG, "trace" => Level::TRACE, - _ => Level::INFO, + _ => Level::INFO, // Fallback }); } else if let Some(levels) = &CONFIG.log_level { // `logLevel` config is Deprecated @@ -27,13 +27,25 @@ pub fn initialize_logger() { builder = builder.with_max_level(Level::WARN); } else if levels.contains(&"error".to_string()) { builder = builder.with_max_level(Level::ERROR); + } else { + // Fallback + builder = builder.with_max_level(Level::INFO); } } else { // Fallback builder = builder.with_max_level(Level::INFO); }; - let subscriber = builder.with_level(true).pretty().finish(); + let subscriber = builder + .without_time() + .with_level(true) + .with_ansi(true) + .with_target(true) + .with_thread_names(true) + .with_line_number(true) + .log_internal_errors(true) + .compact() + .finish(); tracing::subscriber::set_global_default(subscriber).expect("Failed to initialize the logger"); } diff --git a/packages/backend-rs/src/service/stream.rs b/packages/backend-rs/src/service/stream.rs index 46fafa64ba..279d343f10 100644 --- a/packages/backend-rs/src/service/stream.rs +++ b/packages/backend-rs/src/service/stream.rs @@ -1,5 +1,10 @@ pub mod antenna; +pub mod channel; pub mod chat; +pub mod chat_index; +pub mod custom_emoji; +pub mod group_chat; +pub mod moderation; use crate::config::CONFIG; use crate::database::redis_conn; @@ -10,9 +15,9 @@ pub enum Stream { #[strum(serialize = "internal")] Internal, #[strum(serialize = "broadcast")] - Broadcast, - #[strum(to_string = "adminStream:{user_id}")] - Admin { user_id: String }, + CustomEmoji, + #[strum(to_string = "adminStream:{moderator_id}")] + Moderation { moderator_id: String }, #[strum(to_string = "user:{user_id}")] User { user_id: String }, #[strum(to_string = "channelStream:{channel_id}")] @@ -37,7 +42,7 @@ pub enum Stream { #[strum(to_string = "messagingStream:{group_id}")] GroupChat { group_id: String }, #[strum(to_string = "messagingIndexStream:{user_id}")] - MessagingIndex { user_id: String }, + ChatIndex { user_id: String }, } #[derive(thiserror::Error, Debug)] @@ -57,7 +62,7 @@ pub fn publish_to_stream( ) -> Result<(), Error> { let message = if let Some(kind) = kind { format!( - "{{ \"type\": \"{}\", \"body\": {} }}", + "{{\"type\":\"{}\",\"body\":{}}}", kind, value.unwrap_or("null".to_string()), ) @@ -67,10 +72,7 @@ pub fn publish_to_stream( redis_conn()?.publish( &CONFIG.host, - format!( - "{{ \"channel\": \"{}\", \"message\": {} }}", - stream, message, - ), + format!("{{\"channel\":\"{}\",\"message\":{}}}", stream, message), )?; Ok(()) @@ -84,10 +86,10 @@ mod unit_test { #[test] fn channel_to_string() { assert_eq!(Stream::Internal.to_string(), "internal"); - assert_eq!(Stream::Broadcast.to_string(), "broadcast"); + assert_eq!(Stream::CustomEmoji.to_string(), "broadcast"); assert_eq!( - Stream::Admin { - user_id: "9tb42br63g5apjcq".to_string() + Stream::Moderation { + moderator_id: "9tb42br63g5apjcq".to_string() } .to_string(), "adminStream:9tb42br63g5apjcq" diff --git a/packages/backend-rs/src/service/stream/channel.rs b/packages/backend-rs/src/service/stream/channel.rs new file mode 100644 index 0000000000..10a04c5e66 --- /dev/null +++ b/packages/backend-rs/src/service/stream/channel.rs @@ -0,0 +1,10 @@ +use crate::service::stream::{publish_to_stream, Error, Stream}; + +#[crate::export(js_name = "publishToChannelStream")] +pub fn publish(channel_id: String, user_id: String) -> Result<(), Error> { + publish_to_stream( + &Stream::Channel { channel_id }, + Some("typing".to_string()), + Some(format!("\"{}\"", user_id)), + ) +} diff --git a/packages/backend-rs/src/service/stream/chat.rs b/packages/backend-rs/src/service/stream/chat.rs index ae2efce938..3015d921e1 100644 --- a/packages/backend-rs/src/service/stream/chat.rs +++ b/packages/backend-rs/src/service/stream/chat.rs @@ -13,12 +13,15 @@ pub enum ChatEvent { Typing, } +// We want to merge `kind` and `object` into a single enum +// https://github.com/napi-rs/napi-rs/issues/2036 + #[crate::export(js_name = "publishToChatStream")] pub fn publish( sender_user_id: String, receiver_user_id: String, kind: ChatEvent, - object: &serde_json::Value, // TODO?: change this to enum + object: &serde_json::Value, ) -> Result<(), Error> { publish_to_stream( &Stream::Chat { diff --git a/packages/backend-rs/src/service/stream/chat_index.rs b/packages/backend-rs/src/service/stream/chat_index.rs new file mode 100644 index 0000000000..eb64384dca --- /dev/null +++ b/packages/backend-rs/src/service/stream/chat_index.rs @@ -0,0 +1,26 @@ +use crate::service::stream::{publish_to_stream, Error, Stream}; + +#[derive(strum::Display)] +#[crate::export(string_enum = "camelCase")] +pub enum ChatIndexEvent { + #[strum(serialize = "message")] + Message, + #[strum(serialize = "read")] + Read, +} + +// We want to merge `kind` and `object` into a single enum +// https://github.com/napi-rs/napi-rs/issues/2036 + +#[crate::export(js_name = "publishToChatIndexStream")] +pub fn publish( + user_id: String, + kind: ChatIndexEvent, + object: &serde_json::Value, +) -> Result<(), Error> { + publish_to_stream( + &Stream::ChatIndex { user_id }, + Some(kind.to_string()), + Some(serde_json::to_string(object)?), + ) +} diff --git a/packages/backend-rs/src/service/stream/custom_emoji.rs b/packages/backend-rs/src/service/stream/custom_emoji.rs new file mode 100644 index 0000000000..21158fc761 --- /dev/null +++ b/packages/backend-rs/src/service/stream/custom_emoji.rs @@ -0,0 +1,27 @@ +use crate::service::stream::{publish_to_stream, Error, Stream}; +use serde::{Deserialize, Serialize}; + +// TODO: define schema type in other place +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +#[crate::export(object)] +pub struct PackedEmoji { + pub id: String, + pub aliases: Vec, + pub name: String, + pub category: Option, + pub host: Option, + pub url: String, + pub license: Option, + pub width: Option, + pub height: Option, +} + +#[crate::export(js_name = "publishToBroadcastStream")] +pub fn publish(emoji: &PackedEmoji) -> Result<(), Error> { + publish_to_stream( + &Stream::CustomEmoji, + Some("emojiAdded".to_string()), + Some(format!("{{\"emoji\":{}}}", serde_json::to_string(emoji)?)), + ) +} diff --git a/packages/backend-rs/src/service/stream/group_chat.rs b/packages/backend-rs/src/service/stream/group_chat.rs new file mode 100644 index 0000000000..1e676bbef5 --- /dev/null +++ b/packages/backend-rs/src/service/stream/group_chat.rs @@ -0,0 +1,13 @@ +use crate::service::stream::{chat::ChatEvent, publish_to_stream, Error, Stream}; + +// We want to merge `kind` and `object` into a single enum +// https://github.com/napi-rs/napi-rs/issues/2036 + +#[crate::export(js_name = "publishToGroupChatStream")] +pub fn publish(group_id: String, kind: ChatEvent, object: &serde_json::Value) -> Result<(), Error> { + publish_to_stream( + &Stream::GroupChat { group_id }, + Some(kind.to_string()), + Some(serde_json::to_string(object)?), + ) +} diff --git a/packages/backend-rs/src/service/stream/moderation.rs b/packages/backend-rs/src/service/stream/moderation.rs new file mode 100644 index 0000000000..576bf9fd21 --- /dev/null +++ b/packages/backend-rs/src/service/stream/moderation.rs @@ -0,0 +1,21 @@ +use crate::service::stream::{publish_to_stream, Error, Stream}; +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +#[crate::export(object)] +pub struct AbuseUserReportLike { + pub id: String, + pub target_user_id: String, + pub reporter_id: String, + pub comment: String, +} + +#[crate::export(js_name = "publishToModerationStream")] +pub fn publish(moderator_id: String, report: &AbuseUserReportLike) -> Result<(), Error> { + publish_to_stream( + &Stream::Moderation { moderator_id }, + Some("newAbuseUserReport".to_string()), + Some(serde_json::to_string(report)?), + ) +} diff --git a/packages/backend-rs/src/util/http_client.rs b/packages/backend-rs/src/util/http_client.rs new file mode 100644 index 0000000000..143e1a2885 --- /dev/null +++ b/packages/backend-rs/src/util/http_client.rs @@ -0,0 +1,24 @@ +use crate::config::CONFIG; +use once_cell::sync::OnceCell; +use reqwest::{Client, Error, NoProxy, Proxy}; +use std::time::Duration; + +static CLIENT: OnceCell = OnceCell::new(); + +pub fn http_client() -> Result { + CLIENT + .get_or_try_init(|| { + let mut builder = Client::builder().timeout(Duration::from_secs(5)); + + if let Some(proxy_url) = &CONFIG.proxy { + let mut proxy = Proxy::all(proxy_url)?; + if let Some(proxy_bypass_hosts) = &CONFIG.proxy_bypass_hosts { + proxy = proxy.no_proxy(NoProxy::from_string(&proxy_bypass_hosts.join(","))); + } + builder = builder.proxy(proxy); + } + + builder.build() + }) + .cloned() +} diff --git a/packages/backend-rs/src/util/mod.rs b/packages/backend-rs/src/util/mod.rs index 1be5a7fd1f..13fb8ee64b 100644 --- a/packages/backend-rs/src/util/mod.rs +++ b/packages/backend-rs/src/util/mod.rs @@ -1,2 +1,5 @@ +pub use http_client::http_client; + +pub mod http_client; pub mod id; pub mod random; diff --git a/packages/backend/package.json b/packages/backend/package.json index 7ac9205c58..5209b50c41 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -22,21 +22,21 @@ "@swc/core-android-arm64": "1.3.11" }, "dependencies": { - "@bull-board/api": "5.15.5", - "@bull-board/koa": "5.15.5", - "@bull-board/ui": "5.15.5", + "@bull-board/api": "5.16.0", + "@bull-board/koa": "5.16.0", + "@bull-board/ui": "5.16.0", "@discordapp/twemoji": "^15.0.3", "@koa/cors": "5.0.0", "@koa/multer": "3.0.2", "@koa/router": "12.0.1", "@ladjs/koa-views": "9.0.0", "@peertube/http-signature": "1.7.0", - "@redocly/openapi-core": "1.11.0", + "@redocly/openapi-core": "1.12.0", "@sinonjs/fake-timers": "11.2.2", "adm-zip": "0.5.10", "ajv": "8.12.0", "archiver": "7.0.1", - "aws-sdk": "2.1599.0", + "aws-sdk": "2.1608.0", "axios": "^1.6.8", "backend-rs": "workspace:*", "firefish-js": "workspace:*", @@ -62,7 +62,7 @@ "gunzip-maybe": "^1.4.2", "happy-dom": "^14.7.1", "hpagent": "1.2.0", - "ioredis": "5.3.2", + "ioredis": "5.4.1", "ip-cidr": "4.0.0", "is-svg": "5.0.0", "json5": "2.2.3", @@ -126,7 +126,7 @@ }, "devDependencies": { "@swc/cli": "0.3.12", - "@swc/core": "1.4.13", + "@swc/core": "1.5.0", "@types/adm-zip": "^0.5.5", "@types/color-convert": "^2.0.3", "@types/content-disposition": "^0.5.8", @@ -156,7 +156,7 @@ "@types/pug": "2.0.10", "@types/punycode": "2.1.4", "@types/qrcode": "1.5.5", - "@types/qs": "6.9.14", + "@types/qs": "6.9.15", "@types/random-seed": "0.3.5", "@types/ratelimiter": "3.4.6", "@types/rename": "1.0.7", @@ -171,7 +171,7 @@ "@types/websocket": "1.0.10", "@types/ws": "8.5.10", "cross-env": "7.0.3", - "eslint": "^9.0.0", + "eslint": "^9.1.1", "mocha": "10.4.0", "pug": "3.0.2", "strict-event-emitter-types": "2.0.0", @@ -179,7 +179,7 @@ "ts-loader": "9.5.1", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "type-fest": "4.15.0", + "type-fest": "4.17.0", "typescript": "5.4.5", "webpack": "^5.91.0", "ws": "8.16.0" diff --git a/packages/backend/src/migration/1714099399879-alter-aka-type.ts b/packages/backend/src/migration/1714099399879-alter-aka-type.ts new file mode 100644 index 0000000000..ecb031e32d --- /dev/null +++ b/packages/backend/src/migration/1714099399879-alter-aka-type.ts @@ -0,0 +1,36 @@ +import type { MigrationInterface, QueryRunner } from "typeorm"; + +export class AlterAkaType1714099399879 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user" RENAME COLUMN "alsoKnownAs" TO "alsoKnownAsOld"`, + ); + await queryRunner.query( + `ALTER TABLE "user" ADD COLUMN "alsoKnownAs" character varying(512)[]`, + ); + await queryRunner.query( + `UPDATE "user" SET "alsoKnownAs" = string_to_array("alsoKnownAsOld", ',')::character varying[]`, + ); + await queryRunner.query( + `UPDATE "user" SET "alsoKnownAs" = NULL WHERE "alsoKnownAs" = '{}'`, + ); + await queryRunner.query( + `COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too'`, + ); + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "alsoKnownAsOld"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "user" RENAME COLUMN "alsoKnownAs" TO "alsoKnownAsOld"`, + ); + await queryRunner.query(`ALTER TABLE "user" ADD COLUMN "alsoKnownAs" text`); + await queryRunner.query( + `UPDATE "user" SET "alsoKnownAs" = array_to_string("alsoKnownAsOld", ',')`, + ); + await queryRunner.query( + `COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too'`, + ); + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "alsoKnownAsOld"`); + } +} diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts deleted file mode 100644 index f970658f8e..0000000000 --- a/packages/backend/src/misc/emoji-meta.ts +++ /dev/null @@ -1,59 +0,0 @@ -import probeImageSize from "probe-image-size"; -import { Mutex } from "redis-semaphore"; - -import { FILE_TYPE_BROWSERSAFE } from "backend-rs"; -import Logger from "@/services/logger.js"; -import { Cache } from "./cache.js"; -import { redisClient } from "@/db/redis.js"; -import { inspect } from "node:util"; - -export type Size = { - width: number; - height: number; -}; - -const cache = new Cache("emojiMeta", 60 * 10); // once every 10 minutes for the same url -const logger = new Logger("emoji"); - -export async function getEmojiSize(url: string): Promise { - let attempted = true; - - const lock = new Mutex(redisClient, "getEmojiSize"); - await lock.acquire(); - - try { - attempted = (await cache.get(url)) === true; - if (!attempted) { - await cache.set(url, true); - } - } finally { - await lock.release(); - } - - if (attempted) { - logger.warn(`Attempt limit exceeded: ${url}`); - throw new Error("Too many attempts"); - } - - try { - logger.debug(`Retrieving emoji size from ${url}`); - const { width, height, mime } = await probeImageSize(url, { - timeout: 5000, - }); - if (!(mime.startsWith("image/") && FILE_TYPE_BROWSERSAFE.includes(mime))) { - throw new Error("Unsupported image type"); - } - return { width, height }; - } catch (e) { - throw new Error(`Unable to retrieve metadata:\n${inspect(e)}`); - } -} - -export function getNormalSize( - { width, height }: Size, - orientation?: number, -): Size { - return (orientation || 0) >= 5 - ? { width: height, height: width } - : { width, height }; -} diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 152acfedb7..69a2b4dc27 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -88,7 +88,9 @@ export class User { }) public movedToUri: string | null; - @Column("simple-array", { + @Column("varchar", { + length: 512, + array: true, nullable: true, comment: "URIs the user is known as too", }) diff --git a/packages/backend/src/queue/processors/system/local-emoji-size.ts b/packages/backend/src/queue/processors/system/local-emoji-size.ts index bd4dc6b5d4..fbd036ee57 100644 --- a/packages/backend/src/queue/processors/system/local-emoji-size.ts +++ b/packages/backend/src/queue/processors/system/local-emoji-size.ts @@ -3,7 +3,7 @@ import { IsNull } from "typeorm"; import { Emojis } from "@/models/index.js"; import { queueLogger } from "../../logger.js"; -import { getEmojiSize } from "@/misc/emoji-meta.js"; +import { getImageSizeFromUrl } from "backend-rs"; import { inspect } from "node:util"; const logger = queueLogger.createSubLogger("local-emoji-size"); @@ -21,7 +21,7 @@ export async function setLocalEmojiSizes( for (let i = 0; i < emojis.length; i++) { try { - const size = await getEmojiSize(emojis[i].publicUrl); + const size = await getImageSizeFromUrl(emojis[i].publicUrl); await Emojis.update(emojis[i].id, { width: size.width || null, height: size.height || null, diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index a7be3e9846..2d847ef968 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -13,7 +13,13 @@ import { extractPollFromQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; -import { extractHost, isSameOrigin, toPuny } from "backend-rs"; +import { + type ImageSize, + extractHost, + getImageSizeFromUrl, + isSameOrigin, + toPuny, +} from "backend-rs"; import { Emojis, Polls, @@ -46,7 +52,6 @@ import { UserProfiles } from "@/models/index.js"; import { In } from "typeorm"; import { config } from "@/config.js"; import { truncate } from "@/misc/truncate.js"; -import { type Size, getEmojiSize } from "@/misc/emoji-meta.js"; import { langmap } from "@/misc/langmap.js"; import { inspect } from "node:util"; @@ -488,11 +493,16 @@ export async function extractEmojis( tag.icon!.url !== exists.originalUrl || !(exists.width && exists.height) ) { - let size: Size = { width: 0, height: 0 }; - try { - size = await getEmojiSize(tag.icon!.url); - } catch { - /* skip if any error happens */ + let size: ImageSize | null = null; + if (tag.icon?.url != null) { + try { + size = await getImageSizeFromUrl(tag.icon.url); + } catch (err) { + apLogger.info( + `Failed to determine the size of the image: ${tag.icon.url}`, + ); + apLogger.debug(inspect(err)); + } } await Emojis.update( { @@ -504,8 +514,8 @@ export async function extractEmojis( originalUrl: tag.icon!.url, publicUrl: tag.icon!.url, updatedAt: new Date(), - width: size.width || null, - height: size.height || null, + width: size?.width || null, + height: size?.height || null, }, ); @@ -520,9 +530,9 @@ export async function extractEmojis( apLogger.info(`register emoji host=${host}, name=${name}`); - let size: Size = { width: 0, height: 0 }; + let size: ImageSize = { width: 0, height: 0 }; try { - size = await getEmojiSize(tag.icon!.url); + size = await getImageSizeFromUrl(tag.icon!.url); } catch { /* skip if any error happens */ } diff --git a/packages/backend/src/server/api/common/read-messaging-message.ts b/packages/backend/src/server/api/common/read-messaging-message.ts index 20777c8246..f322431608 100644 --- a/packages/backend/src/server/api/common/read-messaging-message.ts +++ b/packages/backend/src/server/api/common/read-messaging-message.ts @@ -1,9 +1,11 @@ +import { publishMainStream } from "@/services/stream.js"; import { - publishMainStream, - publishGroupMessagingStream, -} from "@/services/stream.js"; -import { publishToChatStream, ChatEvent } from "backend-rs"; -import { publishMessagingIndexStream } from "@/services/stream.js"; + publishToChatStream, + publishToGroupChatStream, + publishToChatIndexStream, + ChatEvent, + ChatIndexEvent, +} from "backend-rs"; import { pushNotification } from "@/services/push-notification.js"; import type { User, IRemoteUser } from "@/models/entities/user.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js"; @@ -55,7 +57,7 @@ export async function readUserMessagingMessage( // Publish event publishToChatStream(otherpartyId, userId, ChatEvent.Read, messageIds); - publishMessagingIndexStream(userId, "read", messageIds); + publishToChatIndexStream(userId, ChatIndexEvent.Read, messageIds); if (!(await Users.getHasUnreadMessagingMessage(userId))) { // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 @@ -126,11 +128,11 @@ export async function readGroupMessagingMessage( } // Publish event - publishGroupMessagingStream(groupId, "read", { + publishToGroupChatStream(groupId, ChatEvent.Read, { ids: reads, - userId: userId, + userId, }); - publishMessagingIndexStream(userId, "read", reads); + publishToChatIndexStream(userId, ChatIndexEvent.Read, reads); if (!(await Users.getHasUnreadMessagingMessage(userId))) { // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 8fa7579ceb..59139904bc 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -1,12 +1,17 @@ import define from "@/server/api/define.js"; import { Emojis, DriveFiles } from "@/models/index.js"; -import { genId } from "backend-rs"; +import { + type ImageSize, + genId, + getImageSizeFromUrl, + publishToBroadcastStream, +} from "backend-rs"; import { insertModerationLog } from "@/services/insert-moderation-log.js"; import { ApiError } from "@/server/api/error.js"; import rndstr from "rndstr"; -import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { getEmojiSize } from "@/misc/emoji-meta.js"; +import { apiLogger } from "@/server/api/logger.js"; +import { inspect } from "node:util"; export const meta = { tags: ["admin", "emoji"], @@ -49,7 +54,13 @@ export default define(meta, paramDef, async (ps, me) => { ? file.name.split(".")[0] : `_${rndstr("a-z0-9", 8)}_`; - const size = await getEmojiSize(file.url); + let size: ImageSize | null = null; + try { + size = await getImageSizeFromUrl(file.url); + } catch (err) { + apiLogger.info(`Failed to determine the image size: ${file.url}`); + apiLogger.debug(inspect(err)); + } const emoji = await Emojis.insert({ id: genId(), @@ -62,15 +73,13 @@ export default define(meta, paramDef, async (ps, me) => { publicUrl: file.webpublicUrl ?? file.url, type: file.webpublicType ?? file.type, license: null, - width: size.width || null, - height: size.height || null, + width: size?.width || null, + height: size?.height || null, }).then((x) => Emojis.findOneByOrFail(x.identifiers[0])); await db.queryResultCache!.remove(["meta_emojis"]); - publishBroadcastStream("emojiAdded", { - emoji: await Emojis.pack(emoji.id), - }); + publishToBroadcastStream(await Emojis.pack(emoji)); insertModerationLog(me, "addEmoji", { emojiId: emoji.id, diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts index 424baf4409..9b08076b35 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts @@ -1,12 +1,17 @@ import define from "@/server/api/define.js"; import { Emojis } from "@/models/index.js"; -import { genId } from "backend-rs"; +import { + type ImageSize, + genId, + getImageSizeFromUrl, + publishToBroadcastStream, +} from "backend-rs"; import { ApiError } from "@/server/api/error.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; import { uploadFromUrl } from "@/services/drive/upload-from-url.js"; -import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { getEmojiSize } from "@/misc/emoji-meta.js"; +import { apiLogger } from "@/server/api/logger.js"; +import { inspect } from "node:util"; export const meta = { tags: ["admin", "emoji"], @@ -76,7 +81,14 @@ export default define(meta, paramDef, async (ps, me) => { throw new ApiError(); } - const size = await getEmojiSize(driveFile.url); + let size: ImageSize | null = null; + + try { + size = await getImageSizeFromUrl(driveFile.url); + } catch (err) { + apiLogger.info(`Failed to determine the image size: ${driveFile.url}`); + apiLogger.debug(inspect(err)); + } const copied = await Emojis.insert({ id: genId(), @@ -88,15 +100,13 @@ export default define(meta, paramDef, async (ps, me) => { publicUrl: driveFile.webpublicUrl ?? driveFile.url, type: driveFile.webpublicType ?? driveFile.type, license: emoji.license, - width: size.width || null, - height: size.height || null, + width: size?.width ?? null, + height: size?.height ?? null, }).then((x) => Emojis.findOneByOrFail(x.identifiers[0])); await db.queryResultCache!.remove(["meta_emojis"]); - publishBroadcastStream("emojiAdded", { - emoji: await Emojis.pack(copied.id), - }); + publishToBroadcastStream(await Emojis.pack(copied)); return { id: copied.id, diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts index fda4aa0bb8..f43cd8ae0f 100644 --- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts +++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts @@ -1,10 +1,8 @@ import * as mfm from "mfm-js"; import sanitizeHtml from "sanitize-html"; -import { publishAdminStream } from "@/services/stream.js"; import { AbuseUserReports, UserProfiles, Users } from "@/models/index.js"; -import { genId } from "backend-rs"; +import { genId, publishToModerationStream } from "backend-rs"; import { sendEmail } from "@/services/send-email.js"; -import { fetchMeta } from "backend-rs"; import { getUser } from "@/server/api/common/getters.js"; import { ApiError } from "@/server/api/error.js"; import define from "@/server/api/define.js"; @@ -86,9 +84,8 @@ export default define(meta, paramDef, async (ps, me) => { ], }); - const meta = await fetchMeta(true); for (const moderator of moderators) { - publishAdminStream(moderator.id, "newAbuseUserReport", { + publishToModerationStream(moderator.id, { id: report.id, targetUserId: report.targetUserId, reporterId: report.reporterId, diff --git a/packages/backend/src/server/api/stream/index.ts b/packages/backend/src/server/api/stream/index.ts index 97337bd7e1..3bb0ca073b 100644 --- a/packages/backend/src/server/api/stream/index.ts +++ b/packages/backend/src/server/api/stream/index.ts @@ -15,10 +15,11 @@ import { import type { AccessToken } from "@/models/entities/access-token.js"; import type { UserProfile } from "@/models/entities/user-profile.js"; import { - publishChannelStream, - publishGroupMessagingStream, -} from "@/services/stream.js"; -import { publishToChatStream, ChatEvent } from "backend-rs"; + publishToChannelStream, + publishToChatStream, + publishToGroupChatStream, + ChatEvent, +} from "backend-rs"; import type { UserGroup } from "@/models/entities/user-group.js"; import type { Packed } from "@/misc/schema.js"; import { readNotification } from "@/server/api/common/read-notification.js"; @@ -512,9 +513,9 @@ export default class Connection { } } - private typingOnChannel(channel: ChannelModel["id"]) { + private typingOnChannel(channelId: ChannelModel["id"]) { if (this.user) { - publishChannelStream(channel, "typing", this.user.id); + publishToChannelStream(channelId, this.user.id); } } @@ -530,8 +531,8 @@ export default class Connection { ChatEvent.Typing, this.user.id, ); - } else if (param.group) { - publishGroupMessagingStream(param.group, "typing", this.user.id); + } else if (param.group != null) { + publishToGroupChatStream(param.group, ChatEvent.Typing, this.user.id); } } } diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts index 92fc7c6e79..2f1f552d03 100644 --- a/packages/backend/src/services/logger.ts +++ b/packages/backend/src/services/logger.ts @@ -47,8 +47,8 @@ export default class Logger { return logger; } - private showThisLog(logLevel: Level, configLevel: string) { - switch (configLevel) { + private showThisLog(logLevel: Level, configMaxLevel: string) { + switch (configMaxLevel) { case "error": return ["error"].includes(logLevel); case "warning": @@ -75,7 +75,10 @@ export default class Logger { if ( (config.maxLogLevel != null && !this.showThisLog(level, config.maxLogLevel)) || - (config.logLevel != null && !config.logLevel.includes(level)) + (config.logLevel != null && !config.logLevel.includes(level)) || + (config.maxLogLevel == null && + config.logLevel == null && + !this.showThisLog(level, "info")) ) return; if (!this.store) store = false; diff --git a/packages/backend/src/services/messages/create.ts b/packages/backend/src/services/messages/create.ts index 562e92e42a..d025f57fca 100644 --- a/packages/backend/src/services/messages/create.ts +++ b/packages/backend/src/services/messages/create.ts @@ -7,13 +7,17 @@ import { Mutings, Users, } from "@/models/index.js"; -import { genId, publishToChatStream, toPuny, ChatEvent } from "backend-rs"; -import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import { - publishMessagingIndexStream, - publishMainStream, - publishGroupMessagingStream, -} from "@/services/stream.js"; + genId, + publishToChatStream, + publishToGroupChatStream, + publishToChatIndexStream, + toPuny, + ChatEvent, + ChatIndexEvent, +} from "backend-rs"; +import type { MessagingMessage } from "@/models/entities/messaging-message.js"; +import { publishMainStream } from "@/services/stream.js"; import { pushNotification } from "@/services/push-notification.js"; import { Not } from "typeorm"; import type { Note } from "@/models/entities/note.js"; @@ -57,7 +61,11 @@ export async function createMessage( ChatEvent.Message, messageObj, ); - publishMessagingIndexStream(message.userId, "message", messageObj); + publishToChatIndexStream( + message.userId, + ChatIndexEvent.Message, + messageObj, + ); publishMainStream(message.userId, "messagingMessage", messageObj); } @@ -69,19 +77,27 @@ export async function createMessage( ChatEvent.Message, messageObj, ); - publishMessagingIndexStream(recipientUser.id, "message", messageObj); + publishToChatIndexStream( + recipientUser.id, + ChatIndexEvent.Message, + messageObj, + ); publishMainStream(recipientUser.id, "messagingMessage", messageObj); } - } else if (recipientGroup) { - // グループのストリーム - publishGroupMessagingStream(recipientGroup.id, "message", messageObj); + } else if (recipientGroup != null) { + // group's stream + publishToGroupChatStream(recipientGroup.id, ChatEvent.Message, messageObj); - // メンバーのストリーム + // member's stream const joinings = await UserGroupJoinings.findBy({ userGroupId: recipientGroup.id, }); for (const joining of joinings) { - publishMessagingIndexStream(joining.userId, "message", messageObj); + publishToChatIndexStream( + joining.userId, + ChatIndexEvent.Message, + messageObj, + ); publishMainStream(joining.userId, "messagingMessage", messageObj); } } diff --git a/packages/backend/src/services/messages/delete.ts b/packages/backend/src/services/messages/delete.ts index 745c89380d..5fc4c812e2 100644 --- a/packages/backend/src/services/messages/delete.ts +++ b/packages/backend/src/services/messages/delete.ts @@ -1,8 +1,11 @@ import { config } from "@/config.js"; import { MessagingMessages, Users } from "@/models/index.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js"; -import { publishGroupMessagingStream } from "@/services/stream.js"; -import { publishToChatStream, ChatEvent } from "backend-rs"; +import { + publishToChatStream, + publishToGroupChatStream, + ChatEvent, +} from "backend-rs"; import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderDelete from "@/remote/activitypub/renderer/delete.js"; import renderTombstone from "@/remote/activitypub/renderer/tombstone.js"; @@ -42,7 +45,7 @@ async function postDeleteMessage(message: MessagingMessage) { ); deliver(user, activity, recipient.inbox); } - } else if (message.groupId) { - publishGroupMessagingStream(message.groupId, "deleted", message.id); + } else if (message.groupId != null) { + publishToGroupChatStream(message.groupId, ChatEvent.Deleted, message.id); } } diff --git a/packages/backend/src/services/stream.ts b/packages/backend/src/services/stream.ts index 00d33dbb30..36914d4d41 100644 --- a/packages/backend/src/services/stream.ts +++ b/packages/backend/src/services/stream.ts @@ -2,21 +2,21 @@ import { redisClient } from "@/db/redis.js"; import type { User } from "@/models/entities/user.js"; import type { Note } from "@/models/entities/note.js"; import type { UserList } from "@/models/entities/user-list.js"; -import type { UserGroup } from "@/models/entities/user-group.js"; +// import type { UserGroup } from "@/models/entities/user-group.js"; import { config } from "@/config.js"; // import type { Antenna } from "@/models/entities/antenna.js"; -import type { Channel } from "@/models/entities/channel.js"; +// import type { Channel } from "@/models/entities/channel.js"; import type { StreamChannels, - AdminStreamTypes, + // AdminStreamTypes, // AntennaStreamTypes, - BroadcastTypes, - ChannelStreamTypes, + // BroadcastTypes, + // ChannelStreamTypes, DriveStreamTypes, - GroupMessagingStreamTypes, + // GroupMessagingStreamTypes, InternalStreamTypes, MainStreamTypes, - MessagingIndexStreamTypes, + // MessagingIndexStreamTypes, // MessagingStreamTypes, NoteStreamTypes, UserListStreamTypes, @@ -64,16 +64,17 @@ class Publisher { ); }; - public publishBroadcastStream = ( - type: K, - value?: BroadcastTypes[K], - ): void => { - this.publish( - "broadcast", - type, - typeof value === "undefined" ? null : value, - ); - }; + /* ported to backend-rs */ + // public publishBroadcastStream = ( + // type: K, + // value?: BroadcastTypes[K], + // ): void => { + // this.publish( + // "broadcast", + // type, + // typeof value === "undefined" ? null : value, + // ); + // }; public publishMainStream = ( userId: User["id"], @@ -110,17 +111,18 @@ class Publisher { }); }; - public publishChannelStream = ( - channelId: Channel["id"], - type: K, - value?: ChannelStreamTypes[K], - ): void => { - this.publish( - `channelStream:${channelId}`, - type, - typeof value === "undefined" ? null : value, - ); - }; + /* ported to backend-rs */ + // public publishChannelStream = ( + // channelId: Channel["id"], + // type: K, + // value?: ChannelStreamTypes[K], + // ): void => { + // this.publish( + // `channelStream:${channelId}`, + // type, + // typeof value === "undefined" ? null : value, + // ); + // }; public publishUserListStream = ( listId: UserList["id"], @@ -161,49 +163,52 @@ class Publisher { // ); // }; - public publishGroupMessagingStream = < - K extends keyof GroupMessagingStreamTypes, - >( - groupId: UserGroup["id"], - type: K, - value?: GroupMessagingStreamTypes[K], - ): void => { - this.publish( - `messagingStream:${groupId}`, - type, - typeof value === "undefined" ? null : value, - ); - }; + /* ported to backend-rs */ + // public publishGroupMessagingStream = < + // K extends keyof GroupMessagingStreamTypes, + // >( + // groupId: UserGroup["id"], + // type: K, + // value?: GroupMessagingStreamTypes[K], + // ): void => { + // this.publish( + // `messagingStream:${groupId}`, + // type, + // typeof value === "undefined" ? null : value, + // ); + // }; - public publishMessagingIndexStream = < - K extends keyof MessagingIndexStreamTypes, - >( - userId: User["id"], - type: K, - value?: MessagingIndexStreamTypes[K], - ): void => { - this.publish( - `messagingIndexStream:${userId}`, - type, - typeof value === "undefined" ? null : value, - ); - }; + /* ported to backend-rs */ + // public publishMessagingIndexStream = < + // K extends keyof MessagingIndexStreamTypes, + // >( + // userId: User["id"], + // type: K, + // value?: MessagingIndexStreamTypes[K], + // ): void => { + // this.publish( + // `messagingIndexStream:${userId}`, + // type, + // typeof value === "undefined" ? null : value, + // ); + // }; public publishNotesStream = (note: Note): void => { this.publish("notesStream", null, note); }; - public publishAdminStream = ( - userId: User["id"], - type: K, - value?: AdminStreamTypes[K], - ): void => { - this.publish( - `adminStream:${userId}`, - type, - typeof value === "undefined" ? null : value, - ); - }; + /* ported to backend-rs */ + // public publishAdminStream = ( + // userId: User["id"], + // type: K, + // value?: AdminStreamTypes[K], + // ): void => { + // this.publish( + // `adminStream:${userId}`, + // type, + // typeof value === "undefined" ? null : value, + // ); + // }; } const publisher = new Publisher(); @@ -212,17 +217,15 @@ export default publisher; export const publishInternalEvent = publisher.publishInternalEvent; export const publishUserEvent = publisher.publishUserEvent; -export const publishBroadcastStream = publisher.publishBroadcastStream; +// export const publishBroadcastStream = publisher.publishBroadcastStream; export const publishMainStream = publisher.publishMainStream; export const publishDriveStream = publisher.publishDriveStream; export const publishNoteStream = publisher.publishNoteStream; export const publishNotesStream = publisher.publishNotesStream; -export const publishChannelStream = publisher.publishChannelStream; +// export const publishChannelStream = publisher.publishChannelStream; export const publishUserListStream = publisher.publishUserListStream; // export const publishAntennaStream = publisher.publishAntennaStream; // export const publishMessagingStream = publisher.publishMessagingStream; -export const publishGroupMessagingStream = - publisher.publishGroupMessagingStream; -export const publishMessagingIndexStream = - publisher.publishMessagingIndexStream; -export const publishAdminStream = publisher.publishAdminStream; +// export const publishGroupMessagingStream = publisher.publishGroupMessagingStream; +// export const publishMessagingIndexStream = publisher.publishMessagingIndexStream; +// export const publishAdminStream = publisher.publishAdminStream; diff --git a/packages/client/package.json b/packages/client/package.json index 97a5f83ef7..cc679ddfb2 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -28,13 +28,14 @@ "@types/matter-js": "0.19.6", "@types/prismjs": "^1.26.3", "@types/punycode": "2.1.4", + "@types/qrcode": "1.5.5", "@types/seedrandom": "3.0.8", "@types/textarea-caret": "^3.0.3", "@types/throttle-debounce": "5.0.2", "@types/tinycolor2": "1.4.6", "@types/uuid": "9.0.8", "@vitejs/plugin-vue": "5.0.4", - "@vue/runtime-core": "3.4.21", + "@vue/runtime-core": "3.4.25", "autobind-decorator": "2.4.0", "autosize": "6.0.1", "broadcast-channel": "7.0.0", @@ -60,14 +61,18 @@ "insert-text-at-cursor": "0.3.0", "json5": "2.2.3", "katex": "0.16.10", + "long": "^5.2.3", "libopenmpt-wasm": "github:TheEssem/libopenmpt-packaging#build", "matter-js": "0.19.0", "mfm-js": "0.24.0", + "multer": "1.4.5-lts.1", "moment": "2.30.1", "photoswipe": "5.4.3", "prismjs": "1.29.0", "punycode": "2.3.1", - "rollup": "4.14.2", + "qrcode": "1.5.3", + "qrcode-vue3": "^1.6.8", + "rollup": "4.16.4", "s-age": "1.1.2", "sass": "1.75.0", "seedrandom": "3.0.5", @@ -75,19 +80,19 @@ "swiper": "11.1.1", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", - "three": "0.163.0", + "three": "0.164.1", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tinyld": "^1.3.4", "typescript": "5.4.5", "unicode-emoji-json": "^0.6.0", "uuid": "9.0.1", - "vite": "5.2.8", + "vite": "5.2.10", "vite-plugin-compression": "^0.5.1", - "vue": "3.4.21", + "vue": "3.4.25", "vue-draggable-plus": "^0.4.0", "vue-plyr": "^7.0.0", "vue-prism-editor": "2.0.0-alpha.2", - "vue-tsc": "2.0.13" + "vue-tsc": "2.0.14" } } diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 33c70e777e..7b71d4903d 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -113,6 +113,7 @@ :detailed="true" :detailed-view="detailedView" :parent-id="appearNote.id" + :is-long-judger="isLongJudger" @push="(e) => router.push(notePage(e))" @focusfooter="footerEl!.focus()" @expanded="(e) => setPostExpanded(e)" @@ -325,6 +326,7 @@ const props = defineProps<{ collapsedReply?: boolean; hideFooter?: boolean; hideEmojiViewer?: boolean; + isLongJudger?: (note: entities.Note) => boolean; }>(); const inChannel = inject("inChannel", null); diff --git a/packages/client/src/components/MkNotificationFolded.vue b/packages/client/src/components/MkNotificationFolded.vue index e77467e9a2..4f5048555c 100644 --- a/packages/client/src/components/MkNotificationFolded.vue +++ b/packages/client/src/components/MkNotificationFolded.vue @@ -26,7 +26,6 @@ : notification.reaction " :custom-emojis="notification.note.emojis" - :no-style="true" /> + + diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index a0664c28e9..3fb1c2db6b 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -196,13 +196,26 @@ import { i18n } from "@/i18n"; import { defaultStore } from "@/store"; import icon from "@/scripts/icon"; -const props = defineProps<{ - note: entities.Note; - parentId?: string; - conversation?: entities.Note[]; - detailed?: boolean; - detailedView?: boolean; -}>(); +const props = withDefaults( + defineProps<{ + note: entities.Note; + parentId?: string; + conversation?: entities.Note[]; + detailed?: boolean; + detailedView?: boolean; + isLongJudger?: (note: entities.Note) => boolean; + }>(), + { + isLongJudger: (note: entities.Note) => { + return ( + note.text != null && + (note.text.split("\n").length > 10 || + note.text.length > 800 || + note.files.length > 4) + ); + }, + }, +); const emit = defineEmits<{ (ev: "push", v): void; @@ -216,10 +229,7 @@ const showMoreButton = ref(); const isLong = !props.detailedView && props.note.cw == null && - ((props.note.text != null && - (props.note.text.split("\n").length > 10 || - props.note.text.length > 800)) || - props.note.files.length > 4); + props.isLongJudger(props.note); const collapsed = ref(props.note.cw == null && isLong); const urls = props.note.text ? extractUrlFromMfm(mfm.parse(props.note.text)).slice(0, 5) diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue index d9056c3b25..c3f7a485d8 100644 --- a/packages/client/src/components/MkTimeline.vue +++ b/packages/client/src/components/MkTimeline.vue @@ -338,7 +338,7 @@ defineExpose({ content: ""; position: absolute; inset: -2px 0; - border: 2px solid var(--accentDarken); + border-bottom: 2px solid var(--accentDarken); mask: linear-gradient( to right, transparent, diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index 2a37e38701..58a2f7a6b9 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -7,6 +7,7 @@ import type { Component, MaybeRef, Ref } from "vue"; import { defineAsyncComponent, markRaw, ref } from "vue"; import { i18n } from "./i18n"; import MkDialog from "@/components/MkDialog.vue"; +import MkQrCode from "@/components/MkQrCode.vue"; import MkPostFormDialog from "@/components/MkPostFormDialog.vue"; import MkToast from "@/components/MkToast.vue"; import MkWaitingDialog from "@/components/MkWaitingDialog.vue"; @@ -1000,6 +1001,25 @@ export function post( }); } +export async function displayQrCode(qrCode: string) { + ( + await new Promise<(() => void) | undefined>((resolve) => { + let dispose: (() => void) | undefined; + popup( + MkQrCode, + { qrCode }, + { + closed: () => { + resolve(dispose); + }, + }, + ).then((res) => { + dispose = res.dispose; + }); + }) + )?.(); +} + export const deckGlobalEvents = new EventEmitter(); /* diff --git a/packages/client/src/pages/follow-me.vue b/packages/client/src/pages/follow-me.vue new file mode 100644 index 0000000000..77de02d2d6 --- /dev/null +++ b/packages/client/src/pages/follow-me.vue @@ -0,0 +1,75 @@ + + + diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts index 7273919261..769cbd44f7 100644 --- a/packages/client/src/router.ts +++ b/packages/client/src/router.ts @@ -325,6 +325,10 @@ export const routes: RouteDef[] = [ component: page(() => import("./pages/follow.vue")), loginRequired: true, }, + { + path: "/follow-me", + component: page(() => import("./pages/follow-me.vue")), + }, { path: "/authorize_interaction", component: page(() => import("./pages/authorize_interaction.vue")), diff --git a/packages/client/src/scripts/fold.ts b/packages/client/src/scripts/fold.ts index 02755b1813..1688708a22 100644 --- a/packages/client/src/scripts/fold.ts +++ b/packages/client/src/scripts/fold.ts @@ -20,7 +20,6 @@ interface FoldOption { */ export function foldItems( ns: Item[], - fetch_limit: number, classfier: (n: Item, index: number) => string, aggregator: (ns: Item[], key: string) => ItemFolded, _options?: FoldOption, @@ -30,55 +29,48 @@ export function foldItems( const options: FoldOption = _options ?? {}; options.skipSingleElement ??= true; - for (let i = 0; i < ns.length; i += fetch_limit) { - const toFold = ns.slice(i, i + fetch_limit); - const toAppendKeys: string[] = []; - const foldMap = new Map(); + const toAppendKeys: string[] = []; + const foldMap = new Map(); - for (const [index, n] of toFold.entries()) { - const key = classfier(n, index); - const arr = foldMap.get(key); - if (arr != null) { - arr.push(n); - } else { - foldMap.set(key, [n]); - toAppendKeys.push(key); - } + for (const [index, n] of ns.entries()) { + const key = classfier(n, index); + const arr = foldMap.get(key); + if (arr != null) { + arr.push(n); + } else { + foldMap.set(key, [n]); + toAppendKeys.push(key); } - - res = res.concat( - toAppendKeys.map((key) => { - const arr = foldMap.get(key)!; - if (arr?.length === 1 && options?.skipSingleElement) { - return arr[0]; - } - return aggregator(arr, key); - }), - ); } + res = toAppendKeys.map((key) => { + const arr = foldMap.get(key)!; + if (arr?.length === 1 && options?.skipSingleElement) { + return arr[0]; + } + return aggregator(arr, key); + }); + return res; } -export function foldNotifications( - ns: entities.Notification[], - fetch_limit: number, -) { +export function foldNotifications(ns: entities.Notification[]) { + // By the implement of MkPagination, lastId is unique and is safe for key + const lastId = ns[ns.length - 1]?.id ?? "prepend"; return foldItems( ns, - fetch_limit, (n) => { switch (n.type) { case "renote": - return `renote-of:${n.note.renote.id}`; + return `renote-${n.note.renote.id}`; case "reaction": - return `reaction:${n.reaction}:of:${n.note.id}`; + return `reaction-${n.reaction}-of-${n.note.id}`; default: { return `${n.id}`; } } }, - (ns) => { + (ns, key) => { const represent = ns[0]; function check( ns: entities.Notification[], @@ -94,6 +86,7 @@ export function foldNotifications( userIds: ns.map((nn) => nn.userId), users: ns.map((nn) => nn.user), notifications: ns!, + id: `G-${lastId}-${key}`, } as NotificationFolded; }, ); diff --git a/packages/client/src/scripts/get-user-menu.ts b/packages/client/src/scripts/get-user-menu.ts index 880ce481c7..7a3046aad7 100644 --- a/packages/client/src/scripts/get-user-menu.ts +++ b/packages/client/src/scripts/get-user-menu.ts @@ -255,6 +255,27 @@ export function getUserMenu(user, router: Router = mainRouter) { router.push(`/user-info/${user.id}`); }, }, + { + icon: `${icon("ph-share")}`, + text: i18n.ts.share, + type: "parent", + children: [ + { + icon: "ph-qr-code ph-bold ph-lg", + text: i18n.ts.getQrCode, + action: () => { + os.displayQrCode(`https://${host}/follow-me?acct=${user.username}`); + }, + }, + { + icon: `${icon("ph-hand-waving")}`, + text: i18n.ts.copyRemoteFollowUrl, + action: () => { + copyToClipboard(`https://${host}/follow-me?acct=${user.username}`); + }, + }, + ], + }, { icon: `${icon("ph-newspaper")}`, text: i18n.ts._feeds.copyFeed, @@ -290,6 +311,15 @@ export function getUserMenu(user, router: Router = mainRouter) { os.post({ specified: user }); }, }, + !isSignedIn(me) + ? { + icon: `${icon("ph-hand-waving")}`, + text: i18n.ts.remoteFollow, + action: () => { + router.push(`/follow-me?acct=${user.username}`); + }, + } + : undefined, isSignedIn(me) && me.id !== user.id ? { type: "link", diff --git a/packages/client/src/scripts/scroll.ts b/packages/client/src/scripts/scroll.ts index 61b6515339..b3743c1ef6 100644 --- a/packages/client/src/scripts/scroll.ts +++ b/packages/client/src/scripts/scroll.ts @@ -4,6 +4,9 @@ export function getScrollContainer(el: HTMLElement | null): HTMLElement | null { if (el == null) return null; const overflow = window.getComputedStyle(el).getPropertyValue("overflow-y"); if (overflow === "scroll" || overflow === "auto") { + if (el.tagName === "HTML") { + return null; + } return el; } else { return getScrollContainer(el.parentElement); diff --git a/packages/firefish-js/package.json b/packages/firefish-js/package.json index cd30e879d1..cebbbe8fe0 100644 --- a/packages/firefish-js/package.json +++ b/packages/firefish-js/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@swc/cli": "0.3.12", - "@swc/core": "1.4.13", + "@swc/core": "1.5.0", "@swc/types": "^0.1.6", "@types/jest": "^29.5.12", "@types/node": "20.12.7", diff --git a/packages/sw/package.json b/packages/sw/package.json index 5cf7170d76..78db2cd010 100644 --- a/packages/sw/package.json +++ b/packages/sw/package.json @@ -11,7 +11,7 @@ "devDependencies": { "firefish-js": "workspace:*", "idb-keyval": "^6.2.1", - "vite": "5.2.8", + "vite": "5.2.10", "vite-plugin-compression": "^0.5.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 929d19ef20..e93f965d0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,20 +25,20 @@ importers: version: 4.1.0 devDependencies: '@biomejs/biome': - specifier: 1.6.4 - version: 1.6.4 + specifier: 1.7.1 + version: 1.7.1 '@biomejs/cli-darwin-arm64': - specifier: ^1.6.4 - version: 1.6.4 + specifier: ^1.7.1 + version: 1.7.1 '@biomejs/cli-darwin-x64': - specifier: ^1.6.4 - version: 1.6.4 + specifier: ^1.7.1 + version: 1.7.1 '@biomejs/cli-linux-arm64': - specifier: ^1.6.4 - version: 1.6.4 + specifier: ^1.7.1 + version: 1.7.1 '@biomejs/cli-linux-x64': - specifier: ^1.6.4 - version: 1.6.4 + specifier: ^1.7.1 + version: 1.7.1 '@types/node': specifier: 20.12.7 version: 20.12.7 @@ -55,14 +55,14 @@ importers: packages/backend: dependencies: '@bull-board/api': - specifier: 5.15.5 - version: 5.15.5(@bull-board/ui@5.15.5) + specifier: 5.16.0 + version: 5.16.0(@bull-board/ui@5.16.0) '@bull-board/koa': - specifier: 5.15.5 - version: 5.15.5(@types/koa@2.15.0)(pug@3.0.2) + specifier: 5.16.0 + version: 5.16.0(@types/koa@2.15.0)(pug@3.0.2) '@bull-board/ui': - specifier: 5.15.5 - version: 5.15.5 + specifier: 5.16.0 + version: 5.16.0 '@discordapp/twemoji': specifier: ^15.0.3 version: 15.0.3 @@ -82,8 +82,8 @@ importers: specifier: 1.7.0 version: 1.7.0 '@redocly/openapi-core': - specifier: 1.11.0 - version: 1.11.0 + specifier: 1.12.0 + version: 1.12.0 '@sinonjs/fake-timers': specifier: 11.2.2 version: 11.2.2 @@ -97,8 +97,8 @@ importers: specifier: 7.0.1 version: 7.0.1 aws-sdk: - specifier: 2.1599.0 - version: 2.1599.0 + specifier: 2.1608.0 + version: 2.1608.0 axios: specifier: ^1.6.8 version: 1.6.8 @@ -175,8 +175,8 @@ importers: specifier: 1.2.0 version: 1.2.0 ioredis: - specifier: 5.3.2 - version: 5.3.2 + specifier: 5.4.1 + version: 5.4.1 ip-cidr: specifier: 4.0.0 version: 4.0.0 @@ -293,7 +293,7 @@ importers: version: 3.4.1 redis-semaphore: specifier: 5.5.1 - version: 5.5.1(ioredis@5.3.2) + version: 5.5.1(ioredis@5.4.1) reflect-metadata: specifier: 0.2.2 version: 0.2.2 @@ -341,7 +341,7 @@ importers: version: 0.2.3 typeorm: specifier: 0.3.20 - version: 0.3.20(ioredis@5.3.2)(pg@8.11.5)(ts-node@10.9.2) + version: 0.3.20(ioredis@5.4.1)(pg@8.11.5)(ts-node@10.9.2) ulid: specifier: 2.3.0 version: 2.3.0 @@ -364,10 +364,10 @@ importers: devDependencies: '@swc/cli': specifier: 0.3.12 - version: 0.3.12(@swc/core@1.4.13) + version: 0.3.12(@swc/core@1.5.0) '@swc/core': - specifier: 1.4.13 - version: 1.4.13 + specifier: 1.5.0 + version: 1.5.0 '@types/adm-zip': specifier: ^0.5.5 version: 0.5.5 @@ -456,8 +456,8 @@ importers: specifier: 1.5.5 version: 1.5.5 '@types/qs': - specifier: 6.9.14 - version: 6.9.14 + specifier: 6.9.15 + version: 6.9.15 '@types/random-seed': specifier: 0.3.5 version: 0.3.5 @@ -501,8 +501,8 @@ importers: specifier: 7.0.3 version: 7.0.3 eslint: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.1.1 + version: 9.1.1 mocha: specifier: 10.4.0 version: 10.4.0 @@ -514,25 +514,25 @@ importers: version: 2.0.0 swc-loader: specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.4.13)(webpack@5.91.0) + version: 0.2.6(@swc/core@1.5.0)(webpack@5.91.0) ts-loader: specifier: 9.5.1 version: 9.5.1(typescript@5.4.5)(webpack@5.91.0) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@5.4.5) tsconfig-paths: specifier: 4.2.0 version: 4.2.0 type-fest: - specifier: 4.15.0 - version: 4.15.0 + specifier: 4.17.0 + version: 4.17.0 typescript: specifier: 5.4.5 version: 5.4.5 webpack: specifier: ^5.91.0 - version: 5.91.0(@swc/core@1.4.13) + version: 5.91.0(@swc/core@1.5.0) ws: specifier: 8.16.0 version: 8.16.0 @@ -559,13 +559,13 @@ importers: version: 2.1.1 '@rollup/plugin-alias': specifier: 5.1.0 - version: 5.1.0(rollup@4.14.2) + version: 5.1.0(rollup@4.16.4) '@rollup/plugin-json': specifier: 6.1.0 - version: 6.1.0(rollup@4.14.2) + version: 6.1.0(rollup@4.16.4) '@rollup/pluginutils': specifier: ^5.1.0 - version: 5.1.0(rollup@4.14.2) + version: 5.1.0(rollup@4.16.4) '@syuilo/aiscript': specifier: 0.17.0 version: 0.17.0 @@ -596,6 +596,9 @@ importers: '@types/punycode': specifier: 2.1.4 version: 2.1.4 + '@types/qrcode': + specifier: 1.5.5 + version: 1.5.5 '@types/seedrandom': specifier: 3.0.8 version: 3.0.8 @@ -613,10 +616,10 @@ importers: version: 9.0.8 '@vitejs/plugin-vue': specifier: 5.0.4 - version: 5.0.4(vite@5.2.8)(vue@3.4.21) + version: 5.0.4(vite@5.2.10)(vue@3.4.25) '@vue/runtime-core': - specifier: 3.4.21 - version: 3.4.21 + specifier: 3.4.25 + version: 3.4.25 autobind-decorator: specifier: 2.4.0 version: 2.4.0 @@ -676,7 +679,7 @@ importers: version: 7.5.4 focus-trap-vue: specifier: ^4.0.3 - version: 4.0.3(focus-trap@7.5.4)(vue@3.4.21) + version: 4.0.3(focus-trap@7.5.4)(vue@3.4.25) gsap: specifier: ^3.12.5 version: 3.12.5 @@ -695,6 +698,9 @@ importers: libopenmpt-wasm: specifier: github:TheEssem/libopenmpt-packaging#build version: github.com/TheEssem/libopenmpt-packaging/d05d151a72b638c6312227af0417aca69521172c + long: + specifier: ^5.2.3 + version: 5.2.3 matter-js: specifier: 0.19.0 version: 0.19.0 @@ -704,6 +710,9 @@ importers: moment: specifier: 2.30.1 version: 2.30.1 + multer: + specifier: 1.4.5-lts.1 + version: 1.4.5-lts.1 photoswipe: specifier: 5.4.3 version: 5.4.3 @@ -713,9 +722,15 @@ importers: punycode: specifier: 2.3.1 version: 2.3.1 + qrcode: + specifier: 1.5.3 + version: 1.5.3 + qrcode-vue3: + specifier: ^1.6.8 + version: 1.6.8 rollup: - specifier: 4.14.2 - version: 4.14.2 + specifier: 4.16.4 + version: 4.16.4 s-age: specifier: 1.1.2 version: 1.1.2 @@ -738,8 +753,8 @@ importers: specifier: 3.1.0 version: 3.1.0 three: - specifier: 0.163.0 - version: 0.163.0 + specifier: 0.164.1 + version: 0.164.1 throttle-debounce: specifier: 5.0.0 version: 5.0.0 @@ -759,14 +774,14 @@ importers: specifier: 9.0.1 version: 9.0.1 vite: - specifier: 5.2.8 - version: 5.2.8(@types/node@20.12.7)(sass@1.75.0) + specifier: 5.2.10 + version: 5.2.10(@types/node@20.12.7)(sass@1.75.0) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@5.2.8) + version: 0.5.1(vite@5.2.10) vue: - specifier: 3.4.21 - version: 3.4.21(typescript@5.4.5) + specifier: 3.4.25 + version: 3.4.25(typescript@5.4.5) vue-draggable-plus: specifier: ^0.4.0 version: 0.4.0(@types/sortablejs@1.15.8) @@ -775,10 +790,10 @@ importers: version: 7.0.0 vue-prism-editor: specifier: 2.0.0-alpha.2 - version: 2.0.0-alpha.2(vue@3.4.21) + version: 2.0.0-alpha.2(vue@3.4.25) vue-tsc: - specifier: 2.0.13 - version: 2.0.13(typescript@5.4.5) + specifier: 2.0.14 + version: 2.0.14(typescript@5.4.5) packages/firefish-js: dependencies: @@ -795,10 +810,10 @@ importers: devDependencies: '@swc/cli': specifier: 0.3.12 - version: 0.3.12(@swc/core@1.4.13) + version: 0.3.12(@swc/core@1.5.0) '@swc/core': - specifier: 1.4.13 - version: 1.4.13 + specifier: 1.5.0 + version: 1.5.0 '@swc/types': specifier: ^0.1.6 version: 0.1.6 @@ -825,7 +840,7 @@ importers: version: 29.1.2(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@5.4.5) tsd: specifier: ^0.31.0 version: 0.31.0 @@ -951,11 +966,11 @@ importers: specifier: ^6.2.1 version: 6.2.1 vite: - specifier: 5.2.8 - version: 5.2.8(@types/node@20.12.7)(sass@1.75.0) + specifier: 5.2.10 + version: 5.2.10(@types/node@20.12.7)(sass@1.75.0) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@5.2.8) + version: 0.5.1(vite@5.2.10) packages: @@ -1676,38 +1691,38 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@biomejs/biome@1.6.4: - resolution: {integrity: sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==} + /@biomejs/biome@1.7.1: + resolution: {integrity: sha512-wb2UNoFXcgaMdKXKT5ytsYntaogl2FSTjDt20CZynF3v7OXQUcIpTrr+be3XoOGpoZRj3Ytq9TSpmplUREXmeA==} engines: {node: '>=14.21.3'} hasBin: true requiresBuild: true optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.6.4 - '@biomejs/cli-darwin-x64': 1.6.4 - '@biomejs/cli-linux-arm64': 1.6.4 - '@biomejs/cli-linux-arm64-musl': 1.6.4 - '@biomejs/cli-linux-x64': 1.6.4 - '@biomejs/cli-linux-x64-musl': 1.6.4 - '@biomejs/cli-win32-arm64': 1.6.4 - '@biomejs/cli-win32-x64': 1.6.4 + '@biomejs/cli-darwin-arm64': 1.7.1 + '@biomejs/cli-darwin-x64': 1.7.1 + '@biomejs/cli-linux-arm64': 1.7.1 + '@biomejs/cli-linux-arm64-musl': 1.7.1 + '@biomejs/cli-linux-x64': 1.7.1 + '@biomejs/cli-linux-x64-musl': 1.7.1 + '@biomejs/cli-win32-arm64': 1.7.1 + '@biomejs/cli-win32-x64': 1.7.1 dev: true - /@biomejs/cli-darwin-arm64@1.6.4: - resolution: {integrity: sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==} + /@biomejs/cli-darwin-arm64@1.7.1: + resolution: {integrity: sha512-qfLrIIB58dkgiY/1tgG6fSCBK22PZaSIf6blweZBsG6iMij05mEuJt50ne+zPnNFNUmt8t43NC/qOXT3iFHQBA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] dev: true - /@biomejs/cli-darwin-x64@1.6.4: - resolution: {integrity: sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==} + /@biomejs/cli-darwin-x64@1.7.1: + resolution: {integrity: sha512-OGeyNsEcp5VnKbF9/TBjPCTHNEOm7oHegEve07U3KZmzqfpw2Oe3i9DVW8t6vvj1TYbrwWYCld25H34kBDY7Vg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] dev: true - /@biomejs/cli-linux-arm64-musl@1.6.4: - resolution: {integrity: sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==} + /@biomejs/cli-linux-arm64-musl@1.7.1: + resolution: {integrity: sha512-giH0/CzLOJ+wbxLxd5Shnr5xQf5fGnTRWLDe3lzjaF7IplVydNCEeZJtncB01SvyA6DAFJsvQ4LNxzAOQfEVCg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] @@ -1715,15 +1730,15 @@ packages: dev: true optional: true - /@biomejs/cli-linux-arm64@1.6.4: - resolution: {integrity: sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==} + /@biomejs/cli-linux-arm64@1.7.1: + resolution: {integrity: sha512-MQDf5wErj1iBvlcxCyOa0XqZYN8WJrupVgbNnqhntO3yVATg8GxduVUn1fDSaolznkDRsj7Pz3Xu1esBFwvfmg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] dev: true - /@biomejs/cli-linux-x64-musl@1.6.4: - resolution: {integrity: sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==} + /@biomejs/cli-linux-x64-musl@1.7.1: + resolution: {integrity: sha512-ySNDtPhsLxU125IFHHAxfpoHBpkM56s4mEXeO70GZtgZay/o1h8IUPWCWf5Z7gKgc4jwgYN1U1U9xabI3hZVAg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] @@ -1731,15 +1746,15 @@ packages: dev: true optional: true - /@biomejs/cli-linux-x64@1.6.4: - resolution: {integrity: sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==} + /@biomejs/cli-linux-x64@1.7.1: + resolution: {integrity: sha512-3wmCsGcC3KZ4pfTknXHfyMMlXPMhgfXVAcG5GlrR+Tq2JGiAw0EUydaLpsSBEbcG7IxH6OiUZEJZ95kAycCHBA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] dev: true - /@biomejs/cli-win32-arm64@1.6.4: - resolution: {integrity: sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==} + /@biomejs/cli-win32-arm64@1.7.1: + resolution: {integrity: sha512-8hIDakEqZn0i6+388noYKdZ0ZrovTwnvMU/Qp/oJou0G7EPVdXupOe0oxiQSdRN0W7f6CS/yjPCYuVGzDG6r0g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] @@ -1747,8 +1762,8 @@ packages: dev: true optional: true - /@biomejs/cli-win32-x64@1.6.4: - resolution: {integrity: sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==} + /@biomejs/cli-win32-x64@1.7.1: + resolution: {integrity: sha512-3W9k3uH6Ea6VOpAS9xkkAlS0LTfnGQjmIUCegZ8SDtK2NgJ1gO+qdEkGJb0ltahusFTN1QxJ107dM7ASA9IUEg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1756,20 +1771,20 @@ packages: dev: true optional: true - /@bull-board/api@5.15.5(@bull-board/ui@5.15.5): - resolution: {integrity: sha512-s3x0f+0s4nwndBM+QSROMVKiDyE/vaaouQCsxRWOFqneLCkM+Ro2wF6fkhmFkZMjouoBbS8rCFGaIZ+8uttYtg==} + /@bull-board/api@5.16.0(@bull-board/ui@5.16.0): + resolution: {integrity: sha512-JnPi2M11At/4lxDP267k20AqUBZdVv+82nNMcO80dPJAEKpzbvhLqAl4H3nDSEowmzgzVVlD+/eFOMjg07h9Zg==} peerDependencies: - '@bull-board/ui': 5.15.5 + '@bull-board/ui': 5.16.0 dependencies: - '@bull-board/ui': 5.15.5 + '@bull-board/ui': 5.16.0 redis-info: 3.1.0 dev: false - /@bull-board/koa@5.15.5(@types/koa@2.15.0)(pug@3.0.2): - resolution: {integrity: sha512-Kbmca8hKNW5wLpGM/H1RBm09bcdK+KWCsINUyDtp91bGwMRK0mhiqvjJLJpRohXXmtPTnnJDuVO9p1gYsbed3Q==} + /@bull-board/koa@5.16.0(@types/koa@2.15.0)(pug@3.0.2): + resolution: {integrity: sha512-AB5ys7bKBlCpyFncVsVGAYIVFFJk6vGBtLHn7xNAVqeBAUM3r+n9VxbxW/Or+L6XJWWEzDIElmQgD3OM/sv4aw==} dependencies: - '@bull-board/api': 5.15.5(@bull-board/ui@5.15.5) - '@bull-board/ui': 5.15.5 + '@bull-board/api': 5.16.0(@bull-board/ui@5.16.0) + '@bull-board/ui': 5.16.0 ejs: 3.1.10 koa: 2.15.3 koa-mount: 4.0.0 @@ -1833,10 +1848,10 @@ packages: - whiskers dev: false - /@bull-board/ui@5.15.5: - resolution: {integrity: sha512-TSXgqBDI3ig6ez6yHArGzpwCuA/rhQewv0KOUAvPzssgX4HqfkatrV7gTuTM+XJe7/sLiXnBiryV7SRV0hgRMg==} + /@bull-board/ui@5.16.0: + resolution: {integrity: sha512-XJoHVKUDWCjOb0kMTKs1wTqn5p9mvFUFurTVNcbhPuqkIPoPJLuKhE8a7FvpTIK+HA5NhFRllaRK3K9/Y8JzIA==} dependencies: - '@bull-board/api': 5.15.5(@bull-board/ui@5.15.5) + '@bull-board/api': 5.16.0(@bull-board/ui@5.16.0) dev: false /@cbor-extract/cbor-extract-darwin-arm64@2.2.0: @@ -2239,13 +2254,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@9.0.0): + /@eslint-community/eslint-utils@4.4.0(eslint@9.1.1): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.0.0 + eslint: 9.1.1 eslint-visitor-keys: 3.4.3 dev: true @@ -2479,8 +2494,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@eslint/js@9.0.0: - resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + /@eslint/js@9.1.1: + resolution: {integrity: sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true @@ -2495,8 +2510,8 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array@0.12.3: - resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + /@humanwhocodes/config-array@0.13.0: + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -2519,6 +2534,11 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true + /@humanwhocodes/retry@0.2.3: + resolution: {integrity: sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==} + engines: {node: '>=18.18'} + dev: true + /@img/sharp-darwin-arm64@0.33.3: resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} @@ -3461,8 +3481,8 @@ packages: resolution: {integrity: sha512-r0TqTPVXrxdvhpbOntWnJofOx0rC7u+A+tfC0KFwMtw38QCNb3pwodVjeLa7MT5Uu+fcPxfO119yLBj0QHvBuQ==} dev: false - /@redocly/openapi-core@1.11.0: - resolution: {integrity: sha512-VH10SAkDu+jVW9tDFJWWYroFxHVY9N5VS4gorXw0cK8L+LydUOQ4KiZaKbTsTF2piWmZCxngZI7sNPHMiJ4Ftg==} + /@redocly/openapi-core@1.12.0: + resolution: {integrity: sha512-2Jfxv3iIk1JUwLSnLyewJ8GAsoxubROVieg13Sjo79TjuWaUBuI49j8GZqC08ljENqyEIp0JHReDjhKs4Snrhg==} engines: {node: '>=14.19.0', npm: '>=7.0.0'} dependencies: '@redocly/ajv': 8.11.0 @@ -3479,7 +3499,7 @@ packages: - encoding dev: false - /@rollup/plugin-alias@5.1.0(rollup@4.14.2): + /@rollup/plugin-alias@5.1.0(rollup@4.16.4): resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3488,11 +3508,11 @@ packages: rollup: optional: true dependencies: - rollup: 4.14.2 + rollup: 4.16.4 slash: 4.0.0 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.14.2): + /@rollup/plugin-json@6.1.0(rollup@4.16.4): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3501,8 +3521,8 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.14.2) - rollup: 4.14.2 + '@rollup/pluginutils': 5.1.0(rollup@4.16.4) + rollup: 4.16.4 dev: true /@rollup/pluginutils@4.2.1: @@ -3513,7 +3533,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.14.2): + /@rollup/pluginutils@5.1.0(rollup@4.16.4): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3525,123 +3545,131 @@ packages: '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.14.2 + rollup: 4.16.4 dev: true - /@rollup/rollup-android-arm-eabi@4.14.2: - resolution: {integrity: sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==} + /@rollup/rollup-android-arm-eabi@4.16.4: + resolution: {integrity: sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.14.2: - resolution: {integrity: sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==} + /@rollup/rollup-android-arm64@4.16.4: + resolution: {integrity: sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.14.2: - resolution: {integrity: sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==} + /@rollup/rollup-darwin-arm64@4.16.4: + resolution: {integrity: sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.14.2: - resolution: {integrity: sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==} + /@rollup/rollup-darwin-x64@4.16.4: + resolution: {integrity: sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.2: - resolution: {integrity: sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==} + /@rollup/rollup-linux-arm-gnueabihf@4.16.4: + resolution: {integrity: sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.2: - resolution: {integrity: sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==} + /@rollup/rollup-linux-arm-musleabihf@4.16.4: + resolution: {integrity: sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.16.4: + resolution: {integrity: sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.2: - resolution: {integrity: sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==} + /@rollup/rollup-linux-arm64-musl@4.16.4: + resolution: {integrity: sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.2: - resolution: {integrity: sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==} + /@rollup/rollup-linux-powerpc64le-gnu@4.16.4: + resolution: {integrity: sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.2: - resolution: {integrity: sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==} + /@rollup/rollup-linux-riscv64-gnu@4.16.4: + resolution: {integrity: sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.2: - resolution: {integrity: sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==} + /@rollup/rollup-linux-s390x-gnu@4.16.4: + resolution: {integrity: sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.2: - resolution: {integrity: sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==} + /@rollup/rollup-linux-x64-gnu@4.16.4: + resolution: {integrity: sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.2: - resolution: {integrity: sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==} + /@rollup/rollup-linux-x64-musl@4.16.4: + resolution: {integrity: sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.2: - resolution: {integrity: sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==} + /@rollup/rollup-win32-arm64-msvc@4.16.4: + resolution: {integrity: sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.2: - resolution: {integrity: sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==} + /@rollup/rollup-win32-ia32-msvc@4.16.4: + resolution: {integrity: sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.2: - resolution: {integrity: sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==} + /@rollup/rollup-win32-x64-msvc@4.16.4: + resolution: {integrity: sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==} cpu: [x64] os: [win32] requiresBuild: true @@ -3687,7 +3715,7 @@ packages: resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} dev: false - /@swc/cli@0.3.12(@swc/core@1.4.13): + /@swc/cli@0.3.12(@swc/core@1.5.0): resolution: {integrity: sha512-h7bvxT+4+UDrLWJLFHt6V+vNAcUNii2G4aGSSotKz1ECEk4MyEh5CWxmeSscwuz5K3i+4DWTgm4+4EyMCQKn+g==} engines: {node: '>= 16.14.0'} hasBin: true @@ -3699,7 +3727,7 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.4.13 + '@swc/core': 1.5.0 '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.2 @@ -3721,88 +3749,88 @@ packages: dev: false optional: true - /@swc/core-darwin-arm64@1.4.13: - resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==} + /@swc/core-darwin-arm64@1.5.0: + resolution: {integrity: sha512-dyA25zQjm3xmMFsRPFgBpSqWSW9TITnkndZkZAiPYLjBxH9oTNMa0l09BePsaqEeXySY++tUgAeYu/9onsHLbg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.4.13: - resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==} + /@swc/core-darwin-x64@1.5.0: + resolution: {integrity: sha512-cO7kZMMA/fcQIBT31LBzcVNSk3AZGVYLqvEPnJhFImjPm3mGKUd6kWpARUEGR68MyRU2VsWhE6eCjMcM+G7bxw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.4.13: - resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==} + /@swc/core-linux-arm-gnueabihf@1.5.0: + resolution: {integrity: sha512-BXaXytS4y9lBFRO6vwA6ovvy1d2ZIzS02i2R1oegoZzzNu89CJDpkYXYS9bId0GvK2m9Q9y2ofoZzKE2Rp3PqQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.4.13: - resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==} + /@swc/core-linux-arm64-gnu@1.5.0: + resolution: {integrity: sha512-Bu4/41pGadXKnRsUbox0ig63xImATVH704oPCXcoOvNGkDyMjWgIAhzIi111vrwFNpj9utabgUE4AtlUa2tAOQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.4.13: - resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==} + /@swc/core-linux-arm64-musl@1.5.0: + resolution: {integrity: sha512-lUFFvC8tsepNcTnKEHNrePWanVVef6PQ82Rv9wIeebgGHRUqDh6+CyCqodXez+aKz6NyE/PBIfp0r+jPx4hoJA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.4.13: - resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==} + /@swc/core-linux-x64-gnu@1.5.0: + resolution: {integrity: sha512-c6LegFU1qdyMfk+GzNIOvrX61+mksm21Q01FBnXSy1nf1ACj/a86jmr3zkPl0zpNVHfPOw3Ry1QIuLQKD+67YA==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.4.13: - resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==} + /@swc/core-linux-x64-musl@1.5.0: + resolution: {integrity: sha512-I/V8aWBmfDWwjtM1bS8ASG+6PcO/pVFYyPP5g2ok46Vz1o1MnAUd18mHnWX43nqVJokaW+BD/G4ZMZ+gXRl4zQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.4.13: - resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==} + /@swc/core-win32-arm64-msvc@1.5.0: + resolution: {integrity: sha512-nN685BvI7iM58xabrSOSQHUvIY10pcXh5H9DmS8LeYqG6Dkq7QZ8AwYqqonOitIS5C35MUfhSMLpOTzKoLdUqA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.4.13: - resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==} + /@swc/core-win32-ia32-msvc@1.5.0: + resolution: {integrity: sha512-3YjltmEHljI+TvuDOC4lspUzjBUoB3X5BhftRBprSTJx/czuMl0vdoZKs2Snzb5Eqqesp0Rl8q+iQ1E1oJ6dEA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.4.13: - resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==} + /@swc/core-win32-x64-msvc@1.5.0: + resolution: {integrity: sha512-ZairtCwJsaxnUH85DcYCyGpNb9bUoIm9QXYW+VaEoXwbcB95dTIiJwN0aRxPT8B0B2MNw/CXLqjoPo6sDwz5iw==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.4.13: - resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==} + /@swc/core@1.5.0: + resolution: {integrity: sha512-fjADAC5gOOX54Rpcr1lF9DHLD+nPD5H/zXLtEgK2Ez3esmogT+LfHzCZtUxqetjvaMChKhQ0Pp0ZB6Hpz/tCbw==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -3814,16 +3842,16 @@ packages: '@swc/counter': 0.1.3 '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.13 - '@swc/core-darwin-x64': 1.4.13 - '@swc/core-linux-arm-gnueabihf': 1.4.13 - '@swc/core-linux-arm64-gnu': 1.4.13 - '@swc/core-linux-arm64-musl': 1.4.13 - '@swc/core-linux-x64-gnu': 1.4.13 - '@swc/core-linux-x64-musl': 1.4.13 - '@swc/core-win32-arm64-msvc': 1.4.13 - '@swc/core-win32-ia32-msvc': 1.4.13 - '@swc/core-win32-x64-msvc': 1.4.13 + '@swc/core-darwin-arm64': 1.5.0 + '@swc/core-darwin-x64': 1.5.0 + '@swc/core-linux-arm-gnueabihf': 1.5.0 + '@swc/core-linux-arm64-gnu': 1.5.0 + '@swc/core-linux-arm64-musl': 1.5.0 + '@swc/core-linux-x64-gnu': 1.5.0 + '@swc/core-linux-x64-musl': 1.5.0 + '@swc/core-win32-arm64-msvc': 1.5.0 + '@swc/core-win32-ia32-msvc': 1.5.0 + '@swc/core-win32-x64-msvc': 1.5.0 /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -3978,7 +4006,7 @@ packages: resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==} dependencies: '@types/node': 20.12.7 - '@types/qs': 6.9.14 + '@types/qs': 6.9.15 dev: false /@types/color-convert@2.0.3: @@ -4055,7 +4083,7 @@ packages: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: '@types/node': 20.12.7 - '@types/qs': 6.9.14 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -4064,7 +4092,7 @@ packages: dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.14 + '@types/qs': 6.9.15 '@types/serve-static': 1.15.2 /@types/fluent-ffmpeg@2.1.24: @@ -4390,8 +4418,8 @@ packages: '@types/node': 20.12.7 dev: true - /@types/qs@6.9.14: - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} /@types/random-seed@0.3.5: resolution: {integrity: sha512-CftxcDPAHgs0SLHU2dt+ZlDPJfGqLW3sZlC/ATr5vJDSe5tRLeOne7HMvCOJnFyF8e1U41wqzs3h6AMC613xtA==} @@ -4943,44 +4971,54 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.2.8)(vue@3.4.21): + /@vitejs/plugin-vue@5.0.4(vite@5.2.10)(vue@3.4.25): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0) - vue: 3.4.21(typescript@5.4.5) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) + vue: 3.4.25(typescript@5.4.5) dev: true - /@volar/language-core@2.2.0-alpha.8: - resolution: {integrity: sha512-Ew1Iw7/RIRNuDLn60fWJdOLApAlfTVPxbPiSLzc434PReC9kleYtaa//Wo2WlN1oiRqneW0pWQQV0CwYqaimLQ==} + /@volar/language-core@2.2.0-alpha.10: + resolution: {integrity: sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==} dependencies: - '@volar/source-map': 2.2.0-alpha.8 + '@volar/source-map': 2.2.0-alpha.10 dev: true - /@volar/source-map@2.2.0-alpha.8: - resolution: {integrity: sha512-E1ZVmXFJ5DU4fWDcWHzi8OLqqReqIDwhXvIMhVdk6+VipfMVv4SkryXu7/rs4GA/GsebcRyJdaSkKBB3OAkIcA==} + /@volar/source-map@2.2.0-alpha.10: + resolution: {integrity: sha512-nrdWApVkP5cksAnDEyy1JD9rKdwOJsEq1B+seWO4vNXmZNcxQQCx4DULLBvKt7AzRUAQiAuw5aQkb9RBaSqdVA==} dependencies: muggle-string: 0.4.1 dev: true - /@volar/typescript@2.2.0-alpha.8: - resolution: {integrity: sha512-RLbRDI+17CiayHZs9HhSzlH0FhLl/+XK6o2qoiw2o2GGKcyD1aDoY6AcMd44acYncTOrqoTNoY6LuCiRyiJiGg==} + /@volar/typescript@2.2.0-alpha.10: + resolution: {integrity: sha512-GCa0vTVVdA9ULUsu2Rx7jwsIuyZQPvPVT9o3NrANTbYv+523Ao1gv3glC5vzNSDPM6bUl37r94HbCj7KINQr+g==} dependencies: - '@volar/language-core': 2.2.0-alpha.8 + '@volar/language-core': 2.2.0-alpha.10 path-browserify: 1.0.1 dev: true /@vue/compiler-core@3.4.21: resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.23.9 + '@babel/parser': 7.24.4 '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.0.2 + source-map-js: 1.2.0 + dev: true + + /@vue/compiler-core@3.4.25: + resolution: {integrity: sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==} + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.25 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 dev: true /@vue/compiler-dom@3.4.21: @@ -4990,44 +5028,51 @@ packages: '@vue/shared': 3.4.21 dev: true + /@vue/compiler-dom@3.4.25: + resolution: {integrity: sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==} + dependencies: + '@vue/compiler-core': 3.4.25 + '@vue/shared': 3.4.25 + dev: true + /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: - '@babel/parser': 7.23.9 + '@babel/parser': 7.24.4 postcss: 8.4.38 source-map: 0.6.1 dev: true - /@vue/compiler-sfc@3.4.21: - resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + /@vue/compiler-sfc@3.4.25: + resolution: {integrity: sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==} dependencies: - '@babel/parser': 7.23.9 - '@vue/compiler-core': 3.4.21 - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.25 + '@vue/compiler-dom': 3.4.25 + '@vue/compiler-ssr': 3.4.25 + '@vue/shared': 3.4.25 estree-walker: 2.0.2 - magic-string: 0.30.7 - postcss: 8.4.35 - source-map-js: 1.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 dev: true - /@vue/compiler-ssr@3.4.21: - resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + /@vue/compiler-ssr@3.4.25: + resolution: {integrity: sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==} dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/compiler-dom': 3.4.25 + '@vue/shared': 3.4.25 dev: true - /@vue/language-core@2.0.13(typescript@5.4.5): - resolution: {integrity: sha512-oQgM+BM66SU5GKtUMLQSQN0bxHFkFpLSSAiY87wVziPaiNQZuKVDt/3yA7GB9PiQw0y/bTNL0bOc0jM/siYjKg==} + /@vue/language-core@2.0.14(typescript@5.4.5): + resolution: {integrity: sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 2.2.0-alpha.8 + '@volar/language-core': 2.2.0-alpha.10 '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 @@ -5037,41 +5082,45 @@ packages: vue-template-compiler: 2.7.16 dev: true - /@vue/reactivity@3.4.21: - resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + /@vue/reactivity@3.4.25: + resolution: {integrity: sha512-mKbEtKr1iTxZkAG3vm3BtKHAOhuI4zzsVcN0epDldU/THsrvfXRKzq+lZnjczZGnTdh3ojd86/WrP+u9M51pWQ==} dependencies: - '@vue/shared': 3.4.21 + '@vue/shared': 3.4.25 dev: true - /@vue/runtime-core@3.4.21: - resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + /@vue/runtime-core@3.4.25: + resolution: {integrity: sha512-3qhsTqbEh8BMH3pXf009epCI5E7bKu28fJLi9O6W+ZGt/6xgSfMuGPqa5HRbUxLoehTNp5uWvzCr60KuiRIL0Q==} dependencies: - '@vue/reactivity': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/reactivity': 3.4.25 + '@vue/shared': 3.4.25 dev: true - /@vue/runtime-dom@3.4.21: - resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + /@vue/runtime-dom@3.4.25: + resolution: {integrity: sha512-ode0sj77kuwXwSc+2Yhk8JMHZh1sZp9F/51wdBiz3KGaWltbKtdihlJFhQG4H6AY+A06zzeMLkq6qu8uDSsaoA==} dependencies: - '@vue/runtime-core': 3.4.21 - '@vue/shared': 3.4.21 + '@vue/runtime-core': 3.4.25 + '@vue/shared': 3.4.25 csstype: 3.1.3 dev: true - /@vue/server-renderer@3.4.21(vue@3.4.21): - resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + /@vue/server-renderer@3.4.25(vue@3.4.25): + resolution: {integrity: sha512-8VTwq0Zcu3K4dWV0jOwIVINESE/gha3ifYCOKEhxOj6MEl5K5y8J8clQncTcDhKF+9U765nRw4UdUEXvrGhyVQ==} peerDependencies: - vue: 3.4.21 + vue: 3.4.25 dependencies: - '@vue/compiler-ssr': 3.4.21 - '@vue/shared': 3.4.21 - vue: 3.4.21(typescript@5.4.5) + '@vue/compiler-ssr': 3.4.25 + '@vue/shared': 3.4.25 + vue: 3.4.25(typescript@5.4.5) dev: true /@vue/shared@3.4.21: resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} dev: true + /@vue/shared@3.4.25: + resolution: {integrity: sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==} + dev: true + /@webassemblyjs/ast@1.12.1: resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: @@ -5422,7 +5471,6 @@ packages: /append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - dev: false /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -5845,8 +5893,8 @@ packages: possible-typed-array-names: 1.0.0 dev: false - /aws-sdk@2.1599.0: - resolution: {integrity: sha512-jPb1LAN+s1TLTK+VR3TTJLr//sb3AhhT60Bm9jxB5G/fVeeRczXtBtixNpQ00gksQdkstILYLc9S6MuKMsksxA==} + /aws-sdk@2.1608.0: + resolution: {integrity: sha512-qqmKS6PRNTRO+O3ZVp9+tvB6asy5uRYDpR6AhSrnhu46JtDpI47aB/O9vyykqQf3JsFu0loinDJjl2hxQoal9A==} engines: {node: '>= 10.0.0'} requiresBuild: true dependencies: @@ -6237,7 +6285,7 @@ packages: resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} dependencies: base64-js: 1.5.1 - ieee754: 1.1.13 + ieee754: 1.2.1 isarray: 1.0.0 dev: false @@ -6279,7 +6327,7 @@ packages: dependencies: cron-parser: 4.8.1 get-port: 5.1.1 - ioredis: 5.3.2 + ioredis: 5.4.1 lodash: 4.17.21 msgpackr: 1.10.1 semver: 7.6.0 @@ -6293,7 +6341,6 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - dev: false /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -6747,7 +6794,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: false /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -6990,7 +7036,6 @@ packages: inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: false /concordance@5.0.4: resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} @@ -7269,7 +7314,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} @@ -7807,7 +7851,6 @@ packages: /dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -7990,7 +8033,6 @@ packages: /encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - dev: false /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} @@ -8975,17 +9017,18 @@ packages: - supports-color dev: true - /eslint@9.0.0: - resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + /eslint@9.1.1: + resolution: {integrity: sha512-b4cRQ0BeZcSEzPpY2PjFY70VbO32K7BStTGtBsnIGdTSEEQzBi8hPBcGQmTG2zUvFr9uLe0TK42bw8YszuHEqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1) '@eslint-community/regexpp': 4.9.1 '@eslint/eslintrc': 3.0.2 - '@eslint/js': 9.0.0 - '@humanwhocodes/config-array': 0.12.3 + '@eslint/js': 9.1.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.2.3 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 @@ -9001,7 +9044,6 @@ packages: file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 is-glob: 4.0.3 @@ -9578,14 +9620,14 @@ packages: readable-stream: 2.3.8 dev: false - /focus-trap-vue@4.0.3(focus-trap@7.5.4)(vue@3.4.21): + /focus-trap-vue@4.0.3(focus-trap@7.5.4)(vue@3.4.25): resolution: {integrity: sha512-cIX5rybkCAlNZ4IHYJ3nCFIsipDDljJHHjtTO2IgYWkVYg7X9ipUVdab3HzYp88kmHgMwjcB71LYnXRRsF6ZqQ==} peerDependencies: focus-trap: ^7.0.0 vue: ^3.0.0 dependencies: focus-trap: 7.5.4 - vue: 3.4.21(typescript@5.4.5) + vue: 3.4.25(typescript@5.4.5) dev: true /focus-trap@7.5.4: @@ -10638,8 +10680,8 @@ packages: engines: {node: '>=0.10.0'} dev: false - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + /ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 @@ -11124,7 +11166,6 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -11401,7 +11442,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -12510,6 +12551,10 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: true + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -12553,9 +12598,8 @@ packages: engines: {node: '>=12'} dev: false - /magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -12682,7 +12726,6 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - dev: false /memoize@10.0.0: resolution: {integrity: sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==} @@ -12908,7 +12951,6 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - dev: false /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -13019,7 +13061,6 @@ packages: object-assign: 4.1.1 type-is: 1.6.18 xtend: 4.0.2 - dev: false /mute-stdout@1.0.1: resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} @@ -14039,7 +14080,6 @@ packages: /pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} - dev: false /pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} @@ -14328,6 +14368,7 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} @@ -14645,6 +14686,16 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: false + /qrcode-generator@1.4.4: + resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + dev: true + + /qrcode-vue3@1.6.8: + resolution: {integrity: sha512-LtMnwKWi58ZqHbXBcsTF/VxDYhI6RrBIrDQw8fbDVlO8p5tJBZa7TaIaVYLY937vKO2WCEBmOKksGlpm5ccEIg==} + dependencies: + qrcode-generator: 1.4.4 + dev: true + /qrcode@1.5.3: resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} engines: {node: '>=10.13.0'} @@ -14654,7 +14705,6 @@ packages: encode-utf8: 1.0.3 pngjs: 5.0.0 yargs: 15.4.1 - dev: false /qs@6.12.1: resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} @@ -14786,7 +14836,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: false /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -14874,14 +14923,14 @@ packages: redis-errors: 1.2.0 dev: false - /redis-semaphore@5.5.1(ioredis@5.3.2): + /redis-semaphore@5.5.1(ioredis@5.4.1): resolution: {integrity: sha512-wqeYg3xWDCR81DRlS2y9lx/5TVKr1Qq0w9QuN6WK9i+R3exGPM8QGwnYarSrb6G/aZFMAJffGgLdmvR3jls9cQ==} engines: {node: '>= 14.17.0'} peerDependencies: ioredis: ^4.1.0 || ^5 dependencies: debug: 4.3.4(supports-color@8.1.1) - ioredis: 5.3.2 + ioredis: 5.4.1 transitivePeerDependencies: - supports-color dev: false @@ -15027,7 +15076,6 @@ packages: /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: false /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -15153,28 +15201,29 @@ packages: seedrandom: 2.4.2 dev: false - /rollup@4.14.2: - resolution: {integrity: sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==} + /rollup@4.16.4: + resolution: {integrity: sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.2 - '@rollup/rollup-android-arm64': 4.14.2 - '@rollup/rollup-darwin-arm64': 4.14.2 - '@rollup/rollup-darwin-x64': 4.14.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.2 - '@rollup/rollup-linux-arm64-gnu': 4.14.2 - '@rollup/rollup-linux-arm64-musl': 4.14.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.2 - '@rollup/rollup-linux-riscv64-gnu': 4.14.2 - '@rollup/rollup-linux-s390x-gnu': 4.14.2 - '@rollup/rollup-linux-x64-gnu': 4.14.2 - '@rollup/rollup-linux-x64-musl': 4.14.2 - '@rollup/rollup-win32-arm64-msvc': 4.14.2 - '@rollup/rollup-win32-ia32-msvc': 4.14.2 - '@rollup/rollup-win32-x64-msvc': 4.14.2 + '@rollup/rollup-android-arm-eabi': 4.16.4 + '@rollup/rollup-android-arm64': 4.16.4 + '@rollup/rollup-darwin-arm64': 4.16.4 + '@rollup/rollup-darwin-x64': 4.16.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.16.4 + '@rollup/rollup-linux-arm-musleabihf': 4.16.4 + '@rollup/rollup-linux-arm64-gnu': 4.16.4 + '@rollup/rollup-linux-arm64-musl': 4.16.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.16.4 + '@rollup/rollup-linux-riscv64-gnu': 4.16.4 + '@rollup/rollup-linux-s390x-gnu': 4.16.4 + '@rollup/rollup-linux-x64-gnu': 4.16.4 + '@rollup/rollup-linux-x64-musl': 4.16.4 + '@rollup/rollup-win32-arm64-msvc': 4.16.4 + '@rollup/rollup-win32-ia32-msvc': 4.16.4 + '@rollup/rollup-win32-x64-msvc': 4.16.4 fsevents: 2.3.3 dev: true @@ -15207,7 +15256,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -15749,7 +15797,6 @@ packages: /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - dev: false /streamx@2.15.1: resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} @@ -15839,7 +15886,6 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: false /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -16042,15 +16088,15 @@ packages: whet.extend: 0.9.9 dev: false - /swc-loader@0.2.6(@swc/core@1.4.13)(webpack@5.91.0): + /swc-loader@0.2.6(@swc/core@1.5.0)(webpack@5.91.0): resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: '@swc/core': ^1.2.147 webpack: '>=2' dependencies: - '@swc/core': 1.4.13 + '@swc/core': 1.5.0 '@swc/counter': 0.1.3 - webpack: 5.91.0(@swc/core@1.4.13) + webpack: 5.91.0(@swc/core@1.5.0) dev: true /swiper@11.1.1: @@ -16138,7 +16184,7 @@ packages: engines: {node: '>=14.16'} dev: true - /terser-webpack-plugin@5.3.10(@swc/core@1.4.13)(webpack@5.91.0): + /terser-webpack-plugin@5.3.10(@swc/core@1.5.0)(webpack@5.91.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -16155,12 +16201,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.20 - '@swc/core': 1.4.13 + '@swc/core': 1.5.0 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.27.0 - webpack: 5.91.0(@swc/core@1.4.13) + webpack: 5.91.0(@swc/core@1.5.0) dev: true /terser@5.19.2: @@ -16242,8 +16288,8 @@ packages: any-promise: 1.3.0 dev: false - /three@0.163.0: - resolution: {integrity: sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==} + /three@0.164.1: + resolution: {integrity: sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==} dev: true /throttle-debounce@5.0.0: @@ -16482,10 +16528,10 @@ packages: semver: 7.6.0 source-map: 0.7.4 typescript: 5.4.5 - webpack: 5.91.0(@swc/core@1.4.13) + webpack: 5.91.0(@swc/core@1.5.0) dev: true - /ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@5.4.5): + /ts-node@10.9.2(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@5.4.5): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -16500,7 +16546,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.4.13 + '@swc/core': 1.5.0 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 @@ -16638,8 +16684,8 @@ packages: engines: {node: '>=8'} dev: true - /type-fest@4.15.0: - resolution: {integrity: sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==} + /type-fest@4.17.0: + resolution: {integrity: sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw==} engines: {node: '>=16'} dev: true @@ -16649,7 +16695,6 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: false /type@1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} @@ -16705,7 +16750,6 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false /typedoc@0.23.28(typescript@4.9.4): resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} @@ -16721,7 +16765,7 @@ packages: typescript: 4.9.4 dev: true - /typeorm@0.3.20(ioredis@5.3.2)(pg@8.11.5)(ts-node@10.9.2): + /typeorm@0.3.20(ioredis@5.4.1)(pg@8.11.5)(ts-node@10.9.2): resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} engines: {node: '>=16.13.0'} hasBin: true @@ -16788,12 +16832,12 @@ packages: debug: 4.3.4(supports-color@8.1.1) dotenv: 16.3.1 glob: 10.3.10 - ioredis: 5.3.2 + ioredis: 5.4.1 mkdirp: 2.1.6 pg: 8.11.5 reflect-metadata: 0.2.2 sha.js: 2.4.11 - ts-node: 10.9.2(@swc/core@1.4.13)(@types/node@20.12.7)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.5.0)(@types/node@20.12.7)(typescript@5.4.5) tslib: 2.6.1 uuid: 9.0.1 yargs: 17.7.2 @@ -17134,7 +17178,7 @@ packages: replace-ext: 1.0.1 dev: false - /vite-plugin-compression@0.5.1(vite@5.2.8): + /vite-plugin-compression@0.5.1(vite@5.2.10): resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -17142,13 +17186,13 @@ packages: chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) fs-extra: 10.1.0 - vite: 5.2.8(@types/node@20.12.7)(sass@1.75.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) transitivePeerDependencies: - supports-color dev: true - /vite@5.2.8(@types/node@20.12.7)(sass@1.75.0): - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} + /vite@5.2.10(@types/node@20.12.7)(sass@1.75.0): + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -17178,7 +17222,7 @@ packages: '@types/node': 20.12.7 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.2 + rollup: 4.16.4 sass: 1.75.0 optionalDependencies: fsevents: 2.3.3 @@ -17269,13 +17313,13 @@ packages: vue: 2.7.14 dev: true - /vue-prism-editor@2.0.0-alpha.2(vue@3.4.21): + /vue-prism-editor@2.0.0-alpha.2(vue@3.4.25): resolution: {integrity: sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==} engines: {node: '>=10'} peerDependencies: vue: ^3.0.0 dependencies: - vue: 3.4.21(typescript@5.4.5) + vue: 3.4.25(typescript@5.4.5) dev: true /vue-template-compiler@2.7.16: @@ -17285,14 +17329,14 @@ packages: he: 1.2.0 dev: true - /vue-tsc@2.0.13(typescript@5.4.5): - resolution: {integrity: sha512-a3nL3FvguCWVJUQW/jFrUxdeUtiEkbZoQjidqvMeBK//tuE2w6NWQAbdrEpY2+6nSa4kZoKZp8TZUMtHpjt4mQ==} + /vue-tsc@2.0.14(typescript@5.4.5): + resolution: {integrity: sha512-DgAO3U1cnCHOUO7yB35LENbkapeRsBZ7Ugq5hGz/QOHny0+1VQN8eSwSBjYbjLVPfvfw6EY7sNPjbuHHUhckcg==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/typescript': 2.2.0-alpha.8 - '@vue/language-core': 2.0.13(typescript@5.4.5) + '@volar/typescript': 2.2.0-alpha.10 + '@vue/language-core': 2.0.14(typescript@5.4.5) semver: 7.6.0 typescript: 5.4.5 dev: true @@ -17305,19 +17349,19 @@ packages: csstype: 3.1.2 dev: true - /vue@3.4.21(typescript@5.4.5): - resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + /vue@3.4.25(typescript@5.4.5): + resolution: {integrity: sha512-HWyDqoBHMgav/OKiYA2ZQg+kjfMgLt/T0vg4cbIF7JbXAjDexRf5JRg+PWAfrAkSmTd2I8aPSXtooBFWHB98cg==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.21 - '@vue/compiler-sfc': 3.4.21 - '@vue/runtime-dom': 3.4.21 - '@vue/server-renderer': 3.4.21(vue@3.4.21) - '@vue/shared': 3.4.21 + '@vue/compiler-dom': 3.4.25 + '@vue/compiler-sfc': 3.4.25 + '@vue/runtime-dom': 3.4.25 + '@vue/server-renderer': 3.4.25(vue@3.4.25) + '@vue/shared': 3.4.25 typescript: 5.4.5 dev: true @@ -17377,7 +17421,7 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.91.0(@swc/core@1.4.13): + /webpack@5.91.0(@swc/core@1.5.0): resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} hasBin: true @@ -17408,7 +17452,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.13)(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.5.0)(webpack@5.91.0) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -17468,7 +17512,6 @@ packages: /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: false /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} @@ -17539,7 +17582,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -17631,7 +17673,7 @@ packages: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} dependencies: - sax: 1.2.1 + sax: 1.2.4 xmlbuilder: 11.0.1 dev: false @@ -17643,7 +17685,6 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false /y18n@3.2.2: resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} @@ -17651,7 +17692,6 @@ packages: /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: false /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -17696,7 +17736,6 @@ packages: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: false /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} @@ -17743,7 +17782,6 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: false /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}