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
@@ -14,19 +14,19 @@ describe('passing reactivity between boundaries tests', () => {
14
14
  return double;
15
15
  }
16
16
 
17
- component App() {
18
- let &[count, countTracked] = track(0);
19
-
20
- const &[double] = createDouble(countTracked);
21
-
22
- <div>{'Double: ' + double}</div>
23
- <button
24
- onClick={() => {
25
- count++;
26
- }}
27
- >
28
- {'Increment'}
29
- </button>
17
+ function App() {
18
+ return <>
19
+ let &[count, countTracked] = track(0);
20
+ const &[double] = createDouble(countTracked);
21
+ <div>{'Double: ' + double}</div>
22
+ <button
23
+ onClick={() => {
24
+ count++;
25
+ }}
26
+ >
27
+ {'Increment'}
28
+ </button>
29
+ </>;
30
30
  }
31
31
 
32
32
  render(App);
@@ -63,19 +63,19 @@ describe('passing reactivity between boundaries tests', () => {
63
63
  return { double };
64
64
  }
65
65
 
66
- component App() {
67
- let count = track(0);
68
-
69
- const { double } = createDouble({ count });
70
-
71
- <div>{'Double: ' + double.value}</div>
72
- <button
73
- onClick={() => {
74
- count.value++;
75
- }}
76
- >
77
- {'Increment'}
78
- </button>
66
+ function App() {
67
+ return <>
68
+ let count = track(0);
69
+ const { double } = createDouble({ count });
70
+ <div>{'Double: ' + double.value}</div>
71
+ <button
72
+ onClick={() => {
73
+ count.value++;
74
+ }}
75
+ >
76
+ {'Increment'}
77
+ </button>
78
+ </>;
79
79
  }
80
80
 
81
81
  render(App);
@@ -4,9 +4,9 @@ exports[`compiler > assignments > compiles tracked values in effect with assignm
4
4
 
5
5
  exports[`compiler > assignments > compiles tracked values in effect with update expressions 1`] = `
6
6
  "_$_.untrack(() => {
7
- state.preIncrement = _$_.update_pre(lazy);
8
- state.postIncrement = _$_.update(lazy);
9
- state.preDecrement = _$_.update_pre(lazy, -1);
10
- state.postDecrement = _$_.update(lazy, -1);
11
- });"
7
+ state.preIncrement = _$_.update_pre(lazy);
8
+ state.postIncrement = _$_.update(lazy);
9
+ state.preDecrement = _$_.update_pre(lazy, -1);
10
+ state.postDecrement = _$_.update(lazy, -1);
11
+ });"
12
12
  `;
@@ -4,9 +4,9 @@ exports[`compiler > assignments > compiles tracked values in effect with assignm
4
4
 
5
5
  exports[`compiler > assignments > compiles tracked values in effect with update expressions 1`] = `
6
6
  "_$_.untrack(() => {
7
- state.preIncrement = _$_.update_pre(lazy);
8
- state.postIncrement = _$_.update(lazy);
9
- state.preDecrement = _$_.update_pre(lazy, -1);
10
- state.postDecrement = _$_.update(lazy, -1);
11
- });"
7
+ state.preIncrement = _$_.update_pre(lazy);
8
+ state.postIncrement = _$_.update(lazy);
9
+ state.preDecrement = _$_.update_pre(lazy, -1);
10
+ state.postDecrement = _$_.update(lazy, -1);
11
+ });"
12
12
  `;
@@ -1,72 +1,68 @@
1
1
  import { RippleArray, effect, track, untrack } from 'ripple';
2
2
  import { compile } from '@tsrx/ripple';
3
3
 
4
- const EFFECT_BODY_REGEX = /_\$\_\.effect\(\(\) => \{([\s\S]*?)\n\t\}\);/;
4
+ const EFFECT_BODY_REGEX = /_\$\_\.effect\(\(\) => \{([\s\S]*?)\n\t\t\}\);/;
5
5
 
6
6
  describe('compiler > assignments', () => {
7
7
  it('properly handles JS assignments, reads and updates to array indices', () => {
8
8
  const logs: (number | undefined)[] = [];
9
9
 
10
- component App() {
11
- let items: number[] = [];
12
- let tracked_items = track<number[]>([]);
13
- let items2 = new Array();
14
- let items3: RippleArray<number> = new RippleArray();
15
- let i = 0;
16
-
17
- logs.push(items[0]);
18
- logs.push(items[i]);
19
- logs.push(tracked_items.value[0]);
20
- logs.push(tracked_items.value[i]);
21
- logs.push(items2[0]);
22
- logs.push(items2[i]);
23
- logs.push(items3[0]);
24
- logs.push(items3[i]);
25
-
26
- items[0] = 123;
27
- items[i] = 123;
28
- tracked_items.value[0] = 123;
29
- tracked_items.value[i] = 123;
30
- items2[0] = 123;
31
- items2[i] = 123;
32
- items3[0] = 123;
33
- items3[i] = 123;
34
-
35
- logs.push(items[0]);
36
- logs.push(items[i]);
37
- logs.push(tracked_items.value[0]);
38
- logs.push(tracked_items.value[i]);
39
- logs.push(items2[0]);
40
- logs.push(items2[i]);
41
- logs.push(items3[0]);
42
- logs.push(items3[i]);
43
-
44
- items[0]++;
45
- items[i]++;
46
- tracked_items.value[0]++;
47
- tracked_items.value[i]++;
48
- items2[0]++;
49
- items2[i]++;
50
- items3[0]++;
51
- items3[i]++;
52
-
53
- logs.push(items[0]);
54
- logs.push(items[i]);
55
- logs.push(tracked_items.value[0]);
56
- logs.push(tracked_items.value[i]);
57
- logs.push(items2[0]);
58
- logs.push(items2[i]);
59
- logs.push(items3[0]);
60
- logs.push(items3[i]);
61
-
62
- logs.push(--items[0]);
63
- logs.push(--items[i]);
64
- logs.push(--tracked_items.value[0]);
65
- logs.push(--tracked_items.value[i]);
66
- logs.push(--items2[0]);
67
- logs.push(--items2[i]);
68
- logs.push(--items3[0]);
69
- logs.push(--items3[i]);
10
+ function App() {
11
+ return <>
12
+ let items: number[] = [];
13
+ let tracked_items = track<number[]>([]);
14
+ let items2 = new Array();
15
+ let items3: RippleArray<number> = new RippleArray();
16
+ let i = 0;
17
+ logs.push(items[0]);
18
+ logs.push(items[i]);
19
+ logs.push(tracked_items.value[0]);
20
+ logs.push(tracked_items.value[i]);
21
+ logs.push(items2[0]);
22
+ logs.push(items2[i]);
23
+ logs.push(items3[0]);
24
+ logs.push(items3[i]);
25
+ items[0] = 123;
26
+ items[i] = 123;
27
+ tracked_items.value[0] = 123;
28
+ tracked_items.value[i] = 123;
29
+ items2[0] = 123;
30
+ items2[i] = 123;
31
+ items3[0] = 123;
32
+ items3[i] = 123;
33
+ logs.push(items[0]);
34
+ logs.push(items[i]);
35
+ logs.push(tracked_items.value[0]);
36
+ logs.push(tracked_items.value[i]);
37
+ logs.push(items2[0]);
38
+ logs.push(items2[i]);
39
+ logs.push(items3[0]);
40
+ logs.push(items3[i]);
41
+ items[0]++;
42
+ items[i]++;
43
+ tracked_items.value[0]++;
44
+ tracked_items.value[i]++;
45
+ items2[0]++;
46
+ items2[i]++;
47
+ items3[0]++;
48
+ items3[i]++;
49
+ logs.push(items[0]);
50
+ logs.push(items[i]);
51
+ logs.push(tracked_items.value[0]);
52
+ logs.push(tracked_items.value[i]);
53
+ logs.push(items2[0]);
54
+ logs.push(items2[i]);
55
+ logs.push(items3[0]);
56
+ logs.push(items3[i]);
57
+ logs.push(--items[0]);
58
+ logs.push(--items[i]);
59
+ logs.push(--tracked_items.value[0]);
60
+ logs.push(--tracked_items.value[i]);
61
+ logs.push(--items2[0]);
62
+ logs.push(--items2[i]);
63
+ logs.push(--items3[0]);
64
+ logs.push(--items3[i]);
65
+ </>;
70
66
  }
71
67
 
72
68
  render(App);
@@ -109,13 +105,13 @@ describe('compiler > assignments', () => {
109
105
 
110
106
  it('compiles tracked values in effect with assignment expression', () => {
111
107
  const source = `import { track, effect } from 'ripple';
112
- component App() {
108
+ function App() { return <>
113
109
  let &[count] = track(0);
114
110
 
115
111
  effect(() => {
116
112
  state.count = count;
117
113
  });
118
- }`;
114
+ </>; }`;
119
115
  const result = compile(source, 'test.tsrx');
120
116
  const effect_match = result.code.match(EFFECT_BODY_REGEX);
121
117
  expect(effect_match?.[1].trim()).toMatchSnapshot();
@@ -123,7 +119,7 @@ component App() {
123
119
 
124
120
  it('compiles tracked values in effect with update expressions', () => {
125
121
  const source = `import { track, effect, untrack } from 'ripple';
126
- component App() {
122
+ function App() { return <>
127
123
  let &[count] = track(5);
128
124
 
129
125
  effect(() => {
@@ -134,7 +130,7 @@ component App() {
134
130
  state.postDecrement = count--;
135
131
  });
136
132
  });
137
- }`;
133
+ </>; }`;
138
134
  const result = compile(source, 'test.tsrx');
139
135
  const effect_match = result.code.match(EFFECT_BODY_REGEX);
140
136
  expect(effect_match?.[1].trim()).toMatchSnapshot();
@@ -142,15 +138,15 @@ component App() {
142
138
 
143
139
  it('compiles unknown lazy array destructuring through lazy array helpers', () => {
144
140
  const source = `import { track } from 'ripple';
145
- component Child({ tr: &[count, tr] }) {
141
+ function Child({ tr: &[count, tr] }) { return <>
146
142
  count++;
147
143
  tr[0]++;
148
144
  <div>{count}</div>
149
- }
150
- component App() {
145
+ </>; }
146
+ function App() { return <>
151
147
  let tracked = track(0);
152
148
  <Child tr={tracked} />
153
- }`;
149
+ </>; }`;
154
150
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
155
151
 
156
152
  expect(code).toContain('_$_.lazy_array_get(lazy, 0)');
@@ -162,13 +158,13 @@ component App() {
162
158
  });
163
159
 
164
160
  it('compiles writes to unknown lazy array index 1 through lazy array helpers', () => {
165
- const source = `component Child({ pair: &[first, second] }) {
161
+ const source = `function Child({ pair: &[first, second] }) { return <>
166
162
  second = 10;
167
163
  <div>{first}</div>
168
- }
169
- component App() {
164
+ </>; }
165
+ function App() { return <>
170
166
  <Child pair={[0, 1]} />
171
- }`;
167
+ </>; }`;
172
168
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
173
169
 
174
170
  expect(code).toContain('_$_.lazy_array_set(lazy, 10, 1)');
@@ -176,13 +172,13 @@ component App() {
176
172
  });
177
173
 
178
174
  it('does not double-wrap member access on lazy array value bindings', () => {
179
- const source = `component Child({ pair: &[first] }) {
175
+ const source = `function Child({ pair: &[first] }) { return <>
180
176
  let value = first[0];
181
177
  <div>{value}</div>
182
- }
183
- component App() {
178
+ </>; }
179
+ function App() { return <>
184
180
  <Child pair={[{ 0: 'x' }]} />
185
- }`;
181
+ </>; }`;
186
182
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
187
183
 
188
184
  expect(code).toContain('let value = _$_.lazy_array_get(lazy, 0)[0];');
@@ -191,13 +187,13 @@ component App() {
191
187
 
192
188
  it('throws on indexed access through known tracked lazy destructures', () => {
193
189
  const source = `import { track } from 'ripple';
194
- component App() {
190
+ function App() { return <>
195
191
  let &[value, tracked_ref] = track({ 0: 'x' });
196
192
  let nested = value[0];
197
193
  tracked_ref[0] = { 0: 'y' };
198
194
  let next = value[0];
199
195
  <div>{nested}{next}</div>
200
- }`;
196
+ </>; }`;
201
197
 
202
198
  expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
203
199
  /Use \.value or &\[\] lazy destructuring/,
@@ -206,14 +202,14 @@ component App() {
206
202
 
207
203
  it('throws on known tracked indexed access', () => {
208
204
  const source = `import { track } from 'ripple';
209
- component App() {
205
+ function App() { return <>
210
206
  let tracked = track(0);
211
207
  tracked[0]++;
212
208
  tracked[0] = tracked[0] + 1;
213
209
  let value = tracked[0];
214
210
  let ref = tracked[1];
215
211
  <div>{value}</div>
216
- }`;
212
+ </>; }`;
217
213
 
218
214
  expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
219
215
  /Use \.value or &\[\] lazy destructuring/,
@@ -3,13 +3,13 @@ import { parse, compile } from '@tsrx/ripple';
3
3
  describe('compiler > attributes', () => {
4
4
  it('generates valid JavaScript for component props with hyphenated attributes', () => {
5
5
  const source = `
6
- component Child(props) {
6
+ function Child(props) { return <>
7
7
  <div />
8
- }
8
+ </>; }
9
9
 
10
- export default component App() {
10
+ export default function App() { return <>
11
11
  <Child data-scope="test" aria-label="accessible" class="valid" />
12
- }`;
12
+ </>; }`;
13
13
 
14
14
  const result = compile(source, 'test.tsrx', { mode: 'client' });
15
15
 
@@ -29,8 +29,8 @@ describe('compiler > attributes', () => {
29
29
 
30
30
  testCases.forEach(({ attr, expected }) => {
31
31
  const source = `
32
- component Child(props) { <div /> }
33
- export default component App() { <Child ${attr} /> }`;
32
+ function Child(props) { return <> <div /> </>; }
33
+ export default function App() { return <> <Child ${attr} /> </>; }`;
34
34
 
35
35
  const result = compile(source, 'test.tsrx', { mode: 'client' });
36
36
  expect(result.code).toMatch(expected);
@@ -39,11 +39,11 @@ describe('compiler > attributes', () => {
39
39
 
40
40
  it('handles mixed valid and invalid attribute identifiers correctly', () => {
41
41
  const source = `
42
- component Child(props) {
42
+ function Child(props) { return <>
43
43
  <div />
44
- }
44
+ </>; }
45
45
 
46
- export default component App() {
46
+ export default function App() { return <>
47
47
  <Child
48
48
  validProp="valid"
49
49
  class="valid"
@@ -52,7 +52,7 @@ describe('compiler > attributes', () => {
52
52
  aria-invalid="invalid"
53
53
  custom-prop="invalid"
54
54
  />
55
- }`;
55
+ </>; }`;
56
56
 
57
57
  const result = compile(source, 'test.tsrx', { mode: 'client' });
58
58
 
@@ -69,18 +69,18 @@ describe('compiler > attributes', () => {
69
69
 
70
70
  it('ensures generated code is syntactically valid JavaScript', () => {
71
71
  const source = `
72
- component Child(props) {
72
+ function Child(props) { return <>
73
73
  <div />
74
- }
74
+ </>; }
75
75
 
76
- export default component App() {
76
+ export default function App() { return <>
77
77
  <Child data-scope="test" />
78
- }`;
78
+ </>; }`;
79
79
 
80
80
  const result = compile(source, 'test.tsrx', { mode: 'client' });
81
81
 
82
82
  // Extract the props object from the generated code and test it's valid JavaScript
83
- const match = result.code.match(/Child\([^,]+,\s*(\{[^}]+\})/);
83
+ const match = result.code.match(/_\$_.render_component\(Child,\s*[^,]+,\s*(\{[^}]+\})/);
84
84
  expect(match).toBeTruthy();
85
85
 
86
86
  const propsObject = match?.[1];