From a3c72e21db38ce4b3d4bb28c8bbb1bcf1437c019 Mon Sep 17 00:00:00 2001 From: tmk241 Date: Wed, 2 Sep 2026 17:28:40 +0200 Subject: [PATCH] feat: finalize the Hemx 0.4 core --- Cargo.lock | 117 ++++++++++++++++++++--------------- hemx-build/src/artifact.rs | 54 ---------------- hemx-build/src/authoring.rs | 2 - hemx-build/src/lib.rs | 42 +++---------- hemx-core/src/lib.rs | 65 ------------------- hemx-js/runtime/hemx.d.ts | 2 +- hemx-js/runtime/hemx.js | 8 ++- hemx-js/tests/runtime.rs | 2 - hemx-test/Cargo.toml | 2 +- hemx-test/src/html.rs | 1 - hemx-test/src/lib.rs | 6 +- hemx-test/tests/inspector.rs | 10 +-- hemx/Cargo.toml | 2 +- hemx/src/lib.rs | 12 ++-- tests/server-wasm/Cargo.toml | 2 +- 15 files changed, 96 insertions(+), 231 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbaa726..98639b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,9 +80,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.4.0" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "shlex", @@ -232,9 +232,9 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "futf" @@ -248,21 +248,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-task" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -297,37 +297,50 @@ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hemplate" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbe24674c08ea9cb50edc015ebd364785a7e3985259dc02de1a20b7b2ba6365" +version = "0.3.0" dependencies = [ "hemplate-derive", "hemplate-runtime", ] +[[package]] +name = "hemplate-core" +version = "0.2.0" +dependencies = [ + "hemplate-parser 0.1.0", + "thiserror", + "tree-sitter", +] + [[package]] name = "hemplate-core" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afe08241413edd4646684b396061b67e7fd17856f7e28d6765689612e2085303" dependencies = [ - "hemplate-parser", + "hemplate-parser 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror", "tree-sitter", ] [[package]] name = "hemplate-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed77b2cc320137a6a68866f7aa8231292638f0b7c02f65cef221fe713fc2bad" +version = "0.3.0" dependencies = [ - "hemplate-core", + "hemplate-core 0.2.0", "proc-macro2", "quote", "syn 2.0.119", ] +[[package]] +name = "hemplate-parser" +version = "0.1.0" +dependencies = [ + "tree-sitter", + "tree-sitter-hemplate 0.1.0", +] + [[package]] name = "hemplate-parser" version = "0.1.0" @@ -335,14 +348,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5418a7a1c7640f287133c512d400e2d1d2e083c86f9a6cb16501f36dd98636a2" dependencies = [ "tree-sitter", - "tree-sitter-hemplate", + "tree-sitter-hemplate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hemplate-runtime" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e235b36e44fe1174267df3ad0952a728afe4305edfbc8804a972b5f0121c06" +version = "0.2.0" dependencies = [ "thiserror", ] @@ -373,7 +384,7 @@ dependencies = [ name = "hemx-build" version = "0.4.0" dependencies = [ - "hemplate-core", + "hemplate-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "hemx-core", "quote", "syn 2.0.119", @@ -414,7 +425,7 @@ dependencies = [ [[package]] name = "hemx-test" -version = "0.4.0" +version = "0.5.0" dependencies = [ "axum", "hemx-axum", @@ -457,9 +468,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", @@ -482,9 +493,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "bytes", "http", @@ -512,9 +523,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", "hashbrown", @@ -543,9 +554,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "mac" @@ -584,9 +595,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mio" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "wasi", @@ -866,7 +877,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -923,9 +934,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "socket2" @@ -992,9 +1003,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -1020,22 +1031,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -1060,7 +1071,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.4", ] [[package]] @@ -1104,6 +1115,14 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-hemplate" +version = "0.1.0" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-hemplate" version = "0.1.0" @@ -1116,9 +1135,9 @@ dependencies = [ [[package]] name = "tree-sitter-language" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" +checksum = "ca0d1bf6fdd806e43ae5198f82f527056d359def39e54e67a0f478ac09dac081" [[package]] name = "typenum" @@ -1158,9 +1177,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "web_atoms" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" dependencies = [ "phf", "phf_codegen", diff --git a/hemx-build/src/artifact.rs b/hemx-build/src/artifact.rs index 335daac..b03cdc3 100644 --- a/hemx-build/src/artifact.rs +++ b/hemx-build/src/artifact.rs @@ -17,7 +17,6 @@ pub(super) struct Resources { pub(super) handle_forms: BTreeMap, pub(super) handle_params: BTreeMap>, pub(super) forms: BTreeMap, - pub(super) atoms: BTreeMap, pub(super) classes: BTreeMap, pub(super) events: BTreeMap, } @@ -101,12 +100,6 @@ impl Resources { self.insert_slot(canonical, name, component.clone(), keyed)?; } - if let Some(name) = static_attr(&node.attrs, "data-hemx-atom") { - reject_unkeyed_loop(surface, node.scope, path, "atom", &name)?; - let canonical = canonical_symbol(root, path, &name); - self.insert_atom(canonical, name, component.clone())?; - } - if let Some(name) = static_attr(&node.attrs, "data-hemx-handle") { reject_unkeyed_loop(surface, node.scope, path, "handle", &name)?; let canonical = canonical_symbol(root, path, &name); @@ -169,15 +162,6 @@ impl Resources { insert_resource(&mut self.handles, "handle", symbol, name, component).map(|_| ()) } - pub(super) fn insert_atom( - &mut self, - symbol: String, - name: String, - component: String, - ) -> io::Result<()> { - insert_resource(&mut self.atoms, "atom", symbol, name, component).map(|_| ()) - } - pub(super) fn insert_class( &mut self, symbol: String, @@ -576,21 +560,6 @@ impl Resources { } out.push_str(&format!("{pad}}}\n\n")); - out.push_str(&format!( - "{pad}#[allow(non_upper_case_globals)]\n{pad}pub mod atoms {{\n" - )); - for res in self - .atoms - .values() - .filter(|res| component_matches(res, component)) - { - out.push_str(&format!( - "{inner}pub const {}: ::hemx::Atom<::std::string::String> = ::hemx::Atom::new({});\n", - res.ident, res.id - )); - } - out.push_str(&format!("{pad}}}\n\n")); - out.push_str(&format!( "{pad}#[allow(non_upper_case_globals)]\n{pad}pub mod classes {{\n" )); @@ -794,17 +763,6 @@ impl Resources { res.id )); } - for res in self - .atoms - .values() - .filter(|res| component_matches(res, component)) - { - out.push_str(&format!( - "{pad} (\"data-hemx-atom\", {}, {}),\n", - rust_str(&res.ident), - res.id - )); - } out.push_str(&format!("{pad}];\n")); } @@ -818,7 +776,6 @@ fn __hemx_lower_html(html: &str, table: &[(&str, &str, u32)]) -> ::std::string:: "data-hemx-handle" => "data-hemx-action", "data-hemx-form" => "data-hemx-resource", "data-hemx-revealed" => "data-hemx-revealed", - "data-hemx-atom" => "data-hemx-resource", _ => continue, }; out = __hemx_replace_attr(out, attr, name, runtime_attr, *id); @@ -899,7 +856,6 @@ fn __hemx_attr(tag: &str, attr: &str) -> Option<::std::string::String> { .values() .map(|res| &res.component) .chain(self.handles.values().map(|res| &res.component)) - .chain(self.atoms.values().map(|res| &res.component)) .chain(self.forms.values().map(|form| &form.resource.component)) .chain(self.classes.values().map(|class| &class.component)) .chain(self.events.values().map(|event| &event.component)) @@ -955,12 +911,6 @@ fn __hemx_attr(tag: &str, attr: &str) -> Option<::std::string::String> { out.push_str(&format!("handle_param\t{handle_ident}\t{param}\n")); } } - for res in self.atoms.values() { - out.push_str(&format!( - "atom\t{}\t{}\t{}\n", - res.symbol, res.ident, res.id - )); - } for class in self.classes.values() { out.push_str(&format!( "class\t{}\t{}\t{}\n", @@ -991,10 +941,6 @@ fn __hemx_attr(tag: &str, attr: &str) -> Option<::std::string::String> { parts.push(1); parts.push(res.id); } - for res in self.atoms.values() { - parts.push(3); - parts.push(res.id); - } for form in self.forms.values() { parts.push(2); parts.push(form.resource.id); diff --git a/hemx-build/src/authoring.rs b/hemx-build/src/authoring.rs index a929b87..d1e7cb5 100644 --- a/hemx-build/src/authoring.rs +++ b/hemx-build/src/authoring.rs @@ -42,11 +42,9 @@ pub(super) fn known_hemx_attr(name: &str) -> bool { "data-hemx-root" | "data-hemx-sse" | "data-hemx-ws" - | "data-hemx-st" | "data-hemx-handle" | "data-hemx-slot" | "data-hemx-form" - | "data-hemx-atom" | "data-hemx-key" | "data-hemx-on" | "data-hemx-pending-class" diff --git a/hemx-build/src/lib.rs b/hemx-build/src/lib.rs index 0530407..40126b7 100644 --- a/hemx-build/src/lib.rs +++ b/hemx-build/src/lib.rs @@ -589,10 +589,9 @@ mod tests { io::ErrorKind::InvalidData ); - for (kind, source) in [ - ("atom", r#""#), - ("handle", r#""#), - ] { + let kind = "handle"; + let source = r#""#; + { let first = surface_for_heml_source(Path::new("first.heml"), source.to_owned()).unwrap(); let second = @@ -663,9 +662,6 @@ mod tests { resources .handles .insert("save".into(), resource("save", "page", 12)); - resources - .atoms - .insert("count".into(), resource("count", "page", 13)); resources.forms.insert( "profile".into(), FormResource { @@ -693,8 +689,6 @@ mod tests { 11, 1, 12, - 3, - 13, 2, 14, 2, @@ -713,7 +707,6 @@ mod tests { )); assert!(generated.contains("pub const slot: SlotTarget")); assert!(generated.contains("pub const save: ::hemx::Handle")); - assert!(generated.contains("pub const count: ::hemx::Atom")); assert!(generated.contains("pub const profile: ::hemx::Form")); assert!(generated.contains("\n pub mod targets {\n")); @@ -727,9 +720,6 @@ mod tests { resources .handles .insert("edit".into(), resource("edit", "row", 22)); - resources - .atoms - .insert("selection".into(), resource("selection", "row", 23)); resources .slots .insert("child".into(), resource("child", "page", 24)); @@ -788,17 +778,17 @@ mod tests { let canonical_syms = resources.syms(); assert_eq!( stable_id("generated-rs", &canonical_generated), - 3_787_638_288, + 2_865_325_407, "canonical generated Rust changed" ); assert_eq!( stable_id("generated-rs-global", &canonical_globals), - 1_112_484_789, + 3_814_759_598, "canonical global-export Rust changed" ); assert_eq!( stable_id("generated-syms", &canonical_syms), - 984_222_700, + 2_299_561_723, "canonical symbol manifest changed" ); } @@ -1090,7 +1080,7 @@ mod tests { std::fs::create_dir_all(&templates).unwrap(); std::fs::write( templates.join("todo.heml"), - r#"
    "#, + r#"
      "#, ) .unwrap(); std::fs::write(templates.join("todo.css"), ".todo-card { display: block; }").unwrap(); @@ -1141,8 +1131,6 @@ mod tests { "pub const todo_id: ::hemx::ParamName = ::hemx::ParamName::new(\"todo_id\")" )); assert!(generated.contains("pub mod forms")); - assert!(generated.contains("pub mod atoms")); - assert!(generated.contains("pub const filter")); assert!(generated.contains("pub mod events")); assert!(generated .contains("pub const click: ::hemx::EventName = ::hemx::EventName::new(\"click\")")); @@ -1196,10 +1184,6 @@ mod tests { "form_field\tnew_todo\tlabels\tfalse\ttrue\n".to_owned(), "form_field\tnew_todo\ttitle\ttrue\tfalse\n".to_owned(), "handle_param\tdelete\ttodo_id\n".to_owned(), - format!( - "atom\ttodo.heml::filter\tfilter\t{}\n", - stable_id("atom", "todo.heml::filter") - ), "class\ttodo.css::todo-card\ttodo_card\ttodo-card\n".to_owned(), "class\ttodo.heml::todo-card\ttodo_card\ttodo-card\n".to_owned(), "event\ttodo.heml::change\tchange\tchange\n".to_owned(), @@ -1611,8 +1595,6 @@ mod hemx {{ impl KeyedSlot {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} pub const fn id(self) -> ResourceId {{ ResourceId }} pub fn append_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn prepend_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn replace_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn remove(self, _: K) -> Effect {{ Effect }} pub fn move_before(self, _: K, _: K) -> Effect {{ Effect }} pub fn move_to_end(self, _: K) -> Effect {{ Effect }} }} #[derive(Clone, Copy)] pub struct Handle(::std::marker::PhantomData); impl Handle {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} - #[derive(Clone, Copy)] pub struct Atom(::std::marker::PhantomData); - impl Atom {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} #[derive(Clone, Copy)] pub struct Form(::std::marker::PhantomData); impl Form {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} #[derive(Clone, Copy)] pub struct CssClass(&'static str); @@ -1891,12 +1873,6 @@ fn main() {{ "data-hemx-handle=\"delete\"", "ui::delete", ), - ( - "atom", - r#""#, - "data-hemx-atom=\"selected\"", - "ui::selected", - ), ] { let base = test_dir(&format!("hemx-build-unkeyed-for-{case}-test")); let templates = base.join("templates"); @@ -1933,7 +1909,6 @@ fn main() {{
    • @@ -1948,7 +1923,6 @@ fn main() {{ assert!(syms.contains("slot\ttodo.heml::todos\ttodos\t")); assert!(syms.contains("slot\ttodo.heml::todo_row\ttodo_row\t")); assert!(syms.contains("handle\ttodo.heml::delete\tdelete\t")); - assert!(syms.contains("atom\ttodo.heml::selected\tselected\t")); assert!(syms.contains("slot\ttodo.heml::summary\tsummary\t")); let generated = std::fs::read_to_string(out.join("hemx.generated.rs")).unwrap(); assert!(generated.contains("pub const todo_row: ::hemx::advanced::KeyedSlot")); @@ -2394,8 +2368,6 @@ mod hemx {{ impl KeyedSlot {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} pub const fn id(self) -> ResourceId {{ ResourceId }} pub fn append_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn prepend_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn replace_html(self, _: K, _: impl ::std::convert::Into) -> Effect {{ Effect }} pub fn remove(self, _: K) -> Effect {{ Effect }} pub fn move_before(self, _: K, _: K) -> Effect {{ Effect }} pub fn move_to_end(self, _: K) -> Effect {{ Effect }} }} #[derive(Clone, Copy)] pub struct Handle(::std::marker::PhantomData); impl Handle {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} - #[derive(Clone, Copy)] pub struct Atom(::std::marker::PhantomData); - impl Atom {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} #[derive(Clone, Copy)] pub struct Form(::std::marker::PhantomData); impl Form {{ pub const fn new(_: u32) -> Self {{ Self(::std::marker::PhantomData) }} }} #[derive(Clone, Copy)] pub struct ComponentRef(&'static str); diff --git a/hemx-core/src/lib.rs b/hemx-core/src/lib.rs index 3d39861..f44058f 100644 --- a/hemx-core/src/lib.rs +++ b/hemx-core/src/lib.rs @@ -14,27 +14,6 @@ pub const RUNTIME_ABI_VERSION: u32 = 1; #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub struct BuildFingerprint(pub u64); -#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub struct AtomSnapshot { - pub id: u32, - pub bytes: Vec, -} - -#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] -pub struct AtomState { - pub atoms: Vec, -} - -impl AtomState { - pub fn to_postcard(&self) -> Result, postcard::Error> { - postcard::to_allocvec(self) - } - - pub fn from_postcard(bytes: &[u8]) -> Result { - postcard::from_bytes(bytes) - } -} - impl BuildFingerprint { pub const fn from_parts(parts: &[u32]) -> Self { let mut hash = 0xcbf29ce484222325u64; @@ -51,7 +30,6 @@ impl BuildFingerprint { #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum ResourceKind { Slot, - Atom, Handle, Form, } @@ -669,7 +647,6 @@ fn write_ref(reference: &ResourceRef, out: &mut Vec) { write_u8( match reference.resource.kind { ResourceKind::Slot => 0, - ResourceKind::Atom => 1, ResourceKind::Handle => 2, ResourceKind::Form => 3, }, @@ -866,7 +843,6 @@ fn read_position(reader: &mut WireReader<'_>) -> Result) -> Result { let kind = match reader.read_u8()? { 0 => ResourceKind::Slot, - 1 => ResourceKind::Atom, 2 => ResourceKind::Handle, 3 => ResourceKind::Form, _ => return Err(WireError::UnknownTag), @@ -1126,47 +1102,6 @@ where } } -#[derive(Debug, Eq, PartialEq, Hash)] -pub struct Atom { - id: ResourceId, - _marker: PhantomData T>, -} - -impl Clone for Atom { - fn clone(&self) -> Self { - *self - } -} - -impl Copy for Atom {} - -impl core::fmt::Display for Atom { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - self.id.id.fmt(f) - } -} - -impl Atom { - pub const fn new(id: u32) -> Self { - Self { - id: ResourceId::new(ResourceKind::Atom, id), - _marker: PhantomData, - } - } - - pub const fn id(self) -> ResourceId { - self.id - } - - pub fn set(self, value: impl ToString) -> Effect { - Effect::Patch { - target: ResourceRef::unscoped(self.id), - mode: PatchMode::Morph, - html: SafeHtml::trusted(value.to_string()), - } - } -} - #[derive(Debug, Eq, PartialEq, Hash)] pub struct Handle { id: ResourceId, diff --git a/hemx-js/runtime/hemx.d.ts b/hemx-js/runtime/hemx.d.ts index 585b046..e2085e0 100644 --- a/hemx-js/runtime/hemx.d.ts +++ b/hemx-js/runtime/hemx.d.ts @@ -1,4 +1,4 @@ -export type ResourceKind = "slot" | "atom" | "handle" | "form"; +export type ResourceKind = "slot" | "handle" | "form"; export interface ResourceId { kind: ResourceKind; diff --git a/hemx-js/runtime/hemx.js b/hemx-js/runtime/hemx.js index 67bb973..7c8607e 100644 --- a/hemx-js/runtime/hemx.js +++ b/hemx-js/runtime/hemx.js @@ -939,7 +939,13 @@ if (discriminant === 1) return read(); throw new Error(`unknown hemx option ${discriminant}`); }; - const resource = () => ({ kind: enumValue(["slot", "atom", "handle", "form"], "hemx resource"), id: u32() }); + const resource = () => { + const kind = u8(); + if (kind === 0) return { kind: "slot", id: u32() }; + if (kind === 2) return { kind: "handle", id: u32() }; + if (kind === 3) return { kind: "form", id: u32() }; + throw new Error(`unknown hemx resource ${kind}`); + }; const scope = () => { const kind = u8(); if (kind === 0) return null; diff --git a/hemx-js/tests/runtime.rs b/hemx-js/tests/runtime.rs index 61ead1e..0c203be 100644 --- a/hemx-js/tests/runtime.rs +++ b/hemx-js/tests/runtime.rs @@ -365,8 +365,6 @@ fn runtime_has_no_mirrored_client_application_store() { assert!(!source.contains("atomStore")); assert!(!source.contains("bootstrapState")); - assert!(!source.contains("data-hemx-st")); - assert!(!source.contains("decodeAtomState")); } #[test] diff --git a/hemx-test/Cargo.toml b/hemx-test/Cargo.toml index 7373f82..88f4b6c 100644 --- a/hemx-test/Cargo.toml +++ b/hemx-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hemx-test" -version = "0.4.0" +version = "0.5.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/hemx-test/src/html.rs b/hemx-test/src/html.rs index 08f3449..a57fdee 100644 --- a/hemx-test/src/html.rs +++ b/hemx-test/src/html.rs @@ -300,7 +300,6 @@ impl Error for HtmlInspectionError {} fn resource_attribute(kind: ResourceKind) -> &'static str { match kind { ResourceKind::Slot => "data-hemx-resource", - ResourceKind::Atom => "data-hemx-resource", ResourceKind::Handle => "data-hemx-action", ResourceKind::Form => "data-hemx-resource", } diff --git a/hemx-test/src/lib.rs b/hemx-test/src/lib.rs index 93342ea..0666277 100644 --- a/hemx-test/src/lib.rs +++ b/hemx-test/src/lib.rs @@ -9,7 +9,7 @@ pub use html::{HtmlElement, HtmlInspectionError, HtmlInspector, HtmlSelection}; pub use process::{ProcessError, ProcessFailure, TestProcess, TestProcessBuilder}; use hemx_core::{ - Atom, BuildFingerprint, Effect, EffectBatch, Form, GeneratedTarget, IntoEffect, KeyedSlot, + BuildFingerprint, Effect, EffectBatch, Form, GeneratedTarget, IntoEffect, KeyedSlot, ResourceId, ResourceRef, ScopeKey, Slot, }; use std::future::Future; @@ -465,10 +465,6 @@ impl EffectInspector { self.has_resource(slot.id()) } - pub fn has_atom(&self, atom: Atom) -> bool { - self.has_resource(atom.id()) - } - pub fn has_form(&self, form: Form) -> bool { self.has_resource(form.id()) } diff --git a/hemx-test/tests/inspector.rs b/hemx-test/tests/inspector.rs index 7bf4a37..9165bed 100644 --- a/hemx-test/tests/inspector.rs +++ b/hemx-test/tests/inspector.rs @@ -1,7 +1,6 @@ use hemx_core::{ - Atom, BuildFingerprint, Effect, EffectBatch, Form, GeneratedTarget, HistoryMode, - InsertPosition, KeyedSlot, PatchMode, ResourceId, ResourceKind, ResourceRef, SafeHtml, - ScopeKey, Slot, + BuildFingerprint, Effect, EffectBatch, Form, GeneratedTarget, HistoryMode, InsertPosition, + KeyedSlot, PatchMode, ResourceId, ResourceKind, ResourceRef, SafeHtml, ScopeKey, Slot, }; #[derive(Clone, Copy)] @@ -30,12 +29,10 @@ fn panic_text(result: std::thread::Result) -> String { #[test] fn inspects_tuple_effects() { let count = Slot::::new(1); - let user = Atom::::new(2); - let inspected = hemx_test::run(|value| (count.text(value), user.set("alice")), 42); + let inspected = hemx_test::run(|value| count.text(value), 42); assert!(inspected.has_slot(count)); - assert!(inspected.has_atom(user)); assert!(inspected.contains(&Effect::Patch { target: ResourceRef::unscoped(count.id()), mode: PatchMode::Morph, @@ -227,7 +224,6 @@ fn inspector_predicates_bind_operation_target_scope_kind_and_payload() { assert!(!inspected.has_slot(Slot::<()>::new(99))); assert!(inspected.has_keyed_slot(KeyedSlot::::new(42))); assert!(!inspected.has_keyed_slot(KeyedSlot::::new(99))); - assert!(!inspected.has_atom(Atom::<()>::new(42))); assert!(inspected.has_form(form)); assert!(!inspected.has_form(Form::<()>::new(12))); diff --git a/hemx/Cargo.toml b/hemx/Cargo.toml index aac355d..9114cbe 100644 --- a/hemx/Cargo.toml +++ b/hemx/Cargo.toml @@ -24,4 +24,4 @@ default = [] hemx-core = { version = "0.4.0", path = "../hemx-core" } hemx-derive = { version = "0.4.0", path = "../hemx-derive" } -hemplate = { version = "0.2.0", default-features = false } +hemplate = { version = "0.3.0", path = "../../hemplate/hemplate", default-features = false } diff --git a/hemx/src/lib.rs b/hemx/src/lib.rs index c03c45c..ec0c307 100644 --- a/hemx/src/lib.rs +++ b/hemx/src/lib.rs @@ -13,9 +13,9 @@ pub use hemx_core::{ /// Generated metadata tokens used by macros, generated code, integrations, and tests. /// /// These stay addressable for compatibility, but ordinary app code should use generated -/// helpers instead of naming raw handles, params, events, atoms, or component refs. +/// helpers instead of naming raw handles, params, events, or component refs. #[doc(hidden)] -pub use hemx_core::{Atom, ComponentRef, EventName, GeneratedTarget, Handle, ParamName}; +pub use hemx_core::{ComponentRef, EventName, GeneratedTarget, Handle, ParamName}; pub use hemx_derive::{app, component, form, handler, surface}; /// Advanced/raw hemx primitives used by generated code, integrations, and tests. @@ -188,8 +188,8 @@ mod tests { struct InlineView; impl hemplate::Hemplate for InlineView { - fn render_into(&self, out: &mut String) -> Result<(), hemplate::RenderError> { - out.push_str("ok"); + fn render_into(&self, out: &mut dyn core::fmt::Write) -> Result<(), hemplate::RenderError> { + out.write_str("ok")?; Ok(()) } } @@ -197,8 +197,8 @@ mod tests { struct HintTrackingView(Cell); impl hemplate::Hemplate for HintTrackingView { - fn render_into(&self, out: &mut String) -> Result<(), hemplate::RenderError> { - out.push_str("hinted"); + fn render_into(&self, out: &mut dyn core::fmt::Write) -> Result<(), hemplate::RenderError> { + out.write_str("hinted")?; Ok(()) } diff --git a/tests/server-wasm/Cargo.toml b/tests/server-wasm/Cargo.toml index 1d11377..59237f7 100644 --- a/tests/server-wasm/Cargo.toml +++ b/tests/server-wasm/Cargo.toml @@ -6,7 +6,7 @@ license.workspace = true publish = false [dependencies] -hemplate = { version = "0.2.0", default-features = false, features = ["derive"] } +hemplate = { version = "0.3.0", path = "../../../hemplate/hemplate", default-features = false, features = ["derive"] } hemx = { path = "../../hemx" } [build-dependencies]