diff --git a/README.md b/README.md index d7790c6..7761077 100755 --- a/README.md +++ b/README.md @@ -26,11 +26,16 @@ # Features - ✨ Code highlighting and line numbers (default) -- 📖 Markdown rendering (add `---` or `md` to the start of your paste) +- 📖 Markdown rendering (click the Markdown button) +- 🔥 Single-view pastes (click the Fire button) - ‍🧑‍💻 [CLI Client](https://github.com/zer0bin-dev/zer0) - 🚀 Easily selfhostable - 👀 View counter -- ⌨️ Keybinds (Ctrl + S: save paste, Ctrl + N: new paste, Ctrl + D: duplicate paste) +- ⌨️ Keybinds + - Ctrl + S: save paste + - Ctrl + N: new paste + - Ctrl + D: duplicate paste + - Ctrl + M: toggle markdown mode - 📱 Mobile-friendly UI - 🧈 Super smooth scrolling - 🖼️ Badge generation for stats (seen below) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 7b694f2..40631c5 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -16,16 +16,15 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.0", + "tokio-util", ] [[package]] name = "actix-cors" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30dbd116ef7532f56e2f6d7c511736ea0b124d914ee8820a5271247bf89f06aa" +checksum = "414360eed71ba2d5435b185ba43ecbe281dfab5df3898286d6b7be8074372c92" dependencies = [ - "actix-service", "actix-utils", "actix-web", "derive_more", @@ -49,9 +48,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.0.0" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3fdd63b9cfeaf92eeeece719dabbddddb420a57d3fd171ce1490ecfb7086b1" +checksum = "a5885cb81a0d4d0d322864bea1bb6c2a8144626b4fdc625d4c51eba197e7797a" dependencies = [ "actix-codec", "actix-rt", @@ -110,9 +109,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf3f2183be1241ed4dd22611850b85d38de0b08a09f1f7bcccbd0809084b359" +checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" dependencies = [ "actix-macros", "futures-core", @@ -121,20 +120,20 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e7472ac180abb0a8e592b653744345983a7a14f44691c8394a799d0df4dbbf" +checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" dependencies = [ "actix-rt", "actix-service", "actix-utils", "futures-core", "futures-util", - "log", "mio", "num_cpus", "socket2", "tokio", + "tracing", ] [[package]] @@ -194,7 +193,7 @@ dependencies = [ "serde_urlencoded", "smallvec", "socket2", - "time 0.3.7", + "time 0.3.9", "url", ] @@ -268,7 +267,7 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backend" -version = "1.1.0" +version = "1.1.1" dependencies = [ "actix-cors", "actix-governor", @@ -339,9 +338,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.3" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -410,7 +409,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.43", + "time 0.1.44", "winapi", ] @@ -427,15 +426,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ "percent-encoding", - "time 0.3.7", + "time 0.3.9", "version_check", ] [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] @@ -466,9 +465,9 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce" +checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" dependencies = [ "cfg-if", "crossbeam-utils", @@ -476,9 +475,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if", "lazy_static", @@ -506,9 +505,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0834a35a3fce649144119e18da2a4d8ed12ef3862f47183fd46f625d072d96c" +checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" dependencies = [ "cfg-if", "num_cpus", @@ -558,9 +557,9 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", @@ -740,13 +739,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] @@ -768,9 +767,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.11" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -781,7 +780,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.6.9", + "tokio-util", "tracing", ] @@ -873,9 +872,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown", @@ -943,9 +942,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.119" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" [[package]] name = "local-channel" @@ -967,18 +966,19 @@ checksum = "902eb695eb0591864543cbfbf6d742510642a605a61fc5e97fe6ceb5a30ac4fb" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ "cfg-if", ] @@ -1039,14 +1039,15 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow", "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi", ] @@ -1076,13 +1077,12 @@ checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", ] [[package]] @@ -1131,18 +1131,18 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" dependencies = [ "libc", ] [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "opaque-debug" @@ -1168,7 +1168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" dependencies = [ "lock_api", - "parking_lot_core 0.9.1", + "parking_lot_core 0.9.2", ] [[package]] @@ -1187,9 +1187,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" dependencies = [ "cfg-if", "libc", @@ -1200,9 +1200,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "percent-encoding" @@ -1248,16 +1248,16 @@ dependencies = [ "mach", "once_cell", "raw-cpuid", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "web-sys", "winapi", ] [[package]] name = "quote" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" dependencies = [ "proc-macro2", ] @@ -1294,37 +1294,38 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.2.0" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929f54e29691d4e6a9cc558479de70db7aa3d98cd6fe7ab86d7507aa2886b9d2" +checksum = "738bc47119e3eeccc7e94c4a506901aea5e7b4944ecd0829cbebf4af04ceda12" dependencies = [ "bitflags", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", @@ -1404,9 +1405,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "semver" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" [[package]] name = "serde" @@ -1499,9 +1500,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -1645,9 +1646,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "704df27628939572cd88d33f171cd6f896f4eaca85252c6e0a72d8d8287ee86f" dependencies = [ "proc-macro2", "quote", @@ -1676,19 +1677,20 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] [[package]] name = "time" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ "itoa 1.0.1", "libc", @@ -1698,9 +1700,9 @@ dependencies = [ [[package]] name = "time-macros" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25eb0ca3468fc0acc11828786797f6ef9aa1555e4a211a60d64cc8e4d1be47d6" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" [[package]] name = "tinyvec" @@ -1760,48 +1762,47 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] name = "tracing" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c650a8ef0cd2dd93736f033d21cbd1224c5a967aa0c258d00fcf7dafef9b9f" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" dependencies = [ "cfg-if", + "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.22" +name = "tracing-attributes" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" dependencies = [ "lazy_static", ] @@ -1871,9 +1872,15 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" @@ -1992,9 +1999,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -2005,33 +2012,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" [[package]] name = "zstd" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 7fe758e..76d8be9 100755 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "backend" -version = "1.1.0" +version = "1.1.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -16,7 +16,7 @@ actix-governor = "0.3.0" badge-maker = "0.2.1" -sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "postgres", "chrono"] } +sqlx = { version = "0.5.11", features = ["runtime-tokio-rustls", "postgres", "chrono"] } chrono = { version = "0.4.19", features = ["serde"] } diff --git a/backend/migrations/000_single_view.sql b/backend/migrations/000_single_view.sql new file mode 100644 index 0000000..7b28894 --- /dev/null +++ b/backend/migrations/000_single_view.sql @@ -0,0 +1 @@ +ALTER TABLE pastes ADD column single_view BOOLEAN DEFAULT false; diff --git a/backend/schema.sql b/backend/schema.sql old mode 100755 new mode 100644 index c9a02a7..4188b98 --- a/backend/schema.sql +++ b/backend/schema.sql @@ -7,8 +7,6 @@ CREATE TABLE IF NOT EXISTS pastes ( "created_at" TIMESTAMP WITHOUT TIME ZONE DEFAULT(NOW() AT TIME ZONE 'utc') ); --- ALTER TABLE pastes ADD COLUMN single_view BOOLEAN DEFAULT false; - CREATE OR REPLACE FUNCTION deleteExpiredPastes() RETURNS trigger AS $pastes_expire$ BEGIN DELETE FROM pastes WHERE "expires_at" IS NOT NULL diff --git a/backend/src/main.rs b/backend/src/main.rs index eb706b6..1d0dead 100755 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -2,7 +2,7 @@ mod config; mod models; mod routes; -use std::{io, path::PathBuf}; +use std::{io, path::Path, path::PathBuf}; use actix_cors::Cors; use actix_governor::{Governor, GovernorConfigBuilder}; @@ -12,9 +12,11 @@ use actix_web::{ }; use config::Config; -use sqlx::{postgres::PgPoolOptions, PgPool}; +use sqlx::{migrate::Migrator, postgres::PgPoolOptions, PgPool}; -use crate::routes::{get_paste, get_stats, get_total_pastes_badge, get_version_badge, new_paste, get_raw_paste}; +use crate::routes::{ + get_paste, get_raw_paste, get_stats, get_total_pastes_badge, get_version_badge, new_paste, +}; #[derive(Clone)] pub struct AppState { @@ -22,15 +24,29 @@ pub struct AppState { pub pool: PgPool, } +pub async fn migrations(pool: &PgPool) -> Result<(), sqlx::Error> { + Migrator::new(Path::new("./migrations")) + .await? + .run(pool) + .await?; + + Ok(()) +} + #[actix_rt::main] async fn main() -> io::Result<()> { let config = config::load(PathBuf::from("config.json")); + + let db_uri = &config.databases.postgres_uri.to_string(); + let pool = PgPoolOptions::new() .max_connections(100) - .connect(&config.databases.postgres_uri) + .connect(db_uri) .await .expect("Failed to connect to database"); + migrations(&pool).await.expect("Failed to run migrations"); + let address = format!( "{}:{}", config.server.backend_host, config.server.backend_port diff --git a/frontend/.htmlnanorc b/frontend/.htmlnanorc new file mode 100644 index 0000000..66d6d4a --- /dev/null +++ b/frontend/.htmlnanorc @@ -0,0 +1,3 @@ +{ + "removeComments": false +} \ No newline at end of file diff --git a/frontend/index.pug b/frontend/index.pug index a2e1a93..9a770e8 100755 --- a/frontend/index.pug +++ b/frontend/index.pug @@ -1,4 +1,14 @@ doctype html + +!= '\n' + html(lang='en') head meta(charset='UTF-8') @@ -27,8 +37,9 @@ html(lang='en') a.logo.noselect(href='/') zer0bin .buttons.noselect button#save-button.btn(aria-label='Save') + button#markdown-button.btn(aria-label='Markdown') button#single-view-button.btn(aria-label='Single View') - //- .fireBody(style='display: none') + //- .fireBody(style='visibility: hidden') //- - var parts = 20; //- - while (parts--) { //- .particle @@ -37,8 +48,8 @@ html(lang='en') button#copy-button.btn(aria-label='Copy') a(href='https://github.com/zer0bin-dev/zer0bin' aria-label='GitHub repo') button#github-button.btn(aria-label='GitHub') - span.viewcounter.noselect#viewcounter-label(style='display: none') Views:  - span.viewcounter.noselect#viewcounter-count(style='display: none') + span.viewcounter.noselect#viewcounter-label(style='visibility: hidden; display: none') Views:  + span.viewcounter.noselect#viewcounter-count(style='visibility: hidden; display: none') .hide-button-wrapper button#hide-button.btn(aria-label='Hide') @@ -46,6 +57,6 @@ html(lang='en') .scrollbar-container .wrapper .line-numbers.noselect - pre#code-view-pre(style='display: none') + pre#code-view-pre(style='visibility: hidden') code#code-view - textarea#text-area(spellcheck='false' autofocus='' name='value' aria-label='Paste input area' disabled='' style='display: none') \ No newline at end of file + textarea#text-area(spellcheck='false' autofocus='' name='value' aria-label='Paste input area' disabled='' style='visibility: hidden') \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index 25a6ac3..6ec3411 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "zer0bin", "source": "index.pug", - "version": "1.1.0", + "version": "1.1.1", "browserslist": "> 0.5%, last 2 versions, not dead", "license": "MIT", "scripts": { diff --git a/frontend/src/icons.ts b/frontend/src/icons.ts index 2fd65f0..92c0a2d 100644 --- a/frontend/src/icons.ts +++ b/frontend/src/icons.ts @@ -9,17 +9,22 @@ import { EyeOutlined, EyeInvisibleOutlined, FireOutlined, + FileMarkdownOutlined, } from "@ant-design/icons-svg" import { renderIconDefinitionToSVGElement } from "@ant-design/icons-svg/es/helpers" import tippy from "tippy.js" import "../style/tooltip.scss" import "tippy.js/animations/scale.css" +import { IconDefinition } from "@ant-design/icons-svg/lib/types" const saveButton = document.getElementById("save-button") const newButton = document.getElementById("new-button") const copyButton = document.getElementById("copy-button") const hideButton = document.getElementById("hide-button") const githubButton = document.getElementById("github-button") +const markdownButton = ( + document.getElementById("markdown-button") +) const singleViewButton = ( document.getElementById("single-view-button") ) @@ -29,25 +34,19 @@ const extraSVGAttrs = { height: "1em", fill: "currentColor", } +function renderIcon(elem: HTMLButtonElement, icon: IconDefinition) { + elem.innerHTML += renderIconDefinitionToSVGElement(icon, { + extraSVGAttrs: extraSVGAttrs, + }) +} -saveButton.innerHTML += renderIconDefinitionToSVGElement(SaveOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) -newButton.innerHTML += renderIconDefinitionToSVGElement(FileAddOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) -copyButton.innerHTML += renderIconDefinitionToSVGElement(CopyOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) -githubButton.innerHTML += renderIconDefinitionToSVGElement(GithubOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) -hideButton.innerHTML += renderIconDefinitionToSVGElement(EyeInvisibleOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) -singleViewButton.innerHTML += renderIconDefinitionToSVGElement(FireOutlined, { - extraSVGAttrs: extraSVGAttrs, -}) +renderIcon(saveButton, SaveOutlined) +renderIcon(newButton, FileAddOutlined) +renderIcon(copyButton, CopyOutlined) +renderIcon(githubButton, GithubOutlined) +renderIcon(hideButton, EyeInvisibleOutlined) +renderIcon(markdownButton, FileMarkdownOutlined) +renderIcon(singleViewButton, FireOutlined) tippy("#save-button", { content: "Save paste
Ctrl + S", @@ -57,6 +56,14 @@ tippy("#save-button", { allowHTML: true, }) +tippy("#markdown-button", { + content: "Markdown mode
Ctrl + M", + placement: "bottom", + animation: "scale", + theme: "rosepine", + allowHTML: true, +}) + tippy("#single-view-button", { content: "Single view
Deletes after seen 👻", diff --git a/frontend/src/index.ts b/frontend/src/index.ts index 62038b8..7318600 100755 --- a/frontend/src/index.ts +++ b/frontend/src/index.ts @@ -13,6 +13,7 @@ const apiUrl = config.api_url const confettiChance = parseInt(config.confetti_chance) let rawContent = "" let buttonPaneHidden = false +let isMarkdown = false let singleView = false const jsConfetti = new JSConfetti() @@ -34,16 +35,21 @@ const saveButton = document.getElementById("save-button") const newButton = document.getElementById("new-button") const copyButton = document.getElementById("copy-button") const hideButton = document.getElementById("hide-button") +const markdownButton = ( + document.getElementById("markdown-button") +) const singleViewButton = ( document.getElementById("single-view-button") ) function hide(element: HTMLElement) { - element.style.display = "none" + element.style.visibility = "hidden" + element.style.opacity = "0" } function show(element: HTMLElement) { - element.style.display = null + element.style.visibility = "visible" + element.style.opacity = "1" } function disable(element: HTMLButtonElement) { @@ -121,6 +127,8 @@ function newPaste() { hide(codeViewPre) hide(viewCounterLabel) hide(viewCounter) + viewCounterLabel.style.display = "none" + viewCounter.style.display = "none" } function addMessage(message: string) { @@ -158,6 +166,7 @@ function viewPaste(content: string, views: string, singleView: boolean) { } disable(saveButton) + disable(markdownButton) enable(newButton) enable(copyButton) disable(singleViewButton) @@ -166,6 +175,8 @@ function viewPaste(content: string, views: string, singleView: boolean) { show(codeViewPre) show(viewCounterLabel) show(viewCounter) + viewCounterLabel.style.display = null + viewCounter.style.display = null viewCounter.textContent = views @@ -218,10 +229,6 @@ async function savePaste() { } async function duplicatePaste() { - const path = window.location.pathname - const split = path.split("/") - const id = split[split.length - 1] - const content = rawContent window.history.pushState(null, "", "/") newPaste() @@ -230,6 +237,18 @@ async function duplicatePaste() { editor.value = content } +function toggleMarkdown() { + let val = editor.value + markdownButton.lastElementChild.classList.toggle("markdown") + if (isMarkdown) { + isMarkdown = false + val = val.substring(val.indexOf("\n") + 1) + } else { + isMarkdown = true + val = `---\n${val}` + } +} + saveButton.addEventListener("click", async function () { await savePaste() }) @@ -244,6 +263,9 @@ document.addEventListener("keydown", (e) => { } else if (e.ctrlKey && e.key === "d") { e.preventDefault() duplicatePaste() + } else if (e.ctrlKey && e.key === "m") { + e.preventDefault() + toggleMarkdown() } }) @@ -277,11 +299,9 @@ newButton.addEventListener("click", function () { hideButton.addEventListener("click", function () { if (!buttonPaneHidden) { - // The button pane is currently visible so we hide it buttonPaneHidden = true hide(buttonWrapper) } else { - // The button pane isnt visible so we show it buttonPaneHidden = false show(buttonWrapper) } @@ -289,15 +309,18 @@ hideButton.addEventListener("click", function () { toggleHiddenIcon(buttonPaneHidden) }) +markdownButton.addEventListener("click", function () { + toggleMarkdown() +}) + singleViewButton.addEventListener("click", function () { + singleViewButton.lastElementChild.classList.toggle("fire") if (singleView) { singleView = false hide(singleViewButton.firstElementChild as HTMLElement) - singleViewButton.lastElementChild.classList.remove("fire") } else { singleView = true show(singleViewButton.firstElementChild as HTMLElement) - singleViewButton.lastElementChild.classList.add("fire") } }) diff --git a/frontend/style/font.scss b/frontend/style/font.scss index 5769b08..ede38b9 100644 --- a/frontend/style/font.scss +++ b/frontend/style/font.scss @@ -1,17 +1,17 @@ @font-face { font-family: "Cartograph CF"; - src: local("../fonts/CartographCF-Regular.woff2") format("woff2"), - local("../fonts/CartographCF-Regular.woff") format("woff"), - local("../fonts/CartographCF-Regular.ttf") format("truetype"); + src: url("../fonts/CartographCF-Regular.woff2") format("woff2"), + url("../fonts/CartographCF-Regular.woff") format("woff"), + url("../fonts/CartographCF-Regular.ttf") format("truetype"); font-weight: normal; font-style: normal; font-display: swap; } @font-face { font-family: "Cartograph CF"; - src: local("../fonts/CartographCF-RegularItalic.woff2") format("woff2"), - local("../fonts/CartographCF-RegularItalic.woff") format("woff"), - local("../fonts/CartographCF-RegularItalic.ttf") format("truetype"); + src: url("../fonts/CartographCF-RegularItalic.woff2") format("woff2"), + url("../fonts/CartographCF-RegularItalic.woff") format("woff"), + url("../fonts/CartographCF-RegularItalic.ttf") format("truetype"); font-weight: normal; font-style: italic; font-display: swap; diff --git a/frontend/style/style.scss b/frontend/style/style.scss index 1cd1682..1d7ff23 100755 --- a/frontend/style/style.scss +++ b/frontend/style/style.scss @@ -133,6 +133,7 @@ textarea { background-color: $bg_surface; border-bottom-left-radius: 10px; z-index: 10; + transition: opacity 0.2s, visibility 0.2s; } .buttons { display: flex; @@ -171,6 +172,7 @@ a { &:disabled { color: $muted; } + transition: all 0.2s ease-in; } .btn[disabled] { color: $muted; @@ -186,7 +188,7 @@ a { .btn { color: $muted; &:hover { - color: $foam; + color: $gold; } } } @@ -221,6 +223,9 @@ a { animation: rainbow 3s ease infinite !important; } } +.markdown { + color: $iris; +} .fire { color: $love; }