ripple 0.3.68 → 0.3.70

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.
Files changed (182) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -2
  4. package/src/runtime/element.js +1 -1
  5. package/src/runtime/index-client.js +11 -11
  6. package/src/runtime/index-server.js +7 -4
  7. package/src/runtime/internal/client/bindings.js +1 -1
  8. package/src/runtime/internal/client/blocks.js +13 -4
  9. package/src/runtime/internal/client/component.js +55 -0
  10. package/src/runtime/internal/client/composite.js +4 -2
  11. package/src/runtime/internal/client/expression.js +65 -7
  12. package/src/runtime/internal/client/hmr.js +54 -43
  13. package/src/runtime/internal/client/index.js +5 -1
  14. package/src/runtime/internal/client/portal.js +70 -69
  15. package/src/runtime/internal/client/render.js +3 -0
  16. package/src/runtime/internal/server/index.js +92 -8
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
  18. package/tests/client/array/array.copy-within.test.tsrx +33 -31
  19. package/tests/client/array/array.derived.test.tsrx +186 -169
  20. package/tests/client/array/array.iteration.test.tsrx +40 -37
  21. package/tests/client/array/array.mutations.test.tsrx +113 -101
  22. package/tests/client/array/array.static.test.tsrx +119 -101
  23. package/tests/client/array/array.to-methods.test.tsrx +24 -21
  24. package/tests/client/async-suspend.test.tsrx +247 -246
  25. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
  26. package/tests/client/basic/basic.attributes.test.tsrx +428 -423
  27. package/tests/client/basic/basic.collections.test.tsrx +109 -102
  28. package/tests/client/basic/basic.components.test.tsrx +323 -205
  29. package/tests/client/basic/basic.errors.test.tsrx +91 -91
  30. package/tests/client/basic/basic.events.test.tsrx +114 -115
  31. package/tests/client/basic/basic.get-set.test.tsrx +97 -87
  32. package/tests/client/basic/basic.hmr.test.tsrx +19 -16
  33. package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
  34. package/tests/client/basic/basic.rendering.test.tsrx +272 -182
  35. package/tests/client/basic/basic.styling.test.tsrx +23 -22
  36. package/tests/client/basic/basic.utilities.test.tsrx +10 -8
  37. package/tests/client/boundaries.test.tsrx +26 -26
  38. package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
  39. package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
  40. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
  41. package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
  42. package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
  43. package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
  44. package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
  45. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  46. package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
  47. package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
  48. package/tests/client/composite/composite.generics.test.tsrx +168 -192
  49. package/tests/client/composite/composite.props.test.tsrx +97 -81
  50. package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
  51. package/tests/client/composite/composite.render.test.tsrx +122 -105
  52. package/tests/client/computed-properties.test.tsrx +28 -28
  53. package/tests/client/context.test.tsrx +21 -21
  54. package/tests/client/css/global-additional-cases.test.tsrx +58 -58
  55. package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
  56. package/tests/client/css/global-at-rules.test.tsrx +10 -10
  57. package/tests/client/css/global-basic.test.tsrx +14 -14
  58. package/tests/client/css/global-classes-ids.test.tsrx +14 -14
  59. package/tests/client/css/global-combinators.test.tsrx +10 -10
  60. package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
  61. package/tests/client/css/global-edge-cases.test.tsrx +18 -18
  62. package/tests/client/css/global-keyframes.test.tsrx +12 -12
  63. package/tests/client/css/global-nested.test.tsrx +10 -10
  64. package/tests/client/css/global-pseudo.test.tsrx +12 -12
  65. package/tests/client/css/global-scoping.test.tsrx +20 -20
  66. package/tests/client/css/style-identifier.test.tsrx +126 -259
  67. package/tests/client/date.test.tsrx +146 -133
  68. package/tests/client/dynamic-elements.test.tsrx +398 -365
  69. package/tests/client/events.test.tsrx +292 -290
  70. package/tests/client/for.test.tsrx +156 -153
  71. package/tests/client/head.test.tsrx +105 -96
  72. package/tests/client/html.test.tsrx +122 -26
  73. package/tests/client/input-value.test.tsrx +1361 -1314
  74. package/tests/client/lazy-array.test.tsrx +16 -13
  75. package/tests/client/lazy-destructuring.test.tsrx +257 -213
  76. package/tests/client/map.test.tsrx +65 -60
  77. package/tests/client/media-query.test.tsrx +22 -20
  78. package/tests/client/object.test.tsrx +87 -81
  79. package/tests/client/portal.test.tsrx +57 -51
  80. package/tests/client/ref.test.tsrx +233 -202
  81. package/tests/client/return.test.tsrx +71 -2560
  82. package/tests/client/set.test.tsrx +54 -45
  83. package/tests/client/svg.test.tsrx +216 -186
  84. package/tests/client/switch.test.tsrx +194 -193
  85. package/tests/client/track-async-hydration.test.tsrx +18 -14
  86. package/tests/client/tracked-index-access.test.tsrx +28 -18
  87. package/tests/client/try.test.tsrx +675 -548
  88. package/tests/client/tsx.test.tsrx +373 -311
  89. package/tests/client/typescript-generics.test.tsrx +145 -145
  90. package/tests/client/url/url.derived.test.tsrx +33 -28
  91. package/tests/client/url/url.parsing.test.tsrx +61 -51
  92. package/tests/client/url/url.partial-removal.test.tsrx +56 -48
  93. package/tests/client/url/url.reactivity.test.tsrx +142 -125
  94. package/tests/client/url/url.serialization.test.tsrx +13 -11
  95. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
  96. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
  97. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
  98. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
  99. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
  100. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
  101. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
  102. package/tests/hydration/basic.test.js +3 -3
  103. package/tests/hydration/compiled/client/basic.js +586 -651
  104. package/tests/hydration/compiled/client/composite.js +79 -104
  105. package/tests/hydration/compiled/client/events.js +140 -148
  106. package/tests/hydration/compiled/client/for.js +1005 -1018
  107. package/tests/hydration/compiled/client/head.js +124 -134
  108. package/tests/hydration/compiled/client/hmr.js +41 -48
  109. package/tests/hydration/compiled/client/html-in-template.js +38 -41
  110. package/tests/hydration/compiled/client/html.js +970 -1314
  111. package/tests/hydration/compiled/client/if-children.js +234 -249
  112. package/tests/hydration/compiled/client/if.js +182 -189
  113. package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
  114. package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
  115. package/tests/hydration/compiled/client/portal.js +65 -85
  116. package/tests/hydration/compiled/client/reactivity.js +84 -90
  117. package/tests/hydration/compiled/client/return.js +38 -1939
  118. package/tests/hydration/compiled/client/switch.js +218 -224
  119. package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
  120. package/tests/hydration/compiled/client/try.js +123 -132
  121. package/tests/hydration/compiled/server/basic.js +773 -831
  122. package/tests/hydration/compiled/server/composite.js +166 -191
  123. package/tests/hydration/compiled/server/events.js +170 -184
  124. package/tests/hydration/compiled/server/for.js +851 -909
  125. package/tests/hydration/compiled/server/head.js +206 -216
  126. package/tests/hydration/compiled/server/hmr.js +64 -72
  127. package/tests/hydration/compiled/server/html-in-template.js +42 -76
  128. package/tests/hydration/compiled/server/html.js +1362 -1667
  129. package/tests/hydration/compiled/server/if-children.js +419 -445
  130. package/tests/hydration/compiled/server/if.js +194 -208
  131. package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
  132. package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
  133. package/tests/hydration/compiled/server/portal.js +152 -160
  134. package/tests/hydration/compiled/server/reactivity.js +94 -106
  135. package/tests/hydration/compiled/server/return.js +28 -2172
  136. package/tests/hydration/compiled/server/switch.js +274 -286
  137. package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
  138. package/tests/hydration/compiled/server/try.js +167 -185
  139. package/tests/hydration/components/basic.tsrx +320 -272
  140. package/tests/hydration/components/composite.tsrx +44 -32
  141. package/tests/hydration/components/events.tsrx +101 -91
  142. package/tests/hydration/components/for.tsrx +510 -452
  143. package/tests/hydration/components/head.tsrx +87 -80
  144. package/tests/hydration/components/hmr.tsrx +22 -17
  145. package/tests/hydration/components/html-in-template.tsrx +22 -17
  146. package/tests/hydration/components/html.tsrx +525 -443
  147. package/tests/hydration/components/if-children.tsrx +158 -148
  148. package/tests/hydration/components/if.tsrx +109 -95
  149. package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
  150. package/tests/hydration/components/nested-control-flow.tsrx +215 -203
  151. package/tests/hydration/components/portal.tsrx +41 -34
  152. package/tests/hydration/components/reactivity.tsrx +37 -27
  153. package/tests/hydration/components/return.tsrx +12 -556
  154. package/tests/hydration/components/switch.tsrx +120 -114
  155. package/tests/hydration/components/track-async-serialization.tsrx +107 -91
  156. package/tests/hydration/components/try.tsrx +55 -40
  157. package/tests/hydration/html.test.js +4 -4
  158. package/tests/hydration/return.test.js +13 -532
  159. package/tests/server/await.test.tsrx +3 -3
  160. package/tests/server/basic.attributes.test.tsrx +264 -195
  161. package/tests/server/basic.components.test.tsrx +296 -169
  162. package/tests/server/basic.test.tsrx +300 -198
  163. package/tests/server/compiler.test.tsrx +62 -60
  164. package/tests/server/composite.props.test.tsrx +77 -63
  165. package/tests/server/composite.test.tsrx +168 -192
  166. package/tests/server/context.test.tsrx +18 -12
  167. package/tests/server/dynamic-elements.test.tsrx +197 -180
  168. package/tests/server/for.test.tsrx +85 -78
  169. package/tests/server/head.test.tsrx +50 -43
  170. package/tests/server/html-nesting-validation.test.tsrx +8 -8
  171. package/tests/server/if.test.tsrx +57 -51
  172. package/tests/server/lazy-destructuring.test.tsrx +366 -294
  173. package/tests/server/return.test.tsrx +76 -1355
  174. package/tests/server/streaming-ssr.test.tsrx +4 -75
  175. package/tests/server/style-identifier.test.tsrx +169 -131
  176. package/tests/server/switch.test.tsrx +91 -85
  177. package/tests/server/track-async-serialization.test.tsrx +105 -85
  178. package/tests/server/try.test.tsrx +374 -280
  179. package/tests/utils/compiler-compat-config.test.js +2 -2
  180. package/tests/utils/runtime-imports.test.js +10 -0
  181. package/types/index.d.ts +8 -0
  182. package/tests/client/__snapshots__/html.test.rsrx.snap +0 -40
