@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.
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "tishlang"
3
- version = "1.0.26"
3
+ version = "1.0.27"
4
4
  edition = "2021"
5
5
  description = "Tish CLI - run, REPL, compile to native"
6
6
  license-file = { workspace = true }
@@ -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
- let needs_string = !matches!(
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::String(_),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tishlang/tish",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "Tish - minimal TS/JS-compatible language. Run, REPL, compile to native.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {
Binary file
Binary file
Binary file
Binary file
Binary file