ripple 0.3.7 → 0.3.9
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.
- package/CHANGELOG.md +14 -0
- package/package.json +2 -2
- package/src/compiler/phases/1-parse/index.js +48 -349
- package/src/compiler/phases/2-analyze/index.js +343 -52
- package/src/compiler/phases/3-transform/client/index.js +28 -160
- package/src/compiler/phases/3-transform/segments.js +0 -7
- package/src/compiler/phases/3-transform/server/index.js +31 -154
- package/src/compiler/types/acorn.d.ts +1 -1
- package/src/compiler/types/estree.d.ts +1 -1
- package/src/compiler/types/import.d.ts +0 -2
- package/src/compiler/types/index.d.ts +5 -17
- package/src/compiler/types/parse.d.ts +1 -17
- package/src/compiler/utils.js +53 -20
- package/src/runtime/index-client.js +2 -13
- package/src/runtime/index-server.js +2 -2
- package/src/runtime/internal/client/bindings.js +3 -1
- package/src/runtime/internal/client/composite.js +3 -2
- package/src/runtime/internal/client/events.js +1 -1
- package/src/runtime/internal/client/head.js +3 -4
- package/src/runtime/internal/client/index.js +0 -1
- package/src/runtime/internal/client/runtime.js +0 -52
- package/src/runtime/internal/server/index.js +31 -55
- package/tests/client/array/array.copy-within.test.ripple +12 -12
- package/tests/client/array/array.derived.test.ripple +46 -46
- package/tests/client/array/array.iteration.test.ripple +10 -10
- package/tests/client/array/array.mutations.test.ripple +20 -20
- package/tests/client/array/array.to-methods.test.ripple +6 -6
- package/tests/client/async-suspend.test.ripple +5 -5
- package/tests/client/basic/basic.attributes.test.ripple +81 -81
- package/tests/client/basic/basic.collections.test.ripple +9 -9
- package/tests/client/basic/basic.components.test.ripple +28 -28
- package/tests/client/basic/basic.errors.test.ripple +46 -18
- package/tests/client/basic/basic.events.test.ripple +37 -37
- package/tests/client/basic/basic.get-set.test.ripple +6 -6
- package/tests/client/basic/basic.reactivity.test.ripple +58 -203
- package/tests/client/basic/basic.rendering.test.ripple +19 -19
- package/tests/client/basic/basic.utilities.test.ripple +3 -3
- package/tests/client/boundaries.test.ripple +12 -12
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.ripple.snap +5 -5
- package/tests/client/compiler/compiler.assignments.test.ripple +19 -19
- package/tests/client/compiler/compiler.basic.test.ripple +46 -27
- package/tests/client/compiler/compiler.tracked-access.test.ripple +2 -2
- package/tests/client/composite/composite.dynamic-components.test.ripple +9 -9
- package/tests/client/composite/composite.props.test.ripple +14 -16
- package/tests/client/composite/composite.reactivity.test.ripple +69 -70
- package/tests/client/composite/composite.render.test.ripple +3 -3
- package/tests/client/computed-properties.test.ripple +4 -4
- package/tests/client/date.test.ripple +42 -42
- package/tests/client/dynamic-elements.test.ripple +44 -45
- package/tests/client/events.test.ripple +70 -70
- package/tests/client/for.test.ripple +25 -25
- package/tests/client/head.test.ripple +19 -19
- package/tests/client/html.test.ripple +3 -3
- package/tests/client/input-value.test.ripple +84 -84
- package/tests/client/lazy-destructuring.test.ripple +138 -26
- package/tests/client/map.test.ripple +16 -16
- package/tests/client/media-query.test.ripple +7 -7
- package/tests/client/portal.test.ripple +11 -11
- package/tests/client/ref.test.ripple +4 -4
- package/tests/client/return.test.ripple +52 -52
- package/tests/client/set.test.ripple +6 -6
- package/tests/client/svg.test.ripple +5 -5
- package/tests/client/switch.test.ripple +44 -44
- package/tests/client/try.test.ripple +5 -5
- package/tests/client/url/url.derived.test.ripple +6 -6
- package/tests/client/url-search-params/url-search-params.derived.test.ripple +8 -8
- package/tests/client/url-search-params/url-search-params.iteration.test.ripple +10 -10
- package/tests/client/url-search-params/url-search-params.mutation.test.ripple +10 -10
- package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +18 -18
- package/tests/client/url-search-params/url-search-params.serialization.test.ripple +2 -2
- package/tests/hydration/compiled/client/events.js +25 -25
- package/tests/hydration/compiled/client/for.js +70 -66
- package/tests/hydration/compiled/client/head.js +25 -25
- package/tests/hydration/compiled/client/hmr.js +2 -2
- package/tests/hydration/compiled/client/html.js +3 -3
- package/tests/hydration/compiled/client/if-children.js +24 -24
- package/tests/hydration/compiled/client/if.js +18 -18
- package/tests/hydration/compiled/client/mixed-control-flow.js +9 -9
- package/tests/hydration/compiled/client/portal.js +3 -3
- package/tests/hydration/compiled/client/reactivity.js +16 -16
- package/tests/hydration/compiled/client/return.js +40 -40
- package/tests/hydration/compiled/client/switch.js +12 -12
- package/tests/hydration/compiled/server/events.js +19 -19
- package/tests/hydration/compiled/server/for.js +41 -41
- package/tests/hydration/compiled/server/head.js +26 -26
- package/tests/hydration/compiled/server/hmr.js +2 -2
- package/tests/hydration/compiled/server/html.js +2 -2
- package/tests/hydration/compiled/server/if-children.js +16 -16
- package/tests/hydration/compiled/server/if.js +11 -11
- package/tests/hydration/compiled/server/mixed-control-flow.js +6 -6
- package/tests/hydration/compiled/server/portal.js +2 -2
- package/tests/hydration/compiled/server/reactivity.js +16 -16
- package/tests/hydration/compiled/server/return.js +25 -25
- package/tests/hydration/compiled/server/switch.js +8 -8
- package/tests/hydration/components/events.ripple +25 -25
- package/tests/hydration/components/for.ripple +66 -66
- package/tests/hydration/components/head.ripple +16 -16
- package/tests/hydration/components/hmr.ripple +2 -2
- package/tests/hydration/components/html.ripple +3 -3
- package/tests/hydration/components/if-children.ripple +24 -24
- package/tests/hydration/components/if.ripple +18 -18
- package/tests/hydration/components/mixed-control-flow.ripple +9 -9
- package/tests/hydration/components/portal.ripple +3 -3
- package/tests/hydration/components/reactivity.ripple +16 -16
- package/tests/hydration/components/return.ripple +40 -40
- package/tests/hydration/components/switch.ripple +20 -20
- package/tests/server/await.test.ripple +3 -3
- package/tests/server/basic.attributes.test.ripple +34 -34
- package/tests/server/basic.components.test.ripple +10 -10
- package/tests/server/basic.test.ripple +38 -40
- package/tests/server/compiler.test.ripple +22 -0
- package/tests/server/composite.props.test.ripple +12 -14
- package/tests/server/dynamic-elements.test.ripple +15 -15
- package/tests/server/head.test.ripple +11 -11
- package/tests/server/lazy-destructuring.test.ripple +92 -13
- package/tsconfig.typecheck.json +4 -0
- package/types/index.d.ts +0 -19
- package/tests/client/__snapshots__/tracked-expression.test.ripple.snap +0 -34
- package/tests/client/tracked-expression.test.ripple +0 -26
|
@@ -4,10 +4,10 @@ describe('RippleDate', () => {
|
|
|
4
4
|
it('handles getTime() with reactive updates', () => {
|
|
5
5
|
component DateTest() {
|
|
6
6
|
let date = RippleDate(2025, 0, 1);
|
|
7
|
-
let time = track(() => date.getTime());
|
|
7
|
+
let &[time] = track(() => date.getTime());
|
|
8
8
|
|
|
9
9
|
<button onClick={() => date.setFullYear(2026)}>{'Change Year'}</button>
|
|
10
|
-
<pre>{
|
|
10
|
+
<pre>{time}</pre>
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
render(DateTest);
|
|
@@ -26,10 +26,10 @@ describe('RippleDate', () => {
|
|
|
26
26
|
it('handles getFullYear() with reactive updates', () => {
|
|
27
27
|
component DateTest() {
|
|
28
28
|
let date = RippleDate(2025, 5, 15);
|
|
29
|
-
let year = track(() => date.getFullYear());
|
|
29
|
+
let &[year] = track(() => date.getFullYear());
|
|
30
30
|
|
|
31
31
|
<button onClick={() => date.setFullYear(2030)}>{'Change Year'}</button>
|
|
32
|
-
<pre>{
|
|
32
|
+
<pre>{year}</pre>
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
render(DateTest);
|
|
@@ -47,10 +47,10 @@ describe('RippleDate', () => {
|
|
|
47
47
|
it('handles getMonth() with reactive updates', () => {
|
|
48
48
|
component DateTest() {
|
|
49
49
|
let date = RippleDate(2025, 0, 15);
|
|
50
|
-
let month = track(() => date.getMonth());
|
|
50
|
+
let &[month] = track(() => date.getMonth());
|
|
51
51
|
|
|
52
52
|
<button onClick={() => date.setMonth(11)}>{'Change to December'}</button>
|
|
53
|
-
<pre>{
|
|
53
|
+
<pre>{month}</pre>
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
render(DateTest);
|
|
@@ -68,10 +68,10 @@ describe('RippleDate', () => {
|
|
|
68
68
|
it('handles getDate() with reactive updates', () => {
|
|
69
69
|
component DateTest() {
|
|
70
70
|
let date = RippleDate(2025, 0, 1);
|
|
71
|
-
let day = track(() => date.getDate());
|
|
71
|
+
let &[day] = track(() => date.getDate());
|
|
72
72
|
|
|
73
73
|
<button onClick={() => date.setDate(15)}>{'Change Day'}</button>
|
|
74
|
-
<pre>{
|
|
74
|
+
<pre>{day}</pre>
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
render(DateTest);
|
|
@@ -89,10 +89,10 @@ describe('RippleDate', () => {
|
|
|
89
89
|
it('handles getDay() with reactive updates', () => {
|
|
90
90
|
component DateTest() {
|
|
91
91
|
let date = RippleDate(2025, 0, 1);
|
|
92
|
-
let dayOfWeek = track(() => date.getDay());
|
|
92
|
+
let &[dayOfWeek] = track(() => date.getDay());
|
|
93
93
|
|
|
94
94
|
<button onClick={() => date.setDate(2)}>{'Next Day'}</button>
|
|
95
|
-
<pre>{
|
|
95
|
+
<pre>{dayOfWeek}</pre>
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
render(DateTest);
|
|
@@ -110,10 +110,10 @@ describe('RippleDate', () => {
|
|
|
110
110
|
it('handles getHours() with reactive updates', () => {
|
|
111
111
|
component DateTest() {
|
|
112
112
|
let date = RippleDate(2025, 0, 1, 10, 30, 0);
|
|
113
|
-
let hours = track(() => date.getHours());
|
|
113
|
+
let &[hours] = track(() => date.getHours());
|
|
114
114
|
|
|
115
115
|
<button onClick={() => date.setHours(15)}>{'Change to 3 PM'}</button>
|
|
116
|
-
<pre>{
|
|
116
|
+
<pre>{hours}</pre>
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
render(DateTest);
|
|
@@ -131,10 +131,10 @@ describe('RippleDate', () => {
|
|
|
131
131
|
it('handles getMinutes() with reactive updates', () => {
|
|
132
132
|
component DateTest() {
|
|
133
133
|
let date = RippleDate(2025, 0, 1, 10, 15, 0);
|
|
134
|
-
let minutes = track(() => date.getMinutes());
|
|
134
|
+
let &[minutes] = track(() => date.getMinutes());
|
|
135
135
|
|
|
136
136
|
<button onClick={() => date.setMinutes(45)}>{'Change Minutes'}</button>
|
|
137
|
-
<pre>{
|
|
137
|
+
<pre>{minutes}</pre>
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
render(DateTest);
|
|
@@ -152,10 +152,10 @@ describe('RippleDate', () => {
|
|
|
152
152
|
it('handles getSeconds() with reactive updates', () => {
|
|
153
153
|
component DateTest() {
|
|
154
154
|
let date = RippleDate(2025, 0, 1, 10, 15, 30);
|
|
155
|
-
let seconds = track(() => date.getSeconds());
|
|
155
|
+
let &[seconds] = track(() => date.getSeconds());
|
|
156
156
|
|
|
157
157
|
<button onClick={() => date.setSeconds(45)}>{'Change Seconds'}</button>
|
|
158
|
-
<pre>{
|
|
158
|
+
<pre>{seconds}</pre>
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
render(DateTest);
|
|
@@ -173,10 +173,10 @@ describe('RippleDate', () => {
|
|
|
173
173
|
it('handles toISOString() with reactive updates', () => {
|
|
174
174
|
component DateTest() {
|
|
175
175
|
let date = RippleDate(2025, 0, 1, 12, 0, 0);
|
|
176
|
-
let isoString = track(() => date.toISOString());
|
|
176
|
+
let &[isoString] = track(() => date.toISOString());
|
|
177
177
|
|
|
178
178
|
<button onClick={() => date.setFullYear(2026)}>{'Change Year'}</button>
|
|
179
|
-
<pre>{
|
|
179
|
+
<pre>{isoString}</pre>
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
render(DateTest);
|
|
@@ -199,10 +199,10 @@ describe('RippleDate', () => {
|
|
|
199
199
|
it('handles toDateString() with reactive updates', () => {
|
|
200
200
|
component DateTest() {
|
|
201
201
|
let date = RippleDate(2025, 0, 1);
|
|
202
|
-
let dateString = track(() => date.toDateString());
|
|
202
|
+
let &[dateString] = track(() => date.toDateString());
|
|
203
203
|
|
|
204
204
|
<button onClick={() => date.setMonth(11)}>{'Change to December'}</button>
|
|
205
|
-
<pre>{
|
|
205
|
+
<pre>{dateString}</pre>
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
render(DateTest);
|
|
@@ -223,10 +223,10 @@ describe('RippleDate', () => {
|
|
|
223
223
|
it('handles valueOf() with reactive updates', () => {
|
|
224
224
|
component DateTest() {
|
|
225
225
|
let date = RippleDate(2025, 0, 1);
|
|
226
|
-
let valueOf = track(() => date.valueOf());
|
|
226
|
+
let &[valueOf] = track(() => date.valueOf());
|
|
227
227
|
|
|
228
228
|
<button onClick={() => date.setDate(2)}>{'Next Day'}</button>
|
|
229
|
-
<pre>{
|
|
229
|
+
<pre>{valueOf}</pre>
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
render(DateTest);
|
|
@@ -245,29 +245,29 @@ describe('RippleDate', () => {
|
|
|
245
245
|
it('handles multiple get methods reacting to same setTime change', () => {
|
|
246
246
|
component DateTest() {
|
|
247
247
|
let date = RippleDate(2025, 0, 1, 10, 30, 15);
|
|
248
|
-
let year = track(() => date.getFullYear());
|
|
249
|
-
let month = track(() => date.getMonth());
|
|
250
|
-
let day = track(() => date.getDate());
|
|
251
|
-
let hours = track(() => date.getHours());
|
|
248
|
+
let &[year] = track(() => date.getFullYear());
|
|
249
|
+
let &[month] = track(() => date.getMonth());
|
|
250
|
+
let &[day] = track(() => date.getDate());
|
|
251
|
+
let &[hours] = track(() => date.getHours());
|
|
252
252
|
|
|
253
253
|
<button onClick={() => date.setTime(new Date(2026, 5, 15, 14, 45, 30).getTime())}>
|
|
254
254
|
{'Change All'}
|
|
255
255
|
</button>
|
|
256
256
|
<div>
|
|
257
257
|
{'Year: '}
|
|
258
|
-
{
|
|
258
|
+
{year}
|
|
259
259
|
</div>
|
|
260
260
|
<div>
|
|
261
261
|
{'Month: '}
|
|
262
|
-
{
|
|
262
|
+
{month}
|
|
263
263
|
</div>
|
|
264
264
|
<div>
|
|
265
265
|
{'Day: '}
|
|
266
|
-
{
|
|
266
|
+
{day}
|
|
267
267
|
</div>
|
|
268
268
|
<div>
|
|
269
269
|
{'Hours: '}
|
|
270
|
-
{
|
|
270
|
+
{hours}
|
|
271
271
|
</div>
|
|
272
272
|
}
|
|
273
273
|
|
|
@@ -297,26 +297,26 @@ describe('RippleDate', () => {
|
|
|
297
297
|
let dateFromNumbers = RippleDate(2025, 0, 1);
|
|
298
298
|
let dateFromTimestamp = RippleDate(1735689600000);
|
|
299
299
|
|
|
300
|
-
let nowYear = track(() => dateNow.getFullYear());
|
|
301
|
-
let stringYear = track(() => dateFromString.getFullYear());
|
|
302
|
-
let numbersYear = track(() => dateFromNumbers.getFullYear());
|
|
303
|
-
let timestampYear = track(() => dateFromTimestamp.getFullYear());
|
|
300
|
+
let &[nowYear] = track(() => dateNow.getFullYear());
|
|
301
|
+
let &[stringYear] = track(() => dateFromString.getFullYear());
|
|
302
|
+
let &[numbersYear] = track(() => dateFromNumbers.getFullYear());
|
|
303
|
+
let &[timestampYear] = track(() => dateFromTimestamp.getFullYear());
|
|
304
304
|
|
|
305
305
|
<div>
|
|
306
306
|
{'Now: '}
|
|
307
|
-
{
|
|
307
|
+
{nowYear}
|
|
308
308
|
</div>
|
|
309
309
|
<div>
|
|
310
310
|
{'String: '}
|
|
311
|
-
{
|
|
311
|
+
{stringYear}
|
|
312
312
|
</div>
|
|
313
313
|
<div>
|
|
314
314
|
{'Numbers: '}
|
|
315
|
-
{
|
|
315
|
+
{numbersYear}
|
|
316
316
|
</div>
|
|
317
317
|
<div>
|
|
318
318
|
{'Timestamp: '}
|
|
319
|
-
{
|
|
319
|
+
{timestampYear}
|
|
320
320
|
</div>
|
|
321
321
|
}
|
|
322
322
|
|
|
@@ -342,17 +342,17 @@ describe('RippleDate', () => {
|
|
|
342
342
|
it('handles get methods with arguments non-memoized', () => {
|
|
343
343
|
component DateTest() {
|
|
344
344
|
let date = RippleDate();
|
|
345
|
-
let localeDateString = track(() => date.toLocaleDateString('en-US'));
|
|
346
|
-
let localeTimeString = track(() => date.toLocaleTimeString('en-US'));
|
|
345
|
+
let &[localeDateString] = track(() => date.toLocaleDateString('en-US'));
|
|
346
|
+
let &[localeTimeString] = track(() => date.toLocaleTimeString('en-US'));
|
|
347
347
|
|
|
348
348
|
<button onClick={() => date.setFullYear(date.getFullYear() + 1)}>{'Next Year'}</button>
|
|
349
349
|
<div>
|
|
350
350
|
{'Date: '}
|
|
351
|
-
{
|
|
351
|
+
{localeDateString}
|
|
352
352
|
</div>
|
|
353
353
|
<div>
|
|
354
354
|
{'Time: '}
|
|
355
|
-
{
|
|
355
|
+
{localeTimeString}
|
|
356
356
|
</div>
|
|
357
357
|
}
|
|
358
358
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PropsWithExtras } from 'ripple';
|
|
2
|
-
import { createRefKey, flushSync, track
|
|
2
|
+
import { createRefKey, flushSync, track } from 'ripple';
|
|
3
3
|
|
|
4
4
|
describe('dynamic DOM elements', () => {
|
|
5
5
|
it('renders static dynamic element', () => {
|
|
@@ -21,7 +21,7 @@ describe('dynamic DOM elements', () => {
|
|
|
21
21
|
component App() {
|
|
22
22
|
let obj = { tag: track('div') };
|
|
23
23
|
|
|
24
|
-
<obj
|
|
24
|
+
<obj.tag.value>{'Hello World'}</obj.tag.value>
|
|
25
25
|
}
|
|
26
26
|
render(App);
|
|
27
27
|
|
|
@@ -33,8 +33,9 @@ describe('dynamic DOM elements', () => {
|
|
|
33
33
|
it('renders static dynamic element from a tracked object with a tracked property', () => {
|
|
34
34
|
component App() {
|
|
35
35
|
let obj = track({ tag: track('div') });
|
|
36
|
+
let tag = obj.value.tag;
|
|
36
37
|
|
|
37
|
-
<@
|
|
38
|
+
<@tag>{'Hello World'}</@tag>
|
|
38
39
|
}
|
|
39
40
|
render(App);
|
|
40
41
|
|
|
@@ -48,8 +49,9 @@ describe('dynamic DOM elements', () => {
|
|
|
48
49
|
() => {
|
|
49
50
|
component App() {
|
|
50
51
|
let obj = track({ tag: track('div') });
|
|
52
|
+
let tag = obj.value['tag'];
|
|
51
53
|
|
|
52
|
-
<@
|
|
54
|
+
<@tag>{'Hello World'}</@tag>
|
|
53
55
|
}
|
|
54
56
|
render(App);
|
|
55
57
|
|
|
@@ -61,11 +63,11 @@ describe('dynamic DOM elements', () => {
|
|
|
61
63
|
|
|
62
64
|
it('renders reactive dynamic element', () => {
|
|
63
65
|
component App() {
|
|
64
|
-
let tag = track('div');
|
|
66
|
+
let &[tag] = track('div');
|
|
65
67
|
|
|
66
68
|
<button
|
|
67
69
|
onClick={() => {
|
|
68
|
-
|
|
70
|
+
tag = 'span';
|
|
69
71
|
}}
|
|
70
72
|
>
|
|
71
73
|
{'Change Tag'}
|
|
@@ -107,9 +109,9 @@ describe('dynamic DOM elements', () => {
|
|
|
107
109
|
it('handles dynamic element with attributes', () => {
|
|
108
110
|
component App() {
|
|
109
111
|
let tag = track('div');
|
|
110
|
-
let className = track('test-class');
|
|
112
|
+
let &[className] = track('test-class');
|
|
111
113
|
|
|
112
|
-
<@tag class={
|
|
114
|
+
<@tag class={className} id="test" data-testid="dynamic-element">{'Content'}</@tag>
|
|
113
115
|
}
|
|
114
116
|
render(App);
|
|
115
117
|
|
|
@@ -143,11 +145,9 @@ describe('dynamic DOM elements', () => {
|
|
|
143
145
|
it('handles dynamic element with class object', () => {
|
|
144
146
|
component App() {
|
|
145
147
|
let tag = track('div');
|
|
146
|
-
let active = track(true);
|
|
148
|
+
let &[active] = track(true);
|
|
147
149
|
|
|
148
|
-
<@tag class={{ active:
|
|
149
|
-
{'Element with class object'}
|
|
150
|
-
</@tag>
|
|
150
|
+
<@tag class={{ active: active, 'dynamic-element': true }}>{'Element with class object'}</@tag>
|
|
151
151
|
}
|
|
152
152
|
render(App);
|
|
153
153
|
|
|
@@ -258,22 +258,22 @@ describe('dynamic DOM elements', () => {
|
|
|
258
258
|
it('has reactive attributes on dynamic elements', () => {
|
|
259
259
|
component App() {
|
|
260
260
|
let tag = track('div');
|
|
261
|
-
let count = track(0);
|
|
261
|
+
let &[count] = track(0);
|
|
262
262
|
|
|
263
263
|
<button
|
|
264
264
|
onClick={() => {
|
|
265
|
-
|
|
265
|
+
count++;
|
|
266
266
|
}}
|
|
267
267
|
>
|
|
268
268
|
{'Increment'}
|
|
269
269
|
</button>
|
|
270
270
|
<@tag
|
|
271
|
-
id={
|
|
272
|
-
class={
|
|
273
|
-
data-count={
|
|
271
|
+
id={count % 2 ? 'even' : 'odd'}
|
|
272
|
+
class={count % 2 ? 'even-class' : 'odd-class'}
|
|
273
|
+
data-count={count}
|
|
274
274
|
>
|
|
275
275
|
{'Count: '}
|
|
276
|
-
{
|
|
276
|
+
{count}
|
|
277
277
|
</@tag>
|
|
278
278
|
}
|
|
279
279
|
|
|
@@ -337,17 +337,17 @@ describe('dynamic DOM elements', () => {
|
|
|
337
337
|
it('applies scoped CSS to dynamic elements with reactive classes', () => {
|
|
338
338
|
component App() {
|
|
339
339
|
let tag = track('button');
|
|
340
|
-
let count = track(0);
|
|
340
|
+
let &[count] = track(0);
|
|
341
341
|
|
|
342
342
|
<@tag
|
|
343
|
-
class={
|
|
344
|
-
id={
|
|
343
|
+
class={count % 2 ? 'even' : 'odd'}
|
|
344
|
+
id={count % 2 ? 'even' : 'odd'}
|
|
345
345
|
onClick={() => {
|
|
346
|
-
|
|
346
|
+
count++;
|
|
347
347
|
}}
|
|
348
348
|
>
|
|
349
349
|
{'Count: '}
|
|
350
|
-
{
|
|
350
|
+
{count}
|
|
351
351
|
</@tag>
|
|
352
352
|
|
|
353
353
|
<style>
|
|
@@ -405,14 +405,13 @@ describe('dynamic DOM elements', () => {
|
|
|
405
405
|
});
|
|
406
406
|
|
|
407
407
|
it('handles spread attributes with class and CSS scoping ', () => {
|
|
408
|
-
component DynamicButton(
|
|
408
|
+
component DynamicButton(&{ ...rest }: PropsWithExtras<{
|
|
409
409
|
class: string;
|
|
410
410
|
id: string;
|
|
411
411
|
onClick: EventListener;
|
|
412
412
|
}>) {
|
|
413
413
|
const tag = track('button');
|
|
414
|
-
|
|
415
|
-
<@tag {...@rest}>{@rest.class}</@tag>
|
|
414
|
+
<@tag {...rest}>{rest.class}</@tag>
|
|
416
415
|
|
|
417
416
|
<style>
|
|
418
417
|
.even {
|
|
@@ -425,12 +424,12 @@ describe('dynamic DOM elements', () => {
|
|
|
425
424
|
}
|
|
426
425
|
|
|
427
426
|
component App() {
|
|
428
|
-
|
|
427
|
+
let &[count] = track(0);
|
|
429
428
|
<DynamicButton
|
|
430
|
-
class={
|
|
431
|
-
id={
|
|
429
|
+
class={count % 2 ? 'even' : 'odd'}
|
|
430
|
+
id={count % 2 ? 'even' : 'odd'}
|
|
432
431
|
onClick={() => {
|
|
433
|
-
|
|
432
|
+
count++;
|
|
434
433
|
}}
|
|
435
434
|
/>
|
|
436
435
|
}
|
|
@@ -603,12 +602,12 @@ describe('dynamic DOM elements', () => {
|
|
|
603
602
|
}
|
|
604
603
|
|
|
605
604
|
component App() {
|
|
606
|
-
let active = track(false);
|
|
605
|
+
let &[active] = track(false);
|
|
607
606
|
|
|
608
607
|
<Button
|
|
609
|
-
data-active={String(
|
|
608
|
+
data-active={String(active)}
|
|
610
609
|
onClick={() => {
|
|
611
|
-
|
|
610
|
+
active = !active;
|
|
612
611
|
}}
|
|
613
612
|
{ref (el: HTMLElement) => {
|
|
614
613
|
capturedElement = el;
|
|
@@ -646,25 +645,25 @@ describe('dynamic DOM elements', () => {
|
|
|
646
645
|
}
|
|
647
646
|
|
|
648
647
|
component App() {
|
|
649
|
-
let active = track(false);
|
|
648
|
+
let &[active] = track(false);
|
|
650
649
|
|
|
651
|
-
let buttonProps = track(
|
|
650
|
+
let &[buttonProps] = track(
|
|
652
651
|
() => ({
|
|
653
|
-
'data-active':
|
|
652
|
+
'data-active': active,
|
|
654
653
|
}),
|
|
655
654
|
);
|
|
656
655
|
|
|
657
656
|
<Button
|
|
658
|
-
{
|
|
657
|
+
{...buttonProps}
|
|
659
658
|
onClick={() => {
|
|
660
|
-
|
|
659
|
+
active = !active;
|
|
661
660
|
}}
|
|
662
661
|
{ref (el: HTMLElement) => {
|
|
663
662
|
capturedElement = el;
|
|
664
663
|
}}
|
|
665
664
|
>
|
|
666
665
|
{'content: '}
|
|
667
|
-
{
|
|
666
|
+
{active}
|
|
668
667
|
</Button>
|
|
669
668
|
}
|
|
670
669
|
|
|
@@ -693,12 +692,12 @@ describe('dynamic DOM elements', () => {
|
|
|
693
692
|
}
|
|
694
693
|
|
|
695
694
|
component App() {
|
|
696
|
-
let active = track(false);
|
|
695
|
+
let &[active] = track(false);
|
|
697
696
|
|
|
698
697
|
<Button
|
|
699
|
-
data-active={String(
|
|
698
|
+
data-active={String(active)}
|
|
700
699
|
onClick={() => {
|
|
701
|
-
|
|
700
|
+
active = !active;
|
|
702
701
|
}}
|
|
703
702
|
{ref (el: HTMLElement) => {
|
|
704
703
|
capturedElement = el;
|
|
@@ -730,13 +729,13 @@ describe('dynamic DOM elements', () => {
|
|
|
730
729
|
|
|
731
730
|
it('should remove and add back a text node in a conditional statement with a tracked', () => {
|
|
732
731
|
component App() {
|
|
733
|
-
let b = track(true);
|
|
732
|
+
let &[b] = track(true);
|
|
734
733
|
<div>
|
|
735
|
-
if (
|
|
734
|
+
if (b) {
|
|
736
735
|
{'Inside if'}
|
|
737
736
|
}
|
|
738
737
|
</div>
|
|
739
|
-
<button onClick={() => (
|
|
738
|
+
<button onClick={() => (b = !b)}>{'Toggle b'}</button>
|
|
740
739
|
}
|
|
741
740
|
|
|
742
741
|
render(App);
|