diff --git a/.changepacks/changepack_log_A9ir3S4hRUjc85hjBLGgF.json b/.changepacks/changepack_log_A9ir3S4hRUjc85hjBLGgF.json
new file mode 100644
index 0000000..75c3808
--- /dev/null
+++ b/.changepacks/changepack_log_A9ir3S4hRUjc85hjBLGgF.json
@@ -0,0 +1 @@
+{"changes":{"Cargo.toml":"Patch"},"note":"Fix js script path","date":"2026-03-11T06:01:44.334450200Z"}
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 6acfb7b..c369bc1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3457,7 +3457,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "vespera"
-version = "0.1.41"
+version = "0.1.42"
dependencies = [
"axum",
"axum-extra",
@@ -3472,7 +3472,7 @@ dependencies = [
[[package]]
name = "vespera_core"
-version = "0.1.41"
+version = "0.1.42"
dependencies = [
"rstest",
"serde",
@@ -3481,7 +3481,7 @@ dependencies = [
[[package]]
name = "vespera_macro"
-version = "0.1.41"
+version = "0.1.42"
dependencies = [
"insta",
"proc-macro2",
diff --git a/crates/vespera_macro/src/router_codegen.rs b/crates/vespera_macro/src/router_codegen.rs
index fa3b748..96f1485 100644
--- a/crates/vespera_macro/src/router_codegen.rs
+++ b/crates/vespera_macro/src/router_codegen.rs
@@ -429,10 +429,10 @@ impl Parse for ExportAppInput {
}
/// Swagger UI HTML template. Contains `{}` format placeholder for the OpenAPI spec JSON.
-const SWAGGER_UI_HTML: &str = r#"
Swagger UI"#;
+const SWAGGER_UI_HTML: &str = r##"Swagger UI"##;
/// ReDoc HTML template. Contains `{}` format placeholder for the OpenAPI spec JSON.
-const REDOC_HTML: &str = r#"ReDoc"#;
+const REDOC_HTML: &str = r#"ReDoc"#;
/// Generate a documentation route handler (Swagger UI or ReDoc).
///
@@ -1266,6 +1266,37 @@ pub fn get_users() -> String {
assert!(code.contains("__VESPERA_SPEC"));
}
+ #[test]
+ fn test_swagger_html_template_renders_valid_quotes() {
+ assert!(
+ !SWAGGER_UI_HTML.contains(r#"\""#),
+ "Swagger template should not contain literal backslash-quotes: {SWAGGER_UI_HTML}"
+ );
+ assert!(
+ SWAGGER_UI_HTML.contains(r#"href="https://unpkg.com/swagger-ui-dist/swagger-ui.css""#)
+ );
+ assert!(
+ SWAGGER_UI_HTML
+ .contains(r#"src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js""#)
+ );
+ assert!(SWAGGER_UI_HTML.contains(r##"dom_id: "#swagger-ui""##));
+ }
+
+ #[test]
+ fn test_redoc_html_template_renders_valid_quotes() {
+ assert!(
+ !REDOC_HTML.contains(r#"\""#),
+ "ReDoc template should not contain literal backslash-quotes: {REDOC_HTML}"
+ );
+ assert!(
+ REDOC_HTML.contains(r#"href="https://unpkg.com/redoc/bundles/redoc.standalone.css""#)
+ );
+ assert!(
+ REDOC_HTML.contains(r#"src="https://unpkg.com/redoc/bundles/redoc.standalone.js""#)
+ );
+ assert!(REDOC_HTML.contains(r#"document.getElementById("redoc-container")"#));
+ }
+
#[test]
fn test_parse_server_struct_url_only() {
// Test server struct parsing via AutoRouterInput