From b6e091674c440338193050b18d99fef93812c253 Mon Sep 17 00:00:00 2001 From: arctic-hen7 Date: Wed, 18 Jan 2023 11:10:00 +1030 Subject: [PATCH] fix(capsules): fixed capsules with exporting These were causing substantial errors because we were incorrectly handling widget states. --- packages/perseus/src/reactor/render_mode.rs | 3 +++ packages/perseus/src/turbine/export.rs | 15 +++++++++++++-- packages/perseus/src/turbine/serve.rs | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/perseus/src/reactor/render_mode.rs b/packages/perseus/src/reactor/render_mode.rs index 02389e9930..5a2544825a 100644 --- a/packages/perseus/src/reactor/render_mode.rs +++ b/packages/perseus/src/reactor/render_mode.rs @@ -54,6 +54,9 @@ pub(crate) enum RenderMode { /// An accumulator of the widget states involved in rendering this /// template. We need to be able to collect these to later send /// them to clients for hydration. + /// + /// Importantly, widget states are *not* fallible at build-time! + /// Any errors will be propagated to terminate the build. widget_states: Rc>>, /// A list of widget paths that are either nonexistent, or able to be /// incrementally generated. The build process should parse these and diff --git a/packages/perseus/src/turbine/export.rs b/packages/perseus/src/turbine/export.rs index b02c965b00..253f5bafdc 100644 --- a/packages/perseus/src/turbine/export.rs +++ b/packages/perseus/src/turbine/export.rs @@ -133,6 +133,12 @@ impl Turbine { .into()) } }; + + // If it's a capsule, abort now + if template.is_capsule { + return Ok(()); + } + // Create a locale detection file for it if we're using i18n // These just send the app shell, which will perform a redirect as necessary // Notably, these also include fallback redirectors if either Wasm or JS is @@ -279,11 +285,16 @@ impl Turbine { .immutable_store .read(&format!("static/{}.widgets.json", full_path_encoded)) .await?; + // These are *not* fallible! let widget_states = match serde_json::from_str::< - HashMap>, + HashMap, >(&widget_states) { - Ok(widget_states) => widget_states, + // Same processing as the server does + Ok(widget_states) => widget_states + .into_iter() + .map(|(k, (_, v))| (k, Ok(v))) + .collect::<_>(), Err(err) => return Err(ServerError::InvalidPageState { source: err }), }; let head = self diff --git a/packages/perseus/src/turbine/serve.rs b/packages/perseus/src/turbine/serve.rs index 981a55a8a7..77c2235082 100644 --- a/packages/perseus/src/turbine/serve.rs +++ b/packages/perseus/src/turbine/serve.rs @@ -172,6 +172,7 @@ impl Turbine { .read(&format!("static/{}.widgets.json", &path_encoded)) .await? }; + // From the build process, these are infallible let widget_states = match serde_json::from_str::< HashMap, >(&widget_states)