diff --git a/fastn-resolved-to-js/src/html.rs b/fastn-resolved-to-js/src/html.rs
index 10b31de39..1897a481d 100644
--- a/fastn-resolved-to-js/src/html.rs
+++ b/fastn-resolved-to-js/src/html.rs
@@ -1,18 +1,26 @@
use fastn_resolved_to_js::extensions::*;
pub struct HtmlInput {
- package: Package,
- js: String,
- #[expect(unused)]
- css_files: Vec,
- #[expect(unused)]
- js_files: Vec,
- doc: dyn fastn_resolved::tdoc::TDoc,
+ pub package: Package,
+ pub js: String,
+ pub css_files: Vec,
+ pub js_files: Vec,
+ pub doc: Box,
+ pub has_rive_component: bool,
}
const EMPTY_HTML_BODY: &str = "";
impl HtmlInput {
pub fn to_html(&self) -> String {
+ let mut scripts =
+ fastn_resolved_to_js::utils::get_external_scripts(self.has_rive_component);
+ scripts.push(fastn_resolved_to_js::utils::get_js_html(
+ self.js_files.as_slice(),
+ ));
+ scripts.push(fastn_resolved_to_js::utils::get_css_html(
+ self.css_files.as_slice(),
+ ));
+
format!(
include_str!("../../ftd/ftd-js.html"),
fastn_package = self.package.name,
@@ -36,11 +44,13 @@ impl HtmlInput {
+ {}
"#,
hashed_markdown_js(),
hashed_prism_js(),
- hashed_default_ftd_js(self.package.name.as_str(), &self.doc),
+ hashed_default_ftd_js(self.package.name.as_str(), self.doc.as_ref()),
hashed_prism_css(),
+ scripts.join("").as_str()
)
.as_str(),
extra_js = "", // Todo
@@ -165,12 +175,14 @@ fn default_bag_into_js_ast(doc: &dyn fastn_resolved::tdoc::TDoc) -> Vec,
favicon: Option,
}
+#[derive(Debug, Default)]
pub struct Favicon {
path: String,
content_type: String,
diff --git a/fastn-resolved-to-js/src/lib.rs b/fastn-resolved-to-js/src/lib.rs
index d806fc540..58db572f7 100644
--- a/fastn-resolved-to-js/src/lib.rs
+++ b/fastn-resolved-to-js/src/lib.rs
@@ -341,3 +341,81 @@ pub fn default_bag_into_js_ast(doc: &dyn fastn_resolved::tdoc::TDoc) -> Vec,
+ pub has_rive_components: bool,
+}
+pub fn get_all_asts<'a, T: Iterator- >(
+ doc: &dyn fastn_resolved::tdoc::TDoc,
+ tree: &[&fastn_resolved::ComponentInvocation],
+ used_definitions: T,
+) -> AstOutput {
+ // Check if the document tree uses Rive, if so add the Rive script.
+ let mut has_rive_components = false;
+ let mut export_asts = vec![];
+
+ let mut document_asts = vec![fastn_resolved_to_js::from_tree(
+ tree,
+ doc,
+ &mut has_rive_components,
+ )];
+
+ for definition in used_definitions {
+ if let fastn_resolved::Definition::Component(c) = definition {
+ document_asts.push(c.to_ast(doc, &mut has_rive_components));
+ } else if let fastn_resolved::Definition::Variable(v) = definition {
+ document_asts.push(v.to_ast(
+ doc,
+ Some(fastn_js::GLOBAL_VARIABLE_MAP.to_string()),
+ &mut has_rive_components,
+ ));
+ } else if let fastn_resolved::Definition::WebComponent(web_component) = definition {
+ document_asts.push(web_component.to_ast(doc));
+ } else if let fastn_resolved::Definition::Function(f) = definition {
+ document_asts.push(f.to_ast(doc));
+ } else if let fastn_resolved::Definition::Export { from, to, .. } = definition {
+ if doc.get_opt_record(from).is_some() {
+ continue;
+ }
+ export_asts.push(fastn_js::Ast::Export {
+ from: from.to_string(),
+ to: to.to_string(),
+ })
+ } else if let fastn_resolved::Definition::OrType(ot) = definition {
+ let mut fields = vec![];
+ for variant in &ot.variants {
+ if let Some(value) = &variant.clone().fields().get(0).unwrap().value {
+ fields.push((
+ variant
+ .name()
+ .trim_start_matches(
+ format!(
+ "{}.",
+ fastn_resolved::OrType::or_type_name(ot.name.as_str())
+ )
+ .as_str(),
+ )
+ .to_string(),
+ value.to_fastn_js_value_with_none(doc, &mut false),
+ ));
+ }
+ }
+ document_asts.push(fastn_js::Ast::OrType(fastn_js::OrType {
+ name: ot.name.clone(),
+ variant: fastn_js::SetPropertyValue::Value(fastn_js::Value::Record {
+ fields,
+ other_references: vec![],
+ }),
+ prefix: Some(fastn_js::GLOBAL_VARIABLE_MAP.to_string()),
+ }));
+ }
+ }
+
+ document_asts.extend(export_asts);
+
+ AstOutput {
+ ast: document_asts,
+ has_rive_components,
+ }
+}
diff --git a/v0.5/fastn-compiler/src/js.rs b/v0.5/fastn-compiler/src/js.rs
index ca311340d..b1fa44011 100644
--- a/v0.5/fastn-compiler/src/js.rs
+++ b/v0.5/fastn-compiler/src/js.rs
@@ -1,5 +1,5 @@
impl fastn_compiler::Compiler {
- pub(crate) fn js(&self) -> String {
+ pub(crate) fn js(&self) -> fastn_resolved_to_js::HtmlInput {
use fastn_resolved::tdoc::TDoc;
use fastn_resolved_to_js::extensions::*;
@@ -11,91 +11,27 @@ impl fastn_compiler::Compiler {
// every symbol in self.symbol_used in the bag must be UR::R now
let used_definitions = self.used_definitions();
let doc = fastn_compiler::TDoc {
- name: "",
+ name: "", // Todo: Package name
definitions: &used_definitions,
builtins: fastn_builtins::builtins(),
};
- // Check if the document tree uses Rive, if so add the Rive script.
- let mut has_rive_components = false;
- let mut export_asts = vec![];
-
- let mut document_asts = vec![fastn_resolved_to_js::from_tree(
- resolved_content.as_slice(),
+ let css_files = self.external_css_files(&used_definitions);
+ let js_files = self.external_js_files(&used_definitions);
+ let output = fastn_resolved_to_js::get_all_asts(
&doc,
- &mut has_rive_components,
- )];
-
- for definition in used_definitions.values() {
- if let fastn_resolved::Definition::Component(c) = definition {
- document_asts.push(c.to_ast(&doc, &mut has_rive_components));
- } else if let fastn_resolved::Definition::Variable(v) = definition {
- document_asts.push(v.to_ast(
- &doc,
- Some(fastn_js::GLOBAL_VARIABLE_MAP.to_string()),
- &mut has_rive_components,
- ));
- } else if let fastn_resolved::Definition::WebComponent(web_component) = definition {
- document_asts.push(web_component.to_ast(&doc));
- } else if let fastn_resolved::Definition::Function(f) = definition {
- document_asts.push(f.to_ast(&doc));
- } else if let fastn_resolved::Definition::Export { from, to, .. } = definition {
- if doc.get_opt_record(from).is_some() {
- continue;
- }
- export_asts.push(fastn_js::Ast::Export {
- from: from.to_string(),
- to: to.to_string(),
- })
- } else if let fastn_resolved::Definition::OrType(ot) = definition {
- let mut fields = vec![];
- for variant in &ot.variants {
- if let Some(value) = &variant.clone().fields().get(0).unwrap().value {
- fields.push((
- variant
- .name()
- .trim_start_matches(
- format!(
- "{}.",
- fastn_resolved::OrType::or_type_name(ot.name.as_str())
- )
- .as_str(),
- )
- .to_string(),
- value.to_fastn_js_value_with_none(&doc, &mut false),
- ));
- }
- }
- document_asts.push(fastn_js::Ast::OrType(fastn_js::OrType {
- name: ot.name.clone(),
- variant: fastn_js::SetPropertyValue::Value(fastn_js::Value::Record {
- fields,
- other_references: vec![],
- }),
- prefix: Some(fastn_js::GLOBAL_VARIABLE_MAP.to_string()),
- }));
- }
+ resolved_content.as_slice(),
+ used_definitions.into_iter().map(|(_, v)| v),
+ );
+ let js = fastn_js::to_js(output.ast.as_slice(), "");
+
+ fastn_resolved_to_js::HtmlInput {
+ package: Default::default(), // Todo
+ js,
+ css_files,
+ js_files,
+ doc: Box::new(doc),
+ has_rive_component: output.has_rive_components,
}
-
- document_asts.extend(export_asts);
-
- let mut scripts = fastn_resolved_to_js::utils::get_external_scripts(has_rive_components);
- scripts.push(fastn_resolved_to_js::utils::get_js_html(
- self.external_js_files(&used_definitions).as_slice(),
- ));
- scripts.push(fastn_resolved_to_js::utils::get_css_html(
- self.external_css_files(&used_definitions).as_slice(),
- ));
-
- let js_document_script = fastn_js::to_js(document_asts.as_slice(), "");
-
- js_document_script
}
}
-
-#[expect(unused)]
-pub struct Output {
- js: String,
- css_files: Vec,
- js_files: Vec,
-}
diff --git a/v0.5/fastn-compiler/src/lib.rs b/v0.5/fastn-compiler/src/lib.rs
index ffeeb2663..f1aa38771 100644
--- a/v0.5/fastn-compiler/src/lib.rs
+++ b/v0.5/fastn-compiler/src/lib.rs
@@ -18,7 +18,7 @@ pub use symbols::SymbolStore;
pub struct Output {
#[expect(unused)]
- js: String,
+ js: fastn_resolved_to_js::HtmlInput,
#[expect(unused)]
warnings: Vec>,
#[expect(unused)]