@@ -3,27 +3,27 @@ import { compile } from '@tsrx/ripple';
3
3
 
4
4
  describe('basic client > errors', () => {
5
5
  it('renders with error handling simulation', () => {
6
- component Basic() {
7
- let &[hasError] = track(false);
8
- let &[errorMessage] = track('');
9
-
10
- const triggerError = () => {
11
- try {
12
- throw new Error('Test error');
13
- } catch (e) {
14
- hasError = true;
15
- errorMessage = (e as Error).message;
16
- }
17
- };
18
-
19
- <div>
20
- <button onClick={triggerError}>{'Trigger Error'}</button>
21
- if (hasError) {
22
- <div class="error">{'Error caught: ' + errorMessage}</div>
23
- } else {
24
- <div class="success">{'No error'}</div>
25
- }
26
- </div>
6
+ function Basic() {
7
+ return <>
8
+ let &[hasError] = track(false);
9
+ let &[errorMessage] = track('');
10
+ const triggerError = () => {
11
+ try {
12
+ throw new Error('Test error');
13
+ } catch (e) {
14
+ hasError = true;
15
+ errorMessage = (e as Error).message;
16
+ }
17
+ };
18
+ <div>
19
+ <button onClick={triggerError}>{'Trigger Error'}</button>
20
+ if (hasError) {
21
+ <div class="error">{'Error caught: ' + errorMessage}</div>
22
+ } else {
23
+ <div class="success">{'No error'}</div>
24
+ }
25
+ </div>
26
+ </>;
27
27
  }
28
28
 
29
29
  render(Basic);
@@ -43,29 +43,29 @@ describe('basic client > errors', () => {
43
43
  });
44
44
 
45
45
  it('should throw error for unclosed tag', () => {
46
- const malformedCode = `export default component Example() {
46
+ const malformedCode = `export default function Example() { return <>
47
47
  <div></span>
48
- }`;
48
+ </>; }`;
49
49
  expect(() => {
50
50
  compile(malformedCode, 'test.tsrx');
51
51
  }).toThrow('Expected closing tag to match opening tag');
52
52
  });
53
53
 
54
54
  it('should throw error for completely unclosed tag', () => {
55
- const malformedCode = `export default component Example() {
55
+ const malformedCode = `export default function Example() { return <>
56
56
  <div>content
57
- }`;
57
+ </>; }`;
58
58
 
59
59
  expect(() => {
60
60
  compile(malformedCode, 'test.tsrx');
61
- }).toThrow('Unclosed tag');
61
+ }).toThrow('Expected closing tag to match opening tag');
62
62
  });
63
63
 
64
64
  it('should throw error for interpolating children as text', () => {
65
65
  const code = `
66
- export component Layout({ children }) {
66
+ export function Layout({ children }) { return <>
67
67
  <div>{children}</div>
68
- }
68
+ </>; }
69
69
  `;
70
70
 
71
71
  expect(() => {
@@ -75,9 +75,9 @@ describe('basic client > errors', () => {
75
75
 
76
76
  it('should throw error for interpolating props.children as text', () => {
77
77
  const code = `
78
- export component Layout(props) {
78
+ export function Layout(props) { return <>
79
79
  <div>{props.children}</div>
80
- }
80
+ </>; }
81
81
  `;
82
82
 
83
83
  expect(() => {
@@ -87,9 +87,9 @@ describe('basic client > errors', () => {
87
87
 
88
88
  it('should throw error for calling children as a function', () => {
89
89
  const code = `
90
- export component Layout({ children }) {
90
+ export function Layout({ children }) { return <>
91
91
  {children()}
92
- }
92
+ </>; }
93
93
  `;
94
94
 
95
95
  expect(() => {
@@ -101,9 +101,9 @@ describe('basic client > errors', () => {
101
101
 
102
102
  it('should throw error for calling props.children as a function', () => {
103
103
  const code = `
104
- export component Layout(props) {
104
+ export function Layout(props) { return <>
105
105
  {props.children()}
106
- }
106
+ </>; }
107
107
  `;
108
108
 
109
109
  expect(() => {
@@ -114,18 +114,18 @@ describe('basic client > errors', () => {
114
114
  });
115
115
 
116
116
  it('errors on mutating tracked value inside computed track() evaluation', () => {
117
- component Basic() {
118
- let &[count] = track(0);
119
-
120
- const &[doubled] = track(() => {
121
- try {
122
- count *= 2;
123
- } catch (e) {
124
- error = (e as Error).message;
125
- }
126
- });
127
-
128
- <p>{doubled}</p>
117
+ function Basic() {
118
+ return <>
119
+ let &[count] = track(0);
120
+ const &[doubled] = track(() => {
121
+ try {
122
+ count *= 2;
123
+ } catch (e) {
124
+ error = (e as Error).message;
125
+ }
126
+ });
127
+ <p>{doubled}</p>
128
+ </>;
129
129
  }
130
130
 
131
131
  render(Basic);
@@ -136,20 +136,20 @@ describe('basic client > errors', () => {
136
136
  });
137
137
 
138
138
  it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
139
- component Basic() {
140
- let &[count] = track(0);
141
-
142
- const &[doubled] = track(() => {
143
- try {
144
- untrack(() => {
145
- count *= 2;
146
- });
147
- } catch (e) {
148
- error = (e as Error).message;
149
- }
150
- });
151
-
152
- <p>{doubled}</p>
139
+ function Basic() {
140
+ return <>
141
+ let &[count] = track(0);
142
+ const &[doubled] = track(() => {
143
+ try {
144
+ untrack(() => {
145
+ count *= 2;
146
+ });
147
+ } catch (e) {
148
+ error = (e as Error).message;
149
+ }
150
+ });
151
+ <p>{doubled}</p>
152
+ </>;
153
153
  }
154
154
 
155
155
  render(Basic);
@@ -160,19 +160,19 @@ describe('basic client > errors', () => {
160
160
  });
161
161
 
162
162
  it('errors on mutating a tracked variable in track() getter', () => {
163
- component Basic() {
164
- let &[count] = track(0);
165
-
166
- const &[doubled] = track(0, (value) => {
167
- try {
168
- count += 1;
169
- } catch (e) {
170
- error = (e as Error).message;
171
- }
172
- return value;
173
- });
174
-
175
- <p>{doubled}</p>
163
+ function Basic() {
164
+ return <>
165
+ let &[count] = track(0);
166
+ const &[doubled] = track(0, (value) => {
167
+ try {
168
+ count += 1;
169
+ } catch (e) {
170
+ error = (e as Error).message;
171
+ }
172
+ return value;
173
+ });
174
+ <p>{doubled}</p>
175
+ </>;
176
176
  }
177
177
 
178
178
  render(Basic);
@@ -184,14 +184,14 @@ describe('basic client > errors', () => {
184
184
 
185
185
  it('should throw error for await inside client components', () => {
186
186
  const code = `
187
- export default component App() {
187
+ export default async function App() { return <>
188
188
  let data = 'initial';
189
189
  if (true) {
190
190
  await new Promise(r => setTimeout(r, 100));
191
191
  data = 'loaded';
192
192
  }
193
193
  <div>{data}</div>
194
- }
194
+ </>; }
195
195
  `;
196
196
  expect(() => {
197
197
  compile(code, 'test.tsrx', { mode: 'client' });
@@ -200,39 +200,39 @@ describe('basic client > errors', () => {
200
200
 
201
201
  it('should throw error for while loop inside a component', () => {
202
202
  const code = `
203
- export default component App() {
203
+ export default function App() { return <>
204
204
  let i = 0;
205
205
  while (i < 10) {
206
206
  i++;
207
207
  }
208
208
  <div>{i}</div>
209
- }
209
+ </>; }
210
210
  `;
211
211
  expect(() => {
212
212
  compile(code, 'test.tsrx');
213
- }).toThrow('While loops are not supported in components.');
213
+ }).toThrow('While loops are not supported in TSRX templates.');
214
214
  });
215
215
 
216
216
  it('should throw error for do...while loop inside a component', () => {
217
217
  const code = `
218
- export default component App() {
218
+ export default function App() { return <>
219
219
  let i = 0;
220
220
  do {
221
221
  i++;
222
222
  } while (i < 10);
223
223
  <div>{i}</div>
224
- }
224
+ </>; }
225
225
  `;
226
226
  expect(() => {
227
227
  compile(code, 'test.tsrx');
228
- }).toThrow('Do...while loops are not supported in components.');
228
+ }).toThrow('Do...while loops are not supported in TSRX templates.');
229
229
  });
230
230
 
231
231
  it('should allow JSX fragments in TSRX templates as <tsx> shorthand', () => {
232
232
  const code = `
233
- export default component SafeProfile() {
233
+ export default function SafeProfile() { return <>
234
234
  <b><>{111}</></b>
235
- }
235
+ </>; }
236
236
  `;
237
237
 
238
238
  expect(() => {
@@ -242,9 +242,9 @@ describe('basic client > errors', () => {
242
242
 
243
243
  it('should allow JSX fragments inside tsx blocks', () => {
244
244
  const code = `
245
- export default component SafeProfile() {
245
+ export default function SafeProfile() { return <>
246
246
  <tsx><>{111}</></tsx>
247
- }
247
+ </>; }
248
248
  `;
249
249
 
250
250
  expect(() => {
@@ -254,7 +254,7 @@ describe('basic client > errors', () => {
254
254
 
255
255
  it('should not throw error for while loop inside a function within a component', () => {
256
256
  const code = `
257
- export default component App() {
257
+ export default function App() { return <>
258
258
  const compute = () => {
259
259
  let i = 0;
260
260
  while (i < 10) {
@@ -263,7 +263,7 @@ describe('basic client > errors', () => {
263
263
  return i;
264
264
  };
265
265
  <div>{compute()}</div>
266
- }
266
+ </>; }
267
267
  `;
268
268
  expect(() => {
269
269
  compile(code, 'test.tsrx');
@@ -272,7 +272,7 @@ describe('basic client > errors', () => {
272
272
 
273
273
  it('should not throw error for do...while loop inside a function within a component', () => {
274
274
  const code = `
275
- export default component App() {
275
+ export default function App() { return <>
276
276
  const compute = () => {
277
277
  let i = 0;
278
278
  do {
@@ -281,7 +281,7 @@ describe('basic client > errors', () => {
281
281
  return i;
282
282
  };
283
283
  <div>{compute()}</div>
284
- }
284
+ </>; }
285
285
  `;
286
286
  expect(() => {
287
287
  compile(code, 'test.tsrx');
@@ -290,10 +290,10 @@ describe('basic client > errors', () => {
290
290
 
291
291
  it('should throw error for variables using the reserved _$_ prefix', () => {
292
292
  const code = `
293
- export default component App() {
293
+ export default function App() { return <>
294
294
  const _$_test = 'hello';
295
295
  <div>{_$_test}</div>
296
- }
296
+ </>; }
297
297
  `;
298
298
  expect(() => {
299
299
  compile(code, 'test.tsrx');
@@ -3,22 +3,23 @@ import { flushSync, track } from 'ripple';
3
3
 
4
4
  describe('basic client > events', () => {
5
5
  it('renders with different event types', () => {
6
- component Basic() {
7
- let &[focusCount] = track(0);
8
- let &[clickCount] = track(0);
9
-
10
- <button
11
- onFocus={() => {
12
- focusCount++;
13
- }}
14
- onClick={() => {
15
- clickCount++;
16
- }}
17
- >
18
- {'Test Button'}
19
- </button>
20
- <div class="focus-count">{focusCount}</div>
21
- <div class="click-count">{clickCount}</div>
6
+ function Basic() {
7
+ return <>
8
+ let &[focusCount] = track(0);
9
+ let &[clickCount] = track(0);
10
+ <button
11
+ onFocus={() => {
12
+ focusCount++;
13
+ }}
14
+ onClick={() => {
15
+ clickCount++;
16
+ }}
17
+ >
18
+ {'Test Button'}
19
+ </button>
20
+ <div class="focus-count">{focusCount}</div>
21
+ <div class="click-count">{clickCount}</div>
22
+ </>;
22
23
  }
23
24
 
24
25
  render(Basic);
@@ -37,28 +38,29 @@ describe('basic client > events', () => {
37
38
  });
38
39
 
39
40
  it('renders with capture events', () => {
40
- component Basic() {
41
- let &[captureClicks] = track(0);
42
- let &[bubbleClicks] = track(0);
43
-
44
- <div
45
- onClick={{
46
- handleEvent: () => {
47
- captureClicks++;
48
- },
49
- capture: true,
50
- }}
51
- >
52
- <button
53
- onClick={() => {
54
- bubbleClicks++;
41
+ function Basic() {
42
+ return <>
43
+ let &[captureClicks] = track(0);
44
+ let &[bubbleClicks] = track(0);
45
+ <div
46
+ onClick={{
47
+ handleEvent: () => {
48
+ captureClicks++;
49
+ },
50
+ capture: true,
55
51
  }}
56
52
  >
57
- {'Click me'}
58
- </button>
59
- <div class="capture-count">{captureClicks}</div>
60
- <div class="bubble-count">{bubbleClicks}</div>
61
- </div>
53
+ <button
54
+ onClick={() => {
55
+ bubbleClicks++;
56
+ }}
57
+ >
58
+ {'Click me'}
59
+ </button>
60
+ <div class="capture-count">{captureClicks}</div>
61
+ <div class="bubble-count">{bubbleClicks}</div>
62
+ </div>
63
+ </>;
62
64
  }
63
65
 
64
66
  render(Basic);
@@ -75,26 +77,25 @@ describe('basic client > events', () => {
75
77
  });
76
78
 
77
79
  it('renders with event listeners in spread props', () => {
78
- component Basic() {
79
- let &[count] = track(0);
80
-
81
- const minus = {
82
- onClick() {
83
- count--;
84
- },
85
- };
86
-
87
- const plus = {
88
- onClick() {
89
- count++;
90
- },
91
- };
92
-
93
- <div>
94
- <button {...minus} class="minus">{'-'}</button>
95
- <span class="count">{count}</span>
96
- <button {...plus} class="plus">{'+'}</button>
97
- </div>
80
+ function Basic() {
81
+ return <>
82
+ let &[count] = track(0);
83
+ const minus = {
84
+ onClick() {
85
+ count--;
86
+ },
87
+ };
88
+ const plus = {
89
+ onClick() {
90
+ count++;
91
+ },
92
+ };
93
+ <div>
94
+ <button {...minus} class="minus">{'-'}</button>
95
+ <span class="count">{count}</span>
96
+ <button {...plus} class="plus">{'+'}</button>
97
+ </div>
98
+ </>;
98
99
  }
99
100
 
100
101
  render(Basic);
@@ -124,15 +125,16 @@ describe('basic client > events', () => {
124
125
  });
125
126
 
126
127
  it('removes event listeners from spread props when they are replaced by another prop', () => {
127
- component Basic() {
128
- let &[enabled] = track(true);
129
- let &[count] = track(0);
130
-
131
- <button class="target" {...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}>
132
- {'target'}
133
- </button>
134
- <button class="toggle" onClick={() => (enabled = false)}>{'toggle'}</button>
135
- <span class="count">{count}</span>
128
+ function Basic() {
129
+ return <>
130
+ let &[enabled] = track(true);
131
+ let &[count] = track(0);
132
+ <button class="target" {...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}>
133
+ {'target'}
134
+ </button>
135
+ <button class="toggle" onClick={() => (enabled = false)}>{'toggle'}</button>
136
+ <span class="count">{count}</span>
137
+ </>;
136
138
  }
137
139
 
138
140
  render(Basic);
@@ -154,26 +156,26 @@ describe('basic client > events', () => {
154
156
  });
155
157
 
156
158
  it('handles both delegated and non-delegated events in spread props', () => {
157
- component Basic() {
158
- let &[clickCount] = track(0);
159
- let &[focusCount] = track(0);
160
-
161
- const mixedHandler = {
162
- onClick() {
163
- // Delegated event
164
- clickCount++;
165
- },
166
- onFocus() {
167
- // Non-delegated event
168
- focusCount++;
169
- },
170
- };
171
-
172
- <div>
173
- <button {...mixedHandler} class="mixed-button">{'Test'}</button>
174
- <span class="click-count">{clickCount}</span>
175
- <span class="focus-count">{focusCount}</span>
176
- </div>
159
+ function Basic() {
160
+ return <>
161
+ let &[clickCount] = track(0);
162
+ let &[focusCount] = track(0);
163
+ const mixedHandler = {
164
+ onClick() {
165
+ // Delegated event
166
+ clickCount++;
167
+ },
168
+ onFocus() {
169
+ // Non-delegated event
170
+ focusCount++;
171
+ },
172
+ };
173
+ <div>
174
+ <button {...mixedHandler} class="mixed-button">{'Test'}</button>
175
+ <span class="click-count">{clickCount}</span>
176
+ <span class="focus-count">{focusCount}</span>
177
+ </div>
178
+ </>;
177
179
  }
178
180
 
179
181
  render(Basic);
@@ -197,36 +199,33 @@ describe('basic client > events', () => {
197
199
  });
198
200
 
199
201
  it('renders with complex event handling and state updates', () => {
200
- component Basic() {
201
- let &[counter] = track(0);
202
- let &[history] = track<string[]>([]);
203
- let &[isEven] = track(true);
204
-
205
- const handleIncrement = () => {
206
- counter++;
207
- history = [...history, `Inc to ${counter}`];
208
- isEven = counter % 2 === 0;
209
- };
210
-
211
- const handleDecrement = () => {
212
- counter--;
213
- history = [...history, `Dec to ${counter}`];
214
- isEven = counter % 2 === 0;
215
- };
216
-
217
- const handleReset = () => {
218
- counter = 0;
219
- history = [...history, 'Reset'];
220
- isEven = true;
221
- };
222
-
223
- <div class="counter">{counter}</div>
224
- <div class="parity">{isEven ? 'Even' : 'Odd'}</div>
225
- <div class="history-count">{history.length}</div>
226
-
227
- <button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
228
- <button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
229
- <button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
202
+ function Basic() {
203
+ return <>
204
+ let &[counter] = track(0);
205
+ let &[history] = track<string[]>([]);
206
+ let &[isEven] = track(true);
207
+ const handleIncrement = () => {
208
+ counter++;
209
+ history = [...history, `Inc to ${counter}`];
210
+ isEven = counter % 2 === 0;
211
+ };
212
+ const handleDecrement = () => {
213
+ counter--;
214
+ history = [...history, `Dec to ${counter}`];
215
+ isEven = counter % 2 === 0;
216
+ };
217
+ const handleReset = () => {
218
+ counter = 0;
219
+ history = [...history, 'Reset'];
220
+ isEven = true;
221
+ };
222
+ <div class="counter">{counter}</div>
223
+ <div class="parity">{isEven ? 'Even' : 'Odd'}</div>
224
+ <div class="history-count">{history.length}</div>
225
+ <button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
226
+ <button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
227
+ <button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
228
+ </>;
230
229
  }
231
230
 
232
231
  render(Basic);