ripple 0.3.68 → 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 +48 -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
@@ -2,15 +2,16 @@ import { RippleArray, flushSync, track, type Component } from 'ripple';
2
2
 
3
3
  describe('composite > render', () => {
4
4
  it('renders composite components', () => {
5
- component Button(&{ count }: { count: number }) {
6
- <div>{count}</div>
5
+ function Button(&{ count }: { count: number }) {
6
+ return <><div>{count}</div></>;
7
7
  }
8
8
 
9
- component App() {
10
- let &[count] = track(0);
11
-
12
- <button onClick={() => count++}>{'Increment'}</button>
13
- <Button {count} />
9
+ function App() {
10
+ return <>
11
+ let &[count] = track(0);
12
+ <button onClick={() => count++}>{'Increment'}</button>
13
+ <Button {count} />
14
+ </>;
14
15
  }
15
16
 
16
17
  render(App);
@@ -29,26 +30,28 @@ describe('composite > render', () => {
29
30
  });
30
31
 
31
32
  it('correct handles passing through component props and children', () => {
32
- component Button({ A, B, children }: { A: () => void; B: () => void; children: () => void }) {
33
- <div>
34
- <A />
35
- {children}
36
- <B />
37
- </div>
33
+ function Button({ A, B, children }: { A: () => void; B: () => void; children: () => void }) {
34
+ return <>
35
+ <div>
36
+ <A />
37
+ {children}
38
+ <B />
39
+ </div>
40
+ </>;
38
41
  }
39
42
 
40
- component App() {
41
- component A() {
42
- <div>{'I am A'}</div>
43
- }
44
-
45
- component B() {
46
- <div>{'I am B'}</div>
47
- }
48
-
49
- <Button {A} {B}>
50
- <div>{'other text'}</div>
51
- </Button>
43
+ function App() {
44
+ return <>
45
+ function A() {
46
+ return <><div>{'I am A'}</div></>;
47
+ }
48
+ function B() {
49
+ return <><div>{'I am B'}</div></>;
50
+ }
51
+ <Button {A} {B}>
52
+ <div>{'other text'}</div>
53
+ </Button>
54
+ </>;
52
55
  }
53
56
 
54
57
  render(App);
@@ -57,14 +60,15 @@ describe('composite > render', () => {
57
60
  });
58
61
 
59
62
  it('render simple text as children', () => {
60
- component App() {
61
- let name = 'Click Me';
62
-
63
- <Child class="my-button">{name}</Child>
63
+ function App() {
64
+ return <>
65
+ let name = 'Click Me';
66
+ <Child class="my-button">{name}</Child>
67
+ </>;
64
68
  }
65
69
 
66
- component Child({ children, ...rest }: { children: string; class: string }) {
67
- <button {...rest}>{children}</button>
70
+ function Child({ children, ...rest }: { children: string; class: string }) {
71
+ return <><button {...rest}>{children}</button></>;
68
72
  }
69
73
 
70
74
  render(App);
@@ -72,18 +76,22 @@ describe('composite > render', () => {
72
76
  });
73
77
 
74
78
  it('renders explicit text around children', () => {
75
- component Frame({ children }) {
76
- <div class="frame">
77
- {text 'before'}
78
- {children}
79
- {text 'after'}
80
- </div>
79
+ function Frame({ children }) {
80
+ return <>
81
+ <div class="frame">
82
+ {'before'}
83
+ {children}
84
+ {'after'}
85
+ </div>
86
+ </>;
81
87
  }
82
88
 
83
- component App() {
84
- <Frame>
85
- <span class="middle">{'middle'}</span>
86
- </Frame>
89
+ function App() {
90
+ return <>
91
+ <Frame>
92
+ <span class="middle">{'middle'}</span>
93
+ </Frame>
94
+ </>;
87
95
  }
88
96
 
89
97
  render(App);
@@ -104,33 +112,35 @@ describe('composite > render', () => {
104
112
  });
105
113
 
106
114
  it('preserves distinct scoped ripple hashes for wrapper and child content', () => {
107
- component App() {
108
- component Wrapper({ children }) {
109
- <div class="green">
110
- {'Wrapper'}
111
- {children}
112
- </div>
113
-
114
- <style>
115
- .green {
116
- color: green;
117
- }
118
- </style>
119
- }
120
-
121
- component Child() {
122
- <div class="red">{'Child'}</div>
123
-
124
- <style>
125
- .red {
126
- color: red;
127
- }
128
- </style>
129
- }
130
-
131
- <Wrapper>
132
- <Child />
133
- </Wrapper>
115
+ function App() {
116
+ return <>
117
+ function Wrapper({ children }) {
118
+ return <>
119
+ <div class="green">
120
+ {'Wrapper'}
121
+ {children}
122
+ </div>
123
+ <style>
124
+ .green {
125
+ color: green;
126
+ }
127
+ </style>
128
+ </>;
129
+ }
130
+ function Child() {
131
+ return <>
132
+ <div class="red">{'Child'}</div>
133
+ <style>
134
+ .red {
135
+ color: red;
136
+ }
137
+ </style>
138
+ </>;
139
+ }
140
+ <Wrapper>
141
+ <Child />
142
+ </Wrapper>
143
+ </>;
134
144
  }
135
145
 
136
146
  render(App);
@@ -150,18 +160,19 @@ describe('composite > render', () => {
150
160
  });
151
161
 
152
162
  it('handles generics', () => {
153
- component ArrayTest() {
154
- let items = new RippleArray<number>();
155
- items.push.apply(items, [1, 2, 3, 4, 5]);
156
-
157
- <pre>{items ? JSON.stringify(items) : 'Loading...'}</pre>
163
+ function ArrayTest() {
164
+ return <>
165
+ let items = new RippleArray<number>();
166
+ items.push.apply(items, [1, 2, 3, 4, 5]);
167
+ <pre>{items ? JSON.stringify(items) : 'Loading...'}</pre>
168
+ </>;
158
169
  }
159
170
 
160
171
  render(ArrayTest);
161
172
  });
162
173
 
163
174
  it('should not render <undefined> tag when a passed in component is undefined', () => {
164
- component Child(&{
175
+ function Child(&{
165
176
  children,
166
177
  NonExistent,
167
178
  ...props
@@ -170,15 +181,17 @@ describe('composite > render', () => {
170
181
  NonExistent?: Component;
171
182
  [key: string]: any;
172
183
  }) {
173
- <div {...props}>
174
- {children}
175
- // @ts-expect-error - intentionally testing behavior when a component is undefined
176
- <NonExistent />
177
- </div>
184
+ return <>
185
+ <div {...props}>
186
+ {children}
187
+ // @ts-expect-error - intentionally testing behavior when a component is undefined
188
+ <NonExistent />
189
+ </div>
190
+ </>;
178
191
  }
179
192
 
180
- component App() {
181
- <Child />
193
+ function App() {
194
+ return <><Child /></>;
182
195
  }
183
196
 
184
197
  render(App);
@@ -193,34 +206,38 @@ describe('composite > render', () => {
193
206
 
194
207
  describe('scoped styles with children', () => {
195
208
  it('generates correct CSS hashes for wrapper and child with empty style in App', () => {
196
- component Wrapper(&{ children }: { children?: Component }) {
197
- <div class="green">
198
- {'Wrapper'}
199
- {children}
200
- </div>
201
-
202
- <style>
203
- .green {
204
- color: green;
205
- }
206
- </style>
209
+ function Wrapper(&{ children }: { children?: Component }) {
210
+ return <>
211
+ <div class="green">
212
+ {'Wrapper'}
213
+ {children}
214
+ </div>
215
+ <style>
216
+ .green {
217
+ color: green;
218
+ }
219
+ </style>
220
+ </>;
207
221
  }
208
222
 
209
- component Child() {
210
- <div class="red">{'Child'}</div>
211
-
212
- <style>
213
- .red {
214
- color: red;
215
- }
216
- </style>
223
+ function Child() {
224
+ return <>
225
+ <div class="red">{'Child'}</div>
226
+ <style>
227
+ .red {
228
+ color: red;
229
+ }
230
+ </style>
231
+ </>;
217
232
  }
218
233
 
219
- component App() {
220
- <Wrapper>
221
- <Child />
222
- </Wrapper>
223
- <style></style>
234
+ function App() {
235
+ return <>
236
+ <Wrapper>
237
+ <Child />
238
+ </Wrapper>
239
+ <style></style>
240
+ </>;
224
241
  }
225
242
 
226
243
  render(App);
@@ -2,20 +2,20 @@ import { flushSync, track } from 'ripple';
2
2
 
3
3
  describe('computed tracked properties', () => {
4
4
  it('should update a property using assignment', () => {
5
- component App() {
6
- let obj = {
7
- [0]: track(0),
8
- };
9
-
10
- <div>{obj[0].value}</div>
11
-
12
- <button
13
- onClick={() => {
14
- obj[0].value += 1;
15
- }}
16
- >
17
- {'Increment'}
18
- </button>
5
+ function App() {
6
+ return <>
7
+ let obj = {
8
+ [0]: track(0),
9
+ };
10
+ <div>{obj[0].value}</div>
11
+ <button
12
+ onClick={() => {
13
+ obj[0].value += 1;
14
+ }}
15
+ >
16
+ {'Increment'}
17
+ </button>
18
+ </>;
19
19
  }
20
20
 
21
21
  render(App);
@@ -29,20 +29,20 @@ describe('computed tracked properties', () => {
29
29
  });
30
30
 
31
31
  it('should update a property using update expressions', () => {
32
- component App() {
33
- let obj = {
34
- [0]: track(0),
35
- };
36
-
37
- <div>{obj[0].value}</div>
38
-
39
- <button
40
- onClick={() => {
41
- obj[0].value++;
42
- }}
43
- >
44
- {'Increment'}
45
- </button>
32
+ function App() {
33
+ return <>
34
+ let obj = {
35
+ [0]: track(0),
36
+ };
37
+ <div>{obj[0].value}</div>
38
+ <button
39
+ onClick={() => {
40
+ obj[0].value++;
41
+ }}
42
+ >
43
+ {'Increment'}
44
+ </button>
45
+ </>;
46
46
  }
47
47
 
48
48
  render(App);
@@ -5,18 +5,19 @@ describe('context', () => {
5
5
  it('creates a reactive ref with initial value', () => {
6
6
  const MyContext = Context<string | null>(null);
7
7
 
8
- component Child() {
9
- const value = MyContext.get();
10
-
11
- <div>{value}</div>
8
+ function Child() {
9
+ return <>
10
+ const value = MyContext.get();
11
+ <div>{value}</div>
12
+ </>;
12
13
  }
13
14
 
14
- component TestContext() {
15
- const value = MyContext.get();
16
-
17
- MyContext.set('Hello from context!');
18
-
19
- <Child />
15
+ function TestContext() {
16
+ return <>
17
+ const value = MyContext.get();
18
+ MyContext.set('Hello from context!');
19
+ <Child />
20
+ </>;
20
21
  }
21
22
 
22
23
  render(TestContext);
@@ -32,17 +33,16 @@ describe('context', () => {
32
33
  return value * 2;
33
34
  };
34
35
 
35
- component App() {
36
- MyContext.set(4);
37
-
38
- <h3>{MyContext.get()}</h3>
39
-
40
- <h4>
41
- {'2x:'}
42
- {doubleContext()}
43
- </h4>
44
-
45
- MyContext.set(8);
36
+ function App() {
37
+ return <>
38
+ MyContext.set(4);
39
+ <h3>{MyContext.get()}</h3>
40
+ <h4>
41
+ {'2x:'}
42
+ {doubleContext()}
43
+ </h4>
44
+ MyContext.set(8);
45
+ </>;
46
46
  }
47
47
 
48
48
  render(App);