ripple 0.3.72 → 0.3.76

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 (172) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +4 -10
  4. package/src/runtime/dynamic-client.js +33 -0
  5. package/src/runtime/dynamic-server.js +80 -0
  6. package/src/runtime/index-client.js +5 -13
  7. package/src/runtime/index-server.js +2 -0
  8. package/src/runtime/internal/client/blocks.js +6 -27
  9. package/src/runtime/internal/client/composite.js +11 -6
  10. package/src/runtime/internal/client/for.js +80 -5
  11. package/src/runtime/internal/client/index.js +0 -2
  12. package/src/runtime/internal/client/render.js +5 -2
  13. package/src/runtime/internal/client/types.d.ts +0 -10
  14. package/src/runtime/internal/server/index.js +8 -1
  15. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  16. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  18. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  19. package/tests/client/array/array.derived.test.tsrx +97 -109
  20. package/tests/client/array/array.iteration.test.tsrx +28 -28
  21. package/tests/client/array/array.mutations.test.tsrx +68 -68
  22. package/tests/client/array/array.static.test.tsrx +82 -92
  23. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  24. package/tests/client/async-suspend.test.tsrx +180 -179
  25. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  26. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  27. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  28. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  29. package/tests/client/basic/basic.components.test.tsrx +198 -220
  30. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  31. package/tests/client/basic/basic.events.test.tsrx +80 -85
  32. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  33. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  34. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  35. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  36. package/tests/client/basic/basic.styling.test.tsrx +16 -14
  37. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  38. package/tests/client/boundaries.test.tsrx +18 -18
  39. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  40. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  41. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  42. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  43. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  44. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  45. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  46. package/tests/client/composite/composite.dynamic-components.test.tsrx +62 -47
  47. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  48. package/tests/client/composite/composite.props.test.tsrx +66 -74
  49. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  50. package/tests/client/composite/composite.render.test.tsrx +92 -101
  51. package/tests/client/computed-properties.test.tsrx +14 -18
  52. package/tests/client/context.test.tsrx +14 -18
  53. package/tests/client/css/global-additional-cases.test.tsrx +493 -439
  54. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  55. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  56. package/tests/client/css/global-basic.test.tsrx +105 -98
  57. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  58. package/tests/client/css/global-combinators.test.tsrx +83 -78
  59. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  60. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  61. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  62. package/tests/client/css/global-nested.test.tsrx +88 -78
  63. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  64. package/tests/client/css/global-scoping.test.tsrx +145 -125
  65. package/tests/client/css/style-identifier.test.tsrx +65 -72
  66. package/tests/client/date.test.tsrx +83 -83
  67. package/tests/client/dynamic-elements.test.tsrx +318 -299
  68. package/tests/client/events.test.tsrx +252 -266
  69. package/tests/client/for.test.tsrx +120 -127
  70. package/tests/client/head.test.tsrx +74 -48
  71. package/tests/client/html.test.tsrx +37 -49
  72. package/tests/client/input-value.test.tsrx +1125 -1354
  73. package/tests/client/lazy-array.test.tsrx +10 -16
  74. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  75. package/tests/client/map.test.tsrx +39 -41
  76. package/tests/client/media-query.test.tsrx +15 -19
  77. package/tests/client/object.test.tsrx +46 -56
  78. package/tests/client/portal.test.tsrx +31 -37
  79. package/tests/client/ref.test.tsrx +173 -193
  80. package/tests/client/return.test.tsrx +62 -37
  81. package/tests/client/set.test.tsrx +33 -33
  82. package/tests/client/svg.test.tsrx +197 -216
  83. package/tests/client/switch.test.tsrx +201 -191
  84. package/tests/client/track-async-hydration.test.tsrx +14 -18
  85. package/tests/client/tracked-index-access.test.tsrx +18 -28
  86. package/tests/client/try.test.tsrx +494 -619
  87. package/tests/client/tsx.test.tsrx +286 -292
  88. package/tests/client/typescript-generics.test.tsrx +121 -129
  89. package/tests/client/url/url.derived.test.tsrx +21 -25
  90. package/tests/client/url/url.parsing.test.tsrx +35 -35
  91. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  92. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  93. package/tests/client/url/url.serialization.test.tsrx +8 -8
  94. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  95. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  96. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  97. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  98. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  99. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  100. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  101. package/tests/hydration/compiled/client/basic.js +390 -319
  102. package/tests/hydration/compiled/client/composite.js +52 -44
  103. package/tests/hydration/compiled/client/for.js +734 -604
  104. package/tests/hydration/compiled/client/head.js +183 -103
  105. package/tests/hydration/compiled/client/html.js +93 -86
  106. package/tests/hydration/compiled/client/if-children.js +95 -71
  107. package/tests/hydration/compiled/client/if.js +113 -89
  108. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  109. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  110. package/tests/hydration/compiled/client/reactivity.js +26 -24
  111. package/tests/hydration/compiled/client/return.js +8 -42
  112. package/tests/hydration/compiled/client/switch.js +208 -173
  113. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  114. package/tests/hydration/compiled/client/try.js +29 -21
  115. package/tests/hydration/compiled/server/basic.js +210 -221
  116. package/tests/hydration/compiled/server/composite.js +13 -14
  117. package/tests/hydration/compiled/server/for.js +427 -444
  118. package/tests/hydration/compiled/server/head.js +199 -189
  119. package/tests/hydration/compiled/server/html.js +33 -41
  120. package/tests/hydration/compiled/server/if-children.js +114 -117
  121. package/tests/hydration/compiled/server/if.js +77 -83
  122. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  123. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  124. package/tests/hydration/compiled/server/reactivity.js +24 -22
  125. package/tests/hydration/compiled/server/return.js +6 -18
  126. package/tests/hydration/compiled/server/switch.js +179 -176
  127. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  128. package/tests/hydration/compiled/server/try.js +31 -35
  129. package/tests/hydration/components/basic.tsrx +216 -258
  130. package/tests/hydration/components/composite.tsrx +32 -42
  131. package/tests/hydration/components/events.tsrx +81 -101
  132. package/tests/hydration/components/for.tsrx +270 -336
  133. package/tests/hydration/components/head.tsrx +43 -39
  134. package/tests/hydration/components/hmr.tsrx +16 -22
  135. package/tests/hydration/components/html-in-template.tsrx +15 -21
  136. package/tests/hydration/components/html.tsrx +442 -526
  137. package/tests/hydration/components/if-children.tsrx +107 -125
  138. package/tests/hydration/components/if.tsrx +68 -90
  139. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  140. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  141. package/tests/hydration/components/portal.tsrx +33 -41
  142. package/tests/hydration/components/reactivity.tsrx +26 -34
  143. package/tests/hydration/components/return.tsrx +4 -6
  144. package/tests/hydration/components/switch.tsrx +73 -78
  145. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  146. package/tests/hydration/components/try.tsrx +37 -51
  147. package/tests/hydration/switch.test.js +8 -8
  148. package/tests/server/await.test.tsrx +3 -3
  149. package/tests/server/basic.attributes.test.tsrx +117 -162
  150. package/tests/server/basic.components.test.tsrx +164 -194
  151. package/tests/server/basic.test.tsrx +299 -199
  152. package/tests/server/compiler.test.tsrx +142 -72
  153. package/tests/server/composite.props.test.tsrx +54 -58
  154. package/tests/server/composite.test.tsrx +165 -167
  155. package/tests/server/context.test.tsrx +13 -17
  156. package/tests/server/dynamic-elements.test.tsrx +147 -148
  157. package/tests/server/for.test.tsrx +115 -84
  158. package/tests/server/head.test.tsrx +54 -31
  159. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  160. package/tests/server/if.test.tsrx +49 -59
  161. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  162. package/tests/server/return.test.tsrx +58 -36
  163. package/tests/server/streaming-ssr.test.tsrx +4 -4
  164. package/tests/server/style-identifier.test.tsrx +61 -69
  165. package/tests/server/switch.test.tsrx +89 -97
  166. package/tests/server/track-async-serialization.test.tsrx +85 -103
  167. package/tests/server/try.test.tsrx +275 -360
  168. package/tests/utils/ref-types.test.js +72 -0
  169. package/tests/utils/vite-plugin-config.test.js +41 -74
  170. package/types/index.d.ts +29 -4
  171. package/src/runtime/internal/client/compat.js +0 -40
  172. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -5,17 +5,15 @@ describe('basic client > utilities', () => {
5
5
  let resolve: () => void;
6
6
  const promise = new Promise<void>((res) => (resolve = res));
7
7
 
8
- function Basic() {
9
- return <>
10
- let &[value] = track(0);
11
- effect(() => {
12
- untrack(() => {
13
- value++;
14
- tick().then(() => resolve());
15
- });
8
+ function Basic() @{
9
+ let &[value] = track(0);
10
+ effect(() => {
11
+ untrack(() => {
12
+ value++;
13
+ tick().then(() => resolve());
16
14
  });
17
- <p>{value}</p>
18
- </>;
15
+ });
16
+ <p>{value}</p>
19
17
  }
20
18
  render(Basic);
21
19
 
@@ -14,19 +14,19 @@ describe('passing reactivity between boundaries tests', () => {
14
14
  return double;
15
15
  }
16
16
 
17
- function App() {
18
- return <>
19
- let &[count, countTracked] = track(0);
20
- const &[double] = createDouble(countTracked);
21
- <div>{'Double: ' + double}</div>
17
+ function App() @{
18
+ let &[count, countTracked] = track(0);
19
+ const &[double] = createDouble(countTracked);
20
+ <>
21
+ <div>
22
+ {'Double: ' + double}
23
+ </div>
22
24
  <button
23
25
  onClick={() => {
24
26
  count++;
25
27
  }}
26
- >
27
- {'Increment'}
28
- </button>
29
- </>;
28
+ >{'Increment'}</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
- function App() {
67
- return <>
68
- let count = track(0);
69
- const { double } = createDouble({ count });
70
- <div>{'Double: ' + double.value}</div>
66
+ function App() @{
67
+ let count = track(0);
68
+ const { double } = createDouble({ count });
69
+ <>
70
+ <div>
71
+ {'Double: ' + double.value}
72
+ </div>
71
73
  <button
72
74
  onClick={() => {
73
75
  count.value++;
74
76
  }}
75
- >
76
- {'Increment'}
77
- </button>
78
- </>;
77
+ >{'Increment'}</button>
78
+ </>
79
79
  }
80
80
 
81
81
  render(App);
@@ -7,62 +7,61 @@ 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
- 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
- </>;
10
+ function 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
+ logs.push(items[0]);
17
+ logs.push(items[i]);
18
+ logs.push(tracked_items.value[0]);
19
+ logs.push(tracked_items.value[i]);
20
+ logs.push(items2[0]);
21
+ logs.push(items2[i]);
22
+ logs.push(items3[0]);
23
+ logs.push(items3[i]);
24
+ items[0] = 123;
25
+ items[i] = 123;
26
+ tracked_items.value[0] = 123;
27
+ tracked_items.value[i] = 123;
28
+ items2[0] = 123;
29
+ items2[i] = 123;
30
+ items3[0] = 123;
31
+ items3[i] = 123;
32
+ logs.push(items[0]);
33
+ logs.push(items[i]);
34
+ logs.push(tracked_items.value[0]);
35
+ logs.push(tracked_items.value[i]);
36
+ logs.push(items2[0]);
37
+ logs.push(items2[i]);
38
+ logs.push(items3[0]);
39
+ logs.push(items3[i]);
40
+ items[0]++;
41
+ items[i]++;
42
+ tracked_items.value[0]++;
43
+ tracked_items.value[i]++;
44
+ items2[0]++;
45
+ items2[i]++;
46
+ items3[0]++;
47
+ items3[i]++;
48
+ logs.push(items[0]);
49
+ logs.push(items[i]);
50
+ logs.push(tracked_items.value[0]);
51
+ logs.push(tracked_items.value[i]);
52
+ logs.push(items2[0]);
53
+ logs.push(items2[i]);
54
+ logs.push(items3[0]);
55
+ logs.push(items3[i]);
56
+ logs.push(--items[0]);
57
+ logs.push(--items[i]);
58
+ logs.push(--tracked_items.value[0]);
59
+ logs.push(--tracked_items.value[i]);
60
+ logs.push(--items2[0]);
61
+ logs.push(--items2[i]);
62
+ logs.push(--items3[0]);
63
+ logs.push(--items3[i]);
64
+ <></>
66
65
  }
67
66
 
68
67
  render(App);
@@ -105,13 +104,14 @@ describe('compiler > assignments', () => {
105
104
 
106
105
  it('compiles tracked values in effect with assignment expression', () => {
107
106
  const source = `import { track, effect } from 'ripple';
108
- function App() { return <>
107
+ function App() @{
109
108
  let &[count] = track(0);
110
109
 
111
110
  effect(() => {
112
111
  state.count = count;
113
112
  });
114
- </>; }`;
113
+ <></>
114
+ }`;
115
115
  const result = compile(source, 'test.tsrx');
116
116
  const effect_match = result.code.match(EFFECT_BODY_REGEX);
117
117
  expect(effect_match?.[1].trim()).toMatchSnapshot();
@@ -119,7 +119,7 @@ function App() { return <>
119
119
 
120
120
  it('compiles tracked values in effect with update expressions', () => {
121
121
  const source = `import { track, effect, untrack } from 'ripple';
122
- function App() { return <>
122
+ function App() @{
123
123
  let &[count] = track(5);
124
124
 
125
125
  effect(() => {
@@ -130,7 +130,8 @@ function App() { return <>
130
130
  state.postDecrement = count--;
131
131
  });
132
132
  });
133
- </>; }`;
133
+ <></>
134
+ }`;
134
135
  const result = compile(source, 'test.tsrx');
135
136
  const effect_match = result.code.match(EFFECT_BODY_REGEX);
136
137
  expect(effect_match?.[1].trim()).toMatchSnapshot();
@@ -138,15 +139,15 @@ function App() { return <>
138
139
 
139
140
  it('compiles unknown lazy array destructuring through lazy array helpers', () => {
140
141
  const source = `import { track } from 'ripple';
141
- function Child({ tr: &[count, tr] }) { return <>
142
+ function Child({ tr: &[count, tr] }) @{
142
143
  count++;
143
144
  tr[0]++;
144
145
  <div>{count}</div>
145
- </>; }
146
- function App() { return <>
146
+ }
147
+ function App() @{
147
148
  let tracked = track(0);
148
149
  <Child tr={tracked} />
149
- </>; }`;
150
+ }`;
150
151
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
151
152
 
152
153
  expect(code).toContain('_$_.lazy_array_get(lazy, 0)');
@@ -158,13 +159,13 @@ function App() { return <>
158
159
  });
159
160
 
160
161
  it('compiles writes to unknown lazy array index 1 through lazy array helpers', () => {
161
- const source = `function Child({ pair: &[first, second] }) { return <>
162
+ const source = `function Child({ pair: &[first, second] }) @{
162
163
  second = 10;
163
164
  <div>{first}</div>
164
- </>; }
165
- function App() { return <>
165
+ }
166
+ function App() @{
166
167
  <Child pair={[0, 1]} />
167
- </>; }`;
168
+ }`;
168
169
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
169
170
 
170
171
  expect(code).toContain('_$_.lazy_array_set(lazy, 10, 1)');
@@ -172,13 +173,13 @@ function App() { return <>
172
173
  });
173
174
 
174
175
  it('does not double-wrap member access on lazy array value bindings', () => {
175
- const source = `function Child({ pair: &[first] }) { return <>
176
+ const source = `function Child({ pair: &[first] }) @{
176
177
  let value = first[0];
177
178
  <div>{value}</div>
178
- </>; }
179
- function App() { return <>
179
+ }
180
+ function App() @{
180
181
  <Child pair={[{ 0: 'x' }]} />
181
- </>; }`;
182
+ }`;
182
183
  const { code } = compile(source, 'test.tsrx', { mode: 'client' });
183
184
 
184
185
  expect(code).toContain('let value = _$_.lazy_array_get(lazy, 0)[0];');
@@ -187,13 +188,13 @@ function App() { return <>
187
188
 
188
189
  it('throws on indexed access through known tracked lazy destructures', () => {
189
190
  const source = `import { track } from 'ripple';
190
- function App() { return <>
191
+ function App() @{
191
192
  let &[value, tracked_ref] = track({ 0: 'x' });
192
193
  let nested = value[0];
193
194
  tracked_ref[0] = { 0: 'y' };
194
195
  let next = value[0];
195
196
  <div>{nested}{next}</div>
196
- </>; }`;
197
+ }`;
197
198
 
198
199
  expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
199
200
  /Use \.value or &\[\] lazy destructuring/,
@@ -202,14 +203,14 @@ function App() { return <>
202
203
 
203
204
  it('throws on known tracked indexed access', () => {
204
205
  const source = `import { track } from 'ripple';
205
- function App() { return <>
206
+ function App() @{
206
207
  let tracked = track(0);
207
208
  tracked[0]++;
208
209
  tracked[0] = tracked[0] + 1;
209
210
  let value = tracked[0];
210
211
  let ref = tracked[1];
211
212
  <div>{value}</div>
212
- </>; }`;
213
+ }`;
213
214
 
214
215
  expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
215
216
  /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
- function Child(props) { return <>
6
+ function Child(props) @{
7
7
  <div />
8
- </>; }
8
+ }
9
9
 
10
- export default function App() { return <>
10
+ export default function App() @{
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,12 @@ describe('compiler > attributes', () => {
29
29
 
30
30
  testCases.forEach(({ attr, expected }) => {
31
31
  const source = `
32
- function Child(props) { return <> <div /> </>; }
33
- export default function App() { return <> <Child ${attr} /> </>; }`;
32
+ function Child(props) @{
33
+ <div />
34
+ }
35
+ export default function App() @{
36
+ <Child ${attr} />
37
+ }`;
34
38
 
35
39
  const result = compile(source, 'test.tsrx', { mode: 'client' });
36
40
  expect(result.code).toMatch(expected);
@@ -39,11 +43,11 @@ describe('compiler > attributes', () => {
39
43
 
40
44
  it('handles mixed valid and invalid attribute identifiers correctly', () => {
41
45
  const source = `
42
- function Child(props) { return <>
46
+ function Child(props) @{
43
47
  <div />
44
- </>; }
48
+ }
45
49
 
46
- export default function App() { return <>
50
+ export default function App() @{
47
51
  <Child
48
52
  validProp="valid"
49
53
  class="valid"
@@ -52,7 +56,7 @@ describe('compiler > attributes', () => {
52
56
  aria-invalid="invalid"
53
57
  custom-prop="invalid"
54
58
  />
55
- </>; }`;
59
+ }`;
56
60
 
57
61
  const result = compile(source, 'test.tsrx', { mode: 'client' });
58
62
 
@@ -69,13 +73,13 @@ describe('compiler > attributes', () => {
69
73
 
70
74
  it('ensures generated code is syntactically valid JavaScript', () => {
71
75
  const source = `
72
- function Child(props) { return <>
76
+ function Child(props) @{
73
77
  <div />
74
- </>; }
78
+ }
75
79
 
76
- export default function App() { return <>
80
+ export default function App() @{
77
81
  <Child data-scope="test" />
78
- </>; }`;
82
+ }`;
79
83
 
80
84
  const result = compile(source, 'test.tsrx', { mode: 'client' });
81
85