@tishlang/tish 1.0.26 → 1.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/crates/tish/Cargo.toml +1 -1
- package/crates/tish_compile_js/src/codegen.rs +4 -5
- package/crates/tish_compile_js/src/tests_jsx.rs +67 -0
- package/package.json +1 -1
- package/platform/darwin-arm64/tish +0 -0
- package/platform/darwin-x64/tish +0 -0
- package/platform/linux-arm64/tish +0 -0
- package/platform/linux-x64/tish +0 -0
- package/platform/win32-x64/tish.exe +0 -0
package/crates/tish/Cargo.toml
CHANGED
|
@@ -735,15 +735,14 @@ impl Codegen {
|
|
|
735
735
|
JsxChild::Text(s) => Ok(format!("{:?}", s.as_ref())),
|
|
736
736
|
JsxChild::Expr(e) => {
|
|
737
737
|
let inner = self.emit_expr(e)?;
|
|
738
|
-
|
|
738
|
+
// Only wrap literals we know are primitives (number, bool, null). Never wrap:
|
|
739
|
+
// string/template (already strings), JSX (elements), Call (components), Array/Ident (may hold elements).
|
|
740
|
+
let needs_string = matches!(
|
|
739
741
|
e,
|
|
740
742
|
Expr::Literal {
|
|
741
|
-
value: Literal::
|
|
743
|
+
value: Literal::Number(_) | Literal::Bool(_) | Literal::Null,
|
|
742
744
|
..
|
|
743
745
|
}
|
|
744
|
-
| Expr::TemplateLiteral { .. }
|
|
745
|
-
| Expr::JsxElement { .. }
|
|
746
|
-
| Expr::JsxFragment { .. }
|
|
747
746
|
);
|
|
748
747
|
Ok(if needs_string {
|
|
749
748
|
format!("String({})", inner)
|
|
@@ -96,4 +96,71 @@ mod tests {
|
|
|
96
96
|
assert!(js.contains("__vdom_h(\"p\", null, [])"), "{}", &js[..600.min(js.len())]);
|
|
97
97
|
assert!(js.contains("__lattishVdomPatch"));
|
|
98
98
|
}
|
|
99
|
+
|
|
100
|
+
/// Component calls like {Panel()} return DOM elements. Wrapping in String() produces [object HTMLDivElement].
|
|
101
|
+
#[test]
|
|
102
|
+
fn jsx_component_call_not_wrapped_in_string() {
|
|
103
|
+
let src = r#"
|
|
104
|
+
fn Panel() { return <div class="p">content</div> }
|
|
105
|
+
fn App() { return <div>{Panel()}</div> }
|
|
106
|
+
"#;
|
|
107
|
+
let program = parse(src).unwrap();
|
|
108
|
+
let js = compile_with_jsx(&program, false, JsxMode::LattishH).unwrap();
|
|
109
|
+
assert!(
|
|
110
|
+
js.contains("Panel()"),
|
|
111
|
+
"component call should appear as Panel(), got: {}",
|
|
112
|
+
&js[..500.min(js.len())]
|
|
113
|
+
);
|
|
114
|
+
assert!(
|
|
115
|
+
!js.contains("String(Panel()"),
|
|
116
|
+
"component calls must NOT be wrapped in String() - causes [object HTMLDivElement]. got: {}",
|
|
117
|
+
&js[..600.min(js.len())]
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// Nested JSX elements must not be String()'d or they render as [object HTMLDivElement].
|
|
122
|
+
#[test]
|
|
123
|
+
fn jsx_nested_element_not_wrapped_in_string() {
|
|
124
|
+
let src = r#"fn X() { return <div><span>inner</span></div> }"#;
|
|
125
|
+
let program = parse(src).unwrap();
|
|
126
|
+
let js = compile_with_jsx(&program, false, JsxMode::LattishH).unwrap();
|
|
127
|
+
assert!(
|
|
128
|
+
!js.contains("String(h("),
|
|
129
|
+
"nested JSX elements must NOT be wrapped in String(). got: {}",
|
|
130
|
+
&js[..500.min(js.len())]
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Literal number/bool/null get String() for display. Idents (e.g. {items}) are NOT wrapped—they may hold elements.
|
|
135
|
+
#[test]
|
|
136
|
+
fn jsx_literal_number_wrapped_in_string() {
|
|
137
|
+
let src = r#"fn X() { return <span>{42}</span> }"#;
|
|
138
|
+
let program = parse(src).unwrap();
|
|
139
|
+
let js = compile_with_jsx(&program, false, JsxMode::LattishH).unwrap();
|
|
140
|
+
assert!(
|
|
141
|
+
js.contains("String(42)"),
|
|
142
|
+
"literal number in JSX should be wrapped in String(). got: {}",
|
|
143
|
+
&js[..500.min(js.len())]
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/// Array/ident like {items} (array of buttons) must NOT be String()'d or we get [object HTMLButtonElement].
|
|
148
|
+
#[test]
|
|
149
|
+
fn jsx_array_of_elements_not_wrapped_in_string() {
|
|
150
|
+
let src = r#"
|
|
151
|
+
fn FileList() {
|
|
152
|
+
let items = []
|
|
153
|
+
items.push(<button>a</button>)
|
|
154
|
+
items.push(<button>b</button>)
|
|
155
|
+
return <div>{items}</div>
|
|
156
|
+
}
|
|
157
|
+
"#;
|
|
158
|
+
let program = parse(src).unwrap();
|
|
159
|
+
let js = compile_with_jsx(&program, false, JsxMode::LattishH).unwrap();
|
|
160
|
+
assert!(
|
|
161
|
+
!js.contains("String(items)"),
|
|
162
|
+
"array/ident in JSX must NOT be wrapped in String() - causes [object HTMLButtonElement]. got: {}",
|
|
163
|
+
&js[..600.min(js.len())]
|
|
164
|
+
);
|
|
165
|
+
}
|
|
99
166
|
}
|
package/package.json
CHANGED
|
Binary file
|
package/platform/darwin-x64/tish
CHANGED
|
Binary file
|
|
Binary file
|
package/platform/linux-x64/tish
CHANGED
|
Binary file
|
|
Binary file
|