ripple 0.3.67 → 0.3.69

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 +143 -291
  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 -148
  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,26 +3,30 @@ import { RippleObject, effect, flushSync, track } from 'ripple';
3
3
 
4
4
  describe('composite > reactivity', () => {
5
5
  it('renders composite components with object state', () => {
6
- component Button({ obj }: { obj: { count: Tracked<number> } }) {
7
- <button
8
- class="count2"
9
- onClick={() => {
10
- obj.count.value++;
11
- }}
12
- >
13
- {obj.count.value}
14
- </button>
6
+ function Button({ obj }: { obj: { count: Tracked<number> } }) {
7
+ return <>
8
+ <button
9
+ class="count2"
10
+ onClick={() => {
11
+ obj.count.value++;
12
+ }}
13
+ >
14
+ {obj.count.value}
15
+ </button>
16
+ </>;
15
17
  }
16
18
 
17
- component App() {
18
- <div>
19
- let obj = {
20
- count: track(0),
21
- };
19
+ function App() {
20
+ return <>
21
+ <div>
22
+ let obj = {
23
+ count: track(0),
24
+ };
22
25
 
23
- <span class="count">{obj.count.value}</span>
24
- <Button {obj} />
25
- </div>
26
+ <span class="count">{obj.count.value}</span>
27
+ <Button {obj} />
28
+ </div>
29
+ </>;
26
30
  }
27
31
 
28
32
  render(App);
@@ -37,37 +41,41 @@ describe('composite > reactivity', () => {
37
41
  });
38
42
 
39
43
  it('renders composite components with object state wrapped in an if statement', () => {
40
- component Button({ obj }: { obj: { count: Tracked<number> } }) {
41
- <button
42
- class="count2"
43
- onClick={() => {
44
- obj.count.value++;
45
- }}
46
- >
47
- {obj.count.value}
48
- </button>
44
+ function Button({ obj }: { obj: { count: Tracked<number> } }) {
45
+ return <>
46
+ <button
47
+ class="count2"
48
+ onClick={() => {
49
+ obj.count.value++;
50
+ }}
51
+ >
52
+ {obj.count.value}
53
+ </button>
54
+ </>;
49
55
  }
50
56
 
51
- component OtherComponent({ obj }: { obj: { count: Tracked<number> } }) {
52
- <div class="count3">{obj.count.value}</div>
57
+ function OtherComponent({ obj }: { obj: { count: Tracked<number> } }) {
58
+ return <><div class="count3">{obj.count.value}</div></>;
53
59
  }
54
60
 
55
- component App() {
56
- <div>
57
- let obj = {
58
- count: track(0),
59
- };
60
-
61
- <span class="count">{obj.count.value}</span>
62
- <span>{' '}</span>
63
- if (obj) {
64
- <Button {obj} />
65
- }
66
-
67
- if (obj) {
68
- <OtherComponent {obj} />
69
- }
70
- </div>
61
+ function App() {
62
+ return <>
63
+ <div>
64
+ let obj = {
65
+ count: track(0),
66
+ };
67
+
68
+ <span class="count">{obj.count.value}</span>
69
+ <span>{' '}</span>
70
+ if (obj) {
71
+ <Button {obj} />
72
+ }
73
+
74
+ if (obj) {
75
+ <OtherComponent {obj} />
76
+ }
77
+ </div>
78
+ </>;
71
79
  }
72
80
 
73
81
  render(App);
@@ -83,30 +91,34 @@ describe('composite > reactivity', () => {
83
91
  });
84
92
 
85
93
  it('parents and children have isolated state', () => {
86
- component Button(props: { count: number }) {
87
- let &[count] = track(() => props.count);
88
- <button
89
- onClick={() => {
90
- count++;
91
- }}
92
- >
93
- {'child: ' + count}
94
- </button>
95
- }
96
-
97
- component App() {
98
- <div>
99
- let &[count] = track(0);
100
-
94
+ function Button(props: { count: number }) {
95
+ return <>
96
+ let &[count] = track(() => props.count);
101
97
  <button
102
98
  onClick={() => {
103
99
  count++;
104
100
  }}
105
101
  >
106
- {'parent: ' + count}
102
+ {'child: ' + count}
107
103
  </button>
108
- <Button {count} />
109
- </div>
104
+ </>;
105
+ }
106
+
107
+ function App() {
108
+ return <>
109
+ <div>
110
+ let &[count] = track(0);
111
+
112
+ <button
113
+ onClick={() => {
114
+ count++;
115
+ }}
116
+ >
117
+ {'parent: ' + count}
118
+ </button>
119
+ <Button {count} />
120
+ </div>
121
+ </>;
110
122
  }
111
123
 
112
124
  render(App);
@@ -130,30 +142,34 @@ describe('composite > reactivity', () => {
130
142
  });
131
143
 
132
144
  it('parents and children have isolated connected state (destructured props)', () => {
133
- component Button(&{ count }: { count: number }) {
134
- let &[local_count] = track(() => count);
135
- <button
136
- onClick={() => {
137
- local_count++;
138
- }}
139
- >
140
- {'child: ' + local_count}
141
- </button>
142
- }
143
-
144
- component App() {
145
- <div>
146
- let &[count] = track(0);
147
-
145
+ function Button(&{ count }: { count: number }) {
146
+ return <>
147
+ let &[local_count] = track(() => count);
148
148
  <button
149
149
  onClick={() => {
150
- count++;
150
+ local_count++;
151
151
  }}
152
152
  >
153
- {'parent: ' + count}
153
+ {'child: ' + local_count}
154
154
  </button>
155
- <Button {count} />
156
- </div>
155
+ </>;
156
+ }
157
+
158
+ function App() {
159
+ return <>
160
+ <div>
161
+ let &[count] = track(0);
162
+
163
+ <button
164
+ onClick={() => {
165
+ count++;
166
+ }}
167
+ >
168
+ {'parent: ' + count}
169
+ </button>
170
+ <Button {count} />
171
+ </div>
172
+ </>;
157
173
  }
158
174
 
159
175
  render(App);
@@ -179,38 +195,38 @@ describe('composite > reactivity', () => {
179
195
  it('handles spreading of props', () => {
180
196
  let logs: string[] = [];
181
197
 
182
- component App() {
183
- let &[a] = track(1);
184
- let &[b] = track(2);
185
- let &[c] = track(3);
186
-
187
- let &[obj] = track(
188
- () => ({
189
- a,
190
- b,
191
- c,
192
- }),
193
- );
194
-
195
- <Child {...obj} />
196
-
197
- <button
198
- onClick={() => {
199
- a++;
200
- b++;
201
- c++;
202
- }}
203
- >
204
- {'Increment all'}
205
- </button>
198
+ function App() {
199
+ return <>
200
+ let &[a] = track(1);
201
+ let &[b] = track(2);
202
+ let &[c] = track(3);
203
+ let &[obj] = track(
204
+ () => ({
205
+ a,
206
+ b,
207
+ c,
208
+ }),
209
+ );
210
+ <Child {...obj} />
211
+ <button
212
+ onClick={() => {
213
+ a++;
214
+ b++;
215
+ c++;
216
+ }}
217
+ >
218
+ {'Increment all'}
219
+ </button>
220
+ </>;
206
221
  }
207
222
 
208
- component Child(&{ a, b, c }: { a: number; b: number; c: number }) {
209
- effect(() => {
210
- logs.push(`Child effect: ${a}, ${b}, ${c}`);
211
- });
212
-
213
- <div>{a + ' ' + b + ' ' + c}</div>
223
+ function Child(&{ a, b, c }: { a: number; b: number; c: number }) {
224
+ return <>
225
+ effect(() => {
226
+ logs.push(`Child effect: ${a}, ${b}, ${c}`);
227
+ });
228
+ <div>{a + ' ' + b + ' ' + c}</div>
229
+ </>;
214
230
  }
215
231
 
216
232
  render(App);
@@ -228,21 +244,27 @@ describe('composite > reactivity', () => {
228
244
  });
229
245
 
230
246
  it('keeps reactivity for spread props via intermediate components and lazy destructuring', () => {
231
- component App() {
232
- let &[count] = track(0);
233
- <CounterWrapper {count} up={() => count++} down={() => count--} />
247
+ function App() {
248
+ return <>
249
+ let &[count] = track(0);
250
+ <CounterWrapper {count} up={() => count++} down={() => count--} />
251
+ </>;
234
252
  }
235
253
 
236
- component CounterWrapper(props: Props) {
237
- <div>
238
- <Counter {...props} />
239
- </div>
254
+ function CounterWrapper(props: Props) {
255
+ return <>
256
+ <div>
257
+ <Counter {...props} />
258
+ </div>
259
+ </>;
240
260
  }
241
261
 
242
- component Counter(&{ count, up, down, ...rest }: Props) {
243
- <button onClick={() => up()}>{'UP'}</button>
244
- <button onClick={() => down()}>{'DOWN'}</button>
245
- <span {...rest}>{`Counter: ${count}`}</span>
262
+ function Counter(&{ count, up, down, ...rest }: Props) {
263
+ return <>
264
+ <button onClick={() => up()}>{'UP'}</button>
265
+ <button onClick={() => down()}>{'DOWN'}</button>
266
+ <span {...rest}>{`Counter: ${count}`}</span>
267
+ </>;
246
268
  }
247
269
 
248
270
  render(App);
@@ -265,33 +287,39 @@ describe('composite > reactivity', () => {
265
287
  });
266
288
 
267
289
  it('keeps reactivity on elements for element spreads and adds / removes dynamic props', () => {
268
- component App() {
269
- let &[count] = track(0);
270
- <CounterWrapper {count} up={() => count++} />
290
+ function App() {
291
+ return <>
292
+ let &[count] = track(0);
293
+ <CounterWrapper {count} up={() => count++} />
294
+ </>;
271
295
  }
272
296
 
273
- component CounterWrapper(props: { count: number; up: () => void }) {
274
- const more: { double: Tracked<number>; another?: number; extra: number } = new RippleObject({
275
- double: track(() => props.count * 2),
276
- another: 0,
277
- extra: 100,
278
- });
279
-
280
- effect(() => {
281
- props.count;
282
- if (props.count === 1) {
283
- delete more.another;
284
- } else if (props.count === 2) {
285
- more.another = 0;
286
- }
287
- });
288
-
289
- <div>
290
- <Counter {...props} double={more.double} another={more.another} extra={more.extra} />
291
- </div>
297
+ function CounterWrapper(props: { count: number; up: () => void }) {
298
+ return <>
299
+ const more: {
300
+ double: Tracked<number>;
301
+ another?: number;
302
+ extra: number;
303
+ } = new RippleObject({
304
+ double: track(() => props.count * 2),
305
+ another: 0,
306
+ extra: 100,
307
+ });
308
+ effect(() => {
309
+ props.count;
310
+ if (props.count === 1) {
311
+ delete more.another;
312
+ } else if (props.count === 2) {
313
+ more.another = 0;
314
+ }
315
+ });
316
+ <div>
317
+ <Counter {...props} double={more.double} another={more.another} extra={more.extra} />
318
+ </div>
319
+ </>;
292
320
  }
293
321
 
294
- component Counter(&{
322
+ function Counter(&{
295
323
  count,
296
324
  up,
297
325
  ...rest
@@ -302,8 +330,10 @@ describe('composite > reactivity', () => {
302
330
  another?: number;
303
331
  extra: number;
304
332
  }) {
305
- <div {...rest}>{`Counter: ${count} Double: ${rest.double.value}`}</div>
306
- <button onClick={() => up()}>{'UP'}</button>
333
+ return <>
334
+ <div {...rest}>{`Counter: ${count} Double: ${rest.double.value}`}</div>
335
+ <button onClick={() => up()}>{'UP'}</button>
336
+ </>;
307
337
  }
308
338
 
309
339
  render(App);