splashcat-exporter-v2
Rosalina 2024-05-14 01:37:47 -04:00
commit cd3088eb16
No known key found for this signature in database
43 changed files with 1848 additions and 3977 deletions

View File

@ -1,3 +1,20 @@
## 0.4.15
feat: add znca headers ([#95](https://github.com/spacemeowx2/s3si.ts/issues/95))
feat: update User-Agent ([#94](https://github.com/spacemeowx2/s3si.ts/pull/94))
## 0.4.14
chore: update `WEB_VIEW_VERSION` and queries
fix: readLines may read corrupted data
## 0.4.13
refactor: upgraded the version of dependencies and fixed the deprecated API
([#92](https://github.com/spacemeowx2/s3si.ts/issues/92))
## 0.4.12 ## 0.4.12
feat: add 6.0.0 special feat: add 6.0.0 special

221
deno.lock
View File

@ -1,50 +1,167 @@
{ {
"version": "2", "version": "3",
"remote": { "remote": {
"https://deno.land/std@0.141.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", "https://deno.land/std@0.210.0/fmt/colors.ts": "2685c524bef9b16b3059a417daf6860c754eb755e19e812762ef5dff62f24481",
"https://deno.land/std@0.141.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", "https://deno.land/std@0.213.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975",
"https://deno.land/std@0.141.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", "https://deno.land/std@0.213.0/assert/_diff.ts": "dcc63d94ca289aec80644030cf88ccbf7acaa6fbd7b0f22add93616b36593840",
"https://deno.land/std@0.141.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", "https://deno.land/std@0.213.0/assert/_format.ts": "0ba808961bf678437fb486b56405b6fefad2cf87b5809667c781ddee8c32aff4",
"https://deno.land/std@0.141.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", "https://deno.land/std@0.213.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5",
"https://deno.land/std@0.141.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", "https://deno.land/std@0.213.0/assert/assert_almost_equals.ts": "8b96b7385cc117668b0720115eb6ee73d04c9bcb2f5d2344d674918c9113688f",
"https://deno.land/std@0.141.0/io/types.d.ts": "01f60ae7ec02675b5dbed150d258fc184a78dfe5c209ef53ba4422b46b58822c", "https://deno.land/std@0.213.0/assert/assert_array_includes.ts": "1688d76317fd45b7e93ef9e2765f112fdf2b7c9821016cdfb380b9445374aed1",
"https://deno.land/std@0.141.0/streams/conversion.ts": "8268f3f1a43324953dd8e9e4e31adb42e3caddb4502433bde03c279e43d70a3b", "https://deno.land/std@0.213.0/assert/assert_equals.ts": "4497c56fe7d2993b0d447926702802fc0becb44e319079e8eca39b482ee01b4e",
"https://deno.land/std@0.160.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", "https://deno.land/std@0.213.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9",
"https://deno.land/std@0.160.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", "https://deno.land/std@0.213.0/assert/assert_false.ts": "6f382568e5128c0f855e5f7dbda8624c1ed9af4fcc33ef4a9afeeedcdce99769",
"https://deno.land/std@0.160.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4", "https://deno.land/std@0.213.0/assert/assert_greater.ts": "4945cf5729f1a38874d7e589e0fe5cc5cd5abe5573ca2ddca9d3791aa891856c",
"https://deno.land/std@0.160.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a", "https://deno.land/std@0.213.0/assert/assert_greater_or_equal.ts": "573ed8823283b8d94b7443eb69a849a3c369a8eb9666b2d1db50c33763a5d219",
"https://deno.land/std@0.160.0/bytes/mod.ts": "b2e342fd3669176a27a4e15061e9d588b89c1aaf5008ab71766e23669565d179", "https://deno.land/std@0.213.0/assert/assert_instance_of.ts": "72dc1faff1e248692d873c89382fa1579dd7b53b56d52f37f9874a75b11ba444",
"https://deno.land/std@0.160.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2", "https://deno.land/std@0.213.0/assert/assert_is_error.ts": "6596f2b5ba89ba2fe9b074f75e9318cda97a2381e59d476812e30077fbdb6ed2",
"https://deno.land/std@0.160.0/flags/mod.ts": "686b6b36e14b00f11c9e26cecf439021158436a6e34f60eeb0d927f0b169ae20", "https://deno.land/std@0.213.0/assert/assert_less.ts": "2b4b3fe7910f65f7be52212f19c3977ecb8ba5b2d6d0a296c83cde42920bb005",
"https://deno.land/std@0.160.0/fmt/colors.ts": "9e36a716611dcd2e4865adea9c4bec916b5c60caad4cdcdc630d4974e6bb8bd4", "https://deno.land/std@0.213.0/assert/assert_less_or_equal.ts": "b93d212fe669fbde959e35b3437ac9a4468f2e6b77377e7b6ea2cfdd825d38a0",
"https://deno.land/std@0.160.0/io/buffer.ts": "fae02290f52301c4e0188670e730cd902f9307fb732d79c4aa14ebdc82497289", "https://deno.land/std@0.213.0/assert/assert_match.ts": "ec2d9680ed3e7b9746ec57ec923a17eef6d476202f339ad91d22277d7f1d16e1",
"https://deno.land/std@0.160.0/io/mod.ts": "6e781ebafd5cdccf9ab4afa1f499b08c513602d023cb08ceebc58758501f78bd", "https://deno.land/std@0.213.0/assert/assert_not_equals.ts": "f3edda73043bc2c9fae6cbfaa957d5c69bbe76f5291a5b0466ed132c8789df4c",
"https://deno.land/std@0.160.0/io/readers.ts": "45847ad404afd2f605eae1cff193f223462bc55eeb9ae313c2f3db28aada0fd6", "https://deno.land/std@0.213.0/assert/assert_not_instance_of.ts": "8f720d92d83775c40b2542a8d76c60c2d4aeddaf8713c8d11df8984af2604931",
"https://deno.land/std@0.160.0/io/types.d.ts": "107e1e64834c5ba917c783f446b407d33432c5d612c4b3430df64fc2b4ecf091", "https://deno.land/std@0.213.0/assert/assert_not_match.ts": "b4b7c77f146963e2b673c1ce4846473703409eb93f5ab0eb60f6e6f8aeffe39f",
"https://deno.land/std@0.160.0/io/util.ts": "23e706b4b6a3ebb34af00ad74d7549d906f3211fc98c1fba1185a36e017fb727", "https://deno.land/std@0.213.0/assert/assert_not_strict_equals.ts": "da0b8ab60a45d5a9371088378e5313f624799470c3b54c76e8b8abeec40a77be",
"https://deno.land/std@0.160.0/io/writers.ts": "2e1c63ffd0cfba411b1fd8374609abff9ea86187c9d4d885d42e6fc20325ef0e", "https://deno.land/std@0.213.0/assert/assert_object_match.ts": "e85e5eef62a56ce364c3afdd27978ccab979288a3e772e6855c270a7b118fa49",
"https://deno.land/std@0.160.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", "https://deno.land/std@0.213.0/assert/assert_rejects.ts": "e9e0c8d9c3e164c7ac962c37b3be50577c5a2010db107ed272c4c1afb1269f54",
"https://deno.land/std@0.160.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", "https://deno.land/std@0.213.0/assert/assert_strict_equals.ts": "0425a98f70badccb151644c902384c12771a93e65f8ff610244b8147b03a2366",
"https://deno.land/std@0.160.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", "https://deno.land/std@0.213.0/assert/assert_string_includes.ts": "dfb072a890167146f8e5bdd6fde887ce4657098e9f71f12716ef37f35fb6f4a7",
"https://deno.land/std@0.160.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", "https://deno.land/std@0.213.0/assert/assert_throws.ts": "edddd86b39606c342164b49ad88dd39a26e72a26655e07545d172f164b617fa7",
"https://deno.land/std@0.160.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", "https://deno.land/std@0.213.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8",
"https://deno.land/std@0.160.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac", "https://deno.land/std@0.213.0/assert/equal.ts": "fae5e8a52a11d3ac694bbe1a53e13a7969e3f60791262312e91a3e741ae519e2",
"https://deno.land/std@0.160.0/path/posix.ts": "6b63de7097e68c8663c84ccedc0fd977656eb134432d818ecd3a4e122638ac24", "https://deno.land/std@0.213.0/assert/fail.ts": "f310e51992bac8e54f5fd8e44d098638434b2edb802383690e0d7a9be1979f1c",
"https://deno.land/std@0.160.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", "https://deno.land/std@0.213.0/assert/mod.ts": "325df8c0683ad83a873b9691aa66b812d6275fc9fec0b2d180ac68a2c5efed3b",
"https://deno.land/std@0.160.0/path/win32.ts": "ee8826dce087d31c5c81cd414714e677eb68febc40308de87a2ce4b40e10fb8d", "https://deno.land/std@0.213.0/assert/unimplemented.ts": "47ca67d1c6dc53abd0bd729b71a31e0825fc452dbcd4fde4ca06789d5644e7fd",
"https://deno.land/std@0.160.0/streams/conversion.ts": "328afbedee0a7e0c330ac4c7b4c1af569ee53974f970230f6a78f545b93abb9b", "https://deno.land/std@0.213.0/assert/unreachable.ts": "38cfecb95d8b06906022d2f9474794fca4161a994f83354fd079cac9032b5145",
"https://deno.land/std@0.160.0/testing/_diff.ts": "a23e7fc2b4d8daa3e158fa06856bedf5334ce2a2831e8bf9e509717f455adb2c", "https://deno.land/std@0.213.0/bytes/concat.ts": "9cac3b4376afbef98ff03588eb3cf948e0d1eb6c27cfe81a7651ab6dd3adc54a",
"https://deno.land/std@0.160.0/testing/_format.ts": "cd11136e1797791045e639e9f0f4640d5b4166148796cad37e6ef75f7d7f3832", "https://deno.land/std@0.213.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a",
"https://deno.land/std@0.160.0/testing/asserts.ts": "1e340c589853e82e0807629ba31a43c84ebdcdeca910c4a9705715dfdb0f5ce8", "https://deno.land/std@0.213.0/crypto/_fnv/fnv32.ts": "ba2c5ef976b9f047d7ce2d33dfe18671afc75154bcf20ef89d932b2fe8820535",
"https://deno.land/std@0.160.0/uuid/_common.ts": "76e1fdfb03aecf733f7b3a5edc900f5734f2433b359fdb1535f8de72873bdb3f", "https://deno.land/std@0.213.0/crypto/_fnv/fnv64.ts": "580cadfe2ff333fe253d15df450f927c8ac7e408b704547be26aab41b5772558",
"https://deno.land/std@0.160.0/uuid/mod.ts": "e57ba10200d75f2b17570f13eba19faa6734b1be2da5091e2c01039df41274a5", "https://deno.land/std@0.213.0/crypto/_fnv/mod.ts": "8dbb60f062a6e77b82f7a62ac11fabfba52c3cd408c21916b130d8f57a880f96",
"https://deno.land/std@0.160.0/uuid/v1.ts": "7123410ef9ce980a4f2e54a586ccde5ed7063f6f119a70d86eebd92f8e100295", "https://deno.land/std@0.213.0/crypto/_fnv/util.ts": "27b36ce3440d0a180af6bf1cfc2c326f68823288540a354dc1d636b781b9b75f",
"https://deno.land/std@0.160.0/uuid/v4.ts": "3e983c6ac895ea2a7ba03da927a2438fe1c26ac43fb38dc44f2f8aa50c23cb53", "https://deno.land/std@0.213.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "76c727912539737def4549bb62a96897f37eb334b979f49c57b8af7a1617635e",
"https://deno.land/std@0.160.0/uuid/v5.ts": "43973aeda44ad212f2ec9b8d6c042b74d5cef4ce583d6aa6fc4cdb339344c74c", "https://deno.land/std@0.213.0/crypto/_wasm/mod.ts": "c55f91473846827f077dfd7e5fc6e2726dee5003b6a5747610707cdc638a22ba",
"https://deno.land/x/another_cookiejar@v4.1.4/cookie.ts": "72d6a6633ea13dd2f13b53d9726735b194996353a958024072c4d6b077c97baf", "https://deno.land/std@0.213.0/crypto/crypto.ts": "633e3ac52c496c52b1b6815dc6565db9af93a316665d2719bf7457f7342f372c",
"https://deno.land/x/another_cookiejar@v4.1.4/cookie_jar.ts": "9accd36e76929f2f06fa710d2165fb544703617245fa36ac63560b9fa2a22a25", "https://deno.land/std@0.213.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376",
"https://deno.land/x/another_cookiejar@v4.1.4/fetch_wrapper.ts": "d8918c0776413b2d4a675415727973390b4401a026f6dfdcffedce3296b5e0dc", "https://deno.land/std@0.213.0/encoding/base64.ts": "0ec6d6e6b68fc38f6396277e5184bcd47c1a9db0222fd0b563487eb67e352741",
"https://deno.land/x/another_cookiejar@v4.1.4/mod.ts": "eff949014965771f2cd447fe78625a1ad28b59333afa40640f02c0922534d89a", "https://deno.land/std@0.213.0/flags/mod.ts": "58da4edceb20cbcb30fba78583e64525177aff1d80fb6b7f8bea85ecfd21463b",
"https://deno.land/std@0.213.0/fmt/colors.ts": "aeaee795471b56fc62a3cb2e174ed33e91551b535f44677f6320336aabb54fbb",
"https://deno.land/std@0.213.0/io/_common.ts": "36705cdb4dfcd338d6131bca1b16e48a4d5bf0d1dada6ce397268e88c17a5835",
"https://deno.land/std@0.213.0/io/_constants.ts": "3c7ad4695832e6e4a32e35f218c70376b62bc78621ef069a4a0a3d55739f8856",
"https://deno.land/std@0.213.0/io/buf_reader.ts": "ccbd43ace0a9eebbd5e1b4765724b79da79d1e28b90c2b08537b99192da4a1f7",
"https://deno.land/std@0.213.0/io/buf_writer.ts": "bf68b9c74b1bccf51b9960c54db5eec60e7e3d922c7c62781b0d3971770021ba",
"https://deno.land/std@0.213.0/io/buffer.ts": "79182995c8340ece2fa8763a8da86d282c507e854921d0a4c2ba7425c63609ef",
"https://deno.land/std@0.213.0/io/copy.ts": "63c6a4acf71fb1e89f5e47a7b3b2972f9d2c56dd645560975ead72db7eb23f61",
"https://deno.land/std@0.213.0/io/copy_n.ts": "e4a169b8965b69e6a05175d06bf14565caa91266143ec895e54e95b6cdb27cf2",
"https://deno.land/std@0.213.0/io/limited_reader.ts": "2b3e6c2d134bbbabbc918584db5fd2f8b21091843357f75af0d9f262cb5c94c1",
"https://deno.land/std@0.213.0/io/mod.ts": "571384032c5f60530542a28f2e8b0e73e47e87eca77056ba7e2363f4d4a4573a",
"https://deno.land/std@0.213.0/io/multi_reader.ts": "ca8a7813208a3393dfaed75894d955fe58a38c21b880e69839a4e0547eadbf61",
"https://deno.land/std@0.213.0/io/read_all.ts": "876c1cb20adea15349c72afc86cecd3573335845ae778967aefb5e55fe5a8a4a",
"https://deno.land/std@0.213.0/io/read_delim.ts": "fb0884d97adc398877c6f59e1d1450be12e078790f52845fae7876dc119bb8f6",
"https://deno.land/std@0.213.0/io/read_int.ts": "6ada4e0eec5044982df530e4de804e32ae757a2c318b57eba622d893841ffe2a",
"https://deno.land/std@0.213.0/io/read_lines.ts": "34555eaa25269f6cfb9a842a03daedc9eae4f8295c8f933bd2b1639274ce89e3",
"https://deno.land/std@0.213.0/io/read_long.ts": "199cba44526464f8499e1f3d96008d513bcadc8e5665356a9b84425cac6b16ad",
"https://deno.land/std@0.213.0/io/read_range.ts": "a0c930ea61fdc3ea5520be4df34a7927fe8a2d6da9b04bfaa7b9588ef2e1a718",
"https://deno.land/std@0.213.0/io/read_short.ts": "73777709ad41b6faeff3638c275a329cc820c1082f4dad07909f48875a35a71d",
"https://deno.land/std@0.213.0/io/read_string_delim.ts": "8c604ceea5c3c7ab244583570b467ce194238ace6d49b1d47f25d4f75de86d59",
"https://deno.land/std@0.213.0/io/slice_long_to_bytes.ts": "9769174a8f3b4449f1e1af1a79f78e58ef84d0aaf2f457e1fdc31a01f92439b7",
"https://deno.land/std@0.213.0/io/string_reader.ts": "b0176211e61e235a684abef722e7ecc7a6481238ba264f1a7b199b8a1d2a62f5",
"https://deno.land/std@0.213.0/io/string_writer.ts": "4fe4dcbdadff11c726bf79b0239e14fa9b1e8468a795b465622e4dbd6c1f819c",
"https://deno.land/std@0.213.0/io/to_readable_stream.ts": "ed03a44a1ec1cc55a85a857acf6cac472035298f6f3b6207ea209f93b4aefb39",
"https://deno.land/std@0.213.0/io/to_writable_stream.ts": "ef422e0425963c8a1e0481674e66c3023da50f0acbe5ef51ec9789efc3c1e2ed",
"https://deno.land/std@0.213.0/io/types.ts": "748bbb3ac96abda03594ef5a0db15ce5450dcc6c0d841c8906f8b10ac8d32c96",
"https://deno.land/std@0.213.0/io/write_all.ts": "24aac2312bb21096ae3ae0b102b22c26164d3249dff96dbac130958aa736f038",
"https://deno.land/std@0.213.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297",
"https://deno.land/std@0.213.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2",
"https://deno.land/std@0.213.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031",
"https://deno.land/std@0.213.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c",
"https://deno.land/std@0.213.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
"https://deno.land/std@0.213.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b",
"https://deno.land/std@0.213.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf",
"https://deno.land/std@0.213.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770",
"https://deno.land/std@0.213.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
"https://deno.land/std@0.213.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965",
"https://deno.land/std@0.213.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607",
"https://deno.land/std@0.213.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a",
"https://deno.land/std@0.213.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883",
"https://deno.land/std@0.213.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600",
"https://deno.land/std@0.213.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15",
"https://deno.land/std@0.213.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668",
"https://deno.land/std@0.213.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643",
"https://deno.land/std@0.213.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36",
"https://deno.land/std@0.213.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c",
"https://deno.land/std@0.213.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441",
"https://deno.land/std@0.213.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af",
"https://deno.land/std@0.213.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069",
"https://deno.land/std@0.213.0/path/glob_to_regexp.ts": "83c5fd36a8c86f5e72df9d0f45317f9546afa2ce39acaafe079d43a865aced08",
"https://deno.land/std@0.213.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7",
"https://deno.land/std@0.213.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141",
"https://deno.land/std@0.213.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a",
"https://deno.land/std@0.213.0/path/join_globs.ts": "e9589869a33dc3982101898ee50903db918ca00ad2614dbe3934d597d7b1fbea",
"https://deno.land/std@0.213.0/path/mod.ts": "ffeaccb713dbe6c72e015b7c767f753f8ec5fbc3b621ff5eeee486ffc2c0ddda",
"https://deno.land/std@0.213.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352",
"https://deno.land/std@0.213.0/path/normalize_glob.ts": "98ee8268fad271193603271c203ae973280b5abfbdd2cbca1053fd2af71869ca",
"https://deno.land/std@0.213.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb",
"https://deno.land/std@0.213.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d",
"https://deno.land/std@0.213.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843",
"https://deno.land/std@0.213.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4",
"https://deno.land/std@0.213.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1",
"https://deno.land/std@0.213.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b",
"https://deno.land/std@0.213.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427",
"https://deno.land/std@0.213.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1",
"https://deno.land/std@0.213.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40",
"https://deno.land/std@0.213.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697",
"https://deno.land/std@0.213.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede",
"https://deno.land/std@0.213.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9",
"https://deno.land/std@0.213.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3",
"https://deno.land/std@0.213.0/path/posix/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9",
"https://deno.land/std@0.213.0/path/posix/mod.ts": "563a18c2b3ddc62f3e4a324ff0f583e819b8602a72ad880cb98c9e2e34f8db5b",
"https://deno.land/std@0.213.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91",
"https://deno.land/std@0.213.0/path/posix/normalize_glob.ts": "65f0138fa518ef9ece354f32889783fc38cdf985fb02dcf1c3b14fa47d665640",
"https://deno.land/std@0.213.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb",
"https://deno.land/std@0.213.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c",
"https://deno.land/std@0.213.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a",
"https://deno.land/std@0.213.0/path/posix/separator.ts": "c9ecae5c843170118156ac5d12dc53e9caf6a1a4c96fc8b1a0ab02dff5c847b0",
"https://deno.land/std@0.213.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf",
"https://deno.land/std@0.213.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0",
"https://deno.land/std@0.213.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add",
"https://deno.land/std@0.213.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d",
"https://deno.land/std@0.213.0/path/separator.ts": "c6c890507f944a1f5cb7d53b8d638d6ce3cf0f34609c8d84a10c1eaa400b77a9",
"https://deno.land/std@0.213.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b",
"https://deno.land/std@0.213.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40",
"https://deno.land/std@0.213.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808",
"https://deno.land/std@0.213.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe",
"https://deno.land/std@0.213.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4",
"https://deno.land/std@0.213.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5",
"https://deno.land/std@0.213.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9",
"https://deno.land/std@0.213.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef",
"https://deno.land/std@0.213.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6",
"https://deno.land/std@0.213.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01",
"https://deno.land/std@0.213.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b",
"https://deno.land/std@0.213.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a",
"https://deno.land/std@0.213.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9",
"https://deno.land/std@0.213.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3",
"https://deno.land/std@0.213.0/path/windows/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9",
"https://deno.land/std@0.213.0/path/windows/mod.ts": "7d6062927bda47c47847ffb55d8f1a37b0383840aee5c7dfc93984005819689c",
"https://deno.land/std@0.213.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780",
"https://deno.land/std@0.213.0/path/windows/normalize_glob.ts": "179c86ba89f4d3fe283d2addbe0607341f79ee9b1ae663abcfb3439db2e97810",
"https://deno.land/std@0.213.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734",
"https://deno.land/std@0.213.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7",
"https://deno.land/std@0.213.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3",
"https://deno.land/std@0.213.0/path/windows/separator.ts": "e51c5522140eff4f8402617c5c68a201fdfa3a1a8b28dc23587cff931b665e43",
"https://deno.land/std@0.213.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484",
"https://deno.land/std@0.213.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c",
"https://deno.land/std@0.213.0/uuid/_common.ts": "05c787c5735776c4e48e30294878332c39cb7738f50b209df4eb9f2b0facce4d",
"https://deno.land/std@0.213.0/uuid/constants.ts": "eb6c96871e968adf3355507d7ae79adce71525fd6c1ca55c51d32ace0196d64e",
"https://deno.land/std@0.213.0/uuid/mod.ts": "b9cb1cf73c3d87e15817486df7e885a63b74a7384768a927c708ccd045fcbf78",
"https://deno.land/std@0.213.0/uuid/v1.ts": "a089755e9ba5a172f3d568b617164d4692bd71e548b018e039d1bcb17d4f1bb6",
"https://deno.land/std@0.213.0/uuid/v3.ts": "aff081baee55498ed5804d006735a77b252ac1645e3b418058807218371de577",
"https://deno.land/std@0.213.0/uuid/v4.ts": "8a9c60c887446651be5d50b468a3d702b87bb821fc35f0edcb5515c3bc07b256",
"https://deno.land/std@0.213.0/uuid/v5.ts": "f6771dc89e89f26e74a9b51d25d6b711c27d2ddf3a3650312dd46e7edfe2491e",
"https://deno.land/x/another_cookiejar@v5.0.4/cookie.ts": "2be7548d01a3a9df97deb187761a843a77fd824057478919abf1e1e89ae1eb2e",
"https://deno.land/x/another_cookiejar@v5.0.4/cookie_jar.ts": "e47d7b2c608bcd9600fd26825b600946f16ae167216cea71935049188d2fc6d1",
"https://deno.land/x/another_cookiejar@v5.0.4/fetch_wrapper.ts": "73434cb1b7d5e595eecdcc23e60af6fbc099b9e4cb82bb92d9f1617a85516286",
"https://deno.land/x/another_cookiejar@v5.0.4/mod.ts": "eff949014965771f2cd447fe78625a1ad28b59333afa40640f02c0922534d89a",
"https://deno.land/x/msgpack@v1.4/CachedKeyDecoder.ts": "c39b6f1572902ae08c0e4971f639e81031ac59403957fc43c6fb3c7fe69d99a1", "https://deno.land/x/msgpack@v1.4/CachedKeyDecoder.ts": "c39b6f1572902ae08c0e4971f639e81031ac59403957fc43c6fb3c7fe69d99a1",
"https://deno.land/x/msgpack@v1.4/Decoder.ts": "bdb68309cd51da2b9a897f269784c6d636796258838a97f25b0e1b399c6f369b", "https://deno.land/x/msgpack@v1.4/Decoder.ts": "bdb68309cd51da2b9a897f269784c6d636796258838a97f25b0e1b399c6f369b",
"https://deno.land/x/msgpack@v1.4/Encoder.ts": "4852bbacb30cd66eb2bd61a9e20476802458b991e13aacb5eb984d0348247ffe", "https://deno.land/x/msgpack@v1.4/Encoder.ts": "4852bbacb30cd66eb2bd61a9e20476802458b991e13aacb5eb984d0348247ffe",
@ -61,12 +178,14 @@
"https://deno.land/x/msgpack@v1.4/utils/stream.ts": "1315e29af5c1a40d97bfa6f1c4f7f73d26067b912236f56851981f2f049500b8", "https://deno.land/x/msgpack@v1.4/utils/stream.ts": "1315e29af5c1a40d97bfa6f1c4f7f73d26067b912236f56851981f2f049500b8",
"https://deno.land/x/msgpack@v1.4/utils/typedArrays.ts": "bb819c2f28cf7f85ed50b2e57f108462715555cc61ce315e8134cf1eef2ae662", "https://deno.land/x/msgpack@v1.4/utils/typedArrays.ts": "bb819c2f28cf7f85ed50b2e57f108462715555cc61ce315e8134cf1eef2ae662",
"https://deno.land/x/msgpack@v1.4/utils/utf8.ts": "93183055a7a41986080eeb711e83d553e7c8b121642da4379a5adf253b7beefd", "https://deno.land/x/msgpack@v1.4/utils/utf8.ts": "93183055a7a41986080eeb711e83d553e7c8b121642da4379a5adf253b7beefd",
"https://deno.land/x/progress@v1.2.8/deps.ts": "e0abdc972a0c152508b28ced5ae9c4be26a5773f0aa4a3caa72371c84d2e28a2", "https://deno.land/x/murmurhash@v1.0.0/mod.ts": "13fd2c5534dfd22ffbfcd4255ea13e47a2f2b99e9c90a83dc43e814a0e278829",
"https://deno.land/x/progress@v1.2.8/mod.ts": "5ef7c7ff079d71effed5055666af81cc58a566bc98e2df8473526bd6457976c5", "https://deno.land/x/progress@v1.4.5/deps.ts": "f2886f3f87af20b397ffcf9723a0fabc5893491ce9ce7615a37b1d7a38539247",
"https://deno.land/x/progress@v1.2.8/multi.ts": "392553552243204539d83ee53cadda990db20b1b421520411318ff9bd0320646", "https://deno.land/x/progress@v1.4.5/mod.ts": "e26996fb5f23863c3402133896a9739ea4059b155a3d89ba207cad10b50524ea",
"https://deno.land/x/semaphore@v1.1.1/mod.ts": "431abb51927a16c537cec1cfb05bf2de6a8f3916331f1ec3f9f13ad7ad6a4ea5", "https://deno.land/x/progress@v1.4.5/multi.ts": "bf50eff76d4c1b1b1a3118e73a58631b19b0b30e0dd4166ae4ef0886efae88a5",
"https://deno.land/x/semaphore@v1.1.1/mutex.ts": "2cc6490481f0fdfe97c6b326a2073819d76b76eac3877864a8ada6a2127492f2", "https://deno.land/x/progress@v1.4.5/time.ts": "001198ff9fe2a452830515fc944665c4369990102978b325e1c9094486cfd8ab",
"https://deno.land/x/semaphore@v1.1.1/semaphore.ts": "0acf1159d635fa3b9198a4ad4acac9e877d79196601aa80544ac0db5a71c646d", "https://deno.land/x/semaphore@v1.1.2/mod.ts": "431abb51927a16c537cec1cfb05bf2de6a8f3916331f1ec3f9f13ad7ad6a4ea5",
"https://deno.land/x/semaphore@v1.1.2/mutex.ts": "2cc6490481f0fdfe97c6b326a2073819d76b76eac3877864a8ada6a2127492f2",
"https://deno.land/x/semaphore@v1.1.2/semaphore.ts": "a3da40292cd49c3f31be392aa16831d00c1ddf6daca50dd74eb61aa6ae8f52a3",
"https://deno.land/x/ts_essentials@v9.1.2/lib/functions.ts": "20681c98ce82d503dba56f5ef9313c196f18a2317ce7c0c331cc3fdea0d56688", "https://deno.land/x/ts_essentials@v9.1.2/lib/functions.ts": "20681c98ce82d503dba56f5ef9313c196f18a2317ce7c0c331cc3fdea0d56688",
"https://deno.land/x/ts_essentials@v9.1.2/lib/literal-types/mod.ts": "c1b9e16a7e49814e9509bed8a5dec25b717761a37d0ef1589d411bd6130dd2e5", "https://deno.land/x/ts_essentials@v9.1.2/lib/literal-types/mod.ts": "c1b9e16a7e49814e9509bed8a5dec25b717761a37d0ef1589d411bd6130dd2e5",
"https://deno.land/x/ts_essentials@v9.1.2/lib/mod.ts": "d7e44a25aa621425ffd118a0210a492c5c354411018e2db648a68614d5901f5b", "https://deno.land/x/ts_essentials@v9.1.2/lib/mod.ts": "d7e44a25aa621425ffd118a0210a492c5c354411018e2db648a68614d5901f5b",

19
deps.ts
View File

@ -2,15 +2,14 @@ export {
Cookie, Cookie,
CookieJar, CookieJar,
wrapFetch, wrapFetch,
} from "https://deno.land/x/another_cookiejar@v4.1.4/mod.ts"; } from "https://deno.land/x/another_cookiejar@v5.0.4/mod.ts";
export type { CookieOptions } from "https://deno.land/x/another_cookiejar@v4.1.4/mod.ts"; export type { CookieOptions } from "https://deno.land/x/another_cookiejar@v5.0.4/mod.ts";
export * as base64 from "https://deno.land/std@0.160.0/encoding/base64.ts"; export * as base64 from "https://deno.land/std@0.213.0/encoding/base64.ts";
export * as flags from "https://deno.land/std@0.160.0/flags/mod.ts"; export * as flags from "https://deno.land/std@0.213.0/flags/mod.ts";
export * as io from "https://deno.land/std@0.160.0/io/mod.ts"; export * as io from "https://deno.land/std@0.213.0/io/mod.ts";
export * as uuid from "https://deno.land/std@0.160.0/uuid/mod.ts"; export * as uuid from "https://deno.land/std@0.213.0/uuid/mod.ts";
export * as msgpack from "https://deno.land/x/msgpack@v1.4/mod.ts"; export * as msgpack from "https://deno.land/x/msgpack@v1.4/mod.ts";
export * as path from "https://deno.land/std@0.160.0/path/mod.ts"; export * as path from "https://deno.land/std@0.213.0/path/mod.ts";
export { MultiProgressBar } from "https://deno.land/x/progress@v1.2.8/mod.ts"; export { MultiProgressBar } from "https://deno.land/x/progress@v1.4.5/mod.ts";
export { Mutex } from "https://deno.land/x/semaphore@v1.1.1/mod.ts"; export { Mutex } from "https://deno.land/x/semaphore@v1.1.2/mod.ts";
export type { DeepReadonly } from "https://deno.land/x/ts_essentials@v9.1.2/mod.ts"; export type { DeepReadonly } from "https://deno.land/x/ts_essentials@v9.1.2/mod.ts";
export { writeAll } from "https://deno.land/std@0.160.0/streams/conversion.ts";

View File

@ -1 +1 @@
export { assertEquals } from "https://deno.land/std@0.160.0/testing/asserts.ts"; export { assertEquals } from "https://deno.land/std@0.213.0/assert/mod.ts";

12
gui/.eslintrc.cjs Normal file
View File

@ -0,0 +1,12 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
],
ignorePatterns: ['.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
plugins: ['react-refresh'],
}

View File

@ -11,51 +11,39 @@
"lint": "eslint --max-warnings=0 src" "lint": "eslint --max-warnings=0 src"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^1.4.0", "@tauri-apps/api": "^1.5.3",
"classnames": "^2.3.2", "clsx": "^2.1.0",
"daisyui": "^3.1.7", "daisyui": "^4.6.1",
"i18next": "^23.2.6", "i18next": "^23.8.1",
"i18next-browser-languagedetector": "^7.1.0", "i18next-browser-languagedetector": "^7.2.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-i18next": "^13.0.1", "react-error-boundary": "^4.0.12",
"react-icons": "^4.10.1", "react-i18next": "^14.0.1",
"react-router-dom": "^6.14.1", "react-icons": "^5.0.1",
"react-use": "^17.4.0" "react-router-dom": "^6.21.3",
"react-use": "^17.5.0",
"swr": "^2.2.4"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "^1.4.0", "@tauri-apps/cli": "^1.5.9",
"@types/node": "^20.3.3", "@types/node": "^20.11.10",
"@types/react": "^18.0.15", "@types/react": "^18.0.15",
"@types/react-dom": "^18.0.6", "@types/react-dom": "^18.0.6",
"@typescript-eslint/parser": "^5.61.0", "@typescript-eslint/eslint-plugin": "^6.20.0",
"@vitejs/plugin-react": "^4.0.1", "@typescript-eslint/parser": "^6.20.0",
"autoprefixer": "^10.4.14", "@typescript-eslint/typescript-estree": "^6.20.0",
"eslint": "^8.44.0", "@vitejs/plugin-react": "^4.2.1",
"eslint-config-react-app": "^7.0.1", "autoprefixer": "^10.4.17",
"i18next-http-backend": "^2.2.1", "eslint": "^8.56.0",
"postcss": "^8.4.24", "eslint-plugin-react-hooks": "^4.6.0",
"tailwindcss": "^3.3.2", "eslint-plugin-react-refresh": "^0.4.5",
"typescript": "^5.1.6", "i18next-http-backend": "^2.4.2",
"vite": "^4.3.9", "postcss": "^8.4.33",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3",
"vite": "^5.0.12",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-tsconfig-paths": "^4.2.0" "vite-tsconfig-paths": "^4.3.1"
},
"eslintConfig": {
"extends": "react-app"
},
"pnpm": {
"packageExtensions": {
"eslint-plugin-flowtype": {
"peerDependenciesMeta": {
"@babel/plugin-syntax-flow": {
"optional": true
},
"@babel/plugin-transform-react-jsx": {
"optional": true
}
}
}
}
} }
} }

File diff suppressed because it is too large Load Diff

273
gui/src-tauri/Cargo.lock generated
View File

@ -4,9 +4,9 @@ version = 3
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.20.0" version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
dependencies = [ dependencies = [
"gimli", "gimli",
] ]
@ -94,9 +94,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.68" version = "0.3.69"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"cc", "cc",
@ -459,12 +459,12 @@ dependencies = [
[[package]] [[package]]
name = "ctor" name = "ctor"
version = "0.1.26" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e"
dependencies = [ dependencies = [
"quote", "quote",
"syn 1.0.109", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -494,7 +494,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.23", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -505,7 +505,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -920,9 +920,9 @@ dependencies = [
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.27.3" version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]] [[package]]
name = "gio" name = "gio"
@ -1128,9 +1128,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]] [[package]]
name = "html5ever" name = "html5ever"
version = "0.25.2" version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
dependencies = [ dependencies = [
"log", "log",
"mac", "mac",
@ -1260,9 +1260,9 @@ dependencies = [
[[package]] [[package]]
name = "infer" name = "infer"
version = "0.12.0" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc"
dependencies = [ dependencies = [
"cfb", "cfb",
] ]
@ -1352,9 +1352,9 @@ dependencies = [
[[package]] [[package]]
name = "json-patch" name = "json-patch"
version = "1.0.0" version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@ -1363,13 +1363,14 @@ dependencies = [
] ]
[[package]] [[package]]
name = "kuchiki" name = "kuchikiki"
version = "0.8.1" version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
dependencies = [ dependencies = [
"cssparser", "cssparser",
"html5ever", "html5ever",
"indexmap 1.9.2",
"matches", "matches",
"selectors", "selectors",
] ]
@ -1382,9 +1383,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.147" version = "0.2.152"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
[[package]] [[package]]
name = "line-wrap" name = "line-wrap"
@ -1413,12 +1414,9 @@ dependencies = [
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.17" version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "loom" name = "loom"
@ -1452,13 +1450,13 @@ dependencies = [
[[package]] [[package]]
name = "markup5ever" name = "markup5ever"
version = "0.10.1" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
dependencies = [ dependencies = [
"log", "log",
"phf 0.8.0", "phf 0.10.1",
"phf_codegen", "phf_codegen 0.10.0",
"string_cache", "string_cache",
"string_cache_codegen", "string_cache_codegen",
"tendril", "tendril",
@ -1653,9 +1651,9 @@ dependencies = [
[[package]] [[package]]
name = "object" name = "object"
version = "0.31.1" version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -1779,9 +1777,17 @@ version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
dependencies = [ dependencies = [
"phf_macros 0.10.0",
"phf_shared 0.10.0", "phf_shared 0.10.0",
"proc-macro-hack", ]
[[package]]
name = "phf"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
dependencies = [
"phf_macros 0.11.2",
"phf_shared 0.11.2",
] ]
[[package]] [[package]]
@ -1794,6 +1800,16 @@ dependencies = [
"phf_shared 0.8.0", "phf_shared 0.8.0",
] ]
[[package]]
name = "phf_codegen"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
dependencies = [
"phf_generator 0.10.0",
"phf_shared 0.10.0",
]
[[package]] [[package]]
name = "phf_generator" name = "phf_generator"
version = "0.8.0" version = "0.8.0"
@ -1814,6 +1830,16 @@ dependencies = [
"rand 0.8.5", "rand 0.8.5",
] ]
[[package]]
name = "phf_generator"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
dependencies = [
"phf_shared 0.11.2",
"rand 0.8.5",
]
[[package]] [[package]]
name = "phf_macros" name = "phf_macros"
version = "0.8.0" version = "0.8.0"
@ -1830,16 +1856,15 @@ dependencies = [
[[package]] [[package]]
name = "phf_macros" name = "phf_macros"
version = "0.10.0" version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
dependencies = [ dependencies = [
"phf_generator 0.10.0", "phf_generator 0.11.2",
"phf_shared 0.10.0", "phf_shared 0.11.2",
"proc-macro-hack",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -1861,10 +1886,19 @@ dependencies = [
] ]
[[package]] [[package]]
name = "pin-project-lite" name = "phf_shared"
version = "0.2.9" version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
[[package]] [[package]]
name = "pin-utils" name = "pin-utils"
@ -1958,9 +1992,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.63" version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -1976,9 +2010,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.29" version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -2173,6 +2207,7 @@ checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
name = "s3si-ts" name = "s3si-ts"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"backtrace",
"serde", "serde",
"serde_json", "serde_json",
"tauri", "tauri",
@ -2220,7 +2255,7 @@ dependencies = [
"log", "log",
"matches", "matches",
"phf 0.8.0", "phf 0.8.0",
"phf_codegen", "phf_codegen 0.8.0",
"precomputed-hash", "precomputed-hash",
"servo_arc", "servo_arc",
"smallvec", "smallvec",
@ -2256,29 +2291,29 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.166" version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8" checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.166" version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6" checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
] ]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.99" version = "1.0.113"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
dependencies = [ dependencies = [
"itoa 1.0.5", "itoa 1.0.5",
"ryu", "ryu",
@ -2330,7 +2365,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2504,9 +2539,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.23" version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2610,9 +2645,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri" name = "tauri"
version = "1.4.1" version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cocoa", "cocoa",
@ -2659,12 +2694,13 @@ dependencies = [
[[package]] [[package]]
name = "tauri-build" name = "tauri-build"
version = "1.4.0" version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cargo_toml", "cargo_toml",
"dirs-next",
"heck 0.4.1", "heck 0.4.1",
"json-patch", "json-patch",
"semver 1.0.16", "semver 1.0.16",
@ -2672,13 +2708,14 @@ dependencies = [
"serde_json", "serde_json",
"tauri-utils", "tauri-utils",
"tauri-winres", "tauri-winres",
"walkdir",
] ]
[[package]] [[package]]
name = "tauri-codegen" name = "tauri-codegen"
version = "1.4.0" version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc"
dependencies = [ dependencies = [
"base64 0.21.0", "base64 0.21.0",
"brotli", "brotli",
@ -2702,9 +2739,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-macros" name = "tauri-macros"
version = "1.4.0" version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875"
dependencies = [ dependencies = [
"heck 0.4.1", "heck 0.4.1",
"proc-macro2", "proc-macro2",
@ -2716,9 +2753,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "0.14.0" version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76"
dependencies = [ dependencies = [
"gtk", "gtk",
"http", "http",
@ -2737,9 +2774,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime-wry" name = "tauri-runtime-wry"
version = "0.14.0" version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158"
dependencies = [ dependencies = [
"cocoa", "cocoa",
"gtk", "gtk",
@ -2757,9 +2794,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-utils" name = "tauri-utils"
version = "1.4.0" version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db"
dependencies = [ dependencies = [
"brotli", "brotli",
"ctor", "ctor",
@ -2769,9 +2806,10 @@ dependencies = [
"html5ever", "html5ever",
"infer", "infer",
"json-patch", "json-patch",
"kuchiki", "kuchikiki",
"log",
"memchr", "memchr",
"phf 0.10.1", "phf 0.11.2",
"proc-macro2", "proc-macro2",
"quote", "quote",
"semver 1.0.16", "semver 1.0.16",
@ -2781,7 +2819,7 @@ dependencies = [
"thiserror", "thiserror",
"url", "url",
"walkdir", "walkdir",
"windows 0.39.0", "windows-version",
] ]
[[package]] [[package]]
@ -2841,7 +2879,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2898,11 +2936,10 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.29.1" version = "1.35.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
dependencies = [ dependencies = [
"autocfg",
"backtrace", "backtrace",
"bytes", "bytes",
"num_cpus", "num_cpus",
@ -3177,7 +3214,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -3199,7 +3236,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.23", "syn 2.0.48",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -3438,12 +3475,36 @@ dependencies = [
"windows_x86_64_msvc 0.48.0", "windows_x86_64_msvc 0.48.0",
] ]
[[package]]
name = "windows-targets"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
dependencies = [
"windows_aarch64_gnullvm 0.52.0",
"windows_aarch64_msvc 0.52.0",
"windows_i686_gnu 0.52.0",
"windows_i686_msvc 0.52.0",
"windows_x86_64_gnu 0.52.0",
"windows_x86_64_gnullvm 0.52.0",
"windows_x86_64_msvc 0.52.0",
]
[[package]] [[package]]
name = "windows-tokens" name = "windows-tokens"
version = "0.39.0" version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597"
[[package]]
name = "windows-version"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4"
dependencies = [
"windows-targets 0.52.0",
]
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.42.1" version = "0.42.1"
@ -3456,6 +3517,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.39.0" version = "0.39.0"
@ -3474,6 +3541,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.39.0" version = "0.39.0"
@ -3492,6 +3565,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]]
name = "windows_i686_gnu"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.39.0" version = "0.39.0"
@ -3510,6 +3589,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]]
name = "windows_i686_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.39.0" version = "0.39.0"
@ -3528,6 +3613,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.42.1" version = "0.42.1"
@ -3540,6 +3631,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.39.0" version = "0.39.0"
@ -3558,6 +3655,12 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.4.7" version = "0.4.7"
@ -3579,9 +3682,9 @@ dependencies = [
[[package]] [[package]]
name = "wry" name = "wry"
version = "0.24.3" version = "0.24.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4"
dependencies = [ dependencies = [
"base64 0.13.1", "base64 0.13.1",
"block", "block",
@ -3595,7 +3698,7 @@ dependencies = [
"gtk", "gtk",
"html5ever", "html5ever",
"http", "http",
"kuchiki", "kuchikiki",
"libc", "libc",
"log", "log",
"objc", "objc",

View File

@ -10,10 +10,10 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies] [build-dependencies]
tauri-build = { version = "1.4.0", features = [] } tauri-build = { version = "1.5.1", features = [] }
[dependencies] [dependencies]
tauri = { version = "1.4.1", features = [ tauri = { version = "1.5.4", features = [
"fs-all", "fs-all",
"path-all", "path-all",
"process-relaunch", "process-relaunch",
@ -22,9 +22,10 @@ tauri = { version = "1.4.1", features = [
"shell-sidecar", "shell-sidecar",
"window-all", "window-all",
] } ] }
serde = { version = "1.0.164", features = ["derive"] } serde = { version = "^1.0.196", features = ["derive"] }
serde_json = "1.0.97" serde_json = "^1.0.113"
tokio = { version = "1.28.2", features = ["time"] } tokio = { version = "^1.35.1", features = ["time"] }
backtrace = "^0.3.69"
[features] [features]
# this feature is used for production builds or when `devPath` points to the filesystem # this feature is used for production builds or when `devPath` points to the filesystem

View File

@ -9,7 +9,7 @@
}, },
"package": { "package": {
"productName": "s3si-ts", "productName": "s3si-ts",
"version": "0.4.12" "version": "0.4.15"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@ -5,17 +5,20 @@ import { Home } from "pages/Home";
import { Settings } from "pages/Settings"; import { Settings } from "pages/Settings";
import { Guide } from 'pages/Guide'; import { Guide } from 'pages/Guide';
import { useShowWindow } from 'hooks/useShowWindow'; import { useShowWindow } from 'hooks/useShowWindow';
import { AppContextProvider } from 'context/app';
function App() { function App() {
useShowWindow(); useShowWindow();
return ( return (
<Routes> <AppContextProvider>
<Route path='/' element={<Layout />}> <Routes>
<Route index element={<Home />} /> <Route path='/' element={<Layout />}>
<Route path='/settings' element={<Settings />} /> <Route index element={<Home />} />
<Route path='/guide' element={<Guide />} /> <Route path='/settings' element={<Settings />} />
</Route> <Route path='/guide' element={<Guide />} />
</Routes> </Route>
</Routes>
</AppContextProvider>
); );
} }

View File

@ -11,6 +11,6 @@ export const CheckUpdate: React.FC<{ className?: string, children?: ReactNode }>
} }
return <> return <>
<button className={className} onClick={onClick}>{children}</button> <button type='button' className={className} onClick={onClick}>{children}</button>
</>; </>;
} }

View File

@ -1,9 +1,10 @@
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { AiOutlineWarning } from 'react-icons/ai' import { AiOutlineWarning } from 'react-icons/ai'
import { FallbackProps } from 'react-error-boundary'
type ErrorContentProps = { type ErrorContentProps = {
error: any error: unknown
retry?: () => void retry?: () => void
} }
@ -18,9 +19,14 @@ export const ErrorContent: React.FC<ErrorContentProps> = ({ error, retry }) => {
<span className='inline-flex items-center'> <span className='inline-flex items-center'>
<AiOutlineWarning className='inline-block scale-[2] mr-4 justify-end flex-none' /> <AiOutlineWarning className='inline-block scale-[2] mr-4 justify-end flex-none' />
<div className='max-w-full break-all'> <div className='max-w-full break-all'>
<div>{t('发生了错误')}{retry && <button className='link link-info ml-1'>{t('重试')}</button>}</div> <div>{t('发生了错误')}{retry && <button type='button' className='link link-info ml-1'>{t('重试')}</button>}</div>
{String(error)} {String(error)}
</div> </div>
</span> </span>
</div> </div>
} }
export const FallbackComponent: React.FC<FallbackProps> = ({ error, resetErrorBoundary }) => {
console.error('FallbackComponent', error)
return <ErrorContent error={error} retry={resetErrorBoundary} />
}

View File

@ -9,6 +9,6 @@ type HeaderProps = {
export const Header: React.FC<HeaderProps> = ({ title }) => { export const Header: React.FC<HeaderProps> = ({ title }) => {
const navigate = useNavigate(); const navigate = useNavigate();
return <> return <>
<h2 className="card-title" data-tauri-drag-region><button onClick={() => navigate(-1)}><AiOutlineLeft /></button>{title}</h2> <h2 className="card-title" data-tauri-drag-region><button type='button' onClick={() => navigate(-1)}><AiOutlineLeft /></button>{title}</h2>
</> </>
} }

View File

@ -1,10 +1,8 @@
import { invoke } from '@tauri-apps/api'; import { invoke } from '@tauri-apps/api';
import classNames from 'classnames'; import clsx from 'clsx';
import { usePromise } from 'hooks/usePromise'; import { useService, useServiceMutation } from 'services/useService';
import React, { useState } from 'react' import React, { useState } from 'react'
import { getConfig, getProfile, setProfile } from 'services/config';
import { ensureTokenValid } from 'services/s3si'; import { ensureTokenValid } from 'services/s3si';
import { composeLoadable } from 'utils/composeLoadable';
import { ErrorContent } from './ErrorContent'; import { ErrorContent } from './ErrorContent';
type OpenSplatnetProps = { type OpenSplatnetProps = {
@ -12,30 +10,29 @@ type OpenSplatnetProps = {
} }
export const OpenSplatnet: React.FC<OpenSplatnetProps> = ({ children }) => { export const OpenSplatnet: React.FC<OpenSplatnetProps> = ({ children }) => {
let { loading, error, retry, result } = composeLoadable({ const profileResult = useService('profile', 0)
config: usePromise(getConfig), const { trigger: setProfile } = useServiceMutation('profile', 0)
profile: usePromise(() => getProfile(0)),
});
const [doing, setDoing] = useState(false); const [doing, setDoing] = useState(false);
const [err, setError] = useState<any>(); const [err, setError] = useState<unknown>();
const onClick = async () => { const onClick = async () => {
setDoing(true); setDoing(true);
try { try {
if (!result) { if (!profileResult.data) {
return; return;
} }
const state = result.profile.state; const state = profileResult.data.state;
const newState = await ensureTokenValid(state); const newState = await ensureTokenValid(state);
await setProfile(0, { await setProfile({
...result.profile, ...profileResult.data,
state: newState, state: newState,
}); });
retry?.();
const gtoken = newState.loginState?.gToken; const gtoken = newState.loginState?.gToken;
await invoke('open_splatnet', { await invoke('open_splatnet', {
gtoken, gtoken,
lang: result.profile.state.userLang, lang: profileResult.data.state.userLang,
}); });
} catch (e) { } catch (e) {
setError(e); setError(e);
@ -45,16 +42,21 @@ export const OpenSplatnet: React.FC<OpenSplatnetProps> = ({ children }) => {
}; };
if (error || err) { if (err) {
return <> return <>
<ErrorContent error={error || err} retry={retry} /> <ErrorContent error={err} />
</> </>
} }
const btnLoading = loading || doing; const btnLoading = profileResult.isLoading || doing;
return <> return <>
<button className={classNames('btn w-full', { <button
'btn-disabled': !result?.profile.state.loginState?.sessionToken, type='button'
})} onClick={onClick} disabled={btnLoading}>{btnLoading ? <span className='loading' /> : children}</button> className={clsx('btn w-full', {
'btn-disabled': !profileResult.data?.state?.loginState?.sessionToken,
})}
onClick={onClick}
disabled={btnLoading}
>{btnLoading ? <span className='loading' /> : children}</button>
</> </>
} }

View File

@ -1,71 +1,39 @@
import classNames from 'classnames'; import clsx from 'clsx';
import { usePromise } from 'hooks/usePromise';
import React, { useEffect, useRef, useState } from 'react' import React, { useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { canExport, getProfile, setProfile } from 'services/config'; import { useLog } from 'services/s3si';
import { addLog, run, useLog } from 'services/s3si';
import { Checkbox } from './Checkbox'; import { Checkbox } from './Checkbox';
import { Loading } from './Loading'; import { Loading } from './Loading';
import { useService } from 'services/useService';
import { useAppContext } from 'context/app'
type RunPanelProps = { type RunPanelProps = Record<string, never>
}
export const RunPanel: React.FC<RunPanelProps> = () => { export const RunPanel: React.FC<RunPanelProps> = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { result } = usePromise(() => getProfile(0)); const { data: result } = useService('profile', 0)
const [exportBattle, setExportBattle] = useState(true); const [exportBattle, setExportBattle] = useState(true);
const [exportCoop, setExportCoop] = useState(true); const [exportCoop, setExportCoop] = useState(true);
const [loading, setLoading] = useState(false); const { exports } = useAppContext()
const disabled = !exports
const isExporting = exports?.isExporting ?? false
if (!result) { if (!result) {
return <Loading /> return <Loading />
} }
const onClick = async () => {
setLoading(true);
try {
addLog({
level: 'log',
msg: ['Export started at', new Date().toLocaleString()],
})
const { state } = result;
const newState = await run(state, {
exporter: "stat.ink",
monitor: false,
withSummary: false,
skipMode: exportBattle === false ? 'vs' : exportCoop === false ? 'coop' : undefined,
});
await setProfile(0, {
...result,
state: newState,
})
} catch (e) {
console.error(e)
addLog({
level: 'error',
msg: [e],
})
} finally {
addLog({
level: 'log',
msg: ['Export ended at', new Date().toLocaleString()],
})
setLoading(false);
}
}
const disabled = !canExport(result);
return <> return <>
<div className="tooltip" data-tip={disabled ? t('请先在设置中完成Nintendo Account登录和stat.ink的API密钥') : undefined}> <div className="tooltip" data-tip={disabled ? t('请先在设置中完成Nintendo Account登录和stat.ink的API密钥') : undefined}>
<Checkbox disabled={disabled || loading} value={exportBattle} onChange={setExportBattle}>{t('导出对战数据')}</Checkbox> <Checkbox disabled={disabled || isExporting} value={exportBattle} onChange={setExportBattle}>{t('导出对战数据')}</Checkbox>
<Checkbox disabled={disabled || loading} value={exportCoop} onChange={setExportCoop}>{t('导出打工数据')}</Checkbox> <Checkbox disabled={disabled || isExporting} value={exportCoop} onChange={setExportCoop}>{t('导出打工数据')}</Checkbox>
<button <button
onClick={onClick} type='button'
className={classNames('btn btn-primary w-full', { onClick={() => exports?.trigger({ exportBattle, exportCoop })}
className={clsx('btn btn-primary w-full', {
'btn-disabled': disabled || (!exportBattle && !exportCoop), 'btn-disabled': disabled || (!exportBattle && !exportCoop),
})} })}
disabled={loading} disabled={isExporting}
>{loading ? <span className='loading' /> : t('导出')}</button> >{isExporting ? <span className='loading' /> : t('导出')}</button>
</div> </div>
</> </>
} }

81
gui/src/context/app.tsx Normal file
View File

@ -0,0 +1,81 @@
import { ReactNode, createContext, useContext } from 'react'
import { canExport } from 'services/config';
import { addLog, run } from 'services/s3si';
import { useService, useServiceMutation } from 'services/useService';
import useSWRMutation from 'swr/mutation';
export type ExportArgs = {
exportBattle: boolean,
exportCoop: boolean,
}
const APP_CONTEXT = createContext<{
exports?: {
isExporting: boolean
trigger: (args: ExportArgs) => Promise<void>
}
}>({})
export const useAppContext = () => {
return useContext(APP_CONTEXT)
}
export const AppContextProvider: React.FC<{ children?: ReactNode }> = ({ children }) => {
const { data: result } = useService('profile', 0)
const { trigger: setProfile } = useServiceMutation('profile', 0)
const { trigger: doExport, isMutating } = useSWRMutation<
unknown,
Error,
string,
{
exportBattle: boolean,
exportCoop: boolean,
}
>('export', async (_, { arg: {
exportBattle, exportCoop,
} }) => {
try {
if (!result) {
return
}
addLog({
level: 'log',
msg: ['Export started at', new Date().toLocaleString()],
})
const { state } = result;
const newState = await run(state, {
exporter: "stat.ink",
monitor: false,
withSummary: false,
skipMode: exportBattle === false ? 'vs' : exportCoop === false ? 'coop' : undefined,
});
await setProfile({
...result,
state: newState,
})
} catch (e) {
console.error(e)
addLog({
level: 'error',
msg: [e],
})
} finally {
addLog({
level: 'log',
msg: ['Export ended at', new Date().toLocaleString()],
})
}
})
return <APP_CONTEXT.Provider value={{
exports: result && canExport(result) ? {
isExporting: isMutating,
trigger: async (args: ExportArgs) => {
await doExport(args)
},
} : undefined,
}}>
{children}
</APP_CONTEXT.Provider>
}

View File

@ -1,84 +0,0 @@
import { useState } from "react";
/**
* A hook that returns a promise and its state.
*
* @param factory A function that returns a promise.
* @returns An object containing the promise's state and result.
* @example
* const { loading, result, error } = usePromise(() => fetch('https://example.com')
* .then(response => response.text())
* );
* if (loading) {
* return <p>Loading...</p>;
* }
* if (error) {
* return <p>Error: {error.message}</p>;
* }
* return <p>Result: {result}</p>;
*/
export function usePromise<T>(factory: () => Promise<T>) {
const init = () => {
const promise = factory();
if (!promise || typeof promise.then !== "function") {
throw new Error("The factory function must return a promise.");
}
return promise
.then(r => {
setResult(r);
setLoading(false);
return r;
})
.catch(e => {
setError(e);
setLoading(false);
throw e;
});
}
const [loading, setLoading] = useState(true);
const [result, setResult] = useState<T | undefined>(undefined);
const [error, setError] = useState<any | undefined>(undefined);
const [promise, setPromise] = useState(init);
const retry = () => {
setLoading(true);
setResult(undefined);
setError(undefined);
setPromise(init);
}
return { loading, result, error, promise, retry };
}
/**
* A hook that returns a promise and its state.
*/
export function usePromiseLazy<T, Args extends any[]>(factory: (...args: Args) => Promise<T>) {
const init = (promise: Promise<T>) => {
if (!promise || typeof promise.then !== "function") {
throw new Error("The factory function must return a promise.");
}
return promise
.then(r => {
setResult(r);
setLoading(false);
return r;
})
.catch(e => {
setError(e);
setLoading(false);
throw e;
});
}
const [loading, setLoading] = useState(false);
const [result, setResult] = useState<T | undefined>(undefined);
const [error, setError] = useState<any | undefined>(undefined);
const [promise, setPromise] = useState<Promise<T> | undefined>(undefined);
const execute = (...args: Args) => {
setLoading(true);
setResult(undefined);
setError(undefined);
setPromise(init(factory(...args)));
}
return [execute, { loading, result, error, promise }] as const;
}

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/ban-types */
/* eslint-disable @typescript-eslint/no-explicit-any */
type Maybe<T> = T | null | undefined; type Maybe<T> = T | null | undefined;
type KeyOf<T extends Record<string, any>, K = keyof T> = K extends string ? (T[K] extends Function ? never : K) : never; type KeyOf<T extends Record<string, any>, K = keyof T> = K extends string ? (T[K] extends Function ? never : K) : never;
type DotField<T extends Maybe<Record<string, any>>, K = KeyOf<NonNullable<T>>> = K extends string type DotField<T extends Maybe<Record<string, any>>, K = KeyOf<NonNullable<T>>> = K extends string

View File

@ -21,7 +21,7 @@ export class JSONRPCClient<S extends Service> {
protected transport: Transport; protected transport: Transport;
protected requestMap: Map< protected requestMap: Map<
ID, ID,
(result: RPCResult<any, ResponseError>) => void (result: RPCResult<unknown, ResponseError>) => void
> = new Map(); > = new Map();
protected fatal: unknown = undefined; protected fatal: unknown = undefined;
protected task: Promise<void>; protected task: Promise<void>;
@ -55,6 +55,7 @@ export class JSONRPCClient<S extends Service> {
// receive response from server // receive response from server
protected async run() { protected async run() {
try { try {
// eslint-disable-next-line no-constant-condition
while (true) { while (true) {
const data = await this.transport.recv(); const data = await this.transport.recv();
if (data === undefined) { if (data === undefined) {
@ -111,7 +112,7 @@ export class JSONRPCClient<S extends Service> {
if (result.error) { if (result.error) {
rej(new JSONRPCError(result.error)); rej(new JSONRPCError(result.error));
} else { } else {
res(result.result); res(result.result as R);
} }
}); });
}); });
@ -120,6 +121,7 @@ export class JSONRPCClient<S extends Service> {
getProxy(): S { getProxy(): S {
const proxy = new Proxy({}, { const proxy = new Proxy({}, {
get: (_, method: string) => { get: (_, method: string) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (...params: unknown[]) => this.call(method, ...params as any); return (...params: unknown[]) => this.call(method, ...params as any);
}, },
}); });

View File

@ -1,4 +1,4 @@
import classNames from 'classnames'; import clsx from 'clsx';
import { Header } from 'components/Header'; import { Header } from 'components/Header';
import { useState } from 'react'; import { useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -30,14 +30,16 @@ const Steps: React.FC<{ steps: Step[], className?: string }> = ({ className, ste
{Content && <Content onChange={setState} />} {Content && <Content onChange={setState} />}
<div className='mt-4 flex gap-2'> <div className='mt-4 flex gap-2'>
<button <button
type='button'
onClick={() => setStep(s => s - 1)} onClick={() => setStep(s => s - 1)}
className={classNames('btn', { className={clsx('btn', {
'btn-disabled': !hasPrev || !state.prev, 'btn-disabled': !hasPrev || !state.prev,
})} })}
>{t('上一步')}</button> >{t('上一步')}</button>
<button <button
type='button'
onClick={() => setStep(s => s + 1)} onClick={() => setStep(s => s + 1)}
className={classNames('btn', { className={clsx('btn', {
'btn-disabled': !hasNext || !state.next, 'btn-disabled': !hasNext || !state.next,
})} })}
>{t('下一步')}</button> >{t('下一步')}</button>
@ -49,7 +51,11 @@ const LoginNintendoAccount: React.FC<{ onChange: (v: StepState) => void }> = ({
const { t } = useTranslation(); const { t } = useTranslation();
return <div className='my-3'> return <div className='my-3'>
<button className='btn' onClick={() => onChange({ next: true, prev: true })}>{t('点击登录')}</button> <button
type='button'
className='btn'
onClick={() => onChange({ next: true, prev: true })}
>{t('点击登录')}</button>
</div> </div>
} }

View File

@ -1,25 +1,32 @@
import { OpenSplatnet } from 'components/OpenSplatnet'; import { OpenSplatnet } from 'components/OpenSplatnet';
import { LogPanel, RunPanel } from 'components/RunPanel'; import { LogPanel, RunPanel } from 'components/RunPanel';
import { STAT_INK } from 'constant'; import { STAT_INK } from 'constant';
import React from 'react' import React, { Suspense } from 'react'
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Link } from "react-router-dom"; import { Link } from 'react-router-dom';
import { ErrorBoundary } from 'react-error-boundary';
import { FallbackComponent } from 'components/ErrorContent';
import { Loading } from 'components/Loading';
export const Home: React.FC = () => { export const Home: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
return <div className='flex p-2 w-full h-full gap-2'> return <ErrorBoundary FallbackComponent={FallbackComponent}>
<div className='max-w-full h-full md:max-w-sm flex-auto'> <Suspense fallback={<Loading />}>
<div className='flex flex-col gap-2 h-full'> <div className='flex p-2 w-full h-full gap-2'>
<LogPanel className='sm:hidden flex-auto' /> <div className='max-w-full h-full md:max-w-sm flex-auto'>
<RunPanel /> <div className='flex flex-col gap-2 h-full'>
<Link to='/settings' className='btn'>{t('设置')}</Link> <LogPanel className='sm:hidden flex-auto' />
<div className='flex gap-2 flex-auto-all'> <RunPanel />
<OpenSplatnet>{t('打开鱿鱼圈3')}</OpenSplatnet> <Link to='/settings' className='btn'>{t('设置')}</Link>
<a className='btn w-full' href={STAT_INK} target='_blank' rel='noreferrer'>{t('前往 stat.ink')}</a> <div className='flex gap-2 flex-auto-all'>
<OpenSplatnet>{t('打开鱿鱼圈3')}</OpenSplatnet>
<a className='btn w-full' href={STAT_INK} target='_blank' rel='noreferrer'>{t('前往 stat.ink')}</a>
</div>
</div>
</div> </div>
<LogPanel className='hidden sm:block flex-1' />
</div> </div>
</div> </Suspense>
<LogPanel className='hidden sm:block flex-1' /> </ErrorBoundary>
</div>
} }

View File

@ -1,16 +1,17 @@
import { ErrorContent } from 'components/ErrorContent'; import { ErrorContent, FallbackComponent } from 'components/ErrorContent';
import { Loading } from 'components/Loading'; import { Loading } from 'components/Loading';
import { usePromise, usePromiseLazy } from 'hooks/usePromise'; import React, { Suspense, useState } from 'react'
import React, { useState } from 'react'
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Config, getConfig, getProfile, Profile, setConfig, setProfile } from 'services/config'; import { Config, Profile } from 'services/config';
import { composeLoadable } from 'utils/composeLoadable'; import clsx from 'clsx';
import classNames from 'classnames';
import { useLogin } from 'services/s3si'; import { useLogin } from 'services/s3si';
import { STAT_INK } from 'constant'; import { STAT_INK } from 'constant';
import { Header } from 'components/Header'; import { Header } from 'components/Header';
import { useSubField } from 'hooks/useSubField'; import { useSubField } from 'hooks/useSubField';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import useSWRMutation from 'swr/mutation'
import { useService, useServiceMutation } from 'services/useService';
import { ErrorBoundary } from 'react-error-boundary';
const STAT_INK_KEY_LENGTH = 43; const STAT_INK_KEY_LENGTH = 43;
@ -57,6 +58,8 @@ const Form: React.FC<{
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
const [value, setValue] = useState(oldValue); const [value, setValue] = useState(oldValue);
const { subField } = useSubField({ value, onChange: setValue }); const { subField } = useSubField({ value, onChange: setValue });
const { trigger: setProfile } = useServiceMutation('profile', 0)
const { trigger: setConfig } = useServiceMutation('config')
const changed = JSON.stringify(value) !== JSON.stringify(oldValue); const changed = JSON.stringify(value) !== JSON.stringify(oldValue);
@ -64,12 +67,12 @@ const Form: React.FC<{
const statInkApiKey = subField('profile.state.statInkApiKey') const statInkApiKey = subField('profile.state.statInkApiKey')
const splatnet3Lang = subField('profile.state.userLang') const splatnet3Lang = subField('profile.state.userLang')
const [onSave, { loading, error }] = usePromiseLazy(async () => { const { trigger: onSave, isMutating: loading, error } = useSWRMutation('saveSettings', async () => {
await setProfile(0, value.profile); await setProfile(value.profile);
await setConfig(value.config); await setConfig(value.config);
onSaved?.(); onSaved?.();
}) })
const [onLogin, loginState] = usePromiseLazy(async () => { const loginState = useSWRMutation('login', async () => {
const result = await login(); const result = await login();
if (!result) { if (!result) {
return; return;
@ -85,11 +88,12 @@ const Form: React.FC<{
<label className="label"> <label className="label">
<span className="label-text">{t('Nintendo Account 会话令牌')}</span> <span className="label-text">{t('Nintendo Account 会话令牌')}</span>
<span className="label-text-alt"><button <span className="label-text-alt"><button
className={classNames('link', { type='button'
loading: loginState.loading, className={clsx('link', {
loading: loginState.isMutating,
})} })}
onClick={onLogin} onClick={() => loginState.trigger()}
disabled={loginState.loading} disabled={loginState.isMutating}
>{t('网页登录')}</button></span> >{t('网页登录')}</button></span>
</label> </label>
<input <input
@ -113,7 +117,7 @@ const Form: React.FC<{
</label> </label>
<div className='tooltip' data-tip={statInkKeyError ? t('密钥的长度应该为{{length}}, 请检查', { length: STAT_INK_KEY_LENGTH }) : null}> <div className='tooltip' data-tip={statInkKeyError ? t('密钥的长度应该为{{length}}, 请检查', { length: STAT_INK_KEY_LENGTH }) : null}>
<input <input
className={classNames("input input-bordered w-full", { className={clsx("input input-bordered w-full", {
'input-error': statInkKeyError, 'input-error': statInkKeyError,
})} })}
type="text" type="text"
@ -148,38 +152,49 @@ const Form: React.FC<{
</div> </div>
<ErrorContent error={error} /> <ErrorContent error={error} />
<div className='flex gap-4 max-w-md justify-between flex-auto-all'> <div className='flex gap-4 max-w-md justify-between flex-auto-all'>
<div className="tooltip" data-tip={changed ? undefined : t('没有更改')}> <div className='tooltip' data-tip={changed ? undefined : t('没有更改')}>
<button className={classNames('btn btn-primary w-full', { <button
loading, type='button'
})} onClick={onSave} disabled={!changed || statInkKeyError}>{t('保存')}</button> className={clsx('btn btn-primary w-full', {
loading,
})}
onClick={() => onSave()}
disabled={!changed || statInkKeyError}
>{t('保存')}</button>
</div> </div>
<button className={classNames('btn', { <button
loading, type='button'
})} onClick={() => setValue(oldValue)}>{t('重置')}</button> className={clsx('btn', {
loading,
})}
onClick={() => setValue(oldValue)}
>{t('重置')}</button>
</div> </div>
</> </>
} }
export const Settings: React.FC = () => { const SettingsLoader: React.FC = () => {
const navigate = useNavigate(); const navigate = useNavigate();
let { loading, error, retry, result } = composeLoadable({ const { data: config } = useService('config')
config: usePromise(getConfig), const { data: profile } = useService('profile', 0)
profile: usePromise(() => getProfile(0)),
});
if (loading) { if (!config || !profile) {
return <Page> return <>
<div className='h-full flex items-center justify-center'><Loading /></div> Error
</Page> </>
} }
if (error) { return <>
return <Page> <Form oldValue={{ config, profile }} onSaved={() => navigate(-1)} />
<ErrorContent error={error} retry={retry} /> </>
</Page> }
}
export const Settings: React.FC = () => {
return <Page> return <Page>
{result && <Form oldValue={result} onSaved={() => navigate(-1)} />} <ErrorBoundary FallbackComponent={FallbackComponent}>
<Suspense fallback={<div className='h-full flex items-center justify-center'><Loading /></div>}>
<SettingsLoader />
</Suspense>
</ErrorBoundary>
</Page> </Page>
} }

View File

@ -1,6 +1,6 @@
import { fs } from "@tauri-apps/api" import { fs } from "@tauri-apps/api"
import { appConfigDir, join } from '@tauri-apps/api/path' import { appConfigDir, join } from '@tauri-apps/api/path'
import { State } from '../../../src/state'; import type { State } from '../../../src/state';
const configFile = appConfigDir().then(c => join(c, 'config.json')); const configFile = appConfigDir().then(c => join(c, 'config.json'));
const profileDir = appConfigDir().then(c => join(c, 'profile')); const profileDir = appConfigDir().then(c => join(c, 'profile'));
@ -9,8 +9,7 @@ export type Profile = {
state: State, state: State,
} }
export type Config = { export type Config = Record<string, never>
}
// TODO: import from state.ts. // TODO: import from state.ts.
const DEFAULT_STATE: State = { const DEFAULT_STATE: State = {

View File

@ -9,6 +9,7 @@ const client = new JSONRPCClient<S3SIService>({
const LOG_SUB = new Set<(logs: Log[]) => void>(); const LOG_SUB = new Set<(logs: Log[]) => void>();
async function getLogs() { async function getLogs() {
// eslint-disable-next-line no-constant-condition
while (true) { while (true) {
const r = await client.getLogs() const r = await client.getLogs()
@ -57,7 +58,7 @@ export const useLog = () => {
return useContext(LOG_CONTEXT); return useContext(LOG_CONTEXT);
} }
function renderMsg(i: any) { function renderMsg(i: unknown) {
if (i instanceof Error) { if (i instanceof Error) {
return i.message return i.message
} }
@ -91,14 +92,15 @@ export const LogProvider: React.FC<{ limit?: number, children?: React.ReactNode
LOG_SUB.delete(cb); LOG_SUB.delete(cb);
} }
}, [limit]) }, [limit])
const value = useMemo(() => {
const renderedLogs = logs.map(renderLog)
return {
logs,
renderedLogs,
}
}, [logs])
return <LOG_CONTEXT.Provider value={value}>
const renderedLogs = useMemo(() => logs.map(renderLog), [logs])
return <LOG_CONTEXT.Provider value={{
logs,
renderedLogs,
}}>
{children} {children}
</LOG_CONTEXT.Provider> </LOG_CONTEXT.Provider>
} }

View File

@ -0,0 +1,37 @@
import useSWR, { Key, SWRResponse } from 'swr'
import useSWRMutation, { SWRMutationResponse } from 'swr/mutation'
import { getConfig, getProfile, setConfig, setProfile } from './config'
const SERVICES = {
profile: {
fetcher: getProfile,
updater: setProfile,
},
config: {
fetcher: getConfig,
updater: setConfig,
},
} as const
export type Services = keyof typeof SERVICES
export const useService = <S extends Services>(service: S, ...args: Parameters<(typeof SERVICES)[S]['fetcher']>): SWRResponse<
Awaited<ReturnType<(typeof SERVICES)[S]['fetcher']>>
> => {
// @ts-expect-error TypeScript can not infer type here
return useSWR(['service', service, ...args], () => SERVICES[service].fetcher(...args), { suspense: true })
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type RemoveLastParamters<T extends (...args: any) => any> = T extends (...args: [...infer P, any]) => any ? P : never;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type LastParamter<T extends (...args: any) => any> = T extends (...args: [...infer _, infer P]) => any ? P : never;
export const useServiceMutation = <S extends Services>(service: S, ...args: RemoveLastParamters<(typeof SERVICES)[S]['updater']>): SWRMutationResponse<
Awaited<ReturnType<(typeof SERVICES)[S]['updater']>>,
Error,
Key,
LastParamter<(typeof SERVICES)[S]['updater']>
> => {
// @ts-expect-error TypeScript can not infer type here
return useSWRMutation(['service', service, ...args], (_, { arg }) => SERVICES[service].updater(...args, arg))
}

View File

@ -1,19 +0,0 @@
export type Loadable<T> = {
loading: boolean;
result?: T;
error?: any;
retry?: () => void;
}
export function composeLoadable<T extends Record<string, Loadable<any>>>(map: T): Loadable<{
[P in keyof T]: T[P] extends Loadable<infer R> ? R : never
}> {
const values = Object.values(map)
const loading = values.some(v => v.loading);
const error = values.find(v => v.error)?.error;
const result = loading || error ? undefined : Object.fromEntries(Object.entries(map).map(([k, v]) => [k, v.result])) as any;
const retry = values.some(i => !!i.retry) ? () => Object.values(map).forEach(v => v.retry?.()) : undefined;
return { loading, result, error, retry };
}

View File

@ -1,4 +1,4 @@
import * as path from "https://deno.land/std@0.178.0/path/mod.ts"; import * as path from "https://deno.land/std@0.213.0/path/mod.ts";
import { assertEquals } from "../dev_deps.ts"; import { assertEquals } from "../dev_deps.ts";
if (import.meta.main) { if (import.meta.main) {
@ -39,6 +39,8 @@ if (import.meta.main) {
target, target,
"code:", "code:",
status.code, status.code,
"stderr:",
new TextDecoder().decode(status.stderr),
); );
Deno.exit(status.code); Deno.exit(status.code);
} }

View File

@ -1 +0,0 @@
{}

View File

@ -1,88 +0,0 @@
{
"version": "2",
"remote": {
"https://deno.land/std@0.141.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.141.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
"https://deno.land/std@0.141.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
"https://deno.land/std@0.141.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf",
"https://deno.land/std@0.141.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
"https://deno.land/std@0.141.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
"https://deno.land/std@0.141.0/io/types.d.ts": "01f60ae7ec02675b5dbed150d258fc184a78dfe5c209ef53ba4422b46b58822c",
"https://deno.land/std@0.141.0/streams/conversion.ts": "8268f3f1a43324953dd8e9e4e31adb42e3caddb4502433bde03c279e43d70a3b",
"https://deno.land/std@0.160.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.160.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934",
"https://deno.land/std@0.160.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4",
"https://deno.land/std@0.160.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a",
"https://deno.land/std@0.160.0/bytes/mod.ts": "b2e342fd3669176a27a4e15061e9d588b89c1aaf5008ab71766e23669565d179",
"https://deno.land/std@0.160.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2",
"https://deno.land/std@0.160.0/flags/mod.ts": "686b6b36e14b00f11c9e26cecf439021158436a6e34f60eeb0d927f0b169ae20",
"https://deno.land/std@0.160.0/fmt/colors.ts": "9e36a716611dcd2e4865adea9c4bec916b5c60caad4cdcdc630d4974e6bb8bd4",
"https://deno.land/std@0.160.0/io/buffer.ts": "fae02290f52301c4e0188670e730cd902f9307fb732d79c4aa14ebdc82497289",
"https://deno.land/std@0.160.0/io/mod.ts": "6e781ebafd5cdccf9ab4afa1f499b08c513602d023cb08ceebc58758501f78bd",
"https://deno.land/std@0.160.0/io/readers.ts": "45847ad404afd2f605eae1cff193f223462bc55eeb9ae313c2f3db28aada0fd6",
"https://deno.land/std@0.160.0/io/types.d.ts": "107e1e64834c5ba917c783f446b407d33432c5d612c4b3430df64fc2b4ecf091",
"https://deno.land/std@0.160.0/io/util.ts": "23e706b4b6a3ebb34af00ad74d7549d906f3211fc98c1fba1185a36e017fb727",
"https://deno.land/std@0.160.0/io/writers.ts": "2e1c63ffd0cfba411b1fd8374609abff9ea86187c9d4d885d42e6fc20325ef0e",
"https://deno.land/std@0.160.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
"https://deno.land/std@0.160.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
"https://deno.land/std@0.160.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677",
"https://deno.land/std@0.160.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
"https://deno.land/std@0.160.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
"https://deno.land/std@0.160.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
"https://deno.land/std@0.160.0/path/posix.ts": "6b63de7097e68c8663c84ccedc0fd977656eb134432d818ecd3a4e122638ac24",
"https://deno.land/std@0.160.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
"https://deno.land/std@0.160.0/path/win32.ts": "ee8826dce087d31c5c81cd414714e677eb68febc40308de87a2ce4b40e10fb8d",
"https://deno.land/std@0.160.0/streams/conversion.ts": "328afbedee0a7e0c330ac4c7b4c1af569ee53974f970230f6a78f545b93abb9b",
"https://deno.land/std@0.160.0/testing/_diff.ts": "a23e7fc2b4d8daa3e158fa06856bedf5334ce2a2831e8bf9e509717f455adb2c",
"https://deno.land/std@0.160.0/testing/_format.ts": "cd11136e1797791045e639e9f0f4640d5b4166148796cad37e6ef75f7d7f3832",
"https://deno.land/std@0.160.0/testing/asserts.ts": "1e340c589853e82e0807629ba31a43c84ebdcdeca910c4a9705715dfdb0f5ce8",
"https://deno.land/std@0.160.0/uuid/_common.ts": "76e1fdfb03aecf733f7b3a5edc900f5734f2433b359fdb1535f8de72873bdb3f",
"https://deno.land/std@0.160.0/uuid/mod.ts": "e57ba10200d75f2b17570f13eba19faa6734b1be2da5091e2c01039df41274a5",
"https://deno.land/std@0.160.0/uuid/v1.ts": "7123410ef9ce980a4f2e54a586ccde5ed7063f6f119a70d86eebd92f8e100295",
"https://deno.land/std@0.160.0/uuid/v4.ts": "3e983c6ac895ea2a7ba03da927a2438fe1c26ac43fb38dc44f2f8aa50c23cb53",
"https://deno.land/std@0.160.0/uuid/v5.ts": "43973aeda44ad212f2ec9b8d6c042b74d5cef4ce583d6aa6fc4cdb339344c74c",
"https://deno.land/std@0.178.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
"https://deno.land/std@0.178.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
"https://deno.land/std@0.178.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
"https://deno.land/std@0.178.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
"https://deno.land/std@0.178.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
"https://deno.land/std@0.178.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
"https://deno.land/std@0.178.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
"https://deno.land/std@0.178.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232",
"https://deno.land/std@0.178.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
"https://deno.land/std@0.178.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
"https://deno.land/std@0.178.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
"https://deno.land/x/another_cookiejar@v4.1.4/cookie.ts": "72d6a6633ea13dd2f13b53d9726735b194996353a958024072c4d6b077c97baf",
"https://deno.land/x/another_cookiejar@v4.1.4/cookie_jar.ts": "9accd36e76929f2f06fa710d2165fb544703617245fa36ac63560b9fa2a22a25",
"https://deno.land/x/another_cookiejar@v4.1.4/fetch_wrapper.ts": "d8918c0776413b2d4a675415727973390b4401a026f6dfdcffedce3296b5e0dc",
"https://deno.land/x/another_cookiejar@v4.1.4/mod.ts": "eff949014965771f2cd447fe78625a1ad28b59333afa40640f02c0922534d89a",
"https://deno.land/x/msgpack@v1.4/CachedKeyDecoder.ts": "c39b6f1572902ae08c0e4971f639e81031ac59403957fc43c6fb3c7fe69d99a1",
"https://deno.land/x/msgpack@v1.4/Decoder.ts": "bdb68309cd51da2b9a897f269784c6d636796258838a97f25b0e1b399c6f369b",
"https://deno.land/x/msgpack@v1.4/Encoder.ts": "4852bbacb30cd66eb2bd61a9e20476802458b991e13aacb5eb984d0348247ffe",
"https://deno.land/x/msgpack@v1.4/ExtData.ts": "8d97fe43568e119a1eeb93e1ef1c431e0a24e392fb0c6ffed775aac1e579f244",
"https://deno.land/x/msgpack@v1.4/ExtensionCodec.ts": "e8a24eb1786156239f589cc3058c8ff3d79ed393f420c40fdf7a93df943c91f2",
"https://deno.land/x/msgpack@v1.4/context.ts": "6228de10854dbadf6aef096960af0115214078ec3784eca4565587769fde3d1c",
"https://deno.land/x/msgpack@v1.4/decode.ts": "c808aeec46f6d0e5b28d0bbacd40e78d0a3614b229368c70db2e53c03f7555ca",
"https://deno.land/x/msgpack@v1.4/decodeAsync.ts": "19e4f33ba0cc8d200b857deb9721bace863c0e89f7bff73e2b04379e4ee85bad",
"https://deno.land/x/msgpack@v1.4/encode.ts": "c5598f8eec9efcbd0ef07f246ade049a8f4906703cdb601baf03b2774b293916",
"https://deno.land/x/msgpack@v1.4/mod.ts": "c28290db26b1ea027e1798085fd6c8055685ea086f1418d54a33542b285633c9",
"https://deno.land/x/msgpack@v1.4/timestamp.ts": "5169949efe39bc24f58cd5dcaae682cdf5353c762a54abf9ae6e18c8d9feb648",
"https://deno.land/x/msgpack@v1.4/utils/int.ts": "b08743982f954d2dd7f4f11d868019576b63cb8147d8acc1bce3843f39398188",
"https://deno.land/x/msgpack@v1.4/utils/prettyByte.ts": "35c8104d57ba2a727056beaf1063bbe941d512cdd23ce6b04d7c5b44dafcd46e",
"https://deno.land/x/msgpack@v1.4/utils/stream.ts": "1315e29af5c1a40d97bfa6f1c4f7f73d26067b912236f56851981f2f049500b8",
"https://deno.land/x/msgpack@v1.4/utils/typedArrays.ts": "bb819c2f28cf7f85ed50b2e57f108462715555cc61ce315e8134cf1eef2ae662",
"https://deno.land/x/msgpack@v1.4/utils/utf8.ts": "93183055a7a41986080eeb711e83d553e7c8b121642da4379a5adf253b7beefd",
"https://deno.land/x/murmurhash@v1.0.0/mod.ts": "13fd2c5534dfd22ffbfcd4255ea13e47a2f2b99e9c90a83dc43e814a0e278829",
"https://deno.land/x/progress@v1.2.8/deps.ts": "e0abdc972a0c152508b28ced5ae9c4be26a5773f0aa4a3caa72371c84d2e28a2",
"https://deno.land/x/progress@v1.2.8/mod.ts": "5ef7c7ff079d71effed5055666af81cc58a566bc98e2df8473526bd6457976c5",
"https://deno.land/x/progress@v1.2.8/multi.ts": "392553552243204539d83ee53cadda990db20b1b421520411318ff9bd0320646",
"https://deno.land/x/semaphore@v1.1.1/mod.ts": "431abb51927a16c537cec1cfb05bf2de6a8f3916331f1ec3f9f13ad7ad6a4ea5",
"https://deno.land/x/semaphore@v1.1.1/mutex.ts": "2cc6490481f0fdfe97c6b326a2073819d76b76eac3877864a8ada6a2127492f2",
"https://deno.land/x/semaphore@v1.1.1/semaphore.ts": "0acf1159d635fa3b9198a4ad4acac9e877d79196601aa80544ac0db5a71c646d",
"https://deno.land/x/ts_essentials@v9.1.2/lib/functions.ts": "20681c98ce82d503dba56f5ef9313c196f18a2317ce7c0c331cc3fdea0d56688",
"https://deno.land/x/ts_essentials@v9.1.2/lib/literal-types/mod.ts": "c1b9e16a7e49814e9509bed8a5dec25b717761a37d0ef1589d411bd6130dd2e5",
"https://deno.land/x/ts_essentials@v9.1.2/lib/mod.ts": "d7e44a25aa621425ffd118a0210a492c5c354411018e2db648a68614d5901f5b",
"https://deno.land/x/ts_essentials@v9.1.2/lib/types.ts": "7ee99797a880948c07020e90d569ca3c5d465c378949262110283aa7856f5603",
"https://deno.land/x/ts_essentials@v9.1.2/mod.ts": "ffae461c16d4a1bf24c2179582ab8d5c81ad0df61e4ae2fba51ef5e5bdf90345"
}
}

View File

@ -23,7 +23,7 @@ function encryptKey(uid: string) {
hasher.hash(uid); hasher.hash(uid);
const hash = hasher.result(); const hash = hasher.result();
const key = hash & 0xff; const key = hash & 0xff;
const encrypted = base64.encode( const encrypted = base64.encodeBase64(
new TextEncoder().encode(uid).map((i) => i ^ key), new TextEncoder().encode(uid).map((i) => i ^ key),
); );
return { return {

View File

@ -20,7 +20,7 @@ for (const file of files) {
const content: FileExporterType = JSON.parse(await Deno.readTextFile(file)); const content: FileExporterType = JSON.parse(await Deno.readTextFile(file));
if (content.type === "SUMMARY") continue; if (content.type === "SUMMARY") continue;
const id = content.data.detail.id; const id = content.data.detail.id;
const rawId = base64.decode(id); const rawId = base64.decodeBase64(id);
const uuid = new TextDecoder().decode(rawId.slice(rawId.length - 36)); const uuid = new TextDecoder().decode(rawId.slice(rawId.length - 36));
if (ids.has(uuid)) { if (ids.has(uuid)) {
console.log( console.log(

View File

@ -22,7 +22,7 @@ class TestRankTracker extends RankTracker {
} }
function genId(id: number, date = "20220101"): string { function genId(id: number, date = "20220101"): string {
return base64.encode( return base64.encodeBase64(
`VsHistoryDetail-asdf:asdf:${date}T${ `VsHistoryDetail-asdf:asdf:${date}T${
id.toString().padStart(6, "0") id.toString().padStart(6, "0")
}_------------------------------------`, }_------------------------------------`,

View File

@ -1,9 +1,9 @@
import type { StatInkPostBody, VsHistoryDetail } from "./types.ts"; import type { StatInkPostBody, VsHistoryDetail } from "./types.ts";
export const AGENT_NAME = "s3si.ts"; export const AGENT_NAME = "s3si.ts";
export const S3SI_VERSION = "0.4.12"; export const S3SI_VERSION = "0.4.15";
export const NSOAPP_VERSION = "2.8.1"; export const NSOAPP_VERSION = "2.9.0";
export const WEB_VIEW_VERSION = "6.0.0-daea5c11"; export const WEB_VIEW_VERSION = "6.0.0-eb33aadc";
export enum Queries { export enum Queries {
HomeQuery = HomeQuery =
"51fc56bbf006caf37728914aa8bc0e2c86a80cf195b4d4027d6822a3623098a8", "51fc56bbf006caf37728914aa8bc0e2c86a80cf195b4d4027d6822a3623098a8",
@ -38,9 +38,9 @@ export const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
export const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`; export const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
export const DEFAULT_APP_USER_AGENT = export const DEFAULT_APP_USER_AGENT =
"Mozilla/5.0 (Linux; Android 11; Pixel 5) " + "Mozilla/5.0 (Linux; Android 14; Pixel 7a) " +
"AppleWebKit/537.36 (KHTML, like Gecko) " + "AppleWebKit/537.36 (KHTML, like Gecko) " +
"Chrome/94.0.4606.61 Mobile Safari/537.36"; "Chrome/120.0.6099.230 Mobile Safari/537.36";
export const SPLATNET3_URL = "https://api.lp1.av5ja.srv.nintendo.net"; export const SPLATNET3_URL = "https://api.lp1.av5ja.srv.nintendo.net";
export const SPLATNET3_ENDPOINT = export const SPLATNET3_ENDPOINT =
"https://api.lp1.av5ja.srv.nintendo.net/api/graphql"; "https://api.lp1.av5ja.srv.nintendo.net/api/graphql";

View File

@ -126,8 +126,8 @@ if (import.meta.main) {
const service = new S3SIServiceImplement(); const service = new S3SIServiceImplement();
const server = new JSONRPCServer({ const server = new JSONRPCServer({
transport: new DenoIO({ transport: new DenoIO({
reader: Deno.stdin, reader: Deno.stdin.readable,
writer: Deno.stdout, writer: Deno.stdout.writable,
}), }),
service, service,
}); });

View File

@ -169,7 +169,7 @@ export class SplashcatExporter implements GameExporter {
} }
static getGameId(id: string) { static getGameId(id: string) {
const plainText = new TextDecoder().decode(base64.decode(id)); const plainText = new TextDecoder().decode(base64.decodeBase64(id));
return plainText.split(":").at(-1); return plainText.split(":").at(-1);
} }
@ -200,12 +200,14 @@ export class SplashcatExporter implements GameExporter {
const result: Player = { const result: Player = {
badges: (player.nameplate as Nameplate).badges.map((i) => badges: (player.nameplate as Nameplate).badges.map((i) =>
i i
? Number(new TextDecoder().decode(base64.decode(i.id)).split("-")[1]) ? Number(
new TextDecoder().decode(base64.decodeBase64(i.id)).split("-")[1],
)
: null : null
), ),
splashtagBackgroundId: Number( splashtagBackgroundId: Number(
new TextDecoder().decode( new TextDecoder().decode(
base64.decode((player.nameplate as Nameplate).background.id), base64.decodeBase64((player.nameplate as Nameplate).background.id),
).split("-")[1], ).split("-")[1],
), ),
clothingGear: this.mapGear(player.clothingGear), clothingGear: this.mapGear(player.clothingGear),
@ -215,13 +217,17 @@ export class SplashcatExporter implements GameExporter {
isMe: player.isMyself, isMe: player.isMyself,
name: player.name, name: player.name,
nameId: player.nameId ?? "", nameId: player.nameId ?? "",
nplnId: new TextDecoder().decode(base64.decode(player.id)).split(":").at( nplnId: new TextDecoder().decode(base64.decodeBase64(player.id)).split(
":",
).at(
-1, -1,
)!, )!,
paint: player.paint, paint: player.paint,
species: player.species, species: player.species,
weaponId: Number( weaponId: Number(
new TextDecoder().decode(base64.decode(player.weapon.id)).split("-")[1], new TextDecoder().decode(base64.decodeBase64(player.weapon.id)).split(
"-",
)[1],
), ),
assists: player.result?.assist, assists: player.result?.assist,
deaths: player.result?.death, deaths: player.result?.death,
@ -270,9 +276,10 @@ export class SplashcatExporter implements GameExporter {
: vsDetail.vsMode.mode, : vsDetail.vsMode.mode,
vsRule: vsDetail.vsRule.rule, vsRule: vsDetail.vsRule.rule,
vsStageId: Number( vsStageId: Number(
new TextDecoder().decode(base64.decode(vsDetail.vsStage.id)).split( new TextDecoder().decode(base64.decodeBase64(vsDetail.vsStage.id))
"-", .split(
)[1], "-",
)[1],
), ),
anarchy: vsDetail.vsMode.mode === "BANKARA" anarchy: vsDetail.vsMode.mode === "BANKARA"
? { ? {
@ -301,7 +308,7 @@ export class SplashcatExporter implements GameExporter {
challenge: vsDetail.vsMode.mode === "LEAGUE" challenge: vsDetail.vsMode.mode === "LEAGUE"
? { ? {
id: new TextDecoder().decode( id: new TextDecoder().decode(
base64.decode(vsDetail.leagueMatch?.leagueMatchEvent?.id!), base64.decodeBase64(vsDetail.leagueMatch?.leagueMatchEvent?.id!),
).split("-")[1], ).split("-")[1],
power: vsDetail.leagueMatch?.myLeaguePower ?? undefined, power: vsDetail.leagueMatch?.myLeaguePower ?? undefined,
} }

View File

@ -140,7 +140,8 @@ export async function getGToken(
"Content-Type": "application/json", "Content-Type": "application/json",
"Accept": "application/json", "Accept": "application/json",
"Connection": "Keep-Alive", "Connection": "Keep-Alive",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 7.1.2)", "User-Agent":
"Dalvik/2.1.0 (Linux; U; Android 14; Pixel 7a Build/UQ1A.240105.004)",
}, },
body: JSON.stringify({ body: JSON.stringify({
"client_id": "71b963c1b7b6d119", "client_id": "71b963c1b7b6d119",
@ -194,7 +195,7 @@ export async function getGToken(
"Content-Type": "application/json; charset=utf-8", "Content-Type": "application/json; charset=utf-8",
"Connection": "Keep-Alive", "Connection": "Keep-Alive",
"Accept-Encoding": "gzip", "Accept-Encoding": "gzip",
"User-Agent": `com.nintendo.znca/${NSOAPP_VERSION}(Android/7.1.2)`, "User-Agent": `com.nintendo.znca/${NSOAPP_VERSION}(Android/14)`,
}, },
body: JSON.stringify({ body: JSON.stringify({
parameter: { parameter: {
@ -244,7 +245,7 @@ export async function getGToken(
"Authorization": `Bearer ${idToken}`, "Authorization": `Bearer ${idToken}`,
"Content-Type": "application/json; charset=utf-8", "Content-Type": "application/json; charset=utf-8",
"Accept-Encoding": "gzip", "Accept-Encoding": "gzip",
"User-Agent": `com.nintendo.znca/${NSOAPP_VERSION}(Android/7.1.2)`, "User-Agent": `com.nintendo.znca/${NSOAPP_VERSION}(Android/14)`,
}, },
body: JSON.stringify({ body: JSON.stringify({
parameter: { parameter: {
@ -425,6 +426,8 @@ async function callImink(
headers: { headers: {
"User-Agent": USERAGENT, "User-Agent": USERAGENT,
"Content-Type": "application/json", "Content-Type": "application/json",
"X-znca-Platform": "Android",
"X-znca-Version": NSOAPP_VERSION,
}, },
body: JSON.stringify({ body: JSON.stringify({
"token": idToken, "token": idToken,

View File

@ -1 +0,0 @@
export { IPC } from "./stdio.ts";

View File

@ -1,40 +0,0 @@
/// <reference lib="deno.ns" />
import { io, writeAll } from "../../deps.ts";
import type { ExtractType } from "./types.ts";
export class IPC<T extends { type: string }> {
lines: AsyncIterableIterator<string>;
writer: Deno.Writer;
constructor({ reader, writer }: {
reader: Deno.Reader;
writer: Deno.Writer;
}) {
this.lines = io.readLines(reader);
this.writer = writer;
}
async recvType<K extends T["type"]>(
type: K,
): Promise<ExtractType<T, K>> {
const data = await this.recv();
if (data.type !== type) {
throw new Error(`Unexpected type: ${data.type}`);
}
return data as ExtractType<T, K>;
}
async recv(): Promise<T> {
const result = await this.lines.next();
if (!result.done) {
return JSON.parse(result.value);
}
throw new Error("EOF");
}
async send(data: T) {
await writeAll(
this.writer,
new TextEncoder().encode(JSON.stringify(data) + "\n"),
);
}
}

View File

@ -1,10 +0,0 @@
export type Command = {
type: "hello";
data: string;
};
export type ExtractType<T extends { type: string }, K extends T["type"]> =
Extract<
T,
{ type: K }
>;

View File

@ -1,15 +1,15 @@
import { io, writeAll } from "../../deps.ts"; import { readLines } from "../utils.ts";
import { Transport } from "./types.ts"; import { Transport } from "./types.ts";
export class DenoIO implements Transport { export class DenoIO implements Transport {
lines: AsyncIterableIterator<string>; lines: AsyncIterableIterator<string>;
writer: Deno.Writer & Deno.Closer; writer: WritableStreamDefaultWriter<Uint8Array>;
constructor({ reader, writer }: { constructor({ reader, writer }: {
reader: Deno.Reader; reader: ReadableStream<Uint8Array>;
writer: Deno.Writer & Deno.Closer; writer: WritableStream<Uint8Array>;
}) { }) {
this.lines = io.readLines(reader); this.lines = readLines(reader);
this.writer = writer; this.writer = writer.getWriter();
} }
async recv(): Promise<string | undefined> { async recv(): Promise<string | undefined> {
const result = await this.lines.next(); const result = await this.lines.next();
@ -21,10 +21,8 @@ export class DenoIO implements Transport {
return undefined; return undefined;
} }
async send(data: string) { async send(data: string) {
await writeAll( await this.writer.ready;
this.writer, await this.writer.write(new TextEncoder().encode(data + "\n"));
new TextEncoder().encode(data + "\n"),
);
} }
async close() { async close() {
await this.writer.close(); await this.writer.close();

View File

@ -9,12 +9,12 @@ const COOP_ID =
Deno.test("gameId", async () => { Deno.test("gameId", async () => {
assertEquals( assertEquals(
await gameId(base64.encode(VS_ID)), await gameId(base64.encodeBase64(VS_ID)),
"042bcac9-6b25-5d2e-a5ea-800939a6dea1", "042bcac9-6b25-5d2e-a5ea-800939a6dea1",
); );
assertEquals( assertEquals(
await gameId(base64.encode(COOP_ID)), await gameId(base64.encodeBase64(COOP_ID)),
"58329d62-737d-5b43-ac22-e35e6e44b077", "58329d62-737d-5b43-ac22-e35e6e44b077",
); );
}); });
@ -22,7 +22,7 @@ Deno.test("gameId", async () => {
Deno.test("s3sCoopGameId", async () => { Deno.test("s3sCoopGameId", async () => {
const S3S_COOP_UUID = "be4435b1-0ac5-577b-81bb-766585bec028"; const S3S_COOP_UUID = "be4435b1-0ac5-577b-81bb-766585bec028";
assertEquals( assertEquals(
await s3sCoopGameId(base64.encode(COOP_ID)), await s3sCoopGameId(base64.encodeBase64(COOP_ID)),
S3S_COOP_UUID, S3S_COOP_UUID,
); );
}); });

View File

@ -6,29 +6,53 @@ import {
} from "./constant.ts"; } from "./constant.ts";
import { base64, uuid } from "../deps.ts"; import { base64, uuid } from "../deps.ts";
import { Env } from "./env.ts"; import { Env } from "./env.ts";
import { io } from "../deps.ts";
const stdinLines = io.readLines(Deno.stdin); export async function* readLines(readable: ReadableStream<Uint8Array>) {
const decoder = new TextDecoder();
let buffer = "";
for await (const chunk of readable) {
buffer += decoder.decode(chunk, { stream: true });
let lineEndIndex;
while ((lineEndIndex = buffer.indexOf("\n")) !== -1) {
const line = buffer.slice(0, lineEndIndex).trim();
buffer = buffer.slice(lineEndIndex + 1);
yield line;
}
}
if (buffer.length > 0) {
yield buffer;
}
}
const stdinLines = readLines(Deno.stdin.readable);
export async function readline( export async function readline(
{ skipEmpty = true }: { skipEmpty?: boolean } = {}, { skipEmpty = true }: { skipEmpty?: boolean } = {},
) { ) {
for await (const line of stdinLines) { while (true) {
const result = await stdinLines.next();
if (result.done) {
throw new Error("EOF");
}
const line = result.value;
if (!skipEmpty || line !== "") { if (!skipEmpty || line !== "") {
return line; return line;
} }
} }
throw new Error("EOF");
} }
export function urlBase64Encode(data: ArrayBuffer) { export function urlBase64Encode(data: ArrayBuffer) {
return base64.encode(data) return base64.encodeBase64(data)
.replaceAll("+", "-") .replaceAll("+", "-")
.replaceAll("/", "_") .replaceAll("/", "_")
.replaceAll("=", ""); .replaceAll("=", "");
} }
export function urlBase64Decode(data: string) { export function urlBase64Decode(data: string) {
return base64.decode( return base64.encodeBase64(
data data
.replaceAll("_", "/") .replaceAll("_", "/")
.replaceAll("-", "+"), .replaceAll("-", "+"),
@ -103,14 +127,14 @@ export function gameId(
); );
return uuid.v5.generate(BATTLE_NAMESPACE, content); return uuid.v5.generate(BATTLE_NAMESPACE, content);
} else if (parsed.type === "CoopHistoryDetail") { } else if (parsed.type === "CoopHistoryDetail") {
return uuid.v5.generate(COOP_NAMESPACE, base64.decode(id)); return uuid.v5.generate(COOP_NAMESPACE, base64.decodeBase64(id));
} else { } else {
throw new Error("Unknown type"); throw new Error("Unknown type");
} }
} }
export function s3siGameId(id: string) { export function s3siGameId(id: string) {
const fullId = base64.decode(id); const fullId = base64.decodeBase64(id);
const tsUuid = fullId.slice(fullId.length - 52, fullId.length); const tsUuid = fullId.slice(fullId.length - 52, fullId.length);
return uuid.v5.generate(S3SI_NAMESPACE, tsUuid); return uuid.v5.generate(S3SI_NAMESPACE, tsUuid);
} }
@ -122,7 +146,7 @@ export function s3siGameId(id: string) {
* @returns uuid used in stat.ink * @returns uuid used in stat.ink
*/ */
export function s3sCoopGameId(id: string) { export function s3sCoopGameId(id: string) {
const fullId = base64.decode(id); const fullId = base64.decodeBase64(id);
const tsUuid = fullId.slice(fullId.length - 52, fullId.length); const tsUuid = fullId.slice(fullId.length - 52, fullId.length);
return uuid.v5.generate(COOP_NAMESPACE, tsUuid); return uuid.v5.generate(COOP_NAMESPACE, tsUuid);
} }
@ -131,7 +155,7 @@ export function s3sCoopGameId(id: string) {
* @param id VsHistoryDetail id or CoopHistoryDetail id * @param id VsHistoryDetail id or CoopHistoryDetail id
*/ */
export function parseHistoryDetailId(id: string) { export function parseHistoryDetailId(id: string) {
const plainText = new TextDecoder().decode(base64.decode(id)); const plainText = new TextDecoder().decode(base64.decodeBase64(id));
const vsRE = const vsRE =
/VsHistoryDetail-([a-z0-9-]+):(\w+):(\d{8}T\d{6})_([0-9a-f-]{36})/; /VsHistoryDetail-([a-z0-9-]+):(\w+):(\d{8}T\d{6})_([0-9a-f-]{36})/;
@ -167,7 +191,7 @@ export const delay = (ms: number) =>
* Decode ID and get number after '-' * Decode ID and get number after '-'
*/ */
export function b64Number(id: string): number { export function b64Number(id: string): number {
const text = new TextDecoder().decode(base64.decode(id)); const text = new TextDecoder().decode(base64.decodeBase64(id));
const [_, num] = text.split("-"); const [_, num] = text.split("-");
return parseInt(num); return parseInt(num);
} }