diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfb02d4a8..89a4b1b07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,12 @@ jobs: cd frontend npm ci + - name: 🔧 Install libgtk + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libgtk-3-dev libssl-dev build-essential curl wget libayatana-appindicator3-dev librsvg2-dev libsoup2.4-dev libjavascriptcoregtk-4.0-dev libwebkit2gtk-4.0-dev + version: 1.0 + - name: 🔼 Update Rust to latest stable run: | rustc --version diff --git a/Cargo.lock b/Cargo.lock index c0a4b1af7..c1fce3369 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom", + "getrandom 0.2.8", "once_cell", "version_check", ] @@ -26,7 +26,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.8", "once_cell", "version_check", ] @@ -40,6 +40,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -87,6 +102,46 @@ dependencies = [ "syn", ] +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.3", +] + +[[package]] +name = "attohttpc" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcf00bc6d5abb29b5f97e3c61a90b6d3caa12f3faf897d4a3e3607c050a35a7" +dependencies = [ + "flate2", + "http", + "log", + "native-tls", + "serde", + "serde_json", + "serde_urlencoded", + "url", +] + [[package]] name = "atty" version = "0.2.14" @@ -104,6 +159,56 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08b108ad2665fa3f6e6a517c3d80ec3e77d224c47d605167aefaa5d7ef97fa48" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa 1.0.4", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-http", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b8558f5a0581152dc94dcd289132a1d377494bdeafcd41869b3258e3e2ad92" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "base64" version = "0.13.1" @@ -114,7 +219,7 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" name = "bezier-rs" version = "0.1.0" dependencies = [ - "glam 0.17.3", + "glam", ] [[package]] @@ -122,7 +227,7 @@ name = "bezier-rs-wasm" version = "0.0.0" dependencies = [ "bezier-rs", - "glam 0.17.3", + "glam", "js-sys", "log", "serde", @@ -144,6 +249,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.3" @@ -160,6 +271,27 @@ dependencies = [ "dyn-any", ] +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bstr" version = "0.2.17" @@ -201,6 +333,46 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.3", +] + +[[package]] +name = "cargo_toml" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa0e3586af56b3bfa51fca452bd56e8dbbbd5d8d81cbf0b7e4e35b695b537eb8" +dependencies = [ + "serde", + "toml", +] + [[package]] name = "cc" version = "1.0.77" @@ -210,6 +382,40 @@ dependencies = [ "jobserver", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" +dependencies = [ + "byteorder", + "uuid 0.8.2", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0357a6402b295ca3a86bc148e84df46c02e41f41fef186bda662557ef6328aa" +dependencies = [ + "smallvec", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -223,8 +429,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", + "js-sys", "num-integer", "num-traits", + "time 0.1.45", + "wasm-bindgen", "winapi", ] @@ -236,7 +445,7 @@ checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" dependencies = [ "chrono", "chrono-tz-build", - "phf", + "phf 0.11.1", ] [[package]] @@ -246,8 +455,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" dependencies = [ "parse-zoneinfo", - "phf", - "phf_codegen", + "phf 0.11.1", + "phf_codegen 0.11.1", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", ] [[package]] @@ -266,6 +506,27 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colored" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -276,6 +537,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.3" @@ -292,6 +559,19 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + [[package]] name = "core-graphics-types" version = "0.1.1" @@ -352,7 +632,7 @@ dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.7.1", "scopeguard", ] @@ -392,10 +672,53 @@ dependencies = [ ] [[package]] -name = "cxx" -version = "1.0.82" +name = "cssparser" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "cxx" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf07d07d6531bfcdbe9b8b739b104610c6508dcc4d63b410585faf338241daf" dependencies = [ "cc", "cxxbridge-flags", @@ -405,9 +728,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0" +checksum = "d2eb5b96ecdc99f72657332953d4d9c50135af1bac34277801cc3937906ebd39" dependencies = [ "cc", "codespan-reporting", @@ -420,21 +743,67 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71" +checksum = "ac040a39517fd1674e0f32177648334b0f4074625b5588a64519804ba0553b12" [[package]] name = "cxxbridge-macro" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470" +checksum = "1362b0ddcfc4eb0a1f57b68bd77dd99f0e826958a96abd0ae9bd092e114ffed6" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dbus" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8bcdd56d2e5c4ed26a529c5a9029f5db8290d433497506f958eae3be148eb6" +dependencies = [ + "libc", + "libdbus-sys", + "winapi", +] + [[package]] name = "derivative" version = "2.2.0" @@ -446,6 +815,19 @@ dependencies = [ "syn", ] +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn", +] + [[package]] name = "deunicode" version = "0.4.3" @@ -462,12 +844,60 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" + [[package]] name = "dyn-any" version = "0.2.1" dependencies = [ "dyn-any-derive", - "glam 0.17.3", + "glam", "log", ] @@ -493,6 +923,21 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.8.4" @@ -530,6 +975,38 @@ dependencies = [ "instant", ] +[[package]] +name = "fern" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd7b0849075e79ee9a1836df22c717d1eba30451796fdc631b04565dd11e2a" +dependencies = [ + "colored", + "log", +] + +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset 0.6.5", + "rustc_version 0.3.3", +] + +[[package]] +name = "filetime" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.42.0", +] + [[package]] name = "flate2" version = "1.0.25" @@ -574,18 +1051,114 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +[[package]] +name = "futures-executor" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" + +[[package]] +name = "futures-macro" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +[[package]] +name = "futures-task" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" + +[[package]] +name = "futures-util" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "fxhash" version = "0.2.1" @@ -595,6 +1168,91 @@ dependencies = [ "byteorder", ] +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.3", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.0.3", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.0.3", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.32.0", +] + [[package]] name = "generic-array" version = "0.14.6" @@ -605,6 +1263,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.8" @@ -614,7 +1283,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -629,12 +1298,33 @@ dependencies = [ ] [[package]] -name = "glam" -version = "0.17.3" +name = "gio" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01732b97afd8508eee3333a541b9f7610f454bb818669e66e90f5f57c93a776" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" dependencies = [ - "serde", + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.3", + "winapi", ] [[package]] @@ -643,9 +1333,62 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" dependencies = [ + "bytemuck", "num-traits", + "serde", ] +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" +dependencies = [ + "anyhow", + "heck 0.4.0", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.0.3", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "globset" version = "0.4.9" @@ -670,6 +1413,17 @@ dependencies = [ "walkdir", ] +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.3", +] + [[package]] name = "graph-craft" version = "0.1.0" @@ -679,13 +1433,12 @@ dependencies = [ "bytemuck", "dyn-any", "dyn-clone", - "glam 0.17.3", + "glam", "graphene-core", - "graphene-std", "log", "num-traits", "nvtx", - "rand_chacha", + "rand_chacha 0.3.1", "serde", "spirv-builder", "tempfile", @@ -709,8 +1462,12 @@ name = "graphene-core" version = "0.1.0" dependencies = [ "async-trait", + "bezier-rs", "bytemuck", "dyn-any", + "glam", + "kurbo", + "log", "serde", "spirv-std", ] @@ -721,9 +1478,11 @@ version = "0.1.0" dependencies = [ "bezier-rs", "borrow_stack", + "bytemuck", "dyn-any", "dyn-clone", - "glam 0.17.3", + "glam", + "graph-craft", "graph-proc-macros", "graphene-core", "image", @@ -734,6 +1493,24 @@ dependencies = [ "quote", "serde", "syn", + "tempfile", +] + +[[package]] +name = "graphite-desktop" +version = "0.1.0" +dependencies = [ + "axum", + "chrono", + "fern", + "futures", + "graphite-editor", + "log", + "ron", + "serde", + "serde_json", + "tauri", + "tauri-build", ] [[package]] @@ -746,17 +1523,18 @@ dependencies = [ "derivative", "dyn-any", "env_logger", - "glam 0.17.3", + "glam", "graph-craft", "graphene-core", "graphene-std", "graphite-graphene", "graphite-proc-macros", "image", + "interpreted-executor", "kurbo", "log", "once_cell", - "rand_chacha", + "rand_chacha 0.3.1", "remain", "serde", "serde_json", @@ -771,7 +1549,7 @@ version = "0.0.0" dependencies = [ "base64", "bezier-rs", - "glam 0.17.3", + "glam", "graph-craft", "graphene-std", "image", @@ -802,12 +1580,69 @@ dependencies = [ "graphite-graphene", "js-sys", "log", + "ron", "serde", "serde-wasm-bindgen", "wasm-bindgen", + "wasm-bindgen-futures", "wasm-bindgen-test", ] +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.0.3", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "half" version = "2.1.0" @@ -832,6 +1667,15 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.4.0" @@ -847,6 +1691,66 @@ dependencies = [ "libc", ] +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.4", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + [[package]] name = "humansize" version = "1.1.1" @@ -859,6 +1763,29 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.4", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -883,6 +1810,32 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ico" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "ignore" version = "0.4.18" @@ -930,6 +1883,15 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "infer" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" +dependencies = [ + "cfb", +] + [[package]] name = "instant" version = "0.1.12" @@ -939,12 +1901,78 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interpreted-executor" +version = "0.1.0" +dependencies = [ + "borrow_stack", + "dyn-any", + "dyn-clone", + "glam", + "graph-craft", + "graphene-core", + "graphene-std", + "log", + "num-traits", + "rand_chacha 0.3.1", + "serde", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "itoa" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.25" @@ -972,6 +2000,29 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-patch" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f995a3c8f2bc3dd52a18a583e90f9ec109c047fa1603a853e46bcda14d2e279d" +dependencies = [ + "serde", + "serde_json", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + [[package]] name = "kurbo" version = "0.9.0" @@ -995,9 +2046,18 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" + +[[package]] +name = "libdbus-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c185b5b7ad900923ef3a8ff594083d4d9b5aea80bb4f32b8342363138c0d456b" +dependencies = [ + "pkg-config", +] [[package]] name = "libloading" @@ -1015,6 +2075,15 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + [[package]] name = "link-cplusplus" version = "1.0.7" @@ -1043,6 +2112,40 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e72d50edb17756489e79d52eb146927bec8eba9dd48faadf9ef08bca3791ad5" +dependencies = [ + "cc", + "dirs-next", + "objc-foundation", + "objc_id", + "time 0.3.17", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1052,12 +2155,56 @@ dependencies = [ "libc", ] +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -1067,6 +2214,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -1076,13 +2229,104 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.42.0", +] + [[package]] name = "nanorand" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.8", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "notify-rust" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc2e370356160e41aba3fd0fbac26d86a89ddd2ac4300c03de999a77cfa2509" +dependencies = [ + "dbus", + "mac-notification-sys", + "tauri-winrt-notification", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", ] [[package]] @@ -1126,6 +2370,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "nvtx" version = "1.1.1" @@ -1142,6 +2407,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", ] [[package]] @@ -1150,6 +2445,113 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "openssl" +version = "0.10.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07d5c8cb6e57b3a3612064d7b18b117912b4ce70955c2504d4b741c9e244b132" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_info" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4750134fb6a5d49afc80777394ad5d95b04bc12068c6abb92fae8f43817270f" +dependencies = [ + "log", + "serde", + "winapi", +] + +[[package]] +name = "os_pipe" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6a252f1f8c11e84b3ab59d7a488e48e4478a93937e027076638c49536204639" +dependencies = [ + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.3", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1170,7 +2572,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1182,6 +2584,18 @@ dependencies = [ "regex", ] +[[package]] +name = "paste" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "percent-encoding" version = "2.2.0" @@ -1190,9 +2604,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f400b0f7905bf702f9f3dc3df5a121b16c54e9e8012c082905fdf09a931861a" +checksum = "cc8bed3549e0f9b0a2a78bf7c0018237a2cdf085eecbbc048e52612438e4e9d0" dependencies = [ "thiserror", "ucd-trie", @@ -1200,9 +2614,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "423c2ba011d6e27b02b482a3707c773d19aec65cc024637aec44e19652e66f63" +checksum = "cdc078600d06ff90d4ed238f0119d84ab5d43dbaad278b0e33a8820293b32344" dependencies = [ "pest", "pest_generator", @@ -1210,9 +2624,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e64e6c2c85031c02fdbd9e5c72845445ca0a724d419aa0bc068ac620c9935c1" +checksum = "28a1af60b1c4148bb269006a750cff8e2ea36aff34d2d96cf7be0b14d1bed23c" dependencies = [ "pest", "pest_meta", @@ -1223,22 +2637,54 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57959b91f0a133f89a68be874a5c88ed689c19cd729ecdb5d762ebf16c64d662" +checksum = "fec8605d59fc2ae0c6c1aefc0c7c7a9769732017c0ce07f7a9cfffa7b4404f20" dependencies = [ "once_cell", "pest", "sha1", ] +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + [[package]] name = "phf" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" dependencies = [ - "phf_shared", + "phf_shared 0.11.1", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", ] [[package]] @@ -1247,8 +2693,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.1", + "phf_shared 0.11.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", ] [[package]] @@ -1257,8 +2723,54 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" dependencies = [ - "phf_shared", - "rand", + "phf_shared 0.11.1", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", ] [[package]] @@ -1291,6 +2803,38 @@ dependencies = [ "syn", ] +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "plist" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" +dependencies = [ + "base64", + "indexmap", + "line-wrap", + "serde", + "time 0.3.17", + "xml-rs", +] + [[package]] name = "png" version = "0.17.7" @@ -1309,6 +2853,23 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1333,6 +2894,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + [[package]] name = "proc-macro2" version = "1.0.47" @@ -1353,6 +2920,15 @@ dependencies = [ "syn", ] +[[package]] +name = "quick-xml" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.21" @@ -1362,6 +2938,20 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + [[package]] name = "rand" version = "0.8.5" @@ -1369,8 +2959,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -1380,7 +2980,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -1389,7 +2998,25 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", ] [[package]] @@ -1398,6 +3025,15 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2" +[[package]] +name = "raw-window-handle" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" +dependencies = [ + "cty", +] + [[package]] name = "rayon" version = "1.6.0" @@ -1430,6 +3066,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.8", + "redox_syscall", + "thiserror", +] + [[package]] name = "regex" version = "1.7.0" @@ -1441,6 +3088,15 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.6.28" @@ -1467,6 +3123,41 @@ dependencies = [ "winapi", ] +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "ron" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" +dependencies = [ + "base64", + "bitflags", + "serde", +] + [[package]] name = "rspirv" version = "0.11.0+1.5.4" @@ -1487,7 +3178,7 @@ checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_codegen_spirv" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" dependencies = [ "ar", "hashbrown 0.11.2", @@ -1510,12 +3201,36 @@ dependencies = [ [[package]] name = "rustc_codegen_spirv-types" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" dependencies = [ "rspirv", "serde", ] +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.14", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + [[package]] name = "rustybuzz" version = "0.6.0" @@ -1538,6 +3253,12 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + [[package]] name = "same-file" version = "1.0.6" @@ -1557,6 +3278,16 @@ dependencies = [ "regex", ] +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys 0.36.1", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1582,10 +3313,80 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" [[package]] -name = "serde" -version = "1.0.148" +name = "security-framework" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" dependencies = [ "serde_derive", ] @@ -1603,9 +3404,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.148" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" +checksum = "b4eae9b04cbffdfd550eb462ed33bc6a1b68c935127d008b27444d08380f94e4" dependencies = [ "proc-macro2", "quote", @@ -1618,11 +3419,97 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ - "itoa", + "itoa 1.0.4", "ryu", "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.4", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + [[package]] name = "sha1" version = "0.10.5" @@ -1634,12 +3521,51 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_child" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "siphasher" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + [[package]] name = "slug" version = "0.1.4" @@ -1655,6 +3581,44 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + [[package]] name = "spin" version = "0.9.4" @@ -1677,7 +3641,7 @@ dependencies = [ [[package]] name = "spirv-builder" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu?branch=main#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" dependencies = [ "memchr", "raw-string", @@ -1690,10 +3654,10 @@ dependencies = [ [[package]] name = "spirv-std" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" dependencies = [ "bitflags", - "glam 0.22.0", + "glam", "num-traits", "spirv-std-macros", "spirv-std-types", @@ -1702,7 +3666,7 @@ dependencies = [ [[package]] name = "spirv-std-macros" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" dependencies = [ "proc-macro2", "quote", @@ -1713,7 +3677,7 @@ dependencies = [ [[package]] name = "spirv-std-types" version = "0.4.0-alpha.17" -source = "git+https://github.com/EmbarkStudios/rust-gpu#acb05d379982f35e6d4fbd85ff28af3e9876cf4c" +source = "git+https://github.com/EmbarkStudios/rust-gpu#8bd42bcc3ab58b1925860871ad9949c9bf9078ed" [[package]] name = "spirv-tools" @@ -1736,16 +3700,361 @@ dependencies = [ ] [[package]] -name = "syn" -version = "1.0.104" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" +dependencies = [ + "cfg-expr 0.11.0", + "heck 0.4.0", + "pkg-config", + "toml", + "version-compare 0.1.1", +] + +[[package]] +name = "tao" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c8fab9f2ba9a6d7ad55b46f812984b6ab203d774c162163ac297edc9567404b" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "paste", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "unicode-segmentation", + "uuid 1.2.2", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tauri" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18203448b9d4dcad55607eafeda6dc7fe135848e5f567cd8bdade6cafd8b1a85" +dependencies = [ + "anyhow", + "attohttpc", + "cocoa", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.0", + "http", + "ignore", + "notify-rust", + "objc", + "once_cell", + "open", + "os_info", + "os_pipe", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "rfd", + "semver 1.0.14", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "shared_child", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid 1.2.2", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4" +dependencies = [ + "anyhow", + "cargo_toml", + "heck 0.4.0", + "json-patch", + "semver 1.0.14", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251" +dependencies = [ + "base64", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver 1.0.14", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time 0.3.17", + "uuid 1.2.2", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075" +dependencies = [ + "heck 0.4.0", + "proc-macro2", + "quote", + "syn", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "uuid 1.2.2", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7821c34cf1bd6d89ff46b46a53f3a5050d92afaf2053569f1cc4531167257b24" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid 1.2.2", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1" +dependencies = [ + "brotli", + "ctor", + "glob", + "heck 0.4.0", + "html5ever", + "infer", + "json-patch", + "kuchiki", + "memchr", + "phf 0.10.1", + "proc-macro2", + "quote", + "semver 1.0.14", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows 0.39.0", +] + +[[package]] +name = "tauri-winrt-notification" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58de036c4d2e20717024de2a3c4bf56c301f07b21bc8ef9b57189fce06f1f3b" +dependencies = [ + "quick-xml", + "strum", + "windows 0.39.0", +] + [[package]] name = "tempfile" version = "3.3.0" @@ -1760,6 +4069,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + [[package]] name = "tera" version = "1.17.1" @@ -1774,7 +4094,7 @@ dependencies = [ "percent-encoding", "pest", "pest_derive", - "rand", + "rand 0.8.5", "regex", "serde", "serde_json", @@ -1813,6 +4133,12 @@ dependencies = [ "syn", ] +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + [[package]] name = "thiserror" version = "1.0.37" @@ -1862,6 +4188,210 @@ dependencies = [ "weezl", ] +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "time" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +dependencies = [ + "itoa 1.0.4", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "winapi", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +dependencies = [ + "serde_json", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "ttf-parser" version = "0.17.1" @@ -1939,6 +4469,12 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + [[package]] name = "unicode-bidi-mirroring" version = "0.1.0" @@ -1963,18 +4499,90 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-script" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc" +[[package]] +name = "unicode-segmentation" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" + [[package]] name = "unicode-width" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "uuid" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + [[package]] name = "version_check" version = "0.9.4" @@ -2001,7 +4609,7 @@ dependencies = [ "core-graphics-types", "crossbeam-queue", "half", - "heck", + "heck 0.4.0", "indexmap", "lazy_static", "libloading", @@ -2027,6 +4635,28 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2135,6 +4765,91 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.0.3", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + [[package]] name = "weezl" version = "0.1.7" @@ -2172,6 +4887,85 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" +dependencies = [ + "windows_aarch64_msvc 0.32.0", + "windows_i686_gnu 0.32.0", + "windows_i686_msvc 0.32.0", + "windows_x86_64_gnu 0.32.0", + "windows_x86_64_msvc 0.32.0", +] + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -2179,38 +4973,140 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", + "windows_aarch64_msvc 0.42.0", + "windows_i686_gnu 0.42.0", + "windows_i686_msvc 0.42.0", + "windows_x86_64_gnu 0.42.0", "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_x86_64_msvc 0.42.0", ] +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + [[package]] name = "windows_aarch64_msvc" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + [[package]] name = "windows_i686_gnu" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + [[package]] name = "windows_i686_msvc" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + [[package]] name = "windows_x86_64_gnu" version = "0.42.0" @@ -2223,12 +5119,113 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + [[package]] name = "windows_x86_64_msvc" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] + +[[package]] +name = "wry" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f20dd05f35fa0f8d107a4596b50d4e813b2e4f48cdec1f39854f092f7bbacc99" +dependencies = [ + "base64", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2638d5b9c17ac40575fb54bb461a4b1d2a8d1b4ffcc4ff237d254ec59ddeb82" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1536d6965a5d4e573c7ef73a2c15ebcd0b2de3347bdf526c34c297c00ac40f0" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + [[package]] name = "xml-rs" version = "0.8.4" diff --git a/Cargo.toml b/Cargo.toml index 2dec3785f..e1685bbd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,11 @@ members = [ "graphene", "proc-macros", "frontend/wasm", + "frontend/src-tauri", "node-graph/gcore", "node-graph/gstd", "node-graph/graph-craft", + "node-graph/interpreted-executor", "node-graph/borrow_stack", "libraries/dyn-any", "libraries/bezier-rs", diff --git a/about.toml b/about.toml index db09c5bff..d58ebfa9e 100644 --- a/about.toml +++ b/about.toml @@ -1,11 +1,14 @@ accepted = [ "Apache-2.0", "MIT", + "MIT-0", + "BSD-2-Clause", "BSD-3-Clause", "BSD-2-Clause", "Zlib", "Unicode-DFS-2016", "ISC", + "MPL-2.0", ] ignore-build-dependencies = true ignore-dev-dependencies = true diff --git a/deny.toml b/deny.toml index c8d244c63..d28bd67f7 100644 --- a/deny.toml +++ b/deny.toml @@ -49,6 +49,7 @@ notice = "warn" # output a note when they are encountered. ignore = [ #"RUSTSEC-0000-0000", + "RUSTSEC-2020-0071", # This has been fixed in the version of chrono we use ] # Threshold for security vulnerabilities, any vulnerability with a CVSS score # lower than the range specified will be ignored. Note that ignored advisories @@ -71,13 +72,14 @@ unlicensed = "deny" # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. allow = [ "MIT", + "MIT-0", "Apache-2.0", "BSD-3-Clause", "BSD-2-Clause", "Zlib", - "Zlib", "Unicode-DFS-2016", "ISC", + "MPL-2.0", #"Apache-2.0 WITH LLVM-exception", ] # List of explicitly disallowed licenses diff --git a/editor/Cargo.toml b/editor/Cargo.toml index d639df3f2..dec13acaf 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -10,6 +10,9 @@ homepage = "https://graphite.rs" repository = "https://github.com/GraphiteEditor/Graphite" license = "Apache-2.0" +[features] +gpu = ["graph-craft/gpu", "interpreted-executor/gpu"] + [dependencies] log = "0.4" bitflags = "1.2.1" @@ -18,7 +21,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0" } graphite-proc-macros = { path = "../proc-macros" } bezier-rs = { path = "../libraries/bezier-rs" } -glam = { version="0.17", features = ["serde"] } +glam = { version="0.22", features = ["serde"] } rand_chacha = "0.3.1" spin = "0.9.2" kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ @@ -31,6 +34,7 @@ once_cell = "1.13.0" # Remove when `core::cell::OnceCell` is stabilized (, pub mime: String, #[serde(skip)] - pub image_data: std::rc::Rc>, + pub image_data: std::sync::Arc>, } #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] diff --git a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs index ac92e9fb8..9359c4484 100644 --- a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs +++ b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs @@ -4,7 +4,6 @@ use crate::messages::prelude::*; pub use graphene::DocumentResponse; use bitflags::bitflags; -use serde::ser::SerializeStruct; use serde::{Deserialize, Serialize}; use std::fmt::{self, Display, Formatter}; use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign}; @@ -51,7 +50,7 @@ bitflags! { // (although we ignore the shift key, so the user doesn't have to press `Ctrl Shift +` on a US keyboard), even if the keyboard layout // is for a different locale where the `+` key is somewhere entirely different, shifted or not. This would then also work for numpad `+`. #[impl_message(Message, InputMapperMessage, KeyDown)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)] pub enum Key { // Writing system keys Digit0, @@ -210,18 +209,6 @@ pub enum Key { NumKeys, } -impl Serialize for Key { - fn serialize(&self, serializer: S) -> Result { - let key = format!("{:?}", self); - let label = self.to_string(); - - let mut state = serializer.serialize_struct("KeyWithLabel", 2)?; - state.serialize_field("key", &key)?; - state.serialize_field("label", &label)?; - state.end() - } -} - impl fmt::Display for Key { // TODO: Relevant key labels should be localized when we get around to implementing localization/internationalization fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result { @@ -308,6 +295,35 @@ impl fmt::Display for Key { } } +impl From for LayoutKey { + fn from(key: Key) -> Self { + Self { + key: format!("{:?}", key), + label: key.to_string(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +struct LayoutKey { + key: String, + label: String, +} +/* +impl Serialize for Key { + fn serialize(&self, serializer: S) -> Result { + let key = format!("{:?}", self.0); + let label = self.0.to_string(); + + assert_eq!(serde_json::to_string(Key::KeyEscape), {"key": KeyEscape, "label": "Esc"}); + + let mut state = serializer.serialize_struct("KeyWithLabel", 2)?; + state.serialize_field("key", &key)?; + state.serialize_field("label", &label)?; + state.end() + } +}*/ + pub const NUMBER_OF_KEYS: usize = Key::NumKeys as usize; /// Only `Key`s that exist on a physical keyboard should be used. @@ -342,6 +358,22 @@ impl fmt::Display for KeysGroup { } } +impl From for String { + fn from(keys: KeysGroup) -> Self { + let layout_keys: LayoutKeysGroup = keys.into(); + serde_json::to_string(&layout_keys).expect("Failed to serialize KeysGroup") + } +} + +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct LayoutKeysGroup(Vec); + +impl From for LayoutKeysGroup { + fn from(keys_group: KeysGroup) -> Self { + Self(keys_group.0.into_iter().map(|key| key.into()).collect()) + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum MouseMotion { None, diff --git a/editor/src/messages/input_mapper/utility_types/misc.rs b/editor/src/messages/input_mapper/utility_types/misc.rs index 314d55230..ead06eeb0 100644 --- a/editor/src/messages/input_mapper/utility_types/misc.rs +++ b/editor/src/messages/input_mapper/utility_types/misc.rs @@ -1,4 +1,4 @@ -use super::input_keyboard::{all_required_modifiers_pressed, KeysGroup}; +use super::input_keyboard::{all_required_modifiers_pressed, KeysGroup, LayoutKeysGroup}; use crate::messages::input_mapper::default_mapping::default_mapping; use crate::messages::input_mapper::utility_types::input_keyboard::{KeyStates, NUMBER_OF_KEYS}; use crate::messages::prelude::*; @@ -81,24 +81,27 @@ pub struct MappingEntry { pub enum ActionKeys { Action(MessageDiscriminant), #[serde(rename = "keys")] - Keys(KeysGroup), + Keys(LayoutKeysGroup), } impl ActionKeys { - pub fn to_keys(&mut self, action_input_mapping: &impl Fn(&MessageDiscriminant) -> Vec) { + pub fn to_keys(&mut self, action_input_mapping: &impl Fn(&MessageDiscriminant) -> Vec) -> String { match self { ActionKeys::Action(action) => { if let Some(keys) = action_input_mapping(action).get_mut(0) { let mut taken_keys = KeysGroup::default(); std::mem::swap(keys, &mut taken_keys); - - *self = ActionKeys::Keys(taken_keys); + let description = taken_keys.to_string(); + *self = ActionKeys::Keys(taken_keys.into()); + description } else { - *self = ActionKeys::Keys(KeysGroup::default()); + *self = ActionKeys::Keys(KeysGroup::default().into()); + String::new() } } ActionKeys::Keys(keys) => { warn!("Calling `.to_keys()` on a `ActionKeys::Keys` is a mistake/bug. Keys are: {:?}.", keys); + String::new() } } } diff --git a/editor/src/messages/layout/utility_types/layout_widget.rs b/editor/src/messages/layout/utility_types/layout_widget.rs index 9846586db..d44334e2e 100644 --- a/editor/src/messages/layout/utility_types/layout_widget.rs +++ b/editor/src/messages/layout/utility_types/layout_widget.rs @@ -10,7 +10,7 @@ use crate::messages::layout::utility_types::misc::LayoutTarget; use crate::messages::prelude::*; use serde::{Deserialize, Serialize}; -use std::rc::Rc; +use std::sync::Arc; pub trait PropertyHolder { fn properties(&self) -> Layout { @@ -39,11 +39,9 @@ impl Layout { if let Layout::WidgetLayout(mut widget_layout) = self { // Function used multiple times later in this code block to convert `ActionKeys::Action` to `ActionKeys::Keys` and append its shortcut to the tooltip let apply_shortcut_to_tooltip = |tooltip_shortcut: &mut ActionKeys, tooltip: &mut String| { - tooltip_shortcut.to_keys(action_input_mapping); - - if let ActionKeys::Keys(keys) = tooltip_shortcut { - let shortcut_text = keys.to_string(); + let shortcut_text = tooltip_shortcut.to_keys(action_input_mapping); + if let ActionKeys::Keys(_keys) = tooltip_shortcut { if !shortcut_text.is_empty() { if !tooltip.is_empty() { tooltip.push(' '); @@ -279,12 +277,12 @@ impl WidgetHolder { #[derive(Clone)] pub struct WidgetCallback { - pub callback: Rc Message + 'static>, + pub callback: Arc Message + 'static + Send + Sync>, } impl WidgetCallback { - pub fn new(callback: impl Fn(&T) -> Message + 'static) -> Self { - Self { callback: Rc::new(callback) } + pub fn new(callback: impl Fn(&T) -> Message + 'static + Send + Sync) -> Self { + Self { callback: Arc::new(callback) } } } diff --git a/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs b/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs index eb7348170..02b436ad0 100644 --- a/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs @@ -48,7 +48,7 @@ impl MenuBarEntry { } } - pub fn create_action(callback: impl Fn(&()) -> Message + 'static) -> WidgetHolder { + pub fn create_action(callback: impl Fn(&()) -> Message + 'static + Send + Sync) -> WidgetHolder { WidgetHolder::new(Widget::InvisibleStandinInput(InvisibleStandinInput { on_update: WidgetCallback::new(callback), })) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 7b859b7f3..854825a72 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -548,7 +548,7 @@ impl MessageHandler"))]), + identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[concrete!("Any<'_>")]), inputs: &[DocumentInputType { name: "In", data_type: FrontendGraphDataType::General, @@ -58,7 +55,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Input", category: "Meta", - identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[Type::Concrete(Cow::Borrowed("Any<'_>"))]), + identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[concrete!("Any<'_>")]), inputs: &[DocumentInputType { name: "In", data_type: FrontendGraphDataType::Raster, @@ -70,7 +67,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Output", category: "Meta", - identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[Type::Concrete(Cow::Borrowed("Any<'_>"))]), + identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[concrete!("Any<'_>")]), inputs: &[DocumentInputType { name: "In", data_type: FrontendGraphDataType::Raster, @@ -87,6 +84,21 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ outputs: &[FrontendGraphDataType::Raster], properties: node_properties::no_properties, }, + DocumentNodeType { + name: "GpuImage", + category: "Image Adjustments", + identifier: NodeIdentifier::new("graphene_std::executor::MapGpuSingleImageNode", &[concrete!("&TypeErasedNode")]), + inputs: &[ + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType { + name: "Path", + data_type: FrontendGraphDataType::Text, + default: NodeInput::value(TaggedValue::String(String::new()), true), + }, + ], + outputs: &[FrontendGraphDataType::Raster], + properties: node_properties::gpu_map_properties, + }, DocumentNodeType { name: "Invert RGB", category: "Image Adjustments", @@ -98,7 +110,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Hue/Saturation", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::HueSaturationNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::HueSaturationNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Hue Shift", TaggedValue::F64(0.), false), @@ -111,7 +123,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Brightness/Contrast", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::BrightnessContrastNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::BrightnessContrastNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Brightness", TaggedValue::F64(0.), false), @@ -123,7 +135,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Gamma", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::GammaNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::GammaNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Gamma", TaggedValue::F64(1.), false), @@ -134,7 +146,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Opacity", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::OpacityNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::OpacityNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Factor", TaggedValue::F64(1.), false), @@ -145,7 +157,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Posterize", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::PosterizeNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::PosterizeNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Value", TaggedValue::F64(5.), false), @@ -156,7 +168,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Exposure", category: "Image Adjustments", - identifier: NodeIdentifier::new("graphene_std::raster::ExposureNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_std::raster::ExposureNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), DocumentInputType::new("Value", TaggedValue::F64(0.), false), @@ -167,7 +179,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Add", category: "Math", - identifier: NodeIdentifier::new("graphene_core::ops::AddNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), + identifier: NodeIdentifier::new("graphene_core::ops::AddNode", &[concrete!("&TypeErasedNode")]), inputs: &[ DocumentInputType::new("Input", TaggedValue::F64(0.), true), DocumentInputType::new("Addend", TaggedValue::F64(0.), true), @@ -194,7 +206,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ DocumentNodeType { name: "Path Generator", category: "Vector", - identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[Type::Concrete(Cow::Borrowed("Any<'_>"))]), + identifier: NodeIdentifier::new("graphene_core::ops::IdNode", &[concrete!("Any<'_>")]), inputs: &[DocumentInputType { name: "Path Data", data_type: FrontendGraphDataType::Subpath, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 5d1ceda1a..8cc57b417 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1,6 +1,6 @@ use crate::messages::layout::utility_types::layout_widget::{LayoutGroup, Widget, WidgetCallback, WidgetHolder}; use crate::messages::layout::utility_types::widgets::button_widgets::ParameterExposeButton; -use crate::messages::layout::utility_types::widgets::input_widgets::{NumberInput, NumberInputMode}; +use crate::messages::layout::utility_types::widgets::input_widgets::{NumberInput, NumberInputMode, TextInput}; use crate::messages::prelude::NodeGraphMessage; use glam::DVec2; @@ -14,7 +14,7 @@ pub fn string_properties(text: impl Into) -> Vec { vec![LayoutGroup::Row { widgets: vec![widget] }] } -fn update_value TaggedValue + 'static>(value: F, node_id: NodeId, input_index: usize) -> WidgetCallback { +fn update_value TaggedValue + 'static + Send + Sync>(value: F, node_id: NodeId, input_index: usize) -> WidgetCallback { WidgetCallback::new(move |number_input: &T| { NodeGraphMessage::SetInputValue { node: node_id, @@ -42,6 +42,32 @@ fn expose_widget(node_id: NodeId, index: usize, data_type: FrontendGraphDataType })) } +fn text_widget(document_node: &DocumentNode, node_id: NodeId, index: usize, name: &str) -> Vec { + let input: &NodeInput = document_node.inputs.get(index).unwrap(); + + let mut widgets = vec![ + expose_widget(node_id, index, FrontendGraphDataType::Number, input.is_exposed()), + WidgetHolder::unrelated_seperator(), + WidgetHolder::text_widget(name), + ]; + + if let NodeInput::Value { + tagged_value: TaggedValue::String(x), + exposed: false, + } = &document_node.inputs[index] + { + widgets.extend_from_slice(&[ + WidgetHolder::unrelated_seperator(), + WidgetHolder::new(Widget::TextInput(TextInput { + value: x.clone(), + on_update: update_value(|x: &TextInput| TaggedValue::String(x.value.clone()), node_id, index), + ..TextInput::default() + })), + ]) + } + widgets +} + fn number_range_widget(document_node: &DocumentNode, node_id: NodeId, index: usize, name: &str, range_min: Option, range_max: Option, unit: String, is_integer: bool) -> Vec { let input: &NodeInput = document_node.inputs.get(index).unwrap(); @@ -98,6 +124,12 @@ pub fn adjust_gamma_properties(document_node: &DocumentNode, node_id: NodeId) -> vec![LayoutGroup::Row { widgets: gamma }] } +pub fn gpu_map_properties(document_node: &DocumentNode, node_id: NodeId) -> Vec { + let map = text_widget(document_node, node_id, 1, "Map"); + + vec![LayoutGroup::Row { widgets: map }] +} + pub fn multiply_opacity(document_node: &DocumentNode, node_id: NodeId) -> Vec { let gamma = number_range_widget(document_node, node_id, 1, "Factor", Some(0.), Some(1.), "".into(), false); diff --git a/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs b/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs index ab3e323a0..a7d8df0d1 100644 --- a/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs +++ b/editor/src/messages/portfolio/document/properties_panel/utility_functions.rs @@ -21,7 +21,7 @@ use graphene::layers::text_layer::{FontCache, TextLayer}; use glam::{DAffine2, DVec2}; use std::f64::consts::PI; -use std::rc::Rc; +use std::sync::Arc; pub fn apply_transform_operation(layer: &Layer, transform_op: TransformOp, value: f64, font_cache: &FontCache) -> [f64; 6] { let transformation = match transform_op { @@ -1457,7 +1457,7 @@ fn node_gradient_type(gradient: &Gradient) -> LayoutGroup { } fn node_gradient_color(gradient: &Gradient, position: usize) -> LayoutGroup { - let gradient_clone = Rc::new(gradient.clone()); + let gradient_clone = Arc::new(gradient.clone()); let gradient_2 = gradient_clone.clone(); let gradient_3 = gradient_clone.clone(); let send_fill_message = move |new_gradient: Gradient| PropertiesPanelMessage::ModifyFill { fill: Fill::Gradient(new_gradient) }.into(); diff --git a/editor/src/messages/portfolio/document/utility_types/layer_panel.rs b/editor/src/messages/portfolio/document/utility_types/layer_panel.rs index 919a361c2..e1dcb6fd2 100644 --- a/editor/src/messages/portfolio/document/utility_types/layer_panel.rs +++ b/editor/src/messages/portfolio/document/utility_types/layer_panel.rs @@ -7,7 +7,7 @@ use glam::{DAffine2, DVec2}; use serde::ser::SerializeStruct; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct RawBuffer(Vec); impl From> for RawBuffer { @@ -22,8 +22,15 @@ impl From> for RawBuffer { Self(v_from_raw) } } +#[derive(Debug, Clone, Deserialize, PartialEq, Eq)] +pub struct JsRawBuffer(Vec); -impl Serialize for RawBuffer { +impl From for JsRawBuffer { + fn from(buffer: RawBuffer) -> Self { + Self(buffer.0) + } +} +impl Serialize for JsRawBuffer { fn serialize(&self, serializer: S) -> Result { let mut buffer = serializer.serialize_struct("Buffer", 2)?; buffer.serialize_field("pointer", &(self.0.as_ptr() as usize))?; diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 4796fa355..ef8672d52 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -420,12 +420,12 @@ impl MessageHandler { fn read_image(document: Option<&DocumentMessageHandler>, layer_path: &[LayerId], image_data: Vec, (width, height): (u32, u32)) -> Result, String> { - use graphene_std::raster::Image; + use graphene_core::raster::Image; use image::{ImageBuffer, Rgba}; use std::io::Cursor; let data = image_data.chunks_exact(4).map(|v| graphene_core::raster::color::Color::from_rgba8(v[0], v[1], v[2], v[3])).collect(); - let image = graphene_std::raster::Image { width, height, data }; + let image = graphene_core::raster::Image { width, height, data }; let document = document.ok_or_else(|| "Invalid document".to_string())?; let layer = document.graphene_document.layer(layer_path).map_err(|e| format!("No layer: {e:?}"))?; @@ -452,7 +452,7 @@ impl MessageHandler HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain to Axis"), @@ -469,14 +469,14 @@ impl Fsm for ArtboardToolFsmState { }])]), ArtboardToolFsmState::Drawing | ArtboardToolFsmState::ResizingBounds => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs index 9f885a7a1..3fe9ea11f 100644 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ b/editor/src/messages/tool/tool_messages/ellipse_tool.rs @@ -191,14 +191,14 @@ impl Fsm for EllipseToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Circular"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -207,14 +207,14 @@ impl Fsm for EllipseToolFsmState { ])]), EllipseToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Circular"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs index 874276f42..94109d434 100644 --- a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs +++ b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs @@ -178,7 +178,7 @@ impl Fsm for EyedropperToolFsmState { }, ])]), EyedropperToolFsmState::SamplingPrimary | EyedropperToolFsmState::SamplingSecondary => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Escape])], + key_groups: vec![KeysGroup(vec![Key::Escape]).into()], key_groups_mac: None, mouse: None, label: String::from("Cancel"), diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 35bb3ee18..2ac267cec 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -518,7 +518,7 @@ impl Fsm for GradientToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), @@ -526,7 +526,7 @@ impl Fsm for GradientToolFsmState { }, ])]), GradientToolFsmState::Drawing => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), diff --git a/editor/src/messages/tool/tool_messages/imaginate_tool.rs b/editor/src/messages/tool/tool_messages/imaginate_tool.rs index 9816e4dbd..78be8e9c8 100644 --- a/editor/src/messages/tool/tool_messages/imaginate_tool.rs +++ b/editor/src/messages/tool/tool_messages/imaginate_tool.rs @@ -190,14 +190,14 @@ impl Fsm for ImaginateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -206,14 +206,14 @@ impl Fsm for ImaginateToolFsmState { ])]), ImaginateToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index 90c30c8f6..df7a3f60d 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -247,21 +247,21 @@ impl Fsm for LineToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Lock Angle"), @@ -270,21 +270,21 @@ impl Fsm for LineToolFsmState { ])]), LineToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Lock Angle"), diff --git a/editor/src/messages/tool/tool_messages/navigate_tool.rs b/editor/src/messages/tool/tool_messages/navigate_tool.rs index a90294f8b..1e6677562 100644 --- a/editor/src/messages/tool/tool_messages/navigate_tool.rs +++ b/editor/src/messages/tool/tool_messages/navigate_tool.rs @@ -201,7 +201,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Zoom Out"), @@ -217,7 +217,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap Increments"), @@ -240,7 +240,7 @@ impl Fsm for NavigateToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), @@ -249,14 +249,14 @@ impl Fsm for NavigateToolFsmState { ]), ]), NavigateToolFsmState::Tilting => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }])]), NavigateToolFsmState::Zooming => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap Increments"), diff --git a/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs b/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs index 92a1be507..b1edaab07 100644 --- a/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs +++ b/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs @@ -190,14 +190,14 @@ impl Fsm for NodeGraphToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -206,14 +206,14 @@ impl Fsm for NodeGraphToolFsmState { ])]), NodeGraphToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index d973d768f..dab9d61a6 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -322,7 +322,7 @@ impl Fsm for PathToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -339,10 +339,10 @@ impl Fsm for PathToolFsmState { HintGroup(vec![ HintInfo { key_groups: vec![ - KeysGroup(vec![Key::ArrowUp]), - KeysGroup(vec![Key::ArrowRight]), - KeysGroup(vec![Key::ArrowDown]), - KeysGroup(vec![Key::ArrowLeft]), + KeysGroup(vec![Key::ArrowUp]).into(), + KeysGroup(vec![Key::ArrowRight]).into(), + KeysGroup(vec![Key::ArrowDown]).into(), + KeysGroup(vec![Key::ArrowLeft]).into(), ], key_groups_mac: None, mouse: None, @@ -350,7 +350,7 @@ impl Fsm for PathToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Big Increment Nudge"), @@ -359,21 +359,21 @@ impl Fsm for PathToolFsmState { ]), HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyG])], + key_groups: vec![KeysGroup(vec![Key::KeyG]).into()], key_groups_mac: None, mouse: None, label: String::from("Grab Selected (coming soon)"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyR])], + key_groups: vec![KeysGroup(vec![Key::KeyR]).into()], key_groups_mac: None, mouse: None, label: String::from("Rotate Selected (coming soon)"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyS])], + key_groups: vec![KeysGroup(vec![Key::KeyS]).into()], key_groups_mac: None, mouse: None, label: String::from("Scale Selected (coming soon)"), @@ -383,14 +383,14 @@ impl Fsm for PathToolFsmState { ]), PathToolFsmState::Dragging => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("Split/Align Handles (Toggle)"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Share Lengths of Aligned Handles"), diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 622e098a7..51a8a1114 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -636,21 +636,21 @@ impl Fsm for PenToolFsmState { plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Break Handle"), plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Enter])], + key_groups: vec![KeysGroup(vec![Key::Enter]).into()], key_groups_mac: None, mouse: None, label: String::from("End Path"), diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs index c526d48bd..7a0d47658 100644 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ b/editor/src/messages/tool/tool_messages/rectangle_tool.rs @@ -192,14 +192,14 @@ impl Fsm for RectangleToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -208,14 +208,14 @@ impl Fsm for RectangleToolFsmState { ])]), RectangleToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain Square"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index aedc04dc6..130e46bdb 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -793,21 +793,21 @@ impl Fsm for SelectToolFsmState { }]), HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyG])], + key_groups: vec![KeysGroup(vec![Key::KeyG]).into()], key_groups_mac: None, mouse: None, label: String::from("Grab Selected"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyR])], + key_groups: vec![KeysGroup(vec![Key::KeyR]).into()], key_groups_mac: None, mouse: None, label: String::from("Rotate Selected"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::KeyS])], + key_groups: vec![KeysGroup(vec![Key::KeyS]).into()], key_groups_mac: None, mouse: None, label: String::from("Scale Selected"), @@ -823,14 +823,14 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::Command])]), + key_groups: vec![KeysGroup(vec![Key::Control]).into()], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command]).into()]), mouse: None, label: String::from("Innermost"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -846,7 +846,7 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Grow/Shrink Selection"), @@ -856,10 +856,10 @@ impl Fsm for SelectToolFsmState { HintGroup(vec![ HintInfo { key_groups: vec![ - KeysGroup(vec![Key::ArrowUp]), - KeysGroup(vec![Key::ArrowRight]), - KeysGroup(vec![Key::ArrowDown]), - KeysGroup(vec![Key::ArrowLeft]), + KeysGroup(vec![Key::ArrowUp]).into(), + KeysGroup(vec![Key::ArrowRight]).into(), + KeysGroup(vec![Key::ArrowDown]).into(), + KeysGroup(vec![Key::ArrowLeft]).into(), ], key_groups_mac: None, mouse: None, @@ -867,7 +867,7 @@ impl Fsm for SelectToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Big Increment Nudge"), @@ -876,15 +876,15 @@ impl Fsm for SelectToolFsmState { ]), HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: Some(MouseMotion::LmbDrag), label: String::from("Move Duplicate"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control, Key::KeyD])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::KeyD])]), + key_groups: vec![KeysGroup(vec![Key::Control, Key::KeyD]).into()], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::KeyD]).into()]), mouse: None, label: String::from("Duplicate"), plus: false, @@ -893,14 +893,14 @@ impl Fsm for SelectToolFsmState { ]), SelectToolFsmState::Dragging => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain to Axis"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap to Points (coming soon)"), @@ -910,7 +910,7 @@ impl Fsm for SelectToolFsmState { SelectToolFsmState::DrawingBox => HintData(vec![]), SelectToolFsmState::ResizingBounds => HintData(vec![]), SelectToolFsmState::RotatingBounds => HintData(vec![HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control])], + key_groups: vec![KeysGroup(vec![Key::Control]).into()], key_groups_mac: None, mouse: None, label: String::from("Snap 15°"), diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index 7579322ce..510910824 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -235,14 +235,14 @@ impl Fsm for ShapeToolFsmState { plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain 1:1 Aspect"), plus: true, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), @@ -251,14 +251,14 @@ impl Fsm for ShapeToolFsmState { ])]), ShapeToolFsmState::Drawing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Shift])], + key_groups: vec![KeysGroup(vec![Key::Shift]).into()], key_groups_mac: None, mouse: None, label: String::from("Constrain 1:1 Aspect"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Alt])], + key_groups: vec![KeysGroup(vec![Key::Alt]).into()], key_groups_mac: None, mouse: None, label: String::from("From Center"), diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 0211380ef..ae602dc90 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -267,7 +267,7 @@ impl Fsm for SplineToolFsmState { plus: false, }]), HintGroup(vec![HintInfo { - key_groups: vec![KeysGroup(vec![Key::Enter])], + key_groups: vec![KeysGroup(vec![Key::Enter]).into()], key_groups_mac: None, mouse: None, label: String::from("End Spline"), diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index ba182c9d8..4c3af474f 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -474,14 +474,14 @@ impl Fsm for TextToolFsmState { ])]), TextToolFsmState::Editing => HintData(vec![HintGroup(vec![ HintInfo { - key_groups: vec![KeysGroup(vec![Key::Control, Key::Enter])], - key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::Enter])]), + key_groups: vec![KeysGroup(vec![Key::Control, Key::Enter]).into()], + key_groups_mac: Some(vec![KeysGroup(vec![Key::Command, Key::Enter]).into()]), mouse: None, label: String::from("Commit Edit"), plus: false, }, HintInfo { - key_groups: vec![KeysGroup(vec![Key::Escape])], + key_groups: vec![KeysGroup(vec![Key::Escape]).into()], key_groups_mac: None, mouse: None, label: String::from("Discard Edit"), diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index bed1f8701..5b119931b 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -1,5 +1,5 @@ use super::tool_messages::*; -use crate::messages::input_mapper::utility_types::input_keyboard::KeysGroup; +use crate::messages::input_mapper::utility_types::input_keyboard::LayoutKeysGroup; use crate::messages::input_mapper::utility_types::input_keyboard::MouseMotion; use crate::messages::input_mapper::utility_types::macros::action_keys; use crate::messages::input_mapper::utility_types::misc::ActionKeys; @@ -21,7 +21,7 @@ pub type ToolActionHandlerData<'a> = (&'a DocumentMessageHandler, u64, &'a Docum pub trait ToolCommon: for<'a> MessageHandler> + PropertyHolder + ToolTransition + ToolMetadata {} impl ToolCommon for T where T: for<'a> MessageHandler> + PropertyHolder + ToolTransition + ToolMetadata {} -type Tool = dyn ToolCommon; +type Tool = dyn ToolCommon + Send + Sync; pub trait Fsm { type ToolData; @@ -442,10 +442,10 @@ pub struct HintInfo { /// A `KeysGroup` specifies all the keys pressed simultaneously to perform an action (like "Ctrl C" to copy). /// Usually at most one is given, but less commonly, multiple can be used to describe additional hotkeys not used simultaneously (like the four different arrow keys to nudge a layer). #[serde(rename = "keyGroups")] - pub key_groups: Vec, + pub key_groups: Vec, /// `None` means that the regular `key_groups` should be used for all platforms, `Some` is an override for a Mac-only input hint. #[serde(rename = "keyGroupsMac")] - pub key_groups_mac: Option>, + pub key_groups_mac: Option>, /// An optional `MouseMotion` that can indicate the mouse action, like which mouse button is used and whether a drag occurs. /// No such icon is shown if `None` is given, and it can be combined with `key_groups` if desired. pub mouse: Option, diff --git a/frontend/package-lock.json b/frontend/package-lock.json index bf46dc892..38bc24eed 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,6 +7,7 @@ "name": "graphite-web-frontend", "license": "Apache-2.0", "dependencies": { + "@tauri-apps/api": "^1.2.0", "class-transformer": "^0.5.1", "idb-keyval": "^6.2.0", "reflect-metadata": "^0.1.13", @@ -32,6 +33,7 @@ "sass": "^1.56.1", "sass-loader": "^13.2.0", "typescript": "^4.9.3", + "vue-cli-plugin-tauri": "~1.0.0", "vue-loader": "^17.0.1", "vue-template-compiler": "^2.7.14" }, @@ -435,12 +437,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", + "dev": true + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "dev": true }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/joi/node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/joi/node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", @@ -725,6 +771,191 @@ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", "dev": true }, + "node_modules/@tauri-apps/api": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.2.0.tgz", + "integrity": "sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.2.1.tgz", + "integrity": "sha512-JrFFT1/4V+AGSRjKdgszZwOr+/a1519LDhNxBkbsIg6D/kFK+3kk1qImaQBY9DvvIWK6IV4whc8OAkgxm+Sl3w==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.2.1", + "@tauri-apps/cli-darwin-x64": "1.2.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.2.1", + "@tauri-apps/cli-linux-arm64-gnu": "1.2.1", + "@tauri-apps/cli-linux-arm64-musl": "1.2.1", + "@tauri-apps/cli-linux-x64-gnu": "1.2.1", + "@tauri-apps/cli-linux-x64-musl": "1.2.1", + "@tauri-apps/cli-win32-ia32-msvc": "1.2.1", + "@tauri-apps/cli-win32-x64-msvc": "1.2.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.1.tgz", + "integrity": "sha512-WiAxSON52owFI65Whd3NjcKjXdO1zJfafBVZ3v+Y3F2zlXhRPiirXbtefAc3mvN56zDz/pfi018Qb4XesuVzHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.1.tgz", + "integrity": "sha512-jfumnrn7RYKVtDmHgrQhImoxpqT51bDrO4KxgpIXaYSaf6MdG2JT72dwUovPrURw0JX2Z/Elihq+dYbrsKoV/w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.1.tgz", + "integrity": "sha512-n4p6Ekn6Wa9X/klUGevEGgoWAGApGGsLrJYE4c8bKTbAUfQ9Nyzjh8gK/GDii1dg9oRW0FdXDa6BJa7aEEj9sA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.1.tgz", + "integrity": "sha512-oAHkQQGfNCh8pQQHuDzzqt+S5sOj3tiUkySaquR2z/AQEHeDGAMrRGLZwOiDw9Xvu7qxFiF9H0e5OMK7BkncDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.1.tgz", + "integrity": "sha512-1dEZ5fdFYkMyB1U7ZkDJUlwYwCeqy9Y3vXmtZ6pCxrvgs844s8+RIFDuMU42pTN+lUxfFeQARmv0LpS4eF/QWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.1.tgz", + "integrity": "sha512-wkgCD3s5P6tgBPnn0/gDx7MXMx2Hx+jdA+JP8zdCq4cIeYXlxdZG/zXbHb5ldPadNh582lzHiGg+Pmc+wDg2fA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.1.tgz", + "integrity": "sha512-zD+a+5cSlYVU0ECOojWp71ok/9jE0DJufzb9oky17XIKV/oiOAG60z4OYRe+oqxYS1TcBt+pUa1/2zlu/6SRdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.1.tgz", + "integrity": "sha512-nEgdRd8czaKL1RQfj946dsfzlk6atmD95Fm7NVTVOe77PFHTS3ztHeWK7X6jirCaOF3h/F7qpJVCU6JMnq2tfA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.2.1.tgz", + "integrity": "sha512-ceWiQkmNNRrnfgbLMnndT4QF1IyLK7aOJsMqS/HueshAwmVQWnC1DUE0C58Taetgq38Cavc4gGnZOCHuH6ZuTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -2107,6 +2338,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -2116,6 +2365,12 @@ "lodash": "^4.17.14" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -2171,6 +2426,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -2245,6 +2515,15 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2518,6 +2797,12 @@ "node": ">=4" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2802,6 +3087,18 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", @@ -3302,6 +3599,18 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -3475,6 +3784,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3646,6 +3964,16 @@ "node": ">=6.0.0" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4765,6 +5093,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4995,6 +5338,15 @@ "is-callable": "^1.1.3" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -5131,6 +5483,20 @@ "node": ">=6" } }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5308,6 +5674,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5421,6 +5796,29 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5712,6 +6110,21 @@ } } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -6214,6 +6627,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -6296,6 +6715,12 @@ "node": ">=0.10.0" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -6386,6 +6811,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6410,6 +6841,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6422,6 +6859,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -6446,6 +6889,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -7434,6 +7892,15 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7903,6 +8370,12 @@ "node": ">=8" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8648,6 +9121,12 @@ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -8919,6 +9398,57 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9575,6 +10105,31 @@ "wbuf": "^1.7.3" } }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -10043,6 +10598,19 @@ "node": ">=6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -10211,6 +10779,24 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -10375,6 +10961,26 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "node_modules/vue": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", @@ -10387,6 +10993,191 @@ "@vue/shared": "3.2.45" } }, + "node_modules/vue-cli-plugin-tauri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-tauri/-/vue-cli-plugin-tauri-1.0.0.tgz", + "integrity": "sha512-OGTvXOoFeIpwq87/kSxTyZH9uPc573GyJU06s7/1+xUWfCqh1zMhPdDzoV3TKwOr6OreyakqPiltDrYaMIT4rQ==", + "dev": true, + "dependencies": { + "@tauri-apps/cli": "^1.0.3", + "@vue/cli-shared-utils": "^4.1.1" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/@achrinza/node-ipc": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz", + "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==", + "dev": true, + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 10 || 12 || 14 || 16 || 17" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/@vue/cli-shared-utils": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz", + "integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==", + "dev": true, + "dependencies": { + "@achrinza/node-ipc": "9.2.2", + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/vue-cli-plugin-tauri/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/vue-eslint-parser": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", @@ -11770,12 +12561,53 @@ } } }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "dev": true }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + }, + "dependencies": { + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + } + } + }, "@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", @@ -12006,6 +12838,91 @@ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", "dev": true }, + "@tauri-apps/api": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.2.0.tgz", + "integrity": "sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==" + }, + "@tauri-apps/cli": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.2.1.tgz", + "integrity": "sha512-JrFFT1/4V+AGSRjKdgszZwOr+/a1519LDhNxBkbsIg6D/kFK+3kk1qImaQBY9DvvIWK6IV4whc8OAkgxm+Sl3w==", + "dev": true, + "requires": { + "@tauri-apps/cli-darwin-arm64": "1.2.1", + "@tauri-apps/cli-darwin-x64": "1.2.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.2.1", + "@tauri-apps/cli-linux-arm64-gnu": "1.2.1", + "@tauri-apps/cli-linux-arm64-musl": "1.2.1", + "@tauri-apps/cli-linux-x64-gnu": "1.2.1", + "@tauri-apps/cli-linux-x64-musl": "1.2.1", + "@tauri-apps/cli-win32-ia32-msvc": "1.2.1", + "@tauri-apps/cli-win32-x64-msvc": "1.2.1" + } + }, + "@tauri-apps/cli-darwin-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.1.tgz", + "integrity": "sha512-WiAxSON52owFI65Whd3NjcKjXdO1zJfafBVZ3v+Y3F2zlXhRPiirXbtefAc3mvN56zDz/pfi018Qb4XesuVzHA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-darwin-x64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.1.tgz", + "integrity": "sha512-jfumnrn7RYKVtDmHgrQhImoxpqT51bDrO4KxgpIXaYSaf6MdG2JT72dwUovPrURw0JX2Z/Elihq+dYbrsKoV/w==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.1.tgz", + "integrity": "sha512-n4p6Ekn6Wa9X/klUGevEGgoWAGApGGsLrJYE4c8bKTbAUfQ9Nyzjh8gK/GDii1dg9oRW0FdXDa6BJa7aEEj9sA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.1.tgz", + "integrity": "sha512-oAHkQQGfNCh8pQQHuDzzqt+S5sOj3tiUkySaquR2z/AQEHeDGAMrRGLZwOiDw9Xvu7qxFiF9H0e5OMK7BkncDw==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.1.tgz", + "integrity": "sha512-1dEZ5fdFYkMyB1U7ZkDJUlwYwCeqy9Y3vXmtZ6pCxrvgs844s8+RIFDuMU42pTN+lUxfFeQARmv0LpS4eF/QWQ==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-x64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.1.tgz", + "integrity": "sha512-wkgCD3s5P6tgBPnn0/gDx7MXMx2Hx+jdA+JP8zdCq4cIeYXlxdZG/zXbHb5ldPadNh582lzHiGg+Pmc+wDg2fA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-x64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.1.tgz", + "integrity": "sha512-zD+a+5cSlYVU0ECOojWp71ok/9jE0DJufzb9oky17XIKV/oiOAG60z4OYRe+oqxYS1TcBt+pUa1/2zlu/6SRdA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.1.tgz", + "integrity": "sha512-nEgdRd8czaKL1RQfj946dsfzlk6atmD95Fm7NVTVOe77PFHTS3ztHeWK7X6jirCaOF3h/F7qpJVCU6JMnq2tfA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-win32-x64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.2.1.tgz", + "integrity": "sha512-ceWiQkmNNRrnfgbLMnndT4QF1IyLK7aOJsMqS/HueshAwmVQWnC1DUE0C58Taetgq38Cavc4gGnZOCHuH6ZuTw==", + "dev": true, + "optional": true + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -13087,6 +14004,21 @@ "es-shim-unscopables": "^1.0.0" } }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -13096,6 +14028,12 @@ "lodash": "^4.17.14" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -13123,6 +14061,18 @@ "dev": true, "peer": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -13175,6 +14125,15 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -13379,6 +14338,12 @@ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -13595,6 +14560,15 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", @@ -13959,6 +14933,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -14084,6 +15067,12 @@ "object-keys": "^1.1.1" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -14215,6 +15204,16 @@ "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", "dev": true }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -15086,6 +16085,18 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -15270,6 +16281,12 @@ "is-callable": "^1.1.3" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -15359,6 +16376,17 @@ } } }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -15483,6 +16511,15 @@ "get-intrinsic": "^1.1.1" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -15569,6 +16606,22 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -15791,6 +16844,17 @@ "micromatch": "^4.0.2" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -16127,6 +17191,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -16188,6 +17258,12 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -16262,6 +17338,12 @@ "argparse": "^2.0.1" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -16280,6 +17362,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -16292,6 +17380,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -16308,6 +17402,18 @@ "universalify": "^2.0.0" } }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -17076,6 +18182,12 @@ "boolbase": "^1.0.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -17423,6 +18535,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -17915,6 +19033,12 @@ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -18110,6 +19234,48 @@ "strip-ansi": "^6.0.1" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -18612,6 +19778,23 @@ "wbuf": "^1.7.3" } }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -18950,6 +20133,16 @@ "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -19081,6 +20274,21 @@ } } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19195,6 +20403,25 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } + } + }, "vue": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", @@ -19207,6 +20434,159 @@ "@vue/shared": "3.2.45" } }, + "vue-cli-plugin-tauri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-tauri/-/vue-cli-plugin-tauri-1.0.0.tgz", + "integrity": "sha512-OGTvXOoFeIpwq87/kSxTyZH9uPc573GyJU06s7/1+xUWfCqh1zMhPdDzoV3TKwOr6OreyakqPiltDrYaMIT4rQ==", + "dev": true, + "requires": { + "@tauri-apps/cli": "^1.0.3", + "@vue/cli-shared-utils": "^4.1.1" + }, + "dependencies": { + "@achrinza/node-ipc": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz", + "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==", + "dev": true, + "requires": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + } + }, + "@vue/cli-shared-utils": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz", + "integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==", + "dev": true, + "requires": { + "@achrinza/node-ipc": "9.2.2", + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "vue-eslint-parser": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index b8cdb6eaa..5ec91bfa2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,9 @@ "serve": "vue-cli-service serve || echo 'Graphite project failed to build. Did you remember to `npm install` the dependencies?'", "build": "vue-cli-service build || echo 'Graphite project failed to build. Did you remember to `npm install` the dependencies?'", "lint": "vue-cli-service lint || echo 'Graphite project had lint errors or otherwise failed. In the latter case, did you remember to `npm install` the dependencies?'", - "lint-no-fix": "vue-cli-service lint --no-fix || echo 'Graphite project had lint errors or otherwise failed. In the latter case, did you remember to `npm install` the dependencies?'" + "lint-no-fix": "vue-cli-service lint --no-fix || echo 'Graphite project had lint errors or otherwise failed. In the latter case, did you remember to `npm install` the dependencies?'", + "tauri:build": "vue-cli-service tauri:build", + "tauri:serve": "vue-cli-service tauri:serve" }, "repository": { "type": "git", @@ -17,6 +19,7 @@ "license": "Apache-2.0", "homepage": "https://graphite.rs", "dependencies": { + "@tauri-apps/api": "^1.2.0", "class-transformer": "^0.5.1", "idb-keyval": "^6.2.0", "reflect-metadata": "^0.1.13", @@ -42,6 +45,7 @@ "sass": "^1.56.1", "sass-loader": "^13.2.0", "typescript": "^4.9.3", + "vue-cli-plugin-tauri": "~1.0.0", "vue-loader": "^17.0.1", "vue-template-compiler": "^2.7.14" }, diff --git a/frontend/src-tauri/.gitignore b/frontend/src-tauri/.gitignore new file mode 100644 index 000000000..aba21e242 --- /dev/null +++ b/frontend/src-tauri/.gitignore @@ -0,0 +1,3 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml new file mode 100644 index 000000000..7f58bf27f --- /dev/null +++ b/frontend/src-tauri/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "graphite-desktop" +version = "0.1.0" +description = "Graphite Desktop" +authors = ["Graphite Authors "] +license = "Apache-2.0" +repository = "" +default-run = "graphite-desktop" +edition = "2021" +rust-version = "1.59" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.2", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.2", features = ["api-all", "devtools"] } +axum = "0.6.1" +graphite-editor = { version = "0.0.0", path = "../../editor" } +chrono = "^0.4.23" +ron = "0.8" + +log = "0.4" +fern = {version = "0.6", features = ["colored"] } +futures = "0.3.25" + + +[features] +gpu = ["graphite-editor/gpu"] +# by default Tauri runs in production mode +# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL +default = [ "custom-protocol" ] +# this feature is used for production builds where `devPath` points to the filesystem +# DO NOT remove this +custom-protocol = [ "tauri/custom-protocol" ] diff --git a/frontend/src-tauri/build.rs b/frontend/src-tauri/build.rs new file mode 100644 index 000000000..c1ea37328 --- /dev/null +++ b/frontend/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/frontend/src-tauri/icons/128x128.png b/frontend/src-tauri/icons/128x128.png new file mode 100644 index 000000000..f7bd3fdad Binary files /dev/null and b/frontend/src-tauri/icons/128x128.png differ diff --git a/frontend/src-tauri/icons/128x128@2x.png b/frontend/src-tauri/icons/128x128@2x.png new file mode 100644 index 000000000..56b991cd8 Binary files /dev/null and b/frontend/src-tauri/icons/128x128@2x.png differ diff --git a/frontend/src-tauri/icons/32x32.png b/frontend/src-tauri/icons/32x32.png new file mode 100644 index 000000000..53d1df4ae Binary files /dev/null and b/frontend/src-tauri/icons/32x32.png differ diff --git a/frontend/src-tauri/icons/Square107x107Logo.png b/frontend/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 000000000..5a9310618 Binary files /dev/null and b/frontend/src-tauri/icons/Square107x107Logo.png differ diff --git a/frontend/src-tauri/icons/Square142x142Logo.png b/frontend/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 000000000..5d4be439c Binary files /dev/null and b/frontend/src-tauri/icons/Square142x142Logo.png differ diff --git a/frontend/src-tauri/icons/Square150x150Logo.png b/frontend/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 000000000..d1f9dbc53 Binary files /dev/null and b/frontend/src-tauri/icons/Square150x150Logo.png differ diff --git a/frontend/src-tauri/icons/Square284x284Logo.png b/frontend/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 000000000..e4bbc7a36 Binary files /dev/null and b/frontend/src-tauri/icons/Square284x284Logo.png differ diff --git a/frontend/src-tauri/icons/Square30x30Logo.png b/frontend/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 000000000..cc7bb9c9c Binary files /dev/null and b/frontend/src-tauri/icons/Square30x30Logo.png differ diff --git a/frontend/src-tauri/icons/Square310x310Logo.png b/frontend/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 000000000..d4dd3fcae Binary files /dev/null and b/frontend/src-tauri/icons/Square310x310Logo.png differ diff --git a/frontend/src-tauri/icons/Square44x44Logo.png b/frontend/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 000000000..3edfca75e Binary files /dev/null and b/frontend/src-tauri/icons/Square44x44Logo.png differ diff --git a/frontend/src-tauri/icons/Square71x71Logo.png b/frontend/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 000000000..a189c3e7f Binary files /dev/null and b/frontend/src-tauri/icons/Square71x71Logo.png differ diff --git a/frontend/src-tauri/icons/Square89x89Logo.png b/frontend/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 000000000..454158e56 Binary files /dev/null and b/frontend/src-tauri/icons/Square89x89Logo.png differ diff --git a/frontend/src-tauri/icons/StoreLogo.png b/frontend/src-tauri/icons/StoreLogo.png new file mode 100644 index 000000000..f2a2283e5 Binary files /dev/null and b/frontend/src-tauri/icons/StoreLogo.png differ diff --git a/frontend/src-tauri/icons/icon.icns b/frontend/src-tauri/icons/icon.icns new file mode 100644 index 000000000..a05bb4354 Binary files /dev/null and b/frontend/src-tauri/icons/icon.icns differ diff --git a/frontend/src-tauri/icons/icon.ico b/frontend/src-tauri/icons/icon.ico new file mode 100644 index 000000000..e45b58dd9 Binary files /dev/null and b/frontend/src-tauri/icons/icon.ico differ diff --git a/frontend/src-tauri/icons/icon.png b/frontend/src-tauri/icons/icon.png new file mode 100644 index 000000000..05483f325 Binary files /dev/null and b/frontend/src-tauri/icons/icon.png differ diff --git a/frontend/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs new file mode 100644 index 000000000..10388b783 --- /dev/null +++ b/frontend/src-tauri/src/main.rs @@ -0,0 +1,125 @@ +#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] + +use std::sync::Arc; + +use axum::body::StreamBody; +use axum::extract::Path; +use axum::http; +use axum::response::IntoResponse; +use axum::{routing::get, Router}; +use fern::colors::{Color, ColoredLevelConfig}; +use graphite_editor::application::Editor; +use graphite_editor::messages::frontend::utility_types::FrontendImageData; +use graphite_editor::messages::prelude::*; +use http::{Response, StatusCode}; +use std::collections::HashMap; +use std::sync::Mutex; +use tauri::Manager; + +static IMAGES: Mutex>> = Mutex::new(None); +static EDITOR: Mutex> = Mutex::new(None); + +async fn respond_to(id: Path) -> impl IntoResponse { + let builder = Response::builder().header("Access-Control-Allow-Origin", "*").status(StatusCode::OK); + + let guard = IMAGES.lock().unwrap(); + let images = guard; + let image = images.as_ref().unwrap().get(&id.0).unwrap(); + + println!("image: {:#?}", image.path); + let result: Result, &str> = Ok((*image.image_data).clone()); + let stream = futures::stream::once(async move { result }); + builder.body(StreamBody::new(stream)).unwrap() +} + +fn main() { + println!("Starting server..."); + + let colors = ColoredLevelConfig::new().debug(Color::Magenta).info(Color::Green).error(Color::Red); + + fern::Dispatch::new() + .chain(std::io::stdout()) + .level(log::LevelFilter::Trace) + .format(move |out, message, record| { + out.finish(format_args!( + "[{}]{} {}", + // This will color the log level only, not the whole line. Just a touch. + colors.color(record.level()), + chrono::Utc::now().format("[%Y-%m-%d %H:%M:%S]"), + message + )) + }) + .apply() + .unwrap(); + + *(IMAGES.lock().unwrap()) = Some(HashMap::new()); + graphite_editor::application::set_uuid_seed(0); + *(EDITOR.lock().unwrap()) = Some(Editor::new()); + let app = Router::new().route("/", get(|| async { "Hello, World!" })).route("/image/:id", get(respond_to)); + + // run it with hyper on localhost:3000 + tauri::async_runtime::spawn(async { + axum::Server::bind(&"0.0.0.0:3001".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); + }); + + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![set_random_seed, handle_message]) + .setup(|app| { + app.get_window("main").unwrap().open_devtools(); + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} +#[tauri::command] +fn set_random_seed(seed: f64) { + let seed = seed as u64; + graphite_editor::application::set_uuid_seed(seed); +} + +#[tauri::command] +fn handle_message(message: String) -> String { + let Ok(message) = ron::from_str::(&message) else { + panic!("Error parsing message: {}", message) + }; + let mut guard = EDITOR.lock().unwrap(); + let editor = (*guard).as_mut().unwrap(); + let responses = editor.handle_message(message); + + // Sends a FrontendMessage to JavaScript + fn send_frontend_message_to_js(message: FrontendMessage) -> FrontendMessage { + // Special case for update image data to avoid serialization times. + if let FrontendMessage::UpdateImageData { document_id, image_data } = message { + let mut guard = IMAGES.lock().unwrap(); + let images = (*guard).as_mut().unwrap(); + let mut stub_data = Vec::with_capacity(image_data.len()); + for image in image_data { + let path = image.path.clone(); + let mime = image.mime.clone(); + images.insert(format!("{:?}_{}", &image.path, document_id), image); + stub_data.push(FrontendImageData { + path, + mime, + image_data: Arc::new(Vec::new()), + }); + } + FrontendMessage::UpdateImageData { document_id, image_data: stub_data } + } else { + message + } + } + + for response in &responses { + let serialized = ron::to_string(&send_frontend_message_to_js(response.clone())).unwrap(); + if let Err(error) = ron::from_str::(&serialized) { + log::error!("Error deserializing message: {}", error); + log::debug!("{:#?}", response); + log::debug!("{}", serialized); + } + } + + // Process any `FrontendMessage` responses resulting from the backend processing the dispatched message + let result: Vec<_> = responses.into_iter().map(send_frontend_message_to_js).collect(); + + ron::to_string(&result).expect("Failed to serialize FrontendMessage") +} diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json new file mode 100644 index 000000000..3245f6197 --- /dev/null +++ b/frontend/src-tauri/tauri.conf.json @@ -0,0 +1,66 @@ +{ + "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "build": { + "beforeBuildCommand": "npm run build", + "beforeDevCommand": "npm start", + "distDir": "../dist", + "devPath": "http://127.0.0.1:8080" + }, + "package": { + "productName": "graphite-tauri", + "version": "0.1.0" + }, + "tauri": { + "allowlist": { + "all": true + }, + "bundle": { + "active": true, + "category": "DeveloperTool", + "copyright": "", + "deb": { + "depends": ["librustc_codegen_spirv"] + }, + "externalBin": [], + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "rs.graphite.editor", + "longDescription": "", + "macOS": { + "entitlements": null, + "exceptionDomain": "", + "frameworks": [], + "providerShortName": null, + "signingIdentity": null + }, + "resources": [], + "shortDescription": "", + "targets": "all", + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "security": { + "csp": null + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "height": 600, + "resizable": true, + "title": "Graphite", + "width": 800 + } + ] + } +} diff --git a/frontend/src/components/panels/LayerTree.vue b/frontend/src/components/panels/LayerTree.vue index 078f1eb4a..2a19725e8 100644 --- a/frontend/src/components/panels/LayerTree.vue +++ b/frontend/src/components/panels/LayerTree.vue @@ -280,7 +280,7 @@ import { type LayerPanelEntry, defaultWidgetLayout, UpdateDocumentLayerDetails, - UpdateDocumentLayerTreeStructure, + UpdateDocumentLayerTreeStructureJs, UpdateLayerTreeOptionsLayout, layerTypeData, } from "@/wasm-communication/messages"; @@ -483,14 +483,14 @@ export default defineComponent({ this.fakeHighlight = undefined; this.dragInPanel = false; }, - rebuildLayerTree(updateDocumentLayerTreeStructure: UpdateDocumentLayerTreeStructure) { + rebuildLayerTree(updateDocumentLayerTreeStructure: UpdateDocumentLayerTreeStructureJs) { const layerWithNameBeingEdited = this.layers.find((layer: LayerListingInfo) => layer.editingName); const layerPathWithNameBeingEdited = layerWithNameBeingEdited?.entry.path; const layerIdWithNameBeingEdited = layerPathWithNameBeingEdited?.slice(-1)[0]; const path = [] as bigint[]; this.layers = [] as LayerListingInfo[]; - const recurse = (folder: UpdateDocumentLayerTreeStructure, layers: LayerListingInfo[], cache: Map): void => { + const recurse = (folder: UpdateDocumentLayerTreeStructureJs, layers: LayerListingInfo[], cache: Map): void => { folder.children.forEach((item, index) => { // TODO: fix toString const layerId = BigInt(item.layerId.toString()); @@ -520,7 +520,7 @@ export default defineComponent({ }, }, mounted() { - this.editor.subscriptions.subscribeJsMessage(UpdateDocumentLayerTreeStructure, (updateDocumentLayerTreeStructure) => { + this.editor.subscriptions.subscribeJsMessage(UpdateDocumentLayerTreeStructureJs, (updateDocumentLayerTreeStructure) => { this.rebuildLayerTree(updateDocumentLayerTreeStructure); }); diff --git a/frontend/src/components/widgets/inputs/MenuBarInput.vue b/frontend/src/components/widgets/inputs/MenuBarInput.vue index bec7cef03..6034b3a86 100644 --- a/frontend/src/components/widgets/inputs/MenuBarInput.vue +++ b/frontend/src/components/widgets/inputs/MenuBarInput.vue @@ -68,7 +68,7 @@ import { defineComponent } from "vue"; import { platformIsMac } from "@/utility-functions/platform"; -import { type KeyRaw, type KeysGroup, type MenuBarEntry, type MenuListEntry, UpdateMenuBarLayout } from "@/wasm-communication/messages"; +import { type KeyRaw, type LayoutKeysGroup, type MenuBarEntry, type MenuListEntry, UpdateMenuBarLayout } from "@/wasm-communication/messages"; import MenuList from "@/components/floating-menus/MenuList.vue"; import IconLabel from "@/components/widgets/labels/IconLabel.vue"; @@ -92,7 +92,7 @@ export default defineComponent({ mounted() { this.editor.subscriptions.subscribeJsMessage(UpdateMenuBarLayout, (updateMenuBarLayout) => { const arraysEqual = (a: KeyRaw[], b: KeyRaw[]): boolean => a.length === b.length && a.every((aValue, i) => aValue === b[i]); - const shortcutRequiresLock = (shortcut: KeysGroup): boolean => { + const shortcutRequiresLock = (shortcut: LayoutKeysGroup): boolean => { const shortcutKeys = shortcut.map((keyWithLabel) => keyWithLabel.key); // If this shortcut matches any of the browser-reserved shortcuts diff --git a/frontend/src/components/widgets/labels/UserInputLabel.vue b/frontend/src/components/widgets/labels/UserInputLabel.vue index db4546f0b..8900d5fbe 100644 --- a/frontend/src/components/widgets/labels/UserInputLabel.vue +++ b/frontend/src/components/widgets/labels/UserInputLabel.vue @@ -127,7 +127,7 @@ import { defineComponent, type PropType } from "vue"; import { type IconName } from "@/utility-functions/icons"; import { platformIsMac } from "@/utility-functions/platform"; -import { type KeyRaw, type KeysGroup, type Key, type MouseMotion } from "@/wasm-communication/messages"; +import { type KeyRaw, type LayoutKeysGroup, type Key, type MouseMotion } from "@/wasm-communication/messages"; import LayoutRow from "@/components/layout/LayoutRow.vue"; import IconLabel from "@/components/widgets/labels/IconLabel.vue"; @@ -158,7 +158,7 @@ const ICON_WIDTHS = { export default defineComponent({ inject: ["fullscreen"], props: { - keysWithLabelsGroups: { type: Array as PropType, default: () => [] }, + keysWithLabelsGroups: { type: Array as PropType, default: () => [] }, mouseMotion: { type: String as PropType, required: false }, requiresLock: { type: Boolean as PropType, default: false }, }, @@ -182,7 +182,7 @@ export default defineComponent({ }, }, methods: { - keyTextOrIconList(keyGroup: KeysGroup): LabelData[] { + keyTextOrIconList(keyGroup: LayoutKeysGroup): LabelData[] { return keyGroup.map((key) => this.keyTextOrIcon(key)); }, keyTextOrIcon(keyWithLabel: Key): LabelData { diff --git a/frontend/src/components/window/status-bar/StatusBar.vue b/frontend/src/components/window/status-bar/StatusBar.vue index 56588382c..7f3b6fa5c 100644 --- a/frontend/src/components/window/status-bar/StatusBar.vue +++ b/frontend/src/components/window/status-bar/StatusBar.vue @@ -49,7 +49,7 @@ import { defineComponent } from "vue"; import { platformIsMac } from "@/utility-functions/platform"; -import { type HintData, type HintInfo, type KeysGroup, UpdateInputHints } from "@/wasm-communication/messages"; +import { type HintData, type HintInfo, type LayoutKeysGroup, UpdateInputHints } from "@/wasm-communication/messages"; import LayoutRow from "@/components/layout/LayoutRow.vue"; import Separator from "@/components/widgets/labels/Separator.vue"; @@ -63,7 +63,7 @@ export default defineComponent({ }; }, methods: { - inputKeysForPlatform(hint: HintInfo): KeysGroup[] { + inputKeysForPlatform(hint: HintInfo): LayoutKeysGroup[] { if (platformIsMac() && hint.keyGroupsMac) return hint.keyGroupsMac; return hint.keyGroups; }, diff --git a/frontend/src/components/window/workspace/Panel.vue b/frontend/src/components/window/workspace/Panel.vue index 836cd6403..cfd3dff70 100644 --- a/frontend/src/components/window/workspace/Panel.vue +++ b/frontend/src/components/window/workspace/Panel.vue @@ -214,7 +214,7 @@ import { defineComponent, nextTick, type PropType } from "vue"; import { platformIsMac } from "@/utility-functions/platform"; -import { type KeysGroup, type Key } from "@/wasm-communication/messages"; +import { type LayoutKeysGroup, type Key } from "@/wasm-communication/messages"; import LayoutCol from "@/components/layout/LayoutCol.vue"; import LayoutRow from "@/components/layout/LayoutRow.vue"; @@ -258,7 +258,7 @@ export default defineComponent({ openDocument() { this.editor.instance.documentOpen(); }, - platformModifiers(reservedKey: boolean): KeysGroup { + platformModifiers(reservedKey: boolean): LayoutKeysGroup { // TODO: Remove this by properly feeding these keys from a layout provided by the backend const ALT: Key = { key: "Alt", label: "Alt" }; diff --git a/frontend/src/io-managers/input.ts b/frontend/src/io-managers/input.ts index 6bd481dd0..70653f64c 100644 --- a/frontend/src/io-managers/input.ts +++ b/frontend/src/io-managers/input.ts @@ -30,7 +30,7 @@ export function createInputManager(editor: Editor, container: HTMLElement, dialo // eslint-disable-next-line @typescript-eslint/no-explicit-any const listeners: { target: EventListenerTarget; eventName: EventName; action: (event: any) => void; options?: boolean | AddEventListenerOptions }[] = [ { target: window, eventName: "resize", action: (): void => onWindowResize(container) }, - { target: window, eventName: "beforeunload", action: (e: BeforeUnloadEvent): void => onBeforeUnload(e) }, + { target: window, eventName: "beforeunload", action: (e: BeforeUnloadEvent): Promise => onBeforeUnload(e) }, { target: window.document, eventName: "contextmenu", action: (e: MouseEvent): void => e.preventDefault() }, { target: window.document, eventName: "fullscreenchange", action: (): void => fullscreen.fullscreenModeChanged() }, { target: window, eventName: "keyup", action: (e: KeyboardEvent): Promise => onKeyUp(e) }, @@ -235,15 +235,15 @@ export function createInputManager(editor: Editor, container: HTMLElement, dialo if (boundsOfViewports.length > 0) editor.instance.boundsOfViewports(data); } - function onBeforeUnload(e: BeforeUnloadEvent): void { + async function onBeforeUnload(e: BeforeUnloadEvent): Promise { const activeDocument = document.state.documents[document.state.activeDocumentIndex]; if (activeDocument && !activeDocument.isAutoSaved) editor.instance.triggerAutoSave(activeDocument.id); // Skip the message if the editor crashed, since work is already lost - if (editor.instance.hasCrashed()) return; + if (await editor.instance.hasCrashed()) return; // Skip the message during development, since it's annoying when testing - if (editor.instance.inDevelopmentMode()) return; + if (await editor.instance.inDevelopmentMode()) return; const allDocumentsSaved = document.state.documents.reduce((acc, doc) => acc && doc.isSaved, true); if (!allDocumentsSaved) { diff --git a/frontend/src/wasm-communication/editor.ts b/frontend/src/wasm-communication/editor.ts index e61d32c66..275ee5eff 100644 --- a/frontend/src/wasm-communication/editor.ts +++ b/frontend/src/wasm-communication/editor.ts @@ -1,3 +1,5 @@ +import { invoke } from "@tauri-apps/api"; + import type WasmBindgenPackage from "@/../wasm/pkg"; import { panicProxy } from "@/utility-functions/panic-proxy"; import { type JsMessageType } from "@/wasm-communication/messages"; @@ -24,6 +26,30 @@ export async function updateImage(path: BigUint64Array, mime: string, imageData: editorInstance?.setImageBlobURL(documentId, path, blobURL, image.naturalWidth, image.naturalHeight); } +export async function fetchImage(path: BigUint64Array, mime: string, documentId: bigint, url: string): Promise { + const data = await fetch(url); + const blob = await data.blob(); + + const blobURL = URL.createObjectURL(blob); + + // Pre-decode the image so it is ready to be drawn instantly once it's placed into the viewport SVG + const image = new Image(); + image.src = blobURL; + await image.decode(); + + editorInstance?.setImageBlobURL(documentId, path, blobURL, image.naturalWidth, image.naturalHeight); +} + +// export async function dispatchTauri(message: string): Promise { +export async function dispatchTauri(message: any): Promise { + try { + const response = await invoke("handle_message", { message }); + editorInstance?.tauriResponse(response); + } catch { + console.error("Failed to dispatch Tauri message"); + } +} + // Should be called asynchronously before `createEditor()` export async function initWasm(): Promise { // Skip if the WASM module is already initialized @@ -34,8 +60,14 @@ export async function initWasm(): Promise { wasmImport = await import("@/../wasm/pkg").then(panicProxy); // Provide a random starter seed which must occur after initializing the WASM module, since WASM can't generate its own random numbers - const randomSeed = BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)); + const randomSeedFloat = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); + const randomSeed = BigInt(randomSeedFloat); wasmImport?.setRandomSeed(randomSeed); + try { + await invoke("set_random_seed", { seed: randomSeedFloat }); + } catch { + // Ignore errors + } } // Should be called after running `initWasm()` and its promise resolving diff --git a/frontend/src/wasm-communication/messages.ts b/frontend/src/wasm-communication/messages.ts index 75e693eed..1e6d7eed3 100644 --- a/frontend/src/wasm-communication/messages.ts +++ b/frontend/src/wasm-communication/messages.ts @@ -136,9 +136,9 @@ export type HintData = HintGroup[]; export type HintGroup = HintInfo[]; export class HintInfo { - readonly keyGroups!: KeysGroup[]; + readonly keyGroups!: LayoutKeysGroup[]; - readonly keyGroupsMac!: KeysGroup[] | undefined; + readonly keyGroupsMac!: LayoutKeysGroup[] | undefined; readonly mouse!: MouseMotion | undefined; @@ -151,8 +151,8 @@ export class HintInfo { export type KeyRaw = string; // Serde converts a Rust `Key` enum variant into this format (via a custom serializer) with both the `Key` variant name (called `RawKey` in TS) and the localized `label` for the key export type Key = { key: KeyRaw; label: string }; -export type KeysGroup = Key[]; -export type ActionKeys = { keys: KeysGroup }; +export type LayoutKeysGroup = Key[]; +export type ActionKeys = { keys: LayoutKeysGroup }; export type MouseMotion = string; @@ -596,8 +596,8 @@ export class TriggerSavePreferences extends JsMessage { export class DocumentChanged extends JsMessage {} -export class UpdateDocumentLayerTreeStructure extends JsMessage { - constructor(readonly layerId: bigint, readonly children: UpdateDocumentLayerTreeStructure[]) { +export class UpdateDocumentLayerTreeStructureJs extends JsMessage { + constructor(readonly layerId: bigint, readonly children: UpdateDocumentLayerTreeStructureJs[]) { super(); } } @@ -607,7 +607,7 @@ type DataBuffer = { length: bigint; }; -export function newUpdateDocumentLayerTreeStructure(input: { dataBuffer: DataBuffer }, wasm: WasmRawInstance): UpdateDocumentLayerTreeStructure { +export function newUpdateDocumentLayerTreeStructure(input: { dataBuffer: DataBuffer }, wasm: WasmRawInstance): UpdateDocumentLayerTreeStructureJs { const pointerNum = Number(input.dataBuffer.pointer); const lengthNum = Number(input.dataBuffer.length); @@ -624,7 +624,7 @@ export function newUpdateDocumentLayerTreeStructure(input: { dataBuffer: DataBuf const layerIdsSection = new DataView(wasmMemoryBuffer, pointerNum + 8 + structureSectionLength * 8); let layersEncountered = 0; - let currentFolder = new UpdateDocumentLayerTreeStructure(BigInt(-1), []); + let currentFolder = new UpdateDocumentLayerTreeStructureJs(BigInt(-1), []); const currentFolderStack = [currentFolder]; for (let i = 0; i < structureSectionLength; i += 1) { @@ -639,7 +639,7 @@ export function newUpdateDocumentLayerTreeStructure(input: { dataBuffer: DataBuf const layerId = layerIdsSection.getBigUint64(layersEncountered * 8, true); layersEncountered += 1; - const childLayer = new UpdateDocumentLayerTreeStructure(layerId, []); + const childLayer = new UpdateDocumentLayerTreeStructureJs(layerId, []); currentFolder.children.push(childLayer); } @@ -1361,7 +1361,7 @@ export const messageMakers: Record = { UpdateDocumentArtwork, UpdateDocumentBarLayout, UpdateDocumentLayerDetails, - UpdateDocumentLayerTreeStructure: newUpdateDocumentLayerTreeStructure, + UpdateDocumentLayerTreeStructureJs: newUpdateDocumentLayerTreeStructure, UpdateDocumentModeLayout, UpdateDocumentOverlays, UpdateDocumentRulers, diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index 321d6f6af..8d4c0b7d2 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -10,6 +10,10 @@ homepage = "https://graphite.rs" repository = "https://github.com/GraphiteEditor/Graphite" license = "Apache-2.0" +[features] +tauri = ["ron"] +default = [] + [lib] crate-type = ["cdylib", "rlib"] @@ -22,6 +26,8 @@ serde = { version = "1.0", features = ["derive"] } wasm-bindgen = { version = "0.2.73" } serde-wasm-bindgen = "0.4.1" js-sys = "0.3.55" +wasm-bindgen-futures = "0.4.33" +ron = {version = "0.8", optional = true} [dev-dependencies] wasm-bindgen-test = "0.3.22" diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 2e209cfc7..c11474696 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -33,6 +33,9 @@ pub fn set_random_seed(seed: u64) { #[wasm_bindgen(module = "@/wasm-communication/editor")] extern "C" { fn updateImage(path: Vec, mime: String, imageData: &[u8], document_id: u64); + fn fetchImage(path: Vec, mime: String, document_id: u64, identifier: String); + //fn dispatchTauri(message: String) -> String; + fn dispatchTauri(message: String); } /// Provides a handle to access the raw WASM memory @@ -73,37 +76,53 @@ impl JsEditorHandle { return; } - // Get the editor instances, dispatch the message, and store the `FrontendMessage` queue response - let frontend_messages = EDITOR_INSTANCES.with(|instances| { - // Mutably borrow the editors, and if successful, we can access them in the closure - instances.try_borrow_mut().map(|mut editors| { - // Get the editor instance for this editor ID, then dispatch the message to the backend, and return its response `FrontendMessage` queue - editors - .get_mut(&self.editor_id) - .expect("EDITOR_INSTANCES does not contain the current editor_id") - .handle_message(message.into()) - }) - }); + #[cfg(feature = "tauri")] + { + let message: Message = message.into(); + let message = ron::to_string(&message).unwrap(); - // Process any `FrontendMessage` responses resulting from the backend processing the dispatched message - if let Ok(frontend_messages) = frontend_messages { - // Send each `FrontendMessage` to the JavaScript frontend - for message in frontend_messages.into_iter() { - self.send_frontend_message_to_js(message); + dispatchTauri(message); + } + #[cfg(not(feature = "tauri"))] + { + // Get the editor instances, dispatch the message, and store the `FrontendMessage` queue response + let frontend_messages = EDITOR_INSTANCES.with(|instances| { + // Mutably borrow the editors, and if successful, we can access them in the closure + instances.try_borrow_mut().map(|mut editors| { + // Get the editor instance for this editor ID, then dispatch the message to the backend, and return its response `FrontendMessage` queue + editors + .get_mut(&self.editor_id) + .expect("EDITOR_INSTANCES does not contain the current editor_id") + .handle_message(message.into()) + }) + }); + + // Process any `FrontendMessage` responses resulting from the backend processing the dispatched message + if let Ok(frontend_messages) = frontend_messages { + // Send each `FrontendMessage` to the JavaScript frontend + for message in frontend_messages.into_iter() { + self.send_frontend_message_to_js(message); + } } } // If the editor cannot be borrowed then it has encountered a panic - we should just ignore new dispatches } // Sends a FrontendMessage to JavaScript - fn send_frontend_message_to_js(&self, message: FrontendMessage) { + fn send_frontend_message_to_js(&self, mut message: FrontendMessage) { // Special case for update image data to avoid serialization times. if let FrontendMessage::UpdateImageData { document_id, image_data } = message { for image in image_data { + #[cfg(not(feature = "tauri"))] updateImage(image.path, image.mime, &image.image_data, document_id); + #[cfg(feature = "tauri")] + fetchImage(image.path.clone(), image.mime, document_id, format!("http://localhost:3001/image/{:?}_{}", &image.path, document_id)); } return; } + if let FrontendMessage::UpdateDocumentLayerTreeStructure { data_buffer } = message { + message = FrontendMessage::UpdateDocumentLayerTreeStructureJs { data_buffer: data_buffer.into() }; + } let message_type = message.to_discriminant().local_name(); @@ -139,6 +158,21 @@ impl JsEditorHandle { self.dispatch(Message::Init); } + #[wasm_bindgen(js_name = tauriResponse)] + pub fn tauri_response(&self, message: JsValue) { + #[cfg(feature = "tauri")] + match ron::from_str::>(&message.as_string().unwrap()) { + Ok(response) => { + for message in response { + self.send_frontend_message_to_js(message); + } + } + Err(error) => { + log::error!("tauri response: {:?}\n{:?}", error, message); + } + } + } + /// Displays a dialog with an error message #[wasm_bindgen(js_name = errorDialog)] pub fn error_dialog(&self, title: String, description: String) { diff --git a/graphene/Cargo.toml b/graphene/Cargo.toml index 2db53ddff..289d9a9b7 100644 --- a/graphene/Cargo.toml +++ b/graphene/Cargo.toml @@ -23,7 +23,7 @@ kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ ] } serde = { version = "1.0", features = ["derive"] } base64 = "0.13" -glam = { version = "0.17", features = ["serde"] } +glam = { version = "0.22", features = ["serde"] } # Font rendering rustybuzz = "*" diff --git a/graphene/src/document.rs b/graphene/src/document.rs index 00bec3d7c..460665333 100644 --- a/graphene/src/document.rs +++ b/graphene/src/document.rs @@ -600,7 +600,7 @@ impl Document { image_data, mime, } => { - let image_data = std::rc::Rc::new(image_data); + let image_data = std::sync::Arc::new(image_data); let layer = Layer::new(LayerDataType::Image(ImageLayer::new(mime, image_data)), transform); self.set_layer(&path, layer, insert_index)?; @@ -624,7 +624,7 @@ impl Document { Operation::SetNodeGraphFrameImageData { layer_path, image_data } => { let layer = self.layer_mut(&layer_path).expect("Setting NodeGraphFrame image data for invalid layer"); if let LayerDataType::NodeGraphFrame(node_graph_frame) = &mut layer.data { - let image_data = std::rc::Rc::new(image_data); + let image_data = std::sync::Arc::new(image_data); node_graph_frame.image_data = Some(crate::layers::nodegraph_layer::ImageData { image_data }); } else { panic!("Incorrectly trying to set image data for a layer that is not an NodeGraphFrame layer type"); @@ -850,7 +850,7 @@ impl Document { Operation::ImaginateSetImageData { layer_path, image_data } => { let layer = self.layer_mut(&layer_path).expect("Setting Imaginate image data for invalid layer"); if let LayerDataType::Imaginate(imaginate) = &mut layer.data { - let image_data = std::rc::Rc::new(image_data); + let image_data = std::sync::Arc::new(image_data); imaginate.image_data = Some(ImaginateImageData { image_data }); } else { panic!("Incorrectly trying to set image data for a layer that is not an Imaginate layer type"); diff --git a/graphene/src/layers/base64_serde.rs b/graphene/src/layers/base64_serde.rs index f755d7ae3..cbf2db40e 100644 --- a/graphene/src/layers/base64_serde.rs +++ b/graphene/src/layers/base64_serde.rs @@ -2,14 +2,14 @@ use serde::{Deserialize, Deserializer, Serializer}; -pub fn as_base64(key: &std::rc::Rc>, serializer: S) -> Result +pub fn as_base64(key: &std::sync::Arc>, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&base64::encode(key.as_slice())) } -pub fn from_base64<'a, D>(deserializer: D) -> Result>, D::Error> +pub fn from_base64<'a, D>(deserializer: D) -> Result>, D::Error> where D: Deserializer<'a>, { @@ -17,6 +17,6 @@ where String::deserialize(deserializer) .and_then(|string| base64::decode(string).map_err(|err| Error::custom(err.to_string()))) - .map(std::rc::Rc::new) + .map(std::sync::Arc::new) .map_err(serde::de::Error::custom) } diff --git a/graphene/src/layers/image_layer.rs b/graphene/src/layers/image_layer.rs index e2dca0874..354ef527b 100644 --- a/graphene/src/layers/image_layer.rs +++ b/graphene/src/layers/image_layer.rs @@ -14,7 +14,7 @@ use std::fmt::Write; pub struct ImageLayer { pub mime: String, #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] - pub image_data: std::rc::Rc>, + pub image_data: std::sync::Arc>, // TODO: Have the browser dispose of this blob URL when this is dropped (like when the layer is deleted) #[serde(skip)] pub blob_url: Option, @@ -75,7 +75,7 @@ impl LayerData for ImageLayer { } impl ImageLayer { - pub fn new(mime: String, image_data: std::rc::Rc>) -> Self { + pub fn new(mime: String, image_data: std::sync::Arc>) -> Self { Self { mime, image_data, diff --git a/graphene/src/layers/imaginate_layer.rs b/graphene/src/layers/imaginate_layer.rs index d7a7c8f69..5eef29d17 100644 --- a/graphene/src/layers/imaginate_layer.rs +++ b/graphene/src/layers/imaginate_layer.rs @@ -57,7 +57,7 @@ pub enum ImaginateStatus { #[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] pub struct ImaginateImageData { #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] - pub image_data: std::rc::Rc>, + pub image_data: std::sync::Arc>, } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] diff --git a/graphene/src/layers/nodegraph_layer.rs b/graphene/src/layers/nodegraph_layer.rs index c5da7cb61..6ef0d0088 100644 --- a/graphene/src/layers/nodegraph_layer.rs +++ b/graphene/src/layers/nodegraph_layer.rs @@ -31,7 +31,7 @@ pub struct NodeGraphFrameLayer { #[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] pub struct ImageData { #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] - pub image_data: std::rc::Rc>, + pub image_data: std::sync::Arc>, } impl LayerData for NodeGraphFrameLayer { diff --git a/libraries/bezier-rs/Cargo.toml b/libraries/bezier-rs/Cargo.toml index 7158ea0e8..a4964f0d7 100644 --- a/libraries/bezier-rs/Cargo.toml +++ b/libraries/bezier-rs/Cargo.toml @@ -11,4 +11,4 @@ homepage = "https://graphite.rs/libraries/bezier-rs" repository = "https://github.com/GraphiteEditor/Graphite/libraries/bezier-rs" [dependencies] -glam = { version = "0.17", features = ["serde"] } +glam = { version = "0.22", features = ["serde"] } diff --git a/libraries/bezier-rs/src/bezier/solvers.rs b/libraries/bezier-rs/src/bezier/solvers.rs index a90e13dc6..5494632b8 100644 --- a/libraries/bezier-rs/src/bezier/solvers.rs +++ b/libraries/bezier-rs/src/bezier/solvers.rs @@ -201,7 +201,7 @@ impl Bezier { // Check if the bounding boxes overlap if utils::do_rectangles_overlap(bounding_box1, bounding_box2) { // If bounding boxes are within the error threshold (i.e. are small enough), we have found an intersection - if (bounding_box1[1] - bounding_box1[0]).lt(&error_threshold) && (bounding_box2[1] - bounding_box2[0]).lt(&error_threshold) { + if (bounding_box1[1] - bounding_box1[0]).cmplt(error_threshold).all() && (bounding_box2[1] - bounding_box2[0]).cmplt(error_threshold).all() { // Use the middle t value, return the corresponding `t` value for `self` and `other` return vec![[self_mid_t, other_mid_t]]; } diff --git a/libraries/dyn-any/Cargo.toml b/libraries/dyn-any/Cargo.toml index 5a6cf2c5a..d60999c8d 100644 --- a/libraries/dyn-any/Cargo.toml +++ b/libraries/dyn-any/Cargo.toml @@ -14,7 +14,7 @@ documentation = "https://docs.rs/dyn-any" [dependencies] dyn-any-derive = { path = "derive", version = "0.2.0", optional = true } log = { version = "0.4", optional = true } -glam = { version = "0.17", optional = true } +glam = { version = "0.22", optional = true } [features] derive = ["dyn-any-derive"] @@ -23,6 +23,10 @@ log-bad-types = ["log"] rc = [] # Opt into impls for some glam types glam = ["dep:glam"] +alloc = [] +large-atomics = [] +std = ["alloc", "rc"] +default = ["std", "large-atomics"] [package.metadata.docs.rs] all-features = true diff --git a/libraries/dyn-any/src/lib.rs b/libraries/dyn-any/src/lib.rs index e97b25edd..4266c3b20 100644 --- a/libraries/dyn-any/src/lib.rs +++ b/libraries/dyn-any/src/lib.rs @@ -1,5 +1,9 @@ #![doc(html_root_url = "http://docs.rs/const-default/1.0.0")] #![cfg_attr(feature = "unstable-docs", feature(doc_cfg))] +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "alloc")] +extern crate alloc; #[cfg(feature = "derive")] #[cfg_attr(feature = "unstable-docs", doc(cfg(feature = "derive")))] @@ -9,6 +13,7 @@ pub use dyn_any_derive::DynAny; pub trait UpcastFrom { fn up_from(value: &T) -> &Self; fn up_from_mut(value: &mut T) -> &mut Self; + #[cfg(feature = "alloc")] fn up_from_box(value: Box) -> Box; } @@ -16,6 +21,7 @@ pub trait UpcastFrom { pub trait Upcast { fn up(&self) -> &U; fn up_mut(&mut self) -> &mut U; + #[cfg(feature = "alloc")] fn up_box(self: Box) -> Box; } @@ -29,12 +35,13 @@ where fn up_mut(&mut self) -> &mut U { U::up_from_mut(self) } + #[cfg(feature = "alloc")] fn up_box(self: Box) -> Box { U::up_from_box(self) } } -use std::any::TypeId; +use core::any::TypeId; impl<'a, T: DynAny<'a> + 'a> UpcastFrom for dyn DynAny<'a> + 'a { fn up_from(value: &T) -> &(dyn DynAny<'a> + 'a) { @@ -43,6 +50,7 @@ impl<'a, T: DynAny<'a> + 'a> UpcastFrom for dyn DynAny<'a> + 'a { fn up_from_mut(value: &mut T) -> &mut (dyn DynAny<'a> + 'a) { value } + #[cfg(feature = "alloc")] fn up_from_box(value: Box) -> Box { value } @@ -55,16 +63,16 @@ pub trait DynAny<'a> { } impl<'a, T: StaticType> DynAny<'a> for T { - fn type_id(&self) -> std::any::TypeId { - std::any::TypeId::of::() + fn type_id(&self) -> core::any::TypeId { + core::any::TypeId::of::() } #[cfg(feature = "log-bad-types")] fn type_name(&self) -> &'static str { - std::any::type_name::() + core::any::type_name::() } } pub fn downcast_ref<'a, V: StaticType>(i: &'a dyn DynAny<'a>) -> Option<&'a V> { - if i.type_id() == std::any::TypeId::of::<::Static>() { + if i.type_id() == core::any::TypeId::of::<::Static>() { // SAFETY: caller guarantees that T is the correct type let ptr = i as *const dyn DynAny<'a> as *const V; Some(unsafe { &*ptr }) @@ -73,9 +81,10 @@ pub fn downcast_ref<'a, V: StaticType>(i: &'a dyn DynAny<'a>) -> Option<&'a V> { } } +#[cfg(feature = "alloc")] pub fn downcast<'a, V: StaticType>(i: Box + 'a>) -> Option> { let type_id = DynAny::type_id(i.as_ref()); - if type_id == std::any::TypeId::of::<::Static>() { + if type_id == core::any::TypeId::of::<::Static>() { // SAFETY: caller guarantees that T is the correct type let ptr = Box::into_raw(i) as *mut dyn DynAny<'a> as *mut V; Some(unsafe { Box::from_raw(ptr) }) @@ -85,26 +94,24 @@ pub fn downcast<'a, V: StaticType>(i: Box + 'a>) -> Option log::error!("Tried to downcast a {} to a {}", DynAny::type_name(i.as_ref()), core::any::type_name::()); } - if type_id == std::any::TypeId::of::<&dyn DynAny<'static>>() { - panic!("downcast error: type_id == std::any::TypeId::of::>()"); + if type_id == core::any::TypeId::of::<&dyn DynAny<'static>>() { + panic!("downcast error: type_id == core::any::TypeId::of::>()"); } - println!("expected: {:?}", std::any::TypeId::of::<::Static>()); - println!("actual one: {:?}", type_id); None } } pub trait StaticType { type Static: 'static + ?Sized; - fn type_id(&self) -> std::any::TypeId { - std::any::TypeId::of::() + fn type_id(&self) -> core::any::TypeId { + core::any::TypeId::of::() } } pub trait StaticTypeSized { type Static: 'static; - fn type_id(&self) -> std::any::TypeId { - std::any::TypeId::of::() + fn type_id(&self) -> core::any::TypeId { + core::any::TypeId::of::() } } impl StaticTypeSized for T @@ -115,8 +122,8 @@ where } pub trait StaticTypeClone { type Static: 'static + Clone; - fn type_id(&self) -> std::any::TypeId { - std::any::TypeId::of::() + fn type_id(&self) -> core::any::TypeId { + core::any::TypeId::of::() } } impl StaticTypeClone for T @@ -135,8 +142,10 @@ macro_rules! impl_type { )* }; } -impl<'a, T: StaticTypeClone + Clone> StaticType for std::borrow::Cow<'a, T> { - type Static = std::borrow::Cow<'static, T::Static>; + +#[cfg(feature = "alloc")] +impl<'a, T: StaticTypeClone + Clone> StaticType for Cow<'a, T> { + type Static = Cow<'static, T::Static>; } impl StaticType for *const [T] { type Static = *const [::Static]; @@ -163,19 +172,31 @@ impl StaticType for [T; N] { impl<'a> StaticType for dyn DynAny<'a> + '_ { type Static = dyn DynAny<'static>; } +#[cfg(feature = "alloc")] pub trait IntoDynAny<'n>: Sized + StaticType + 'n { fn into_dyn(self) -> Box + 'n> { Box::new(self) } } +#[cfg(feature = "alloc")] impl<'n, T: StaticType + 'n> IntoDynAny<'n> for T {} +#[cfg(feature = "alloc")] impl From<()> for Box> { fn from(_: ()) -> Box> { Box::new(()) } } +#[cfg(feature = "alloc")] +use alloc::{ + borrow::Cow, + boxed::Box, + collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque}, + string::String, + vec::Vec, +}; +use core::sync::atomic::*; use core::{ cell::{Cell, RefCell, UnsafeCell}, iter::Empty, @@ -184,26 +205,38 @@ use core::{ num::Wrapping, time::Duration, }; -use std::{ - collections::*, - sync::{atomic::*, *}, - vec::Vec, -}; impl_type!( Option, Result, Cell, UnsafeCell, RefCell, MaybeUninit, - Vec, String, BTreeMap,BTreeSet, LinkedList, VecDeque, - BinaryHeap, ManuallyDrop, PhantomData, PhantomPinned, Empty, - Wrapping, Duration, Once, Mutex, RwLock, bool, f32, f64, char, - u8, AtomicU8, u16, AtomicU16, u32, AtomicU32, u64, AtomicU64, usize, AtomicUsize, - i8, AtomicI8, i16, AtomicI16, i32, AtomicI32, i64, AtomicI64, isize, AtomicIsize, + ManuallyDrop, PhantomData, PhantomPinned, Empty, + Wrapping, Duration, bool, f32, f64, char, + u8, AtomicU8, u16, AtomicU16, u32, AtomicU32, u64, usize, AtomicUsize, + i8, AtomicI8, i16, AtomicI16, i32, AtomicI32, i64, isize, AtomicIsize, i128, u128, AtomicBool, AtomicPtr ); +#[cfg(feature = "large-atomics")] +impl_type!(AtomicU64, AtomicI64); + +#[cfg(feature = "alloc")] +impl_type!( + Vec, String, BTreeMap,BTreeSet, LinkedList, VecDeque, + BinaryHeap +); + +#[cfg(feature = "std")] +use std::sync::*; + +#[cfg(feature = "std")] +impl_type!(Once, Mutex, RwLock); #[cfg(feature = "rc")] -use std::{rc::Rc, sync::Arc}; +use std::rc::Rc; #[cfg(feature = "rc")] -impl_type!(Rc, Arc); +impl_type!(Rc); +#[cfg(all(feature = "rc", feature = "alloc"))] +use std::sync::Arc; +#[cfg(all(feature = "rc", feature = "alloc"))] +impl_type!(Arc); #[cfg(feature = "glam")] use glam::*; @@ -216,6 +249,7 @@ impl_type!( Quat, Affine2, Affine3A, DAffine2, DAffine3, DQuat ); +#[cfg(feature = "alloc")] impl crate::StaticType for Box { type Static = Box<::Static>; } diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 8ab1eb479..00bc65827 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -9,17 +9,26 @@ license = "MIT OR Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -std = ["dyn-any"] -default = ["async", "serde"] -gpu = ["spirv-std", "bytemuck"] -async = ["async-trait"] +std = ["dyn-any", "dyn-any/std"] +default = ["async", "serde", "kurbo", "log"] +log = ["dep:log"] +serde = ["dep:serde", "glam/serde"] +gpu = ["spirv-std", "bytemuck", "glam/bytemuck", "dyn-any"] +async = ["async-trait", "alloc"] nightly = [] -serde = ["dep:serde"] +alloc = ["dyn-any", "bezier-rs"] [dependencies] -dyn-any = {path = "../../libraries/dyn-any", features = ["derive"], optional = true} +dyn-any = {path = "../../libraries/dyn-any", features = ["derive"], optional = true, default-features = false } spirv-std = { git = "https://github.com/EmbarkStudios/rust-gpu", features = ["glam"] , optional = true} bytemuck = {version = "1.8", features = ["derive"], optional = true} async-trait = {version = "0.1", optional = true} -serde = {version = "1.0", features = ["derive"], optional = true} +serde = {version = "1.0", features = ["derive"], optional = true, default-features = false } +log = {version = "0.4", optional = true} + +bezier-rs = { path = "../../libraries/bezier-rs", optional = true } +kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ + "serde", +], optional = true } +glam = { version = "^0.22", default-features = false, features = ["scalar-math", "libm"]} diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index feccb4ec8..81246f8ad 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -1,7 +1,12 @@ #![no_std] -#[cfg(feature = "async")] + +#[cfg(feature = "alloc")] extern crate alloc; +#[cfg_attr(feature = "log", macro_use)] +#[cfg(feature = "log")] +extern crate log; + #[cfg(feature = "async")] use alloc::boxed::Box; #[cfg(feature = "async")] @@ -17,6 +22,9 @@ pub mod gpu; pub mod raster; +#[cfg(feature = "alloc")] +pub mod vector; + pub trait Node { type Output; diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 0cef45f7d..027b151e9 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -1,7 +1,7 @@ use crate::Node; pub mod color; -use self::color::Color; +pub use self::color::Color; #[derive(Debug, Clone, Copy)] pub struct GrayscaleColorNode; @@ -21,6 +21,12 @@ impl<'n> Node for &'n GrayscaleColorNode { } } +impl GrayscaleColorNode { + pub fn new() -> Self { + Self + } +} + #[derive(Debug, Clone, Copy)] pub struct BrightenColorNode>(N); @@ -48,8 +54,10 @@ impl + Copy> BrightenColorNode { } #[derive(Debug, Clone, Copy)] +#[cfg(not(target_arch = "spirv"))] pub struct HueShiftColorNode>(N); +#[cfg(not(target_arch = "spirv"))] impl> Node for HueShiftColorNode { type Output = Color; fn eval(self, color: Color) -> Color { @@ -58,6 +66,7 @@ impl> Node for HueShiftColorNode { Color::from_hsla(hue + hue_shift / 360., saturation, lightness, alpha) } } +#[cfg(not(target_arch = "spirv"))] impl + Copy> Node for &HueShiftColorNode { type Output = Color; fn eval(self, color: Color) -> Color { @@ -67,6 +76,7 @@ impl + Copy> Node for &HueShiftColorNode { } } +#[cfg(not(target_arch = "spirv"))] impl + Copy> HueShiftColorNode { pub fn new(node: N) -> Self { Self(node) @@ -85,6 +95,48 @@ where } } +#[cfg(feature = "alloc")] +pub use image::Image; +#[cfg(feature = "alloc")] +mod image { + use super::Color; + use alloc::vec::Vec; + use dyn_any::{DynAny, StaticType}; + #[derive(Clone, Debug, PartialEq, DynAny, Default)] + #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct Image { + pub width: u32, + pub height: u32, + pub data: Vec, + } + + impl Image { + pub const fn empty() -> Self { + Self { + width: 0, + height: 0, + data: Vec::new(), + } + } + } + + impl IntoIterator for Image { + type Item = Color; + type IntoIter = alloc::vec::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.data.into_iter() + } + } + + impl<'a> IntoIterator for &'a Image { + type Item = &'a Color; + type IntoIter = alloc::slice::Iter<'a, Color>; + fn into_iter(self) -> Self::IntoIter { + self.data.iter() + } + } +} + /*pub struct MutWrapper(pub N); impl<'n, T: Clone, N> Node<&'n mut T> for &'n MutWrapper diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/raster/color.rs index 37dab7e07..aca21ce06 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/raster/color.rs @@ -3,13 +3,23 @@ use dyn_any::{DynAny, StaticType}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(target_arch = "spirv")] +use spirv_std::num_traits::float::Float; + +#[cfg(target_arch = "spirv")] +use spirv_std::num_traits::Euclid; + +#[cfg(feature = "gpu")] +use bytemuck::{Pod, Zeroable}; + /// Structure that represents a color. /// Internally alpha is stored as `f32` that ranges from `0.0` (transparent) to `1.0` (opaque). /// The other components (RGB) are stored as `f32` that range from `0.0` up to `f32::MAX`, /// the values encode the brightness of each channel proportional to the light intensity in cd/m² (nits) in HDR, and `0.0` (black) to `1.0` (white) in SDR color. #[repr(C)] -#[cfg_attr(feature = "std", derive(Debug, Clone, Copy, PartialEq, Default, Serialize, Deserialize, DynAny))] -#[cfg_attr(not(feature = "std"), derive(Debug, Clone, Copy, PartialEq, Default))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, DynAny))] +#[cfg_attr(feature = "gpu", derive(Pod, Zeroable))] +#[derive(Debug, Clone, Copy, PartialEq, Default)] pub struct Color { red: f32, green: f32, @@ -92,6 +102,7 @@ impl Color { /// use graphene_core::raster::color::Color; /// let color = Color::from_hsla(0.5, 0.2, 0.3, 1.); /// ``` + #[cfg(not(target_arch = "spirv"))] pub fn from_hsla(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> Color { let temp1 = if lightness < 0.5 { lightness * (saturation + 1.) @@ -219,7 +230,10 @@ impl Color { } else { 4. + (self.red - self.green) / (max_channel - min_channel) } / 6.; + #[cfg(not(target_arch = "spirv"))] let hue = hue.rem_euclid(1.); + #[cfg(target_arch = "spirv")] + let hue = hue.rem_euclid(&1.); [hue, saturation, lightness, self.alpha] } diff --git a/node-graph/gstd/src/vector/consts.rs b/node-graph/gcore/src/vector/consts.rs similarity index 97% rename from node-graph/gstd/src/vector/consts.rs rename to node-graph/gcore/src/vector/consts.rs index c629c9c3b..d4e9b0a36 100644 --- a/node-graph/gstd/src/vector/consts.rs +++ b/node-graph/gcore/src/vector/consts.rs @@ -1,4 +1,4 @@ -use std::ops::{Index, IndexMut}; +use core::ops::{Index, IndexMut}; use serde::{Deserialize, Serialize}; diff --git a/node-graph/gstd/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs similarity index 93% rename from node-graph/gstd/src/vector/generator_nodes.rs rename to node-graph/gcore/src/vector/generator_nodes.rs index 3168d40bb..ad8eeba83 100644 --- a/node-graph/gstd/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -1,7 +1,5 @@ -use std::sync::Arc; - +use crate::Node; use glam::{DAffine2, DVec2}; -use graphene_core::Node; use super::subpath::Subpath; @@ -40,8 +38,10 @@ impl Node<()> for &UnitSquareGenerator { } } +// TODO: I removed the Arc requirement we shouuld think about when it makes sense to use its +// vs making a generic value node #[derive(Debug, Clone)] -pub struct PathGenerator(Arc); +pub struct PathGenerator(Subpath); impl Node<()> for PathGenerator { type Output = VectorData; @@ -53,7 +53,7 @@ impl Node<()> for PathGenerator { impl Node<()> for &PathGenerator { type Output = VectorData; fn eval(self, _input: ()) -> Self::Output { - (*self.0).clone() + (self.0).clone() } } use crate::raster::Image; @@ -65,7 +65,7 @@ impl> Node for BlitSubpath { type Output = Image; fn eval(self, input: Image) -> Self::Output { let subpath = self.0.eval(()); - info!("Blitting subpath {subpath:?}"); + log::info!("Blitting subpath {subpath:?}"); input } } @@ -74,7 +74,7 @@ impl + Copy> Node for &BlitSubpath { type Output = Image; fn eval(self, input: Image) -> Self::Output { let subpath = self.0.eval(()); - info!("Blitting subpath {subpath:?}"); + log::info!("Blitting subpath {subpath:?}"); input } } diff --git a/node-graph/gstd/src/vector/id_vec.rs b/node-graph/gcore/src/vector/id_vec.rs similarity index 97% rename from node-graph/gstd/src/vector/id_vec.rs rename to node-graph/gcore/src/vector/id_vec.rs index a1eb596e7..902a65b21 100644 --- a/node-graph/gstd/src/vector/id_vec.rs +++ b/node-graph/gcore/src/vector/id_vec.rs @@ -1,5 +1,8 @@ +use core::ops::{Deref, DerefMut}; use serde::{Deserialize, Serialize}; -use std::ops::{Deref, DerefMut}; + +use alloc::vec; +use alloc::vec::Vec; /// Brief description: A vec that allows indexing elements by both index and an assigned unique ID /// Goals of this Data Structure: @@ -121,7 +124,7 @@ impl IdBackedVec { } /// Enumerate the ids and elements in this container `(&ElementId, &T)` - pub fn enumerate(&self) -> std::iter::Zip, core::slice::Iter> { + pub fn enumerate(&self) -> core::iter::Zip, core::slice::Iter> { self.element_ids.iter().zip(self.elements.iter()) } diff --git a/node-graph/gstd/src/vector/manipulator_group.rs b/node-graph/gcore/src/vector/manipulator_group.rs similarity index 100% rename from node-graph/gstd/src/vector/manipulator_group.rs rename to node-graph/gcore/src/vector/manipulator_group.rs diff --git a/node-graph/gstd/src/vector/manipulator_point.rs b/node-graph/gcore/src/vector/manipulator_point.rs similarity index 100% rename from node-graph/gstd/src/vector/manipulator_point.rs rename to node-graph/gcore/src/vector/manipulator_point.rs diff --git a/node-graph/gstd/src/vector/mod.rs b/node-graph/gcore/src/vector/mod.rs similarity index 100% rename from node-graph/gstd/src/vector/mod.rs rename to node-graph/gcore/src/vector/mod.rs diff --git a/node-graph/gstd/src/vector/subpath.rs b/node-graph/gcore/src/vector/subpath.rs similarity index 98% rename from node-graph/gstd/src/vector/subpath.rs rename to node-graph/gcore/src/vector/subpath.rs index 0071fc8e7..2caeaa52c 100644 --- a/node-graph/gstd/src/vector/subpath.rs +++ b/node-graph/gcore/src/vector/subpath.rs @@ -3,6 +3,9 @@ use super::id_vec::IdBackedVec; use super::manipulator_group::ManipulatorGroup; use super::manipulator_point::ManipulatorPoint; +use alloc::string::String; +use alloc::vec; +use alloc::vec::Vec; use dyn_any::{DynAny, StaticType}; use glam::{DAffine2, DVec2}; use kurbo::{BezPath, PathEl, Shape}; @@ -92,7 +95,7 @@ impl Subpath { pub fn new_ngon(center: DVec2, sides: u64, radius: f64) -> Self { let mut manipulator_groups = vec![]; for i in 0..sides { - let angle = (i as f64) * std::f64::consts::TAU / (sides as f64); + let angle = (i as f64) * core::f64::consts::TAU / (sides as f64); let center = center + DVec2::ONE * radius; let position = ManipulatorGroup::new_with_anchor(DVec2::new(center.x + radius * f64::cos(angle), center.y + radius * f64::sin(angle)) * 0.5); @@ -346,7 +349,7 @@ impl Subpath { /// Generate an SVG `path` elements's `d` attribute: ``. pub fn to_svg(&mut self) -> String { fn write_positions(result: &mut String, values: [Option; 3]) { - use std::fmt::Write; + use core::fmt::Write; let count = values.into_iter().flatten().count(); for (index, pos) in values.into_iter().flatten().enumerate() { write!(result, "{},{}", pos.x, pos.y).unwrap(); @@ -442,7 +445,7 @@ impl BezierId { /// An iterator over [`bezier_rs::Bezier`] segments constructable via [`Subpath::bezier_iter`]. pub struct PathIter<'a> { - path: std::iter::Zip, core::slice::Iter<'a, ManipulatorGroup>>, + path: core::iter::Zip, core::slice::Iter<'a, ManipulatorGroup>>, last_anchor: Option, last_out_handle: Option, diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index 3e08e97fc..9b0ef087b 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -8,13 +8,12 @@ license = "MIT OR Apache-2.0" default = [] profiling = ["nvtx", "gpu"] gpu = ["serde", "vulkano", "spirv-builder", "tera", "graphene-core/gpu"] -serde = ["dep:serde", "graphene-std/serde", "glam/serde"] +serde = ["dep:serde", "graphene-core/serde", "glam/serde"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -graphene-core = { path = "../gcore", features = ["async", "std" ] } -graphene-std = { path = "../gstd" } +graphene-core = { path = "../gcore", features = ["async", "std", "alloc"] } dyn-any = { path = "../../libraries/dyn-any", features = ["log-bad-types", "rc", "glam"] } num-traits = "0.2" borrow_stack = { path = "../borrow_stack" } @@ -22,7 +21,7 @@ dyn-clone = "1.0" rand_chacha = "0.3.1" log = "0.4" serde = { version = "1", features = ["derive", "rc"], optional = true } -glam = { version = "0.17" } +glam = { version = "0.22" } vulkano = {git = "https://github.com/GraphiteEditor/vulkano", branch = "fix_rust_gpu", optional = true} bytemuck = {version = "1.8" } diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 1355b596a..1687bec94 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -5,6 +5,7 @@ use std::sync::Mutex; pub mod value; +use dyn_any::{DynAny, StaticType}; use rand_chacha::{ rand_core::{RngCore, SeedableRng}, ChaCha20Rng, @@ -138,7 +139,7 @@ pub enum DocumentNodeImplementation { Unresolved(NodeIdentifier), } -#[derive(Clone, Debug, Default, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq, DynAny)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct NodeNetwork { pub inputs: Vec, diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 3cd948e73..ecac42061 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -15,10 +15,10 @@ pub enum TaggedValue { F64(f64), Bool(bool), DVec2(DVec2), - Image(graphene_std::raster::Image), + Image(graphene_core::raster::Image), Color(graphene_core::raster::color::Color), - Subpath(graphene_std::vector::subpath::Subpath), - RcSubpath(Arc), + Subpath(graphene_core::vector::subpath::Subpath), + RcSubpath(Arc), } impl TaggedValue { diff --git a/node-graph/graph-craft/src/executor.rs b/node-graph/graph-craft/src/executor.rs index b9bb4eab5..02e4afdc7 100644 --- a/node-graph/graph-craft/src/executor.rs +++ b/node-graph/graph-craft/src/executor.rs @@ -1,10 +1,8 @@ use std::error::Error; -use borrow_stack::{BorrowStack, FixedSizeStack}; -use graphene_core::Node; -use graphene_std::any::{Any, TypeErasedNode}; +use dyn_any::DynAny; -use crate::{document::NodeNetwork, node_registry::push_node, proto::ProtoNetwork}; +use crate::{document::NodeNetwork, proto::ProtoNetwork}; pub struct Compiler {} @@ -25,30 +23,8 @@ impl Compiler { proto_network } } +pub type Any<'a> = Box + 'a>; pub trait Executor { fn execute(&self, input: Any<'static>) -> Result, Box>; } - -pub struct DynamicExecutor { - stack: FixedSizeStack>, -} - -impl DynamicExecutor { - pub fn new(proto_network: ProtoNetwork) -> Self { - assert_eq!(proto_network.inputs.len(), 1); - let node_count = proto_network.nodes.len(); - let stack = FixedSizeStack::new(node_count); - for (_id, node) in proto_network.nodes { - push_node(node, &stack); - } - Self { stack } - } -} - -impl Executor for DynamicExecutor { - fn execute(&self, input: Any<'static>) -> Result, Box> { - let result = unsafe { self.stack.get().last().unwrap().eval(input) }; - Ok(result) - } -} diff --git a/node-graph/graph-craft/src/gpu/compiler.rs b/node-graph/graph-craft/src/gpu/compiler.rs index 36522548d..7dd4eff53 100644 --- a/node-graph/graph-craft/src/gpu/compiler.rs +++ b/node-graph/graph-craft/src/gpu/compiler.rs @@ -30,6 +30,10 @@ pub fn create_files(matadata: &Metadata, network: &ProtoNetwork, compile_dir: &P let cargo_toml = create_cargo_toml(matadata)?; std::fs::write(cargo_file, cargo_toml)?; + let toolchain_file = compile_dir.join("rust-toolchain"); + let toolchain = include_str!("templates/rust-toolchain"); + std::fs::write(toolchain_file, toolchain)?; + // create src dir match std::fs::create_dir(&src) { Ok(_) => {} diff --git a/node-graph/graph-craft/src/gpu/executor.rs b/node-graph/graph-craft/src/gpu/executor.rs index ae29a1b8b..e84234083 100644 --- a/node-graph/graph-craft/src/gpu/executor.rs +++ b/node-graph/graph-craft/src/gpu/executor.rs @@ -1,7 +1,7 @@ use std::path::Path; use super::{compiler::Metadata, context::Context}; -use crate::gpu::compiler; +use crate::{executor::Any, gpu::compiler}; use bytemuck::Pod; use dyn_any::StaticTypeSized; use vulkano::{ @@ -44,7 +44,7 @@ impl GpuExecutor { } impl crate::executor::Executor for GpuExecutor { - fn execute(&self, input: graphene_std::any::Any<'static>) -> Result, Box> { + fn execute(&self, input: Any<'static>) -> Result, Box> { let input = dyn_any::downcast::>(input).expect("Wrong input type"); let context = &self.context; let result: Vec = execute_shader( @@ -91,7 +91,7 @@ fn execute_shader( .bind_pipeline_compute(compute_pipeline.clone()) .bind_descriptor_sets(PipelineBindPoint::Compute, compute_pipeline.layout().clone(), 0, set) .push_constants(compute_pipeline.layout().clone(), 0, constants) - .dispatch([1024, 1, 1]) + .dispatch([((constants.n as isize - 1) / 1024 + 1) as u32 * 1024, 1, 1]) .unwrap(); let command_buffer = builder.build().unwrap(); diff --git a/node-graph/graph-craft/src/lib.rs b/node-graph/graph-craft/src/lib.rs index c6002d3d2..9f3ff0905 100644 --- a/node-graph/graph-craft/src/lib.rs +++ b/node-graph/graph-craft/src/lib.rs @@ -1,8 +1,6 @@ #[macro_use] extern crate log; -pub mod node_registry; - pub mod document; pub mod proto; @@ -10,124 +8,3 @@ pub mod executor; #[cfg(feature = "gpu")] pub mod gpu; - -#[cfg(test)] -mod tests { - - use std::marker::PhantomData; - - use graphene_core::value::ValueNode; - use graphene_core::{structural::*, RefNode}; - - use borrow_stack::BorrowStack; - use dyn_any::{downcast, IntoDynAny}; - use graphene_std::any::{Any, DowncastNode, DynAnyNode, TypeErasedNode}; - use graphene_std::ops::AddNode; - - #[test] - fn borrow_stack() { - let stack = borrow_stack::FixedSizeStack::new(256); - unsafe { - let dynanynode: DynAnyNode, (), _, _> = DynAnyNode::new(ValueNode(2_u32)); - stack.push(dynanynode.into_box()); - } - stack.push_fn(|nodes| { - let pre_node = nodes.get(0).unwrap(); - let downcast: DowncastNode<&TypeErasedNode, &u32> = DowncastNode::new(pre_node); - let dynanynode: DynAnyNode>, u32, _, _> = DynAnyNode::new(ConsNode(downcast, PhantomData)); - dynanynode.into_box() - }); - stack.push_fn(|_| { - let dynanynode: DynAnyNode<_, (u32, &u32), _, _> = DynAnyNode::new(AddNode); - dynanynode.into_box() - }); - stack.push_fn(|nodes| { - let compose_node = nodes[1].after(&nodes[2]); - TypeErasedNode(Box::new(compose_node)) - }); - - let result = unsafe { &stack.get()[0] }.eval_ref(().into_dyn()); - assert_eq!(*downcast::<&u32>(result).unwrap(), &2_u32); - let result = unsafe { &stack.get()[1] }.eval_ref(4_u32.into_dyn()); - assert_eq!(*downcast::<(u32, &u32)>(result).unwrap(), (4_u32, &2_u32)); - let result = unsafe { &stack.get()[1] }.eval_ref(4_u32.into_dyn()); - let add = unsafe { &stack.get()[2] }.eval_ref(result); - assert_eq!(*downcast::(add).unwrap(), 6_u32); - let add = unsafe { &stack.get()[3] }.eval_ref(4_u32.into_dyn()); - assert_eq!(*downcast::(add).unwrap(), 6_u32); - } - - #[test] - fn execute_add() { - use crate::document::*; - use crate::proto::*; - - fn add_network() -> NodeNetwork { - NodeNetwork { - inputs: vec![0, 0], - output: 1, - nodes: [ - ( - 0, - DocumentNode { - name: "Cons".into(), - inputs: vec![NodeInput::Network, NodeInput::Network], - implementation: DocumentNodeImplementation::Unresolved(NodeIdentifier::new( - "graphene_core::structural::ConsNode", - &[Type::Concrete(std::borrow::Cow::Borrowed("u32")), Type::Concrete(std::borrow::Cow::Borrowed("u32"))], - )), - metadata: DocumentNodeMetadata::default(), - }, - ), - ( - 1, - DocumentNode { - name: "Add".into(), - inputs: vec![NodeInput::Node(0)], - implementation: DocumentNodeImplementation::Unresolved(NodeIdentifier::new( - "graphene_core::ops::AddNode", - &[Type::Concrete(std::borrow::Cow::Borrowed("u32")), Type::Concrete(std::borrow::Cow::Borrowed("u32"))], - )), - metadata: DocumentNodeMetadata::default(), - }, - ), - ] - .into_iter() - .collect(), - } - } - - let network = NodeNetwork { - inputs: vec![0], - output: 0, - nodes: [( - 0, - DocumentNode { - name: "Inc".into(), - inputs: vec![ - NodeInput::Network, - NodeInput::Value { - tagged_value: value::TaggedValue::U32(1), - exposed: false, - }, - ], - implementation: DocumentNodeImplementation::Network(add_network()), - metadata: DocumentNodeMetadata::default(), - }, - )] - .into_iter() - .collect(), - }; - - use crate::executor::{Compiler, DynamicExecutor, Executor}; - - let compiler = Compiler {}; - let protograph = compiler.compile(network, false); - - let exec = DynamicExecutor::new(protograph); - - let result = exec.execute(32_u32.into_dyn()).unwrap(); - let val = *dyn_any::downcast::(result).unwrap(); - assert_eq!(val, 33_u32); - } -} diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index 177b29263..0efc4073a 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -321,17 +321,12 @@ impl ProtoNetwork { } fn replace_node_references(&mut self, lookup: &HashMap) { - self.nodes.iter_mut().for_each(|(sid, node)| { + self.nodes.iter_mut().for_each(|(_, node)| { node.map_ids(|id| *lookup.get(&id).expect("node not found in lookup table")); }); self.inputs = self.inputs.iter().map(|id| *lookup.get(id).unwrap()).collect(); self.output = *lookup.get(&self.output).unwrap(); } - - fn replace_ids_with_lookup(&mut self, lookup: HashMap) { - self.nodes.iter_mut().for_each(|(id, _)| *id = *lookup.get(id).unwrap()); - self.replace_node_references(&lookup); - } } #[cfg(test)] diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 014458668..29253f662 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -12,13 +12,17 @@ license = "MIT OR Apache-2.0" derive = ["graph-proc-macros"] memoization = ["once_cell"] default = ["derive", "memoization"] +gpu = ["graph-craft/gpu", "graphene-core/gpu"] [dependencies] -graphene-core = {path = "../gcore", features = ["async", "std"], default-features = false} +graphene-core = {path = "../gcore", features = ["async", "std" ], default-features = false} borrow_stack = {path = "../borrow_stack"} dyn-any = {path = "../../libraries/dyn-any", features = ["derive"]} graph-proc-macros = {path = "../proc-macro", optional = true} +graph-craft = {path = "../graph-craft"} +bytemuck = {version = "1.8" } +tempfile = "3" once_cell = {version= "1.10", optional = true} #pretty-token-stream = {path = "../../pretty-token-stream"} syn = {version = "1.0", default-features = false, features = ["parsing", "printing"]} @@ -32,7 +36,7 @@ bezier-rs = { path = "../../libraries/bezier-rs" } kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ "serde", ] } -glam = { version = "0.17", features = ["serde"] } +glam = { version = "0.22", features = ["serde"] } [dependencies.serde] version = "1.0" diff --git a/node-graph/gstd/src/cache.rs b/node-graph/gstd/src/cache.rs index ee917444e..0c408e640 100644 --- a/node-graph/gstd/src/cache.rs +++ b/node-graph/gstd/src/cache.rs @@ -30,7 +30,9 @@ where input.borrow().hash(&mut hasher); let hash = hasher.finish(); - self.map.get_or_create_with(&hash, || CacheNode::new(self.node)) + self.map.get_or_create_with(&hash, ||{ + trace!("Creating new cache node"); + CacheNode::new(self.node)}) } } diff --git a/node-graph/gstd/src/executor.rs b/node-graph/gstd/src/executor.rs new file mode 100644 index 000000000..2d4ae56c7 --- /dev/null +++ b/node-graph/gstd/src/executor.rs @@ -0,0 +1,135 @@ +use bytemuck::Pod; +use core::marker::PhantomData; +use dyn_any::StaticTypeSized; +use graph_craft::document::*; +use graph_craft::proto::*; +use graphene_core::{raster::Image, value::ValueNode, Node}; + +pub struct MapGpuNode, I: IntoIterator, S: StaticTypeSized + Sync + Send + Pod, O: StaticTypeSized + Sync + Send + Pod>(pub NN, PhantomData<(S, I, O)>); + +impl<'n, I: IntoIterator, NN: Node<(), Output = &'n NodeNetwork> + Copy, S: StaticTypeSized + Sync + Send + Pod, O: StaticTypeSized + Sync + Send + Pod> Node + for &MapGpuNode +{ + type Output = Vec; + fn eval(self, input: I) -> Self::Output { + let network = self.0.eval(()); + + use graph_craft::executor::Compiler; + use graph_craft::executor::Executor; + use graph_craft::gpu::compiler::Metadata; + let compiler = Compiler {}; + let proto_network = compiler.compile(network.clone(), true); + + let m = Metadata::new("project".to_owned(), vec!["test@example.com".to_owned()]); + let temp_dir = tempfile::tempdir().expect("failed to create tempdir"); + + use graph_craft::gpu::context::Context; + use graph_craft::gpu::executor::GpuExecutor; + let executor: GpuExecutor = GpuExecutor::new(Context::new(), proto_network, m, temp_dir.path()).unwrap(); + + let data: Vec<_> = input.into_iter().collect(); + let result = executor.execute(Box::new(data)).unwrap(); + let result = dyn_any::downcast::>(result).unwrap(); + *result + } +} +impl<'n, I: IntoIterator, NN: Node<(), Output = &'n NodeNetwork> + Copy, S: StaticTypeSized + Sync + Send + Pod, O: StaticTypeSized + Sync + Send + Pod> Node for MapGpuNode { + type Output = Vec; + fn eval(self, input: I) -> Self::Output { + let network = self.0.eval(()); + + use graph_craft::executor::Compiler; + use graph_craft::executor::Executor; + use graph_craft::gpu::compiler::Metadata; + let compiler = Compiler {}; + let proto_network = compiler.compile(network.clone(), true); + + let m = Metadata::new("project".to_owned(), vec!["test@example.com".to_owned()]); + let temp_dir = tempfile::tempdir().expect("failed to create tempdir"); + + use graph_craft::gpu::context::Context; + use graph_craft::gpu::executor::GpuExecutor; + let executor: GpuExecutor = GpuExecutor::new(Context::new(), proto_network, m, temp_dir.path()).unwrap(); + + let data: Vec<_> = input.into_iter().collect(); + let result = executor.execute(Box::new(data)).unwrap(); + let result = dyn_any::downcast::>(result).unwrap(); + *result + } +} + +impl, NN: Node<()>, S: StaticTypeSized + Sync + Pod + Send, O: StaticTypeSized + Sync + Send + Pod> MapGpuNode { + pub const fn new(network: NN) -> Self { + MapGpuNode(network, PhantomData) + } +} + +pub struct MapGpuSingleImageNode>(pub NN); + +impl + Copy> Node for MapGpuSingleImageNode { + type Output = Image; + fn eval(self, input: Image) -> Self::Output { + let node = self.0.eval(()); + use graph_craft::document::*; + + let identifier = NodeIdentifier { + name: std::borrow::Cow::Owned(node), + types: std::borrow::Cow::Borrowed(&[]), + }; + + let network = NodeNetwork { + inputs: vec![0], + output: 0, + nodes: [( + 0, + DocumentNode { + name: "Image filter Node".into(), + inputs: vec![NodeInput::Network], + implementation: DocumentNodeImplementation::Unresolved(identifier), + metadata: DocumentNodeMetadata::default(), + }, + )] + .into_iter() + .collect(), + }; + + let value_network = ValueNode::new(network); + let map_node = MapGpuNode::new(&value_network); + let data = map_node.eval(input.data.clone()); + Image { data, ..input } + } +} + +impl + Copy> Node for &MapGpuSingleImageNode { + type Output = Image; + fn eval(self, input: Image) -> Self::Output { + let node = self.0.eval(()); + use graph_craft::document::*; + + let identifier = NodeIdentifier { + name: std::borrow::Cow::Owned(node), + types: std::borrow::Cow::Borrowed(&[]), + }; + + let network = NodeNetwork { + inputs: vec![0], + output: 0, + nodes: [( + 0, + DocumentNode { + name: "Image filter Node".into(), + inputs: vec![NodeInput::Network], + implementation: DocumentNodeImplementation::Unresolved(identifier), + metadata: DocumentNodeMetadata::default(), + }, + )] + .into_iter() + .collect(), + }; + + let value_network = ValueNode::new(network); + let map_node = MapGpuNode::new(&value_network); + let data = map_node.eval(input.data.clone()); + Image { data, ..input } + } +} diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index f03914236..60c7bb053 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -9,8 +9,10 @@ extern crate log; pub mod memo; pub mod raster; -pub mod vector; pub mod any; +#[cfg(feature = "gpu")] +pub mod executor; + pub use graphene_core::*; diff --git a/node-graph/gstd/src/memo.rs b/node-graph/gstd/src/memo.rs index 3c1a1e55a..5660d9609 100644 --- a/node-graph/gstd/src/memo.rs +++ b/node-graph/gstd/src/memo.rs @@ -9,7 +9,10 @@ pub struct CacheNode, I> { impl<'n, CashedNode: Node + Copy, I> Node for &'n CacheNode { type Output = &'n CashedNode::Output; fn eval(self, input: I) -> Self::Output { - self.cache.get_or_init(|| self.node.eval(input)) + self.cache.get_or_init(|| { + trace!("Creating new cache node"); + self.node.eval(input) + }) } } diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index c3e05a3b6..9b55eab9d 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -1,7 +1,7 @@ use core::marker::PhantomData; use dyn_any::{DynAny, StaticType}; use graphene_core::ops::FlatMapResultNode; -use graphene_core::raster::color::Color; +use graphene_core::raster::{Color, Image}; use graphene_core::structural::{ComposeNode, ConsNode}; use graphene_core::{generic::FnNode, ops::MapResultNode, structural::Then, value::ValueNode, Node}; use image::Pixel; @@ -98,40 +98,6 @@ impl Node for BufferNode { } } -#[derive(Clone, Debug, PartialEq, DynAny, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -pub struct Image { - pub width: u32, - pub height: u32, - pub data: Vec, -} - -impl Image { - pub const fn empty() -> Self { - Self { - width: 0, - height: 0, - data: Vec::new(), - } - } -} - -impl IntoIterator for Image { - type Item = Color; - type IntoIter = std::vec::IntoIter; - fn into_iter(self) -> Self::IntoIter { - self.data.into_iter() - } -} - -impl<'a> IntoIterator for &'a Image { - type Item = &'a Color; - type IntoIter = std::slice::Iter<'a, Color>; - fn into_iter(self) -> Self::IntoIter { - self.data.iter() - } -} - pub fn file_node<'n, P: AsRef + 'n>() -> impl Node, Error>> { let fs = ValueNode(StdFs).clone(); let fs = ConsNode::new(fs); diff --git a/node-graph/interpreted-executor/Cargo.toml b/node-graph/interpreted-executor/Cargo.toml new file mode 100644 index 000000000..546015a90 --- /dev/null +++ b/node-graph/interpreted-executor/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "interpreted-executor" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" + +[features] +default = [] +serde = ["dep:serde", "graphene-std/serde", "glam/serde"] +gpu = ["graphene-std/gpu"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +graphene-core = { path = "../gcore", features = ["async", "std" ] } +graphene-std = { path = "../gstd" } +graph-craft = { path = "../graph-craft" } +dyn-any = { path = "../../libraries/dyn-any", features = ["log-bad-types"] } +num-traits = "0.2" +borrow_stack = { path = "../borrow_stack" } +dyn-clone = "1.0" +rand_chacha = "0.3.1" +log = "0.4" +serde = { version = "1", features = ["derive"], optional = true } +glam = { version = "0.22" } diff --git a/node-graph/interpreted-executor/src/executor.rs b/node-graph/interpreted-executor/src/executor.rs new file mode 100644 index 000000000..961764708 --- /dev/null +++ b/node-graph/interpreted-executor/src/executor.rs @@ -0,0 +1,31 @@ +use std::error::Error; + +use borrow_stack::{BorrowStack, FixedSizeStack}; +use graphene_core::Node; +use graphene_std::any::{Any, TypeErasedNode}; + +use crate::node_registry::push_node; +use graph_craft::{executor::Executor, proto::ProtoNetwork}; + +pub struct DynamicExecutor { + stack: FixedSizeStack>, +} + +impl DynamicExecutor { + pub fn new(proto_network: ProtoNetwork) -> Self { + assert_eq!(proto_network.inputs.len(), 1); + let node_count = proto_network.nodes.len(); + let stack = FixedSizeStack::new(node_count); + for (_id, node) in proto_network.nodes { + push_node(node, &stack); + } + Self { stack } + } +} + +impl Executor for DynamicExecutor { + fn execute(&self, input: Any<'static>) -> Result, Box> { + let result = unsafe { self.stack.get().last().unwrap().eval(input) }; + Ok(result) + } +} diff --git a/node-graph/interpreted-executor/src/lib.rs b/node-graph/interpreted-executor/src/lib.rs new file mode 100644 index 000000000..7a3af043a --- /dev/null +++ b/node-graph/interpreted-executor/src/lib.rs @@ -0,0 +1,127 @@ +#[macro_use] +extern crate log; + +pub mod executor; +pub mod node_registry; + +#[cfg(test)] +mod tests { + + use std::marker::PhantomData; + + use graphene_core::value::ValueNode; + use graphene_core::{structural::*, RefNode}; + + use borrow_stack::BorrowStack; + use dyn_any::{downcast, IntoDynAny}; + use graphene_std::any::{Any, DowncastNode, DynAnyNode, TypeErasedNode}; + use graphene_std::ops::AddNode; + + #[test] + fn borrow_stack() { + let stack = borrow_stack::FixedSizeStack::new(256); + unsafe { + let dynanynode: DynAnyNode, (), _, _> = DynAnyNode::new(ValueNode(2_u32)); + stack.push(dynanynode.into_box()); + } + stack.push_fn(|nodes| { + let pre_node = nodes.get(0).unwrap(); + let downcast: DowncastNode<&TypeErasedNode, &u32> = DowncastNode::new(pre_node); + let dynanynode: DynAnyNode>, u32, _, _> = DynAnyNode::new(ConsNode(downcast, PhantomData)); + dynanynode.into_box() + }); + stack.push_fn(|_| { + let dynanynode: DynAnyNode<_, (u32, &u32), _, _> = DynAnyNode::new(AddNode); + dynanynode.into_box() + }); + stack.push_fn(|nodes| { + let compose_node = nodes[1].after(&nodes[2]); + TypeErasedNode(Box::new(compose_node)) + }); + + let result = unsafe { &stack.get()[0] }.eval_ref(().into_dyn()); + assert_eq!(*downcast::<&u32>(result).unwrap(), &2_u32); + let result = unsafe { &stack.get()[1] }.eval_ref(4_u32.into_dyn()); + assert_eq!(*downcast::<(u32, &u32)>(result).unwrap(), (4_u32, &2_u32)); + let result = unsafe { &stack.get()[1] }.eval_ref(4_u32.into_dyn()); + let add = unsafe { &stack.get()[2] }.eval_ref(result); + assert_eq!(*downcast::(add).unwrap(), 6_u32); + let add = unsafe { &stack.get()[3] }.eval_ref(4_u32.into_dyn()); + assert_eq!(*downcast::(add).unwrap(), 6_u32); + } + + #[test] + fn execute_add() { + use graph_craft::document::*; + use graph_craft::proto::*; + + fn add_network() -> NodeNetwork { + NodeNetwork { + inputs: vec![0, 0], + output: 1, + nodes: [ + ( + 0, + DocumentNode { + name: "Cons".into(), + inputs: vec![NodeInput::Network, NodeInput::Network], + implementation: DocumentNodeImplementation::Unresolved(NodeIdentifier::new( + "graphene_core::structural::ConsNode", + &[Type::Concrete(std::borrow::Cow::Borrowed("u32")), Type::Concrete(std::borrow::Cow::Borrowed("u32"))], + )), + metadata: DocumentNodeMetadata::default(), + }, + ), + ( + 1, + DocumentNode { + name: "Add".into(), + inputs: vec![NodeInput::Node(0)], + implementation: DocumentNodeImplementation::Unresolved(NodeIdentifier::new( + "graphene_core::ops::AddNode", + &[Type::Concrete(std::borrow::Cow::Borrowed("u32")), Type::Concrete(std::borrow::Cow::Borrowed("u32"))], + )), + metadata: DocumentNodeMetadata::default(), + }, + ), + ] + .into_iter() + .collect(), + } + } + + let network = NodeNetwork { + inputs: vec![0], + output: 0, + nodes: [( + 0, + DocumentNode { + name: "Inc".into(), + inputs: vec![ + NodeInput::Network, + NodeInput::Value { + tagged_value: value::TaggedValue::U32(1), + exposed: false, + }, + ], + implementation: DocumentNodeImplementation::Network(add_network()), + metadata: DocumentNodeMetadata::default(), + }, + )] + .into_iter() + .collect(), + }; + + use crate::executor::DynamicExecutor; + use graph_craft::executor::{Compiler, Executor}; + + let compiler = Compiler {}; + let protograph = compiler.compile(network, false); + + let exec = DynamicExecutor::new(protograph); + + let result = exec.execute(32_u32.into_dyn()).unwrap(); + let val = *dyn_any::downcast::(result).unwrap(); + assert_eq!(val, 33_u32); + } +} diff --git a/node-graph/graph-craft/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs similarity index 90% rename from node-graph/graph-craft/src/node_registry.rs rename to node-graph/interpreted-executor/src/node_registry.rs index c2002e9d2..d450511c9 100644 --- a/node-graph/graph-craft/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -3,19 +3,19 @@ use glam::DVec2; use graphene_core::generic::FnNode; use graphene_core::ops::{AddNode, IdNode}; use graphene_core::raster::color::Color; +use graphene_core::raster::Image; use graphene_core::structural::{ConsNode, Then}; +use graphene_core::vector::subpath::Subpath; use graphene_core::Node; use graphene_std::any::DowncastBothNode; use graphene_std::any::{Any, DowncastNode, DynAnyNode, IntoTypeErasedNode, TypeErasedNode}; -use graphene_std::raster::Image; -use graphene_std::vector::subpath::Subpath; -use crate::proto::Type; -use crate::proto::{ConstructionArgs, NodeIdentifier, ProtoNode, ProtoNodeInput}; +use graph_craft::proto::Type; +use graph_craft::proto::{ConstructionArgs, NodeIdentifier, ProtoNode, ProtoNodeInput}; type NodeConstructor = fn(ProtoNode, &FixedSizeStack>); -use crate::{concrete, generic}; +use graph_craft::{concrete, generic}; //TODO: turn into hasmap static NODE_REGISTRY: &[(NodeIdentifier, NodeConstructor)] = &[ @@ -25,7 +25,7 @@ static NODE_REGISTRY: &[(NodeIdentifier, NodeConstructor)] = &[ let pre_node = nodes.get(pre_id as usize).unwrap(); pre_node.into_type_erased() } else { - graphene_core::ops::IdNode.into_type_erased() + IdNode.into_type_erased() } }) }), @@ -35,7 +35,7 @@ static NODE_REGISTRY: &[(NodeIdentifier, NodeConstructor)] = &[ let pre_node = nodes.get(pre_id as usize).unwrap(); pre_node.into_type_erased() } else { - graphene_core::ops::IdNode.into_type_erased() + IdNode.into_type_erased() } }) }), @@ -221,6 +221,54 @@ static NODE_REGISTRY: &[(NodeIdentifier, NodeConstructor)] = &[ } }) }), + #[cfg(feature = "gpu")] + ( + NodeIdentifier::new("graphene_std::executor::MapGpuNode", &[concrete!("&TypeErasedNode"), concrete!("Color"), concrete!("Color")]), + |proto_node, stack| { + if let ConstructionArgs::Nodes(operation_node_id) = proto_node.construction_args { + stack.push_fn(move |nodes| { + info!("Map image Depending upon id {:?}", operation_node_id); + let operation_node = nodes.get(operation_node_id[0] as usize).unwrap(); + let input_node: DowncastBothNode<_, (), &graph_craft::document::NodeNetwork> = DowncastBothNode::new(operation_node); + let map_node: graphene_std::executor::MapGpuNode<_, Vec, u32, u32> = graphene_std::executor::MapGpuNode::new(input_node); + let map_node = DynAnyNode::new(map_node); + + if let ProtoNodeInput::Node(node_id) = proto_node.input { + let pre_node = nodes.get(node_id as usize).unwrap(); + (pre_node).then(map_node).into_type_erased() + } else { + map_node.into_type_erased() + } + }) + } else { + unimplemented!() + } + }, + ), + #[cfg(feature = "gpu")] + ( + NodeIdentifier::new("graphene_std::executor::MapGpuSingleImageNode", &[concrete!("&TypeErasedNode")]), + |proto_node, stack| { + if let ConstructionArgs::Nodes(operation_node_id) = proto_node.construction_args { + stack.push_fn(move |nodes| { + info!("Map image Depending upon id {:?}", operation_node_id); + let operation_node = nodes.get(operation_node_id[0] as usize).unwrap(); + let input_node: DowncastBothNode<_, (), String> = DowncastBothNode::new(operation_node); + let map_node = graphene_std::executor::MapGpuSingleImageNode(input_node); + let map_node = DynAnyNode::new(map_node); + + if let ProtoNodeInput::Node(node_id) = proto_node.input { + let pre_node = nodes.get(node_id as usize).unwrap(); + (pre_node).then(map_node).into_type_erased() + } else { + map_node.into_type_erased() + } + }) + } else { + unimplemented!() + } + }, + ), (NodeIdentifier::new("graphene_std::raster::MapImageNode", &[]), |proto_node, stack| { if let ConstructionArgs::Nodes(operation_node_id) = proto_node.construction_args { stack.push_fn(move |nodes| { @@ -442,7 +490,7 @@ pub fn push_node<'a>(proto_node: ProtoNode, stack: &'a FixedSizeStack>(); panic!( - "NodeImplementation: {:?} not found in Registry types for which the node is implemented:\n {:#?}", + "NodeImplementation: {:?} not found in Registry. Types for which the node is implemented:\n {:#?}", proto_node.identifier, other_types ); } diff --git a/website/other/bezier-rs-demos/wasm/Cargo.toml b/website/other/bezier-rs-demos/wasm/Cargo.toml index 1f78e88f1..8b281d13c 100644 --- a/website/other/bezier-rs-demos/wasm/Cargo.toml +++ b/website/other/bezier-rs-demos/wasm/Cargo.toml @@ -21,7 +21,7 @@ wasm-bindgen = { version = "0.2.73", features = ["serde-serialize"] } serde_json = "*" serde-wasm-bindgen = "0.4.1" js-sys = "0.3.55" -glam = { version = "0.17", features = ["serde"] } +glam = { version = "0.22", features = ["serde"] } [dev-dependencies] wasm-bindgen-test = "0.3.22"