From 38220c7cc112014c8158ce9bc9e7850e438c1bec Mon Sep 17 00:00:00 2001 From: Orual Date: Tue, 6 Jan 2026 21:43:17 -0500 Subject: [PATCH] js crate optimization --- .gitignore | 2 + Cargo.lock | 33 ++++++--- Cargo.toml | 10 +++ crates/weaver-app/Cargo.toml | 20 +++++- crates/weaver-common/Cargo.toml | 3 +- crates/weaver-editor-core/Cargo.toml | 22 +++++- crates/weaver-editor-crdt/Cargo.toml | 4 +- crates/weaver-embed-worker/Cargo.toml | 3 +- crates/weaver-renderer-js/Cargo.toml | 18 +++-- crates/weaver-renderer/Cargo.toml | 31 ++++++-- crates/weaver-renderer/src/atproto/writer.rs | 74 ++++++++++++-------- crates/weaver-renderer/src/lib.rs | 2 + 12 files changed, 165 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index 3423294..c65a9d1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ CLAUDE.md.local # Deciduous database (local) .deciduous/ + +!.cargo/config.toml diff --git a/Cargo.lock b/Cargo.lock index 8733b9e..f4a0768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7674,6 +7674,28 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "onig" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" +dependencies = [ + "bitflags 2.10.0", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "oorandom" version = "11.1.5" @@ -10619,6 +10641,7 @@ dependencies = [ "flate2", "fnv", "once_cell", + "onig", "plist", "regex-syntax", "serde", @@ -10626,7 +10649,6 @@ dependencies = [ "serde_json", "thiserror 2.0.17", "walkdir", - "yaml-rust", ] [[package]] @@ -13331,15 +13353,6 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - [[package]] name = "yaml-rust2" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index 6133843..8f1f323 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,3 +95,13 @@ opt-level = 2 [profile.android-dev] inherits = "dev" + + +# [profile.release] +# opt-level = "z" +# debug = false +# lto = true +# codegen-units = 1 +# panic = "abort" +# incremental = false +# strip = true diff --git a/crates/weaver-app/Cargo.toml b/crates/weaver-app/Cargo.toml index a3e46b0..bd64729 100644 --- a/crates/weaver-app/Cargo.toml +++ b/crates/weaver-app/Cargo.toml @@ -70,7 +70,7 @@ base64 = "0.22" http = "1.3" reqwest = { version = "0.12", default-features = false, features = ["json"] } dioxus-free-icons = { version = "0.9", features = ["font-awesome-brands"] } -syntect = { workspace = true, default-features = false, features = ["default-fancy"]} +# syntect configured per-target below # diesel = { version = "2.3", features = ["sqlite", "returning_clauses_for_sqlite_3_35", "chrono", "serde_json"] } # diesel_migrations = { version = "2.3", features = ["sqlite"] } tokio = { version = "1.28", features = ["sync"] } @@ -101,10 +101,28 @@ lightningcss = { version = "1.0.0-alpha.68", optional = true } webbrowser = "1.0.6" reqwest = { version = "0.12", default-features = false, features = ["json"] } ring = { version = "0.17", default-features = false, features = ["alloc"] } +# Native: full syntect with onig +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "default-themes", + "plist-load", + "regex-onig" +] } [target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] reqwest = { version = "0.12", default-features = false, features = ["json"] } tracing-wasm = "0.2" +# WASM: syntect with fancy-regex (no onig for wasm) +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "default-themes", + "plist-load", + "regex-fancy" +] } #sqlite-wasm-rs = { version = "0.4", default-features = false, features = ["precompiled", "relaxed-idb"] } time = { version = "0.3", features = ["wasm-bindgen"] } console_error_panic_hook = "0.1" diff --git a/crates/weaver-common/Cargo.toml b/crates/weaver-common/Cargo.toml index ee17559..ea38bed 100644 --- a/crates/weaver-common/Cargo.toml +++ b/crates/weaver-common/Cargo.toml @@ -6,8 +6,7 @@ license.workspace = true publish = false [features] -default = ["dev"] -dev = [] +default = [ "use-index"] native = ["jacquard/dns"] use-index = [] iroh = ["dep:iroh", "dep:iroh-gossip", "dep:iroh-tickets"] diff --git a/crates/weaver-editor-core/Cargo.toml b/crates/weaver-editor-core/Cargo.toml index d3d4467..2af00fe 100644 --- a/crates/weaver-editor-core/Cargo.toml +++ b/crates/weaver-editor-core/Cargo.toml @@ -13,9 +13,27 @@ web-time = "1.1" markdown-weaver = { workspace = true } markdown-weaver-escape = { workspace = true } weaver-common = { path = "../weaver-common" } -weaver-renderer = { path = "../weaver-renderer" } +# Only needs syntax-highlighting, not CSS generation +weaver-renderer = { path = "../weaver-renderer", default-features = false, features = ["syntax-highlighting"] } weaver-api = { path = "../weaver-api" } jacquard = { workspace = true } -syntect = { workspace = true } + +# Native: syntect with onig +[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies] +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "regex-onig" +] } + +# WASM: syntect with fancy-regex +[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "regex-fancy" +] } [dev-dependencies] diff --git a/crates/weaver-editor-crdt/Cargo.toml b/crates/weaver-editor-crdt/Cargo.toml index d8bc296..c9eda1f 100644 --- a/crates/weaver-editor-crdt/Cargo.toml +++ b/crates/weaver-editor-crdt/Cargo.toml @@ -29,8 +29,8 @@ thiserror = "2" futures-util = "0.3" n0-future = { workspace = true } -# Optional weaver-specific deps -weaver-renderer = { path = "../weaver-renderer", optional = true } +# Optional weaver-specific deps - only syntax-highlighting needed +weaver-renderer = { path = "../weaver-renderer", optional = true, default-features = false, features = ["syntax-highlighting"] } [target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] gloo-worker = { version = "0.5", features = ["futures"] } diff --git a/crates/weaver-embed-worker/Cargo.toml b/crates/weaver-embed-worker/Cargo.toml index 6e93fdf..f0f671c 100644 --- a/crates/weaver-embed-worker/Cargo.toml +++ b/crates/weaver-embed-worker/Cargo.toml @@ -11,7 +11,8 @@ use-index = [] [dependencies] weaver-common = { path = "../weaver-common", features = ["cache", "perf"] } -weaver-renderer = { path = "../weaver-renderer" } +# WASM target - only syntax-highlighting, not syntax-css +weaver-renderer = { path = "../weaver-renderer", default-features = false, features = ["syntax-highlighting"] } jacquard = { workspace = true } serde = { workspace = true } tracing = { workspace = true } diff --git a/crates/weaver-renderer-js/Cargo.toml b/crates/weaver-renderer-js/Cargo.toml index 3df47bf..df9a811 100644 --- a/crates/weaver-renderer-js/Cargo.toml +++ b/crates/weaver-renderer-js/Cargo.toml @@ -9,11 +9,15 @@ description = "WASM bindings for weaver-renderer" [lib] crate-type = ["cdylib", "rlib"] +[features] +default = ["syntax-highlighting"] +syntax-highlighting = ["weaver-renderer/syntax-highlighting"] + [dependencies] -weaver-renderer = { path = "../weaver-renderer" } +weaver-renderer = { path = "../weaver-renderer", default-features = false } weaver-common = { path = "../weaver-common" } weaver-api = { path = "../weaver-api" } -jacquard = { workspace = true } +jacquard = { workspace = true, default-features = false } markdown-weaver = { workspace = true } markdown-weaver-escape = { workspace = true } @@ -24,6 +28,10 @@ tsify-next = "0.5" js-sys = "0.3" console_error_panic_hook = "0.1" -[profile.release] -lto = true -opt-level = "z" +[package.metadata.wasm-pack.profile.dev] +# Disable wasm-opt (default for dev) +wasm-opt = false + +[package.metadata.wasm-pack.profile.release] +# Enable with size optimization +wasm-opt = ['-Oz', '--enable-bulk-memory-opt', '--enable-nontrapping-float-to-int'] diff --git a/crates/weaver-renderer/Cargo.toml b/crates/weaver-renderer/Cargo.toml index fda7f97..637a834 100644 --- a/crates/weaver-renderer/Cargo.toml +++ b/crates/weaver-renderer/Cargo.toml @@ -6,8 +6,12 @@ license.workspace = true publish = false [features] -default = [] +default = ["syntax-highlighting", "syntax-css"] pckt = [] +# Basic syntax highlighting (code_pretty.rs) - works in WASM +syntax-highlighting = ["dep:syntect"] +# CSS generation from themes (css.rs) - native only, needs plist + themes +syntax-css = ["syntax-highlighting"] [dependencies] n0-future.workspace = true @@ -18,7 +22,6 @@ serde.workspace = true markdown-weaver = { workspace = true } http = "1.3.1" url = "2.5.4" -syntect = { workspace = true, default-features = false, features = ["default-fancy"]} markdown-weaver-escape = { workspace = true, features = ["std"] } thiserror.workspace = true tracing.workspace = true @@ -33,18 +36,34 @@ pin-project = "1.1.10" smol_str = { version = "0.3", features = ["serde"] } pulldown-latex = "0.6" mime-sniffer = "0.1.3" -reqwest = { version = "0.12.7", default-features = false, features = [ - "json", - "rustls-tls", -] } +# Native: full syntect with onig (fast) + themes for CSS generation [target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies] +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "default-themes", + "plist-load", + "regex-onig" +], optional = true } regex = { version = "1.12" } tokio = { version = "1.28", features = ["rt", "time"] } tokio-util = { version = "0.7.14", features = ["rt"] } ignore = "0.4.23" +reqwest = { version = "0.12.7", default-features = false, features = [ + "json", + "rustls-tls", +] } +# WASM: minimal syntect with fancy-regex (pure Rust), no themes [target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] +syntect = { workspace = true, default-features = false, features = [ + "parsing", + "html", + "default-syntaxes", + "regex-fancy" +], optional = true } regex-lite = { version = "0.1" } [dev-dependencies] diff --git a/crates/weaver-renderer/src/atproto/writer.rs b/crates/weaver-renderer/src/atproto/writer.rs index 4ad586b..62db3f7 100644 --- a/crates/weaver-renderer/src/atproto/writer.rs +++ b/crates/weaver-renderer/src/atproto/writer.rs @@ -968,42 +968,60 @@ impl<'a, I: Iterator, Range)>, W: StrWrite, E: EmbedCon self.close_wrapper() } TagEnd::CodeBlock => { - use std::sync::LazyLock; - use syntect::parsing::SyntaxSet; - static SYNTAX_SET: LazyLock = - LazyLock::new(|| SyntaxSet::load_defaults_newlines()); + #[cfg(feature = "syntax-highlighting")] + { + use std::sync::LazyLock; + use syntect::parsing::SyntaxSet; + static SYNTAX_SET: LazyLock = + LazyLock::new(|| SyntaxSet::load_defaults_newlines()); - if let Some((lang, buffer)) = self.code_buffer.take() { - if let Some(ref lang_str) = lang { - // Use a temporary String buffer for syntect - let mut temp_output = String::new(); - match crate::code_pretty::highlight( - &SYNTAX_SET, - Some(lang_str), - &buffer, - &mut temp_output, - ) { - Ok(_) => { - self.write(&temp_output)?; - } - Err(_) => { - // Fallback to plain code block - self.write("
")?;
-                                escape_html_body_text(&mut self.writer, &buffer)?;
-                                self.write("
\n")?; + if let Some((lang, buffer)) = self.code_buffer.take() { + if let Some(ref lang_str) = lang { + let mut temp_output = String::new(); + match crate::code_pretty::highlight( + &SYNTAX_SET, + Some(lang_str), + &buffer, + &mut temp_output, + ) { + Ok(_) => { + self.write(&temp_output)?; + } + Err(_) => { + self.write("
")?;
+                                    escape_html_body_text(&mut self.writer, &buffer)?;
+                                    self.write("
\n")?; + } } + } else { + self.write("
")?;
+                            escape_html_body_text(&mut self.writer, &buffer)?;
+                            self.write("
\n")?; } } else { - self.write("
")?;
+                        self.write("
\n")?; + } + Ok(()) + } + #[cfg(not(feature = "syntax-highlighting"))] + { + if let Some((lang, buffer)) = self.code_buffer.take() { + if let Some(ref lang_str) = lang { + self.write("
")?;
+                        } else {
+                            self.write("
")?;
+                        }
                         escape_html_body_text(&mut self.writer, &buffer)?;
                         self.write("
\n")?; + } else { + self.write("
\n")?; } - } else { - self.write("\n")?; + Ok(()) } - Ok(()) } TagEnd::List(true) => { self.write("\n")?; diff --git a/crates/weaver-renderer/src/lib.rs b/crates/weaver-renderer/src/lib.rs index 5bf5b48..22be491 100644 --- a/crates/weaver-renderer/src/lib.rs +++ b/crates/weaver-renderer/src/lib.rs @@ -26,7 +26,9 @@ use std::task::Poll; pub mod atproto; pub mod base_html; +#[cfg(feature = "syntax-highlighting")] pub mod code_pretty; +#[cfg(feature = "syntax-css")] pub mod css; pub mod facet; pub mod leaflet; -- knotmirror 0.0.1