From 67dfd1c3ab8cf647ec632085bb56d8b4cd273ba9 Mon Sep 17 00:00:00 2001 From: Orual Date: Sat, 8 Nov 2025 15:08:54 -0500 Subject: [PATCH] server-side rendering actually works now --- Cargo.lock | 428 ++++++++++------------ Cargo.toml | 17 +- crates/weaver-api/Cargo.toml | 6 +- crates/weaver-app/Cargo.toml | 7 +- crates/weaver-app/Dioxus.toml | 2 +- crates/weaver-app/assets/sw.js | 13 - crates/weaver-app/src/components/entry.rs | 169 ++++----- crates/weaver-app/src/data.rs | 245 +++++++++++++ crates/weaver-app/src/fetch.rs | 4 +- crates/weaver-app/src/main.rs | 1 + test.html | 278 +++++++++----- 11 files changed, 726 insertions(+), 444 deletions(-) create mode 100644 crates/weaver-app/src/data.rs diff --git a/Cargo.lock b/Cargo.lock index df3bc4f..c138a4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,7 +30,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -227,7 +227,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -249,7 +249,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -260,7 +260,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -411,7 +411,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -569,7 +569,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -709,9 +709,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.44" +version = "1.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" dependencies = [ "find-msvc-tools", "jobserver", @@ -871,7 +871,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1000,9 +1000,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const-serialize" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4acbf274e71b0a53ff15f8669b86df421586a9fcac6398bc374c0b7146b6a3" +checksum = "fd339aa356cc6452308fad2ee56623f900a8e68bc0ab9360a0ddb8270e5640c8" dependencies = [ "const-serialize-macro", "serde", @@ -1010,13 +1010,13 @@ dependencies = [ [[package]] name = "const-serialize-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d3f3be18d39289c06c906cb7fb7ea1f027607ac5fa0cb0c4f1e91719042c52" +checksum = "797d158acb331e2a89d696343a27cd39bf7e36aaef33ba4799a5ef1526e24861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1283,7 +1283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1310,7 +1310,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1334,7 +1334,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1345,7 +1345,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1385,7 +1385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1427,7 +1427,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1461,7 +1461,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1490,7 +1490,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "unicode-xid", ] @@ -1502,7 +1502,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "unicode-xid", ] @@ -1551,7 +1551,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1571,7 +1571,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1588,9 +1588,9 @@ dependencies = [ [[package]] name = "dioxus" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9361dcb0cacb57f8af31010e1a3503404415ce5ff33dd83c760dfdcf505aded9" +checksum = "f76e820919058a685a1fdbb2ef4888c73ac77d623c39a7dfde2aa812947246be" dependencies = [ "dioxus-asset-resolver", "dioxus-cli-config", @@ -1622,9 +1622,9 @@ dependencies = [ [[package]] name = "dioxus-asset-resolver" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "954badc855b8e61d8880d204c7e3e2570daa59302c3843b2de1fae30ec266e64" +checksum = "7f6a124667ce5565c39fe2f33af45c21fe459c5bfcf7a8074ad12c9e9da5817c" dependencies = [ "dioxus-cli-config", "http", @@ -1643,18 +1643,18 @@ dependencies = [ [[package]] name = "dioxus-cli-config" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a6973d779e73f4b8ce705b1ea4c96f4083567ede862e734da2ab7c1dfc4b6" +checksum = "babc8eaf90379352bc4820830749fd231feb9312433d4094b4e7b79d912b3d96" dependencies = [ "wasm-bindgen", ] [[package]] name = "dioxus-config-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b5a9360dbf7a8499f67a96b8408f0c4d45222b0f19d7e42a7c49030b1a4085" +checksum = "30018b5b95567cee42febbb444d5e5e47dbe3e91fa6e44b9e571edad0184cd36" dependencies = [ "proc-macro2", "quote", @@ -1662,15 +1662,15 @@ dependencies = [ [[package]] name = "dioxus-config-macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060c2e384709a434a74d24a676f4ccd61e7a97f812b0807fa71a8ef8896cfd3b" +checksum = "0a16b25f8761253ed5ffa4d0789376310fbbc1bbaa8190fc2f374db82c6285a1" [[package]] name = "dioxus-core" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743e05cc98a6c7189e7df49791c0affb860cb858ba2a19dde4ecadf2a8729e8c" +checksum = "75468d08468919f783b0f7ee826802f4e8e66c5b5a0451245d861c211ca18216" dependencies = [ "anyhow", "const_format", @@ -1691,28 +1691,28 @@ dependencies = [ [[package]] name = "dioxus-core-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa557c3d165eb2df73414f4678912e4595de80d6cd13566a3377f16c438c5ec3" +checksum = "f145abdb2a3f858456cb4382390863cf0398c228ad0733618f48891da7687be3" dependencies = [ "convert_case 0.8.0", "dioxus-rsx", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "dioxus-core-types" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d16343cebee52e82686963ccd6f5590ebca567229bfa59aa3d598210f3a9fc0" +checksum = "36f5ecf5a51de06d78aded3b5f7516a258f53117cba718bc5706317a3c04c844" [[package]] name = "dioxus-desktop" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dfcfa2ae65f643a05583acb27e5a52b22de52b2f49583d012c8e58b6c495941" +checksum = "f493c74ff09410c5eadf42abd031d4b3d4032a4d5a2411c77d1d0d5156ca3687" dependencies = [ "async-trait", "base64 0.22.1", @@ -1736,7 +1736,7 @@ dependencies = [ "global-hotkey", "infer", "jni", - "lazy-js-bundle 0.7.0", + "lazy-js-bundle 0.7.1", "libc", "muda", "ndk", @@ -1759,15 +1759,15 @@ dependencies = [ "tracing", "tray-icon", "tungstenite 0.27.0", - "webbrowser 1.0.6", + "webbrowser", "wry", ] [[package]] name = "dioxus-devtools" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419353dace2fb67ac7b35070a56c00a66c920c0191e7a81cf9c9ac8dd7ab3798" +checksum = "4eb2c5019b7fa72e8e6b21ba99e9263bd390c9a30bbf09793b72f4b57ed7c3d7" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -1786,9 +1786,9 @@ dependencies = [ [[package]] name = "dioxus-devtools-types" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6eb8755823ca644da88a50e80676330f4f0c1a40650af03d2fd617d3478a8e7" +checksum = "7b007cec5b8548281921c4e4678926a3936e9d6757e951380685cc6121a6f974" dependencies = [ "dioxus-core", "serde", @@ -1797,9 +1797,9 @@ dependencies = [ [[package]] name = "dioxus-document" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cc73e120c260a07689353b09b8fdb0c49960fb88ba8e669992245c80720bb6" +checksum = "8c55bcae9aaf150d4a141c61b3826da5a7ac23dfff09726568525cd46336e9a2" dependencies = [ "dioxus-core", "dioxus-core-macro", @@ -1808,7 +1808,7 @@ dependencies = [ "futures-channel", "futures-util", "generational-box", - "lazy-js-bundle 0.7.0", + "lazy-js-bundle 0.7.1", "serde", "serde_json", "tracing", @@ -1816,9 +1816,9 @@ dependencies = [ [[package]] name = "dioxus-fullstack" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55dfce343a754869dfde344e41c79a3ec4737867f90501dcfe8850eceeb37ea" +checksum = "ff04cef82d6639eb15186f626298645dbd92978bf66dc3efd2e5984a2ff4a1ff" dependencies = [ "anyhow", "async-stream", @@ -1881,9 +1881,9 @@ dependencies = [ [[package]] name = "dioxus-fullstack-core" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f486f2b8864d1a0843189acbec74af6d9d206e82694ded6e5923a6c6f774b15" +checksum = "41281c7cd4d311a50933256e19a5d91d0d950ad350dd3232bd4321fdd3a59fb0" dependencies = [ "anyhow", "axum-core", @@ -1909,23 +1909,23 @@ dependencies = [ [[package]] name = "dioxus-fullstack-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a59c844d648dae315b5aa264956f0c6fd9f34a5cedbf79fd0744820bf302bc5" +checksum = "ae73023c8b8fee2692fc50a28063336f0b6930e86727e30c1047c92d30805b49" dependencies = [ "const_format", "convert_case 0.8.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "xxhash-rust", ] [[package]] name = "dioxus-history" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea04ad918a08b81af66f1128f759162e33e8f7e7e062597e6dd542a45211905" +checksum = "dac73657da5c7a20629482d774b52f4a4f7cb57a520649f1d855d4073e809c98" dependencies = [ "dioxus-core", "tracing", @@ -1933,9 +1933,9 @@ dependencies = [ [[package]] name = "dioxus-hooks" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7c1a9c7e8d2422198d082d03a9e1f4eb5789cdc1d73f1eb08e0d36a62fdfcb" +checksum = "7ffd445f16d64939e06cd71a1c63a665f383fda6b7882f4c6f8f1bd6efca2046" dependencies = [ "dioxus-core", "dioxus-signals", @@ -1950,9 +1950,9 @@ dependencies = [ [[package]] name = "dioxus-html" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe86f40430acb0ee310f91e7dbdd48ea4e26267dedab6e54f0c45f0c692db924" +checksum = "9f407fc73a9554a644872fcccc9faf762acad8f45158e3d67e42ab8dd42f4586" dependencies = [ "async-trait", "bytes", @@ -1967,7 +1967,7 @@ dependencies = [ "futures-util", "generational-box", "keyboard-types", - "lazy-js-bundle 0.7.0", + "lazy-js-bundle 0.7.1", "rustversion", "serde", "serde_json", @@ -1977,27 +1977,27 @@ dependencies = [ [[package]] name = "dioxus-html-internal-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ca3487501aa1b95a5d65554ee36839da660b03174146c5c27d54014067abd" +checksum = "a968aae4bc92de87cbac3d0d043803b25a7c62c187841e61adcc9b49917c2b2a" dependencies = [ "convert_case 0.8.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "dioxus-interpreter-js" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c429cd5057cec2eb00acef02a699ebd359a98d392629464b2e1c350eaed8ce" +checksum = "83ab170d89308399205f8ad3d43d8d419affe317016b41ca0695186f7593cba2" dependencies = [ "dioxus-core", "dioxus-core-types", "dioxus-html", "js-sys", - "lazy-js-bundle 0.7.0", + "lazy-js-bundle 0.7.1", "rustc-hash 2.1.1", "serde", "sledgehammer_bindgen", @@ -2009,9 +2009,9 @@ dependencies = [ [[package]] name = "dioxus-liveview" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36d558d71ee41b33d2b35fd39444bfaab65fbda0b608c3eba33ea8ff97247115" +checksum = "ca4f2850ec1a468c6f15b578c43218562d2309aadaf2b8bf17f54ce30e72f594" dependencies = [ "axum", "dioxus-cli-config", @@ -2037,9 +2037,9 @@ dependencies = [ [[package]] name = "dioxus-logger" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a54751cf6aa00132c8a17343ad8d8cdb587d67a4b71acfc19ed78a924128edb" +checksum = "42237934c6a67f5ed9a8c37e47ca980ee7cfec9e783a9a1f8c2e36c8b96ae74b" dependencies = [ "dioxus-cli-config", "tracing", @@ -2062,9 +2062,9 @@ dependencies = [ [[package]] name = "dioxus-router" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577cc2680066242ef0e672c379c7b63072dee838a7dac6a4296f0c768ab2f72f" +checksum = "fdf1b95b7cafd07a2b39651ab2b146e4aa72acb0295cd52f422b7db5e2ab6eeb" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -2083,9 +2083,9 @@ dependencies = [ [[package]] name = "dioxus-router-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a924da6e4b92053266b1f153292bd2282ce1ff2b035b29002f1520112a4d00e5" +checksum = "a292046c5d166046ae027fce47b177a733946cf1efc8d006de9f4064f69110cd" dependencies = [ "base16", "digest", @@ -2093,26 +2093,26 @@ dependencies = [ "quote", "sha2", "slab", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "dioxus-rsx" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e290f814c6ee06f34d40bb5f3db976500f39e1776c80984fb23815377c2c9cd0" +checksum = "f026380dfda8b93ad995c0a90a62a17b8afeb246baff1b781a52c7b1b3ebd791" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "dioxus-server" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3b6b8658b79b05c44e66dd934ca3e419a175d1ea9c130b07aa6512605e8df5" +checksum = "012e972802d2dc4f4afab89bb4c7695e6a7b8b8a81b6bc30d43c1a42e11eb6ff" dependencies = [ "anyhow", "async-trait", @@ -2168,9 +2168,9 @@ dependencies = [ [[package]] name = "dioxus-signals" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fce8fe43f49769d7a05bef9e1acafcefc9b5f7da2b9bb58e0bde12a145028b9" +checksum = "3895cc17ff5b43ada07743111be586e7a927ed7ec511457020e4235e13e63fe6" dependencies = [ "dioxus-core", "futures-channel", @@ -2184,9 +2184,9 @@ dependencies = [ [[package]] name = "dioxus-ssr" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c180307efbf0f2cb64ad125fd4e6e00d0586dba73875bdea0d6587f5c89524b7" +checksum = "592391fc30a77f94bc5a3385d1569052907e3b3cecb28099671b9d5801dee6c6" dependencies = [ "askama_escape", "dioxus-core", @@ -2196,9 +2196,9 @@ dependencies = [ [[package]] name = "dioxus-stores" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01f9b29b4486f4aa515ab59b5d5b9177b1abf1a3f4c1940cedc8031ca6c11933" +checksum = "8521729ac35f362476ac4eb7d1c4ab79e7e92a0facfdea3ee978c0ddf7108d37" dependencies = [ "dioxus-core", "dioxus-signals", @@ -2207,20 +2207,20 @@ dependencies = [ [[package]] name = "dioxus-stores-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d63865f35106c145a11b1072eb84dd9d0d4ca4a78861ad666c297ebae8f42d" +checksum = "23a733d2684dc843e81954f6176b3353e4cfc71b6978a8e464591bb5536f610b" dependencies = [ "convert_case 0.8.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "dioxus-time" version = "0.7.0" -source = "git+https://github.com/ealmloff/dioxus-std?branch=0.7#e5a74354cd36be440febdd6b701f584bd552bd62" +source = "git+https://github.com/ealmloff/dioxus-std?branch=0.7#8c868ac1d60e3232e3f16f6195d6deb3c016de17" dependencies = [ "dioxus", "futures", @@ -2230,9 +2230,9 @@ dependencies = [ [[package]] name = "dioxus-web" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d877058b49e547fee2b0fe26af17018142983262a9dd3f739963903799aea8e" +checksum = "76155ecd44535e7c096ec8c5aac4a945899e47567ead4869babdaa74f3f9bca0" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -2249,7 +2249,7 @@ dependencies = [ "generational-box", "gloo-timers", "js-sys", - "lazy-js-bundle 0.7.0", + "lazy-js-bundle 0.7.1", "rustc-hash 2.1.1", "send_wrapper", "serde", @@ -2309,7 +2309,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2341,7 +2341,7 @@ checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2388,7 +2388,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2436,7 +2436,7 @@ checksum = "7a4102713839a8c01c77c165bc38ef2e83948f6397fa1e1dcfacec0f07b149d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2547,7 +2547,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2568,7 +2568,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2589,7 +2589,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2659,7 +2659,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2786,7 +2786,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2902,7 +2902,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3031,9 +3031,9 @@ dependencies = [ [[package]] name = "generational-box" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f067a79c49f237b1017258357a9789477be4f47f11422c74547a8bec189adb4" +checksum = "b3c1ae09dfd2d455484a54b56129b9821241c4b0e412227806b6c3730cd18a29" dependencies = [ "parking_lot", "tracing", @@ -3194,7 +3194,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3354,7 +3354,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3571,15 +3571,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "html5ever" version = "0.27.0" @@ -3591,7 +3582,7 @@ dependencies = [ "markup5ever 0.12.1", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3896,7 +3887,7 @@ checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3930,7 +3921,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4026,9 +4017,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -4054,8 +4045,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jacquard" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "bytes", "getrandom 0.2.16", @@ -4083,8 +4073,7 @@ dependencies = [ [[package]] name = "jacquard-api" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "bon", "bytes", @@ -4101,8 +4090,7 @@ dependencies = [ [[package]] name = "jacquard-axum" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "axum", "bytes", @@ -4123,8 +4111,7 @@ dependencies = [ [[package]] name = "jacquard-common" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "base64 0.22.1", "bon", @@ -4165,20 +4152,18 @@ dependencies = [ [[package]] name = "jacquard-derive" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "heck 0.5.0", "jacquard-lexicon", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] name = "jacquard-identity" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.1" dependencies = [ "bon", "bytes", @@ -4204,8 +4189,7 @@ dependencies = [ [[package]] name = "jacquard-lexicon" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.1" dependencies = [ "cid", "dashmap", @@ -4223,15 +4207,14 @@ dependencies = [ "serde_repr", "serde_with", "sha2", - "syn 2.0.108", + "syn 2.0.109", "thiserror 2.0.17", "unicode-segmentation", ] [[package]] name = "jacquard-oauth" -version = "0.8.0" -source = "git+https://tangled.org/@nonbinary.computer/jacquard#ee0f31db86814449fa586aa6b1abf65a52733f9e" +version = "0.9.0" dependencies = [ "base64 0.22.1", "bytes", @@ -4258,7 +4241,7 @@ dependencies = [ "tokio", "trait-variant", "url", - "webbrowser 0.8.15", + "webbrowser", ] [[package]] @@ -4460,9 +4443,9 @@ checksum = "e49596223b9d9d4947a14a25c142a6e7d8ab3f27eb3ade269d238bb8b5c267e2" [[package]] name = "lazy-js-bundle" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb1a786b3e81c7a8c1809f8e430cc53f26b37695d929ba41bc30d71679c80e0a" +checksum = "409273b42d0e3ae7c8ce6b8cfbc6a27b7c7d83bbb94fc7f93f22cc9b90eea078" [[package]] name = "lazy_static" @@ -4666,7 +4649,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4689,7 +4672,7 @@ dependencies = [ "proc-macro2", "quote", "sealed", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4701,7 +4684,7 @@ dependencies = [ "proc-macro2", "quote", "sealed", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4714,7 +4697,7 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4728,9 +4711,9 @@ dependencies = [ [[package]] name = "manganis" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcdad2e00822f2705d142c76843e4d0de796754e1dfa7e459e4e2b1742d6e632" +checksum = "124f8f094eb75783b38209ce4d534b9617da4efac652802d9bafe05043a3ec95" dependencies = [ "const-serialize", "manganis-core", @@ -4739,9 +4722,9 @@ dependencies = [ [[package]] name = "manganis-core" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058d5b28351649020f1a1a3c36a8019a5e1d747f4103e3adb6b5eef15f1683e0" +checksum = "41fbd1fb8c5aabcc54c6b02dbc968e1c89c28f3e543f2789ef9e3ce45dbdf5df" dependencies = [ "const-serialize", "dioxus-cli-config", @@ -4751,16 +4734,16 @@ dependencies = [ [[package]] name = "manganis-macro" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5449ca340d41990d79be6accc063aa9b6a70b83766a0210d5230dd76e40dd7" +checksum = "45d6fec2a8249739bb30b53a08ecbb217f76096c08f1053f38ec3981ba424c11" dependencies = [ "dunce", "macro-string", "manganis-core", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4840,7 +4823,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4946,7 +4929,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4957,7 +4940,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5339,7 +5322,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5511,9 +5494,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.74" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags 2.10.0", "cfg-if", @@ -5532,7 +5515,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5543,9 +5526,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.110" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -5599,7 +5582,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5838,7 +5821,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5962,7 +5945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6049,7 +6032,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "version_check", "yansi", ] @@ -6151,9 +6134,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -6329,7 +6312,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6552,9 +6535,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.34" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", "ring", @@ -6647,9 +6630,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.5" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1317c3bf3e7df961da95b0a56a172a02abead31276215a0497241a7624b487ce" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -6686,7 +6669,7 @@ checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6852,7 +6835,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6924,7 +6907,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6969,7 +6952,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.12.0", "schemars 0.9.0", - "schemars 1.0.5", + "schemars 1.1.0", "serde_core", "serde_json", "serde_with_macros", @@ -6985,7 +6968,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7127,7 +7110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f62f06db0370222f7f498ef478fce9f8df5828848d1d3517e3331936d7074f55" dependencies = [ "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7274,7 +7257,7 @@ dependencies = [ "quote", "serde", "sha2", - "syn 2.0.108", + "syn 2.0.109", "thiserror 1.0.69", ] @@ -7317,9 +7300,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subsecond" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e778134c310fa884270b226bbf58df76da727acf921f46834b0af896d739235c" +checksum = "834e8caec50249083ee6972a2f7645c4baadcb39d49ea801da1dc1d5e1c2ccb9" dependencies = [ "js-sys", "libc", @@ -7336,9 +7319,9 @@ dependencies = [ [[package]] name = "subsecond-types" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfc02dd02f2ce7c9aa6c0eb4f490fc455925c2590de7a3c54dde088c3ef481d" +checksum = "c6beffea67e72a7a530990b270fd0277971eae564fdc10c1e0080e928b477fab" dependencies = [ "serde", ] @@ -7383,9 +7366,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" dependencies = [ "proc-macro2", "quote", @@ -7409,7 +7392,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7523,7 +7506,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7602,7 +7585,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7613,7 +7596,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -7731,7 +7714,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -8053,7 +8036,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -8137,7 +8120,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -8428,7 +8411,7 @@ checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -8497,7 +8480,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "wasm-bindgen-shared", ] @@ -8550,7 +8533,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffd01f29024361dcb5b54f50b4cfe8d56ecac0ece515f52e7756e979b9a43c2d" dependencies = [ "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -8819,23 +8802,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webbrowser" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" -dependencies = [ - "core-foundation 0.9.4", - "home", - "jni", - "log", - "ndk-context", - "objc", - "raw-window-handle 0.5.2", - "url", - "web-sys", -] - [[package]] name = "webbrowser" version = "1.0.6" @@ -8939,7 +8905,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9057,7 +9023,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9068,7 +9034,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9644,7 +9610,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "synstructure", ] @@ -9686,7 +9652,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "zbus_names", "zvariant", "zvariant_utils", @@ -9721,7 +9687,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9741,7 +9707,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "synstructure", ] @@ -9763,7 +9729,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9796,7 +9762,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -9851,7 +9817,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "zvariant_utils", ] @@ -9864,6 +9830,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.108", + "syn 2.0.109", "winnow 0.7.13", ] diff --git a/Cargo.toml b/Cargo.toml index d67a8e1..703d953 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,10 +40,19 @@ lexicon_cid = { package = "cid", version = "0.10.1", features = [ markdown-weaver = { git = "https://github.com/rsform/markdown-weaver" } markdown-weaver-escape = { git = "https://github.com/rsform/markdown-weaver" } -jacquard = { git = "https://tangled.org/@nonbinary.computer/jacquard", default-features = false, features = ["derive", "api_bluesky"] } -jacquard-api = { git = "https://tangled.org/@nonbinary.computer/jacquard" } -jacquard-common = { git = "https://tangled.org/@nonbinary.computer/jacquard" } -jacquard-axum = { git = "https://tangled.org/@nonbinary.computer/jacquard" } +# jacquard = { git = "https://tangled.org/@nonbinary.computer/jacquard", default-features = false, features = ["derive", "api_bluesky"] } +# jacquard-api = { git = "https://tangled.org/@nonbinary.computer/jacquard" } +# jacquard-common = { git = "https://tangled.org/@nonbinary.computer/jacquard" } +# jacquard-axum = { git = "https://tangled.org/@nonbinary.computer/jacquard" } +# jacquard-derive = { git = "https://tangled.org/@nonbinary.computer/jacquard" } +# jacquard-lexicon = { git = "https://tangled.org/@nonbinary.computer/jacquard", default-features = false } + +jacquard = { path = "../jacquard/crates/jacquard", default-features = false, features = ["derive", "api_bluesky"] } +jacquard-api = { path = "../jacquard/crates/jacquard-api" } +jacquard-common = { path = "../jacquard/crates/jacquard-common" } +jacquard-axum = {path = "../jacquard/crates/jacquard-axum" } +jacquard-derive = { path = "../jacquard/crates/jacquard-derive" } +jacquard-lexicon = { path = "../jacquard/crates/jacquard-lexicon", default-features = false } [profile] diff --git a/crates/weaver-api/Cargo.toml b/crates/weaver-api/Cargo.toml index 5565d3b..460a147 100644 --- a/crates/weaver-api/Cargo.toml +++ b/crates/weaver-api/Cargo.toml @@ -7,9 +7,9 @@ authors.workspace = true [dependencies] bytes = { workspace = true, features = ["serde"] } -jacquard-common = { git = "https://tangled.org/@nonbinary.computer/jacquard" } -jacquard-derive = { git = "https://tangled.org/@nonbinary.computer/jacquard" } -jacquard-lexicon = { git = "https://tangled.org/@nonbinary.computer/jacquard", default-features = false } +jacquard-common = { workspace = true } +jacquard-derive = { workspace = true } +jacquard-lexicon = { workspace = true } miette.workspace = true rustversion = "1.0" serde.workspace = true diff --git a/crates/weaver-app/Cargo.toml b/crates/weaver-app/Cargo.toml index 3b80e13..9a5e860 100644 --- a/crates/weaver-app/Cargo.toml +++ b/crates/weaver-app/Cargo.toml @@ -5,9 +5,10 @@ authors = ["Orual "] edition = "2021" [features] -default = ["web"] +default = ["web", "fullstack-server", "no-app-index"] # Fullstack mode with SSR and server functions fullstack-server = ["dioxus/fullstack"] +no-app-index = [] web = ["dioxus/web"] desktop = ["dioxus/desktop"] @@ -20,8 +21,8 @@ server = [ "dioxus/server", "dep:jacquard-axum", "dep:axum"] [dependencies] dashmap = "6.1.0" -dioxus = { version = "0.7.0", features = ["router"] } -#dioxus = { version = "0.7.0", features = ["router", "fullstack"] } +dioxus = { version = "0.7.1", features = ["router"] } +#dioxus = { version = "0.7.1", features = ["router", "fullstack"] } weaver-common = { path = "../weaver-common" } jacquard = { workspace = true, features = ["streaming"] } jacquard-axum = { workspace = true, optional = true } diff --git a/crates/weaver-app/Dioxus.toml b/crates/weaver-app/Dioxus.toml index 0582966..f9475c0 100644 --- a/crates/weaver-app/Dioxus.toml +++ b/crates/weaver-app/Dioxus.toml @@ -12,7 +12,7 @@ title = "Weaver" style = [] # Additional JavaScript files -script = ["assets/sw.js"] +script = [] [web.resource.dev] diff --git a/crates/weaver-app/assets/sw.js b/crates/weaver-app/assets/sw.js index 23b6b25..150f37a 100644 --- a/crates/weaver-app/assets/sw.js +++ b/crates/weaver-app/assets/sw.js @@ -9,12 +9,10 @@ const urlMappings = new Map(); // Install and activate immediately self.addEventListener("install", (event) => { - console.log("[SW] Installing service worker"); self.skipWaiting(); }); self.addEventListener("activate", (event) => { - console.log("[SW] Activating service worker"); event.waitUntil(clients.claim()); }); @@ -22,13 +20,10 @@ self.addEventListener("activate", (event) => { self.addEventListener("message", (event) => { if (event.data.type === "register_mappings") { const notebook = event.data.notebook; - console.log("[SW] Registering blob mappings for notebook:", notebook); - // Store blob URL mappings for (const [name, url] of Object.entries(event.data.blobs)) { const key = `${notebook}/image/${name}`; urlMappings.set(key, url); - console.log("[SW] Registered mapping:", key, "->", url); } } }); @@ -45,15 +40,10 @@ self.addEventListener("fetch", (event) => { // Reconstruct the key const key = pathParts.join("/"); - console.log("[SW] Intercepted image request:", key); - const mapping = urlMappings.get(key); if (mapping) { - console.log("[SW] Found mapping for:", key, "->", mapping); event.respondWith(handleBlobRequest(mapping, key)); return; - } else { - console.log("[SW] No mapping found for:", key); } } @@ -67,12 +57,10 @@ async function handleBlobRequest(url, key) { let response = await cache.match(key); if (response) { - console.log("[SW] Cache hit for:", key); return response; } // Fetch from PDS - console.log("[SW] Fetching from PDS:", url); response = await fetch(url); if (!response.ok) { @@ -82,7 +70,6 @@ async function handleBlobRequest(url, key) { // Cache the response await cache.put(key, response.clone()); - console.log("[SW] Cached blob:", key); return response; } catch (error) { diff --git a/crates/weaver-app/src/components/entry.rs b/crates/weaver-app/src/components/entry.rs index 3f60f09..f4f2efa 100644 --- a/crates/weaver-app/src/components/entry.rs +++ b/crates/weaver-app/src/components/entry.rs @@ -4,6 +4,7 @@ use crate::blobcache::BlobCache; use crate::{ components::avatar::{Avatar, AvatarFallback, AvatarImage}, + data::use_handle, fetch, }; @@ -11,8 +12,7 @@ use crate::Route; use dioxus::prelude::*; const ENTRY_CSS: Asset = asset!("/assets/styling/entry.css"); -#[cfg(feature = "fullstack-server")] -use dioxus::{fullstack::extract::Extension, CapturedError}; + use jacquard::prelude::*; #[allow(unused_imports)] use jacquard::smol_str::ToSmolStr; @@ -30,15 +30,13 @@ use weaver_api::sh_weaver::notebook::{entry, BookEntryView}; pub fn Entry(ident: AtIdentifier<'static>, book_title: SmolStr, title: SmolStr) -> Element { let ident_clone = ident.clone(); let book_title_clone = book_title.clone(); - let entry = use_resource(use_reactive!(|(ident, book_title, title)| async move { - let fetcher = use_context::(); - let entry = fetcher - .get_entry(ident.clone(), book_title.clone(), title) - .await - .ok() - .flatten(); - if let Some(entry_data) = &entry { - let entry_record = &entry_data.1; + + // Use feature-gated hook for SSR support + let entry = crate::data::use_entry_data(ident.clone(), book_title.clone(), title.clone())?; + + // Handle blob caching when entry data is available + use_effect(move || { + if let Some((_book_entry_view, entry_record)) = &*entry.read() { if let Some(embeds) = &entry_record.embeds { if let Some(images) = &embeds.images { // Register blob mappings with service worker (client-side only) @@ -48,46 +46,54 @@ pub fn Entry(ident: AtIdentifier<'static>, book_title: SmolStr, title: SmolStr) not(feature = "fullstack-server") ))] { - let _ = crate::service_worker::register_entry_blobs( - &ident, - book_title.as_str(), - images, - &fetcher, - ) - .await; + let ident = ident.clone(); + let book_title = book_title.clone(); + let images = images.clone(); + spawn(async move { + let fetcher = use_context::(); + let _ = crate::service_worker::register_entry_blobs( + &ident, + book_title.as_str(), + &images, + &fetcher, + ) + .await; + }); } #[cfg(feature = "fullstack-server")] { - for image in &images.images { - let cid = image.image.blob().cid(); - cache_blob( - ident.to_smolstr(), - cid.to_smolstr(), - image.name.as_ref().map(|n| n.to_smolstr()), - ) - .await - .ok(); - } + let ident = ident.clone(); + let images = images.clone(); + spawn(async move { + for image in &images.images { + use crate::data::cache_blob; + + let cid = image.image.blob().cid(); + cache_blob( + ident.to_smolstr(), + cid.to_smolstr(), + image.name.as_ref().map(|n| n.to_smolstr()), + ) + .await + .ok(); + } + }); } } } } - entry - })); + }); match &*entry.read_unchecked() { - Some(Some(entry_data)) => { + Some((book_entry_view, entry_record)) => { rsx! { EntryPage { - book_entry_view: entry_data.0.clone(), - entry_record: entry_data.1.clone(), - ident: ident_clone, + book_entry_view: book_entry_view.clone(), + entry_record: entry_record.clone(), + ident: use_handle(ident_clone)?(), book_title: book_title_clone } } } - Some(None) => { - rsx! { div { class: "error", "Entry not found" } } - } - None => rsx! { p { "Loading..." } }, + _ => rsx! { p { "Loading..." } }, } } @@ -170,8 +176,7 @@ pub fn EntryCard(entry: BookEntryView<'static>, book_title: SmolStr) -> Element .map(|t| t.as_ref()) .unwrap_or("Untitled"); - let ident = entry_view.uri.authority().clone().into_static(); - let ident_for_avatar = ident.clone(); + let ident = use_handle(entry_view.uri.authority().clone().into_static())?; // Format date let formatted_date = entry_view @@ -195,7 +200,7 @@ pub fn EntryCard(entry: BookEntryView<'static>, book_title: SmolStr) -> Element div { class: "entry-card", Link { to: Route::Entry { - ident: ident.clone(), + ident: ident(), book_title: book_title.clone(), title: title.to_string().into() }, @@ -214,12 +219,12 @@ pub fn EntryCard(entry: BookEntryView<'static>, book_title: SmolStr) -> Element if let Some(author) = first_author { div { class: "entry-card-author", { - match from_data::(author.record.get_at_path(".value").unwrap()) { - Ok(profile) => { + match author.record.get_at_path(".value").and_then(|v| from_data::(v).ok()) { + Some(profile) => { let avatar = profile.avatar .map(|avatar| { let cid = avatar.blob().cid(); - format!("https://cdn.bsky.app/img/avatar/plain/{}/{cid}@jpeg", ident_for_avatar.as_ref()) + format!("https://cdn.bsky.app/img/avatar/plain/{}/{cid}@jpeg", entry_view.uri.authority().as_ref()) }); let display_name = profile.display_name .as_ref() @@ -235,7 +240,7 @@ pub fn EntryCard(entry: BookEntryView<'static>, book_title: SmolStr) -> Element span { class: "meta-label", "@{ident}" } } } - Err(_) => { + None => { rsx! { span { class: "author-name", "Author {author.index}" } } @@ -296,8 +301,8 @@ fn EntryMetadata( if i > 0 { span { ", " } } { // Parse author profile from the nested value field - match from_data::(author.record.get_at_path(".value").unwrap()) { - Ok(profile) => { + match author.record.get_at_path(".value").and_then(|v| from_data::(v).ok()) { + Some(profile) => { let avatar = profile.avatar .map(|avatar| { let cid = avatar.blob().cid(); @@ -325,7 +330,7 @@ fn EntryMetadata( } } } - Err(_) => { + None => { rsx! { span { class: "author-name", "Author {author.index}" } } @@ -405,25 +410,33 @@ pub struct EntryMarkdownProps { id: Signal, #[props(default)] class: Signal, - content: ReadSignal>, + ident: ReadSignal>, } /// Render some text as markdown. #[allow(unused)] pub fn EntryMarkdown(props: EntryMarkdownProps) -> Element { - let content = &*props.content.read(); - let parser = markdown_weaver::Parser::new(&content.content); - - let mut html_buf = String::new(); - markdown_weaver::html::push_html(&mut html_buf, parser); + let processed = crate::data::use_rendered_markdown( + props.content.read().clone(), + props.ident.read().clone(), + )?; - rsx! { - div { - id: "{&*props.id.read()}", - class: "{&*props.class.read()}", - dangerous_inner_html: "{html_buf}" - } + match &*processed.read_unchecked() { + Some(Some(html_buf)) => rsx! { + div { + id: "{&*props.id.read()}", + class: "{&*props.class.read()}", + dangerous_inner_html: "{html_buf}" + } + }, + _ => rsx! { + div { + id: "{&*props.id.read()}", + class: "{&*props.class.read()}", + "Loading..." + } + }, } } @@ -435,32 +448,8 @@ fn EntryMarkdownDirect( content: entry::Entry<'static>, ident: AtIdentifier<'static>, ) -> Element { - use n0_future::stream::StreamExt; - use weaver_renderer::{ - atproto::{ClientContext, ClientWriter}, - ContextIterator, NotebookProcessor, - }; - - let processed = use_resource(use_reactive!(|(content, ident)| async move { - // Create client context for link/image/embed handling - let fetcher = use_context::(); - let did = match ident { - AtIdentifier::Did(d) => d, - AtIdentifier::Handle(h) => fetcher.client.resolve_handle(&h).await.ok()?, - }; - let ctx = ClientContext::<()>::new(content.clone(), did); - let parser = markdown_weaver::Parser::new(&content.content); - let iter = ContextIterator::default(parser); - let processor = NotebookProcessor::new(ctx, iter); - - // Collect events from the processor stream - let events: Vec<_> = StreamExt::collect(processor).await; - - // Render to HTML - let mut html_buf = String::new(); - let _ = ClientWriter::<_, _, ()>::new(events.into_iter(), &mut html_buf).run(); - Some(html_buf) - })); + // Use feature-gated hook for SSR support + let processed = crate::data::use_rendered_markdown(content, ident)?; match &*processed.read_unchecked() { Some(Some(html_buf)) => rsx! { @@ -479,11 +468,3 @@ fn EntryMarkdownDirect( }, } } - -#[cfg(feature = "fullstack-server")] -#[put("/cache/{ident}/{cid}?name", cache: Extension>)] -pub async fn cache_blob(ident: SmolStr, cid: SmolStr, name: Option) -> Result<()> { - let ident = AtIdentifier::new_owned(ident)?; - let cid = Cid::new_owned(cid.as_bytes())?; - cache.cache(ident, cid, name).await -} diff --git a/crates/weaver-app/src/data.rs b/crates/weaver-app/src/data.rs new file mode 100644 index 0000000..5736345 --- /dev/null +++ b/crates/weaver-app/src/data.rs @@ -0,0 +1,245 @@ +//! Feature-gated data fetching layer that abstracts over SSR and client-only modes. +//! +//! In fullstack-server mode, hooks use `use_server_future` with inline async closures. +//! In client-only mode, hooks use `use_resource` with context-provided fetchers. + +#[cfg(feature = "server")] +use crate::blobcache::BlobCache; +use dioxus::prelude::*; +#[cfg(feature = "fullstack-server")] +#[allow(unused_imports)] +use dioxus::{fullstack::extract::Extension, CapturedError}; +use jacquard::types::{did::Did, string::Handle}; +#[allow(unused_imports)] +use jacquard::{ + prelude::IdentityResolver, + smol_str::SmolStr, + types::{cid::Cid, string::AtIdentifier}, +}; +#[allow(unused_imports)] +use std::sync::Arc; +use weaver_api::sh_weaver::notebook::{entry::Entry, BookEntryView}; +// ============================================================================ +// Wrapper Hooks (feature-gated) +// ============================================================================ + +/// Fetches entry data with SSR support in fullstack mode. +/// Returns a MappedSignal over the server future resource. +#[cfg(feature = "fullstack-server")] +pub fn use_entry_data( + ident: AtIdentifier<'static>, + book_title: SmolStr, + title: SmolStr, +) -> Result, Entry<'static>)>>, RenderError> { + let fetcher = use_context::(); + let fetcher = fetcher.clone(); + let ident = use_signal(|| ident); + let book_title = use_signal(|| book_title); + let entry_title = use_signal(|| title); + let res = use_server_future(move || { + let fetcher = fetcher.clone(); + async move { + if let Some(entry) = fetcher + .get_entry(ident(), book_title(), entry_title()) + .await + .ok() + .flatten() + { + let (_book_entry_view, entry_record) = (&entry.0, &entry.1); + if let Some(embeds) = &entry_record.embeds { + if let Some(images) = &embeds.images { + let ident = ident.clone(); + let images = images.clone(); + for image in &images.images { + use jacquard::smol_str::ToSmolStr; + + let cid = image.image.blob().cid(); + cache_blob( + ident.to_smolstr(), + cid.to_smolstr(), + image.name.as_ref().map(|n| n.to_smolstr()), + ) + .await + .ok(); + } + } + } + Some(( + serde_json::to_value(entry.0.clone()).unwrap(), + serde_json::to_value(entry.1.clone()).unwrap(), + )) + } else { + None + } + } + }); + res.map(|r| { + use_memo(move || { + if let Some(Some((ev, e))) = &*r.read_unchecked() { + use jacquard::from_json_value; + + let book_entry = from_json_value::(ev.clone()).unwrap(); + let entry = from_json_value::(e.clone()).unwrap(); + + Some((book_entry, entry)) + } else { + None + } + }) + }) +} + +/// Fetches entry data client-side only (no SSR). +#[cfg(not(feature = "fullstack-server"))] +pub fn use_entry_data( + ident: AtIdentifier<'static>, + book_title: SmolStr, + title: SmolStr, +) -> Result, Entry<'static>)>>, RenderError> { + let fetcher = use_context::(); + let fetcher = fetcher.clone(); + let ident = use_signal(|| ident); + let book_title = use_signal(|| book_title); + let entry_title = use_signal(|| title); + let r = use_resource(move || { + let fetcher = fetcher.clone(); + async move { + fetcher + .get_entry(ident(), book_title(), entry_title()) + .await + .ok() + .flatten() + .map(|arc| (arc.0.clone(), arc.1.clone())) + } + }); + Ok(use_memo(move || { + if let Some(Some((ev, e))) = &*r.read_unchecked() { + Some((ev.clone(), e.clone())) + } else { + None + } + })) +} + +pub fn use_handle( + ident: AtIdentifier<'static>, +) -> Result>, RenderError> { + let fetcher = use_context::(); + let fetcher = fetcher.clone(); + let ident = use_signal(|| ident); + #[cfg(feature = "fullstack-server")] + let h_str = { + use_server_future(move || { + let fetcher = fetcher.clone(); + async move { + use jacquard::smol_str::ToSmolStr; + + fetcher + .client + .resolve_ident_owned(&ident()) + .await + .map(|doc| doc.handles().first().map(|h| h.to_smolstr())) + .ok() + .flatten() + } + }) + }; + #[cfg(not(feature = "fullstack-server"))] + let h_str = { + use_resource(move || { + let fetcher = fetcher.clone(); + async move { + use jacquard::smol_str::ToSmolStr; + + fetcher + .client + .resolve_ident_owned(&ident()) + .await + .map(|doc| doc.handles().first().map(|h| h.to_smolstr())) + .ok() + .flatten() + } + }) + }; + Ok(h_str.map(|h_str| { + use_memo(move || { + if let Some(Some(e)) = &*h_str.read_unchecked() { + use jacquard::IntoStatic; + + AtIdentifier::Handle(Handle::raw(&e).into_static()) + } else { + ident() + } + }) + })?) +} + +/// Hook to render markdown client-side only (no SSR). +#[cfg(feature = "fullstack-server")] +pub fn use_rendered_markdown( + content: Entry<'static>, + ident: AtIdentifier<'static>, +) -> Result>, RenderError> { + let ident = use_signal(|| ident); + let content = use_signal(|| content); + let fetcher = use_context::(); + Ok(use_server_future(move || { + let fetcher = fetcher.clone(); + async move { + let did = match ident() { + AtIdentifier::Did(d) => d, + AtIdentifier::Handle(h) => fetcher.client.resolve_handle(&h).await.ok()?, + }; + Some(render_markdown_impl(content(), did).await) + } + })?) +} + +/// Hook to render markdown client-side only (no SSR). +#[cfg(not(feature = "fullstack-server"))] +pub fn use_rendered_markdown( + content: Entry<'static>, + ident: AtIdentifier<'static>, +) -> Result>, RenderError> { + let ident = use_signal(|| ident); + let content = use_signal(|| content); + let fetcher = use_context::(); + Ok(use_resource(move || { + let fetcher = fetcher.clone(); + async move { + let did = match ident() { + AtIdentifier::Did(d) => d, + AtIdentifier::Handle(h) => fetcher.client.resolve_handle(&h).await.ok()?, + }; + Some(render_markdown_impl(content(), did).await) + } + })) +} + +/// Internal implementation of markdown rendering. +async fn render_markdown_impl(content: Entry<'static>, did: Did<'static>) -> String { + use n0_future::stream::StreamExt; + use weaver_renderer::{ + atproto::{ClientContext, ClientWriter}, + ContextIterator, NotebookProcessor, + }; + + let ctx = ClientContext::<()>::new(content.clone(), did); + let parser = markdown_weaver::Parser::new(&content.content); + let iter = ContextIterator::default(parser); + let processor = NotebookProcessor::new(ctx, iter); + + let events: Vec<_> = StreamExt::collect(processor).await; + + let mut html_buf = String::new(); + let _ = ClientWriter::<_, _, ()>::new(events.into_iter(), &mut html_buf).run(); + html_buf +} + +#[cfg(feature = "fullstack-server")] +#[put("/cache/{ident}/{cid}?name", cache: Extension>)] +pub async fn cache_blob(ident: SmolStr, cid: SmolStr, name: Option) -> Result<()> { + let ident = AtIdentifier::new_owned(ident)?; + let cid = Cid::new_owned(cid.as_bytes())?; + cache.cache(ident, cid, name).await +} diff --git a/crates/weaver-app/src/fetch.rs b/crates/weaver-app/src/fetch.rs index 944334f..a26a4d5 100644 --- a/crates/weaver-app/src/fetch.rs +++ b/crates/weaver-app/src/fetch.rs @@ -60,7 +60,9 @@ impl CachedFetcher { ) -> Result, Entry<'static>)>>> { if let Some(result) = self.get_notebook(ident.clone(), book_title).await? { let (notebook, entries) = result.as_ref(); - if let Some(entry) = cache_impl::get(&self.entry_cache, &(ident.clone(), entry_title.clone())) { + if let Some(entry) = + cache_impl::get(&self.entry_cache, &(ident.clone(), entry_title.clone())) + { Ok(Some(entry)) } else { if let Some(entry) = entry_by_title( diff --git a/crates/weaver-app/src/main.rs b/crates/weaver-app/src/main.rs index 41e3ff0..9478cf0 100644 --- a/crates/weaver-app/src/main.rs +++ b/crates/weaver-app/src/main.rs @@ -22,6 +22,7 @@ mod blobcache; mod cache_impl; /// Define a components module that contains all shared components for our app. mod components; +mod data; mod fetch; mod service_worker; /// Define a views module that contains the UI for all Layouts and Routes for our app. diff --git a/test.html b/test.html index e9b9d3e..dddeb6a 100644 --- a/test.html +++ b/test.html @@ -1,97 +1,187 @@ - + - - - - -

Main Title & "Special Chars"

-

This is a paragraph with emphasis, strong emphasis, strikethrough, and inline code. -Also, here's some escaped HTML: < & > " '

-
-

A blockquote with -multiple lines.

-
-

And a nested blockquote.

-
-
-
- -

Lists and Links

-
    -
  • Unordered item 1

    -
  • -
  • Unordered item 2

    -
      -
    • Nested unordered item

      -
        -
      • Deeply nested

        -
      • -
      -
    • -
    -
  • -
-
    -
  1. Ordered item 1

    -
  2. -
  3. Ordered item 2 (with a line break) -Still item 2.

    -
  4. -
  5. Ordered item 3

    -
  6. -
-

GFM Task List

-
    -
  • Unchecked task

    -
  • -
  • Checked task

    -
  • -
-

Visit our site: http://example.com or contact test@example.com. -For more info, check www.example.org. -A standard link: Example Site. -An angle link: https://angled.example.org

-

Media and Code

-

Alt text for image

-
fn main() {
-    println!("Hello, Rust!");
-}
-
Generic code block
-with no language.
-

Table Time

- - - - - - - - - - - - - - - - - - - - -
Header 1Header 2 (Center)Header 3 (Right)
Cell 1-1Cell 1-2Cell 1-3
Cell 2-1 with inlineCell 2-2Cell 2-3
-

Other Features

-

This is a footnote reference.1

-

Raw HTML:

-

Passthrough

Math: block

-
\sum_{i=0}^n i = \frac{n(n+1)}{2}
-

and inline E=mc^2.

- + Weaver + + + + + + + + +
+
+
+
+
+
+
+ + + + + +

Your app is being rebuilt.

+
+

A non-hot-reloadable change occurred and we must rebuild.

+
+
+
+

Loading...

+ + -- 2.51.2