ripple 0.3.2 → 0.3.4
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 +85 -0
- package/package.json +2 -2
- package/src/compiler/identifier-utils.js +0 -2
- package/src/compiler/phases/1-parse/index.js +101 -195
- package/src/compiler/phases/2-analyze/index.js +82 -174
- package/src/compiler/phases/2-analyze/prune.js +2 -2
- package/src/compiler/phases/3-transform/client/index.js +174 -264
- package/src/compiler/phases/3-transform/segments.js +0 -22
- package/src/compiler/phases/3-transform/server/index.js +185 -42
- package/src/compiler/types/index.d.ts +14 -33
- package/src/compiler/utils.js +32 -20
- package/src/runtime/index-client.js +0 -17
- package/src/runtime/internal/client/bindings.js +118 -7
- package/src/runtime/internal/client/render.js +5 -1
- package/src/runtime/internal/client/runtime.js +1 -1
- package/src/runtime/internal/client/types.d.ts +4 -0
- package/tests/client/array/array.copy-within.test.ripple +7 -7
- package/tests/client/array/array.derived.test.ripple +24 -24
- package/tests/client/array/array.iteration.test.ripple +7 -7
- package/tests/client/array/array.mutations.test.ripple +17 -17
- package/tests/client/array/array.to-methods.test.ripple +4 -4
- package/tests/client/async-suspend.test.ripple +3 -3
- package/tests/client/basic/basic.attributes.test.ripple +31 -31
- package/tests/client/basic/basic.collections.test.ripple +6 -6
- package/tests/client/basic/basic.components.test.ripple +8 -8
- package/tests/client/basic/basic.errors.test.ripple +31 -34
- package/tests/client/basic/basic.events.test.ripple +11 -11
- package/tests/client/basic/basic.get-set.test.ripple +18 -18
- package/tests/client/basic/basic.reactivity.test.ripple +36 -36
- package/tests/client/basic/basic.rendering.test.ripple +7 -7
- package/tests/client/basic/basic.utilities.test.ripple +4 -4
- package/tests/client/boundaries.test.ripple +7 -7
- package/tests/client/compiler/__snapshots__/compiler.typescript.test.ripple.snap +24 -0
- package/tests/client/compiler/compiler.assignments.test.ripple +12 -10
- package/tests/client/compiler/compiler.basic.test.ripple +58 -60
- package/tests/client/compiler/compiler.tracked-access.test.ripple +14 -8
- package/tests/client/compiler/compiler.typescript.test.ripple +31 -0
- package/tests/client/composite/composite.dynamic-components.test.ripple +6 -6
- package/tests/client/composite/composite.props.test.ripple +9 -9
- package/tests/client/composite/composite.reactivity.test.ripple +23 -23
- package/tests/client/composite/composite.render.test.ripple +52 -4
- package/tests/client/computed-properties.test.ripple +3 -3
- package/tests/client/context.test.ripple +3 -3
- package/tests/client/css/global-additional-cases.test.ripple +5 -2
- package/tests/client/css/style-identifier.test.ripple +40 -49
- package/tests/client/date.test.ripple +39 -39
- package/tests/client/dynamic-elements.test.ripple +37 -37
- package/tests/client/events.test.ripple +25 -25
- package/tests/client/for.test.ripple +8 -8
- package/tests/client/head.test.ripple +7 -7
- package/tests/client/html.test.ripple +2 -2
- package/tests/client/input-value.test.ripple +376 -177
- package/tests/client/lazy-destructuring.test.ripple +185 -0
- package/tests/client/map.test.ripple +20 -20
- package/tests/client/media-query.test.ripple +4 -4
- package/tests/client/object.test.ripple +5 -5
- package/tests/client/portal.test.ripple +4 -4
- package/tests/client/ref.test.ripple +3 -3
- package/tests/client/return.test.ripple +17 -17
- package/tests/client/set.test.ripple +10 -10
- package/tests/client/svg.test.ripple +6 -5
- package/tests/client/switch.test.ripple +10 -10
- package/tests/client/tracked-expression.test.ripple +3 -1
- package/tests/client/try.test.ripple +4 -4
- package/tests/client/url/url.derived.test.ripple +6 -7
- package/tests/client/url/url.parsing.test.ripple +9 -9
- package/tests/client/url/url.partial-removal.test.ripple +9 -9
- package/tests/client/url/url.reactivity.test.ripple +16 -16
- package/tests/client/url/url.serialization.test.ripple +3 -3
- package/tests/client/url-search-params/url-search-params.derived.test.ripple +7 -8
- package/tests/client/url-search-params/url-search-params.initialization.test.ripple +6 -4
- package/tests/client/url-search-params/url-search-params.iteration.test.ripple +12 -12
- package/tests/client/url-search-params/url-search-params.mutation.test.ripple +18 -18
- package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +16 -16
- package/tests/client/url-search-params/url-search-params.serialization.test.ripple +4 -4
- package/tests/client/url-search-params/url-search-params.tracked-url.test.ripple +3 -3
- package/tests/hydration/build-components.js +4 -10
- package/tests/hydration/compiled/client/basic.js +4 -4
- package/tests/hydration/compiled/client/events.js +2 -0
- package/tests/hydration/compiled/client/for.js +2 -0
- package/tests/hydration/compiled/client/head.js +13 -11
- package/tests/hydration/compiled/client/hmr.js +4 -2
- package/tests/hydration/compiled/client/html.js +82 -95
- package/tests/hydration/compiled/client/if-children.js +8 -9
- package/tests/hydration/compiled/client/if.js +2 -0
- package/tests/hydration/compiled/client/mixed-control-flow.js +4 -2
- package/tests/hydration/compiled/client/portal.js +1 -1
- package/tests/hydration/compiled/client/reactivity.js +2 -0
- package/tests/hydration/compiled/client/return.js +2 -0
- package/tests/hydration/compiled/client/switch.js +2 -0
- package/tests/hydration/compiled/server/composite.js +2 -2
- package/tests/hydration/compiled/server/events.js +2 -0
- package/tests/hydration/compiled/server/for.js +2 -0
- package/tests/hydration/compiled/server/head.js +13 -11
- package/tests/hydration/compiled/server/hmr.js +2 -0
- package/tests/hydration/compiled/server/html.js +2 -0
- package/tests/hydration/compiled/server/if-children.js +2 -0
- package/tests/hydration/compiled/server/if.js +2 -0
- package/tests/hydration/compiled/server/mixed-control-flow.js +2 -0
- package/tests/hydration/compiled/server/portal.js +1 -1
- package/tests/hydration/compiled/server/reactivity.js +2 -0
- package/tests/hydration/compiled/server/return.js +2 -0
- package/tests/hydration/compiled/server/switch.js +2 -0
- package/tests/hydration/components/composite.ripple +1 -1
- package/tests/hydration/components/events.ripple +10 -8
- package/tests/hydration/components/for.ripple +22 -20
- package/tests/hydration/components/head.ripple +8 -6
- package/tests/hydration/components/hmr.ripple +3 -1
- package/tests/hydration/components/html.ripple +3 -1
- package/tests/hydration/components/if-children.ripple +9 -7
- package/tests/hydration/components/if.ripple +7 -5
- package/tests/hydration/components/mixed-control-flow.ripple +5 -3
- package/tests/hydration/components/portal.ripple +2 -2
- package/tests/hydration/components/reactivity.ripple +11 -9
- package/tests/hydration/components/return.ripple +13 -11
- package/tests/hydration/components/switch.ripple +6 -4
- package/tests/server/__snapshots__/compiler.test.ripple.snap +22 -0
- package/tests/server/await.test.ripple +2 -2
- package/tests/server/basic.attributes.test.ripple +21 -19
- package/tests/server/basic.components.test.ripple +5 -4
- package/tests/server/basic.test.ripple +21 -20
- package/tests/server/compiler.test.ripple +36 -5
- package/tests/server/composite.props.test.ripple +7 -6
- package/tests/server/context.test.ripple +3 -1
- package/tests/server/dynamic-elements.test.ripple +24 -24
- package/tests/server/head.test.ripple +7 -5
- package/tests/server/style-identifier.test.ripple +95 -16
- package/types/index.d.ts +4 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { flushSync,
|
|
2
|
+
import { RippleArray, RippleObject, flushSync, track } from 'ripple';
|
|
3
3
|
|
|
4
4
|
describe('basic client > attribute rendering', () => {
|
|
5
5
|
it('render static attributes', () => {
|
|
@@ -14,7 +14,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
14
14
|
|
|
15
15
|
it('render dynamic class attribute', () => {
|
|
16
16
|
component Basic() {
|
|
17
|
-
let active =
|
|
17
|
+
let active = track(false);
|
|
18
18
|
|
|
19
19
|
<button
|
|
20
20
|
onClick={() => {
|
|
@@ -98,7 +98,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
98
98
|
|
|
99
99
|
it('render dynamic class object', () => {
|
|
100
100
|
component Basic() {
|
|
101
|
-
let active =
|
|
101
|
+
let active = track(false);
|
|
102
102
|
|
|
103
103
|
<button
|
|
104
104
|
onClick={() => {
|
|
@@ -141,7 +141,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
141
141
|
|
|
142
142
|
it('applies scoped ripple class to multiple elements with dynamic class expressions', () => {
|
|
143
143
|
component Basic() {
|
|
144
|
-
let selected =
|
|
144
|
+
let selected = track(1);
|
|
145
145
|
|
|
146
146
|
<div class={@selected === 0 ? 'selected' : ''}>{`div 1`}</div>
|
|
147
147
|
<div class={@selected === 0 ? 'selected' : ''}>{`div 2`}</div>
|
|
@@ -170,7 +170,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
170
170
|
|
|
171
171
|
it('render dynamic id attribute', () => {
|
|
172
172
|
component Basic() {
|
|
173
|
-
let count =
|
|
173
|
+
let count = track(0);
|
|
174
174
|
|
|
175
175
|
<button
|
|
176
176
|
onClick={() => {
|
|
@@ -202,7 +202,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
202
202
|
|
|
203
203
|
it('render dynamic style attribute', () => {
|
|
204
204
|
component Basic() {
|
|
205
|
-
let color =
|
|
205
|
+
let color = track('red');
|
|
206
206
|
|
|
207
207
|
<button
|
|
208
208
|
onClick={() => {
|
|
@@ -231,7 +231,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
231
231
|
|
|
232
232
|
it('render style attribute as dynamic object', () => {
|
|
233
233
|
component Basic() {
|
|
234
|
-
let color =
|
|
234
|
+
let color = track('red');
|
|
235
235
|
|
|
236
236
|
<button
|
|
237
237
|
onClick={() => {
|
|
@@ -260,7 +260,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
260
260
|
|
|
261
261
|
it('render tracked variable as style attribute', () => {
|
|
262
262
|
component Basic() {
|
|
263
|
-
let style =
|
|
263
|
+
let style = track({ color: 'red', fontWeight: 'bold' });
|
|
264
264
|
|
|
265
265
|
function toggleColor() {
|
|
266
266
|
@style = { ...@style, color: @style.color === 'red' ? 'blue' : 'red' };
|
|
@@ -287,7 +287,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
287
287
|
|
|
288
288
|
it('render tracked object as style attribute', () => {
|
|
289
289
|
component Basic() {
|
|
290
|
-
let style =
|
|
290
|
+
let style = new RippleObject({ color: 'red', fontWeight: 'bold' });
|
|
291
291
|
|
|
292
292
|
function toggleColor() {
|
|
293
293
|
style.color = style.color === 'red' ? 'blue' : 'red';
|
|
@@ -360,8 +360,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
360
360
|
|
|
361
361
|
it('render dynamic boolean attributes', () => {
|
|
362
362
|
component Basic() {
|
|
363
|
-
let disabled =
|
|
364
|
-
let checked =
|
|
363
|
+
let disabled = track(false);
|
|
364
|
+
let checked = track(false);
|
|
365
365
|
|
|
366
366
|
<button
|
|
367
367
|
onClick={() => {
|
|
@@ -391,8 +391,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
391
391
|
|
|
392
392
|
it('render multiple dynamic attributes', () => {
|
|
393
393
|
component Basic() {
|
|
394
|
-
let theme =
|
|
395
|
-
let size =
|
|
394
|
+
let theme = track('light');
|
|
395
|
+
let size = track('medium');
|
|
396
396
|
|
|
397
397
|
<button
|
|
398
398
|
onClick={() => {
|
|
@@ -426,8 +426,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
426
426
|
|
|
427
427
|
it('render conditional attributes', () => {
|
|
428
428
|
component Basic() {
|
|
429
|
-
let showTitle =
|
|
430
|
-
let showAria =
|
|
429
|
+
let showTitle = track(false);
|
|
430
|
+
let showAria = track(false);
|
|
431
431
|
|
|
432
432
|
<button
|
|
433
433
|
onClick={() => {
|
|
@@ -468,7 +468,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
468
468
|
|
|
469
469
|
it('render spread attributes', () => {
|
|
470
470
|
component Basic() {
|
|
471
|
-
let attrs =
|
|
471
|
+
let attrs = track<TestAttributes>(
|
|
472
472
|
{
|
|
473
473
|
class: 'initial',
|
|
474
474
|
id: 'test-1',
|
|
@@ -508,12 +508,12 @@ describe('basic client > attribute rendering', () => {
|
|
|
508
508
|
|
|
509
509
|
it('renders with reactive attributes with nested reactive attributes', () => {
|
|
510
510
|
component App() {
|
|
511
|
-
let value =
|
|
511
|
+
let value = track('parent-class');
|
|
512
512
|
|
|
513
513
|
<p class={@value}>{'Colored parent value'}</p>
|
|
514
514
|
|
|
515
515
|
<div>
|
|
516
|
-
let nested =
|
|
516
|
+
let nested = track('nested-class');
|
|
517
517
|
|
|
518
518
|
<p class={@nested}>{'Colored nested value'}</p>
|
|
519
519
|
</div>
|
|
@@ -556,8 +556,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
556
556
|
|
|
557
557
|
it('handles reactive event handler changes', () => {
|
|
558
558
|
component Basic() {
|
|
559
|
-
let count =
|
|
560
|
-
let mode =
|
|
559
|
+
let count = track(0);
|
|
560
|
+
let mode = track<'increment' | 'decrement'>('increment');
|
|
561
561
|
|
|
562
562
|
const incrementHandler = () => {
|
|
563
563
|
@count++;
|
|
@@ -613,7 +613,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
613
613
|
|
|
614
614
|
it('handles events with capture option', () => {
|
|
615
615
|
component Basic() {
|
|
616
|
-
let captureOrder: RippleArray<string> =
|
|
616
|
+
let captureOrder: RippleArray<string> = new RippleArray();
|
|
617
617
|
|
|
618
618
|
const handleCaptureClick = {
|
|
619
619
|
handleEvent() {
|
|
@@ -647,7 +647,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
647
647
|
|
|
648
648
|
it('handles events with Capture suffix in the name', () => {
|
|
649
649
|
component Basic() {
|
|
650
|
-
let captureOrder: RippleArray<string> =
|
|
650
|
+
let captureOrder: RippleArray<string> = new RippleArray();
|
|
651
651
|
|
|
652
652
|
const handleCaptureClick = () => {
|
|
653
653
|
captureOrder.push('capture');
|
|
@@ -678,7 +678,7 @@ describe('basic client > attribute rendering', () => {
|
|
|
678
678
|
|
|
679
679
|
it('handles custom events with customName option', () => {
|
|
680
680
|
component Basic() {
|
|
681
|
-
let customEventCount =
|
|
681
|
+
let customEventCount = track(0);
|
|
682
682
|
|
|
683
683
|
const handleCustom = {
|
|
684
684
|
handleEvent(event: CustomEvent) {
|
|
@@ -713,8 +713,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
713
713
|
|
|
714
714
|
it('handles events with delegated: false option to bypass delegation', () => {
|
|
715
715
|
component Basic() {
|
|
716
|
-
let delegatedCount =
|
|
717
|
-
let nonDelegatedCount =
|
|
716
|
+
let delegatedCount = track(0);
|
|
717
|
+
let nonDelegatedCount = track(0);
|
|
718
718
|
|
|
719
719
|
const delegatedHandler = () => {
|
|
720
720
|
@delegatedCount++;
|
|
@@ -827,8 +827,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
827
827
|
|
|
828
828
|
it('handles events defined as function directly vs as object', () => {
|
|
829
829
|
component Basic() {
|
|
830
|
-
let functionCount =
|
|
831
|
-
let objectCount =
|
|
830
|
+
let functionCount = track(0);
|
|
831
|
+
let objectCount = track(0);
|
|
832
832
|
|
|
833
833
|
const functionHandler = () => {
|
|
834
834
|
@functionCount++;
|
|
@@ -880,8 +880,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
880
880
|
|
|
881
881
|
it('handles passive event option', () => {
|
|
882
882
|
component Basic() {
|
|
883
|
-
let passiveDefaultPrevented =
|
|
884
|
-
let nonPassiveDefaultPrevented =
|
|
883
|
+
let passiveDefaultPrevented = track<boolean | null>(null);
|
|
884
|
+
let nonPassiveDefaultPrevented = track<boolean | null>(null);
|
|
885
885
|
|
|
886
886
|
const passiveHandler = {
|
|
887
887
|
handleEvent(event: Event) {
|
|
@@ -945,8 +945,8 @@ describe('basic client > attribute rendering', () => {
|
|
|
945
945
|
|
|
946
946
|
it('handles once option to fire event only once', () => {
|
|
947
947
|
component Basic() {
|
|
948
|
-
let onceCount =
|
|
949
|
-
let regularCount =
|
|
948
|
+
let onceCount = track(0);
|
|
949
|
+
let regularCount = track(0);
|
|
950
950
|
|
|
951
951
|
const onceHandler = {
|
|
952
952
|
handleEvent() {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { flushSync } from 'ripple';
|
|
1
|
+
import { RippleArray, flushSync, track } from 'ripple';
|
|
2
2
|
import { TRACKED_ARRAY } from '../../../src/runtime/internal/client/constants.js';
|
|
3
3
|
|
|
4
4
|
describe('basic client > collections', () => {
|
|
5
5
|
it('renders with simple reactive objects', () => {
|
|
6
6
|
component Basic() {
|
|
7
|
-
let user =
|
|
7
|
+
let user = track(
|
|
8
8
|
{
|
|
9
9
|
name: 'John',
|
|
10
10
|
age: 25,
|
|
@@ -40,10 +40,10 @@ describe('basic client > collections', () => {
|
|
|
40
40
|
|
|
41
41
|
it('renders with nested reactive objects', () => {
|
|
42
42
|
component Basic() {
|
|
43
|
-
let user =
|
|
43
|
+
let user = track(
|
|
44
44
|
{
|
|
45
|
-
name:
|
|
46
|
-
age:
|
|
45
|
+
name: track('John'),
|
|
46
|
+
age: track(25),
|
|
47
47
|
},
|
|
48
48
|
);
|
|
49
49
|
|
|
@@ -77,7 +77,7 @@ describe('basic client > collections', () => {
|
|
|
77
77
|
|
|
78
78
|
it('works as a reactive RippleArray when constructed using # syntactic sugar', () => {
|
|
79
79
|
component App() {
|
|
80
|
-
const array =
|
|
80
|
+
const array = new RippleArray(1, 2, 3);
|
|
81
81
|
|
|
82
82
|
<pre>{String(array[3])}</pre>
|
|
83
83
|
<pre>{array[0]}</pre>
|
|
@@ -6,7 +6,7 @@ import type {
|
|
|
6
6
|
Component,
|
|
7
7
|
PropsWithChildrenOptional,
|
|
8
8
|
} from 'ripple';
|
|
9
|
-
import { flushSync } from 'ripple';
|
|
9
|
+
import { flushSync, track } from 'ripple';
|
|
10
10
|
|
|
11
11
|
describe('basic client > components & composition', () => {
|
|
12
12
|
it('renders with component composition and children', () => {
|
|
@@ -69,7 +69,7 @@ describe('basic client > components & composition', () => {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
component Basic() {
|
|
72
|
-
let test =
|
|
72
|
+
let test = track(false);
|
|
73
73
|
<Card>
|
|
74
74
|
component test() {
|
|
75
75
|
<p>{'Card content here'}</p>
|
|
@@ -134,7 +134,7 @@ describe('basic client > components & composition', () => {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
component Basic() {
|
|
137
|
-
let clicked =
|
|
137
|
+
let clicked = track(false);
|
|
138
138
|
|
|
139
139
|
<Card
|
|
140
140
|
title="Test Card"
|
|
@@ -175,8 +175,8 @@ describe('basic client > components & composition', () => {
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
component Basic() {
|
|
178
|
-
let message =
|
|
179
|
-
let number =
|
|
178
|
+
let message = track('Hello');
|
|
179
|
+
let number = track(1);
|
|
180
180
|
|
|
181
181
|
<ChildComponent text={message} count={number} />
|
|
182
182
|
<button
|
|
@@ -214,14 +214,14 @@ describe('basic client > components & composition', () => {
|
|
|
214
214
|
it('it retains this context with bracketed prop functions and keeps original chaining', () => {
|
|
215
215
|
component App() {
|
|
216
216
|
const SYMBOL_PROP = Symbol();
|
|
217
|
-
let hasError =
|
|
217
|
+
let hasError = track(false);
|
|
218
218
|
const obj: {
|
|
219
219
|
count: Tracked<number>;
|
|
220
220
|
increment: () => void;
|
|
221
221
|
[key: symbol]: () => void;
|
|
222
222
|
arr: Array<() => void>;
|
|
223
223
|
} = {
|
|
224
|
-
count:
|
|
224
|
+
count: track(0),
|
|
225
225
|
increment() {
|
|
226
226
|
this.@count++;
|
|
227
227
|
},
|
|
@@ -402,7 +402,7 @@ describe('basic client > components & composition', () => {
|
|
|
402
402
|
}
|
|
403
403
|
|
|
404
404
|
component App() {
|
|
405
|
-
let Content =
|
|
405
|
+
let Content = track(() => Noop);
|
|
406
406
|
<@Content />
|
|
407
407
|
|
|
408
408
|
<button onClick={() => (@Content = Op)}>{'Show Op'}</button>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { flushSync } from 'ripple';
|
|
1
|
+
import { flushSync, track, untrack } from 'ripple';
|
|
2
2
|
import { compile } from 'ripple/compiler';
|
|
3
3
|
|
|
4
4
|
describe('basic client > errors', () => {
|
|
5
5
|
it('renders with error handling simulation', () => {
|
|
6
6
|
component Basic() {
|
|
7
|
-
let hasError =
|
|
8
|
-
let errorMessage =
|
|
7
|
+
let hasError = track(false);
|
|
8
|
+
let errorMessage = track('');
|
|
9
9
|
|
|
10
10
|
const triggerError = () => {
|
|
11
11
|
try {
|
|
@@ -89,11 +89,11 @@ describe('basic client > errors', () => {
|
|
|
89
89
|
);
|
|
90
90
|
});
|
|
91
91
|
|
|
92
|
-
it('errors on mutating tracked value inside computed
|
|
92
|
+
it('errors on mutating tracked value inside computed track() evaluation', () => {
|
|
93
93
|
component Basic() {
|
|
94
|
-
let count =
|
|
94
|
+
let count = track(0);
|
|
95
95
|
|
|
96
|
-
const doubled =
|
|
96
|
+
const doubled = track(() => {
|
|
97
97
|
try {
|
|
98
98
|
@count *= 2;
|
|
99
99
|
} catch (e) {
|
|
@@ -107,42 +107,39 @@ describe('basic client > errors', () => {
|
|
|
107
107
|
render(Basic);
|
|
108
108
|
|
|
109
109
|
expect(error).toBe(
|
|
110
|
-
'Assignments or updates to tracked values are not allowed during computed "
|
|
110
|
+
'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
|
|
111
111
|
);
|
|
112
112
|
});
|
|
113
113
|
|
|
114
|
-
it(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
component Basic() {
|
|
118
|
-
let count = #ripple.track(0);
|
|
119
|
-
|
|
120
|
-
const doubled = #ripple.track(() => {
|
|
121
|
-
try {
|
|
122
|
-
#ripple.untrack(() => {
|
|
123
|
-
@count *= 2;
|
|
124
|
-
});
|
|
125
|
-
} catch (e) {
|
|
126
|
-
error = (e as Error).message;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
114
|
+
it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
|
|
115
|
+
component Basic() {
|
|
116
|
+
let count = track(0);
|
|
129
117
|
|
|
130
|
-
|
|
131
|
-
|
|
118
|
+
const doubled = track(() => {
|
|
119
|
+
try {
|
|
120
|
+
untrack(() => {
|
|
121
|
+
@count *= 2;
|
|
122
|
+
});
|
|
123
|
+
} catch (e) {
|
|
124
|
+
error = (e as Error).message;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
132
127
|
|
|
133
|
-
|
|
128
|
+
<p>{@doubled}</p>
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
render(Basic);
|
|
134
132
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
);
|
|
133
|
+
expect(error).toBe(
|
|
134
|
+
'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
|
|
135
|
+
);
|
|
136
|
+
});
|
|
140
137
|
|
|
141
|
-
it('errors on mutating a tracked variable in
|
|
138
|
+
it('errors on mutating a tracked variable in track() getter', () => {
|
|
142
139
|
component Basic() {
|
|
143
|
-
let count =
|
|
140
|
+
let count = track(0);
|
|
144
141
|
|
|
145
|
-
const doubled =
|
|
142
|
+
const doubled = track(0, (value) => {
|
|
146
143
|
try {
|
|
147
144
|
@count += 1;
|
|
148
145
|
} catch (e) {
|
|
@@ -157,7 +154,7 @@ describe('basic client > errors', () => {
|
|
|
157
154
|
render(Basic);
|
|
158
155
|
|
|
159
156
|
expect(error).toBe(
|
|
160
|
-
'Assignments or updates to tracked values are not allowed during computed "
|
|
157
|
+
'Assignments or updates to tracked values are not allowed during computed "track(() => ...)" evaluation',
|
|
161
158
|
);
|
|
162
159
|
});
|
|
163
160
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { flushSync } from 'ripple';
|
|
2
|
+
import { flushSync, track } from 'ripple';
|
|
3
3
|
|
|
4
4
|
describe('basic client > events', () => {
|
|
5
5
|
it('renders with different event types', () => {
|
|
6
6
|
component Basic() {
|
|
7
|
-
let focusCount =
|
|
8
|
-
let clickCount =
|
|
7
|
+
let focusCount = track(0);
|
|
8
|
+
let clickCount = track(0);
|
|
9
9
|
|
|
10
10
|
<button
|
|
11
11
|
onFocus={() => {
|
|
@@ -38,8 +38,8 @@ describe('basic client > events', () => {
|
|
|
38
38
|
|
|
39
39
|
it('renders with capture events', () => {
|
|
40
40
|
component Basic() {
|
|
41
|
-
let captureClicks =
|
|
42
|
-
let bubbleClicks =
|
|
41
|
+
let captureClicks = track(0);
|
|
42
|
+
let bubbleClicks = track(0);
|
|
43
43
|
|
|
44
44
|
<div
|
|
45
45
|
onClick={{
|
|
@@ -76,7 +76,7 @@ describe('basic client > events', () => {
|
|
|
76
76
|
|
|
77
77
|
it('renders with event listeners in spread props', () => {
|
|
78
78
|
component Basic() {
|
|
79
|
-
let count =
|
|
79
|
+
let count = track(0);
|
|
80
80
|
|
|
81
81
|
const minus = {
|
|
82
82
|
onClick() {
|
|
@@ -125,8 +125,8 @@ describe('basic client > events', () => {
|
|
|
125
125
|
|
|
126
126
|
it('handles both delegated and non-delegated events in spread props', () => {
|
|
127
127
|
component Basic() {
|
|
128
|
-
let clickCount =
|
|
129
|
-
let focusCount =
|
|
128
|
+
let clickCount = track(0);
|
|
129
|
+
let focusCount = track(0);
|
|
130
130
|
|
|
131
131
|
const mixedHandler = {
|
|
132
132
|
onClick() {
|
|
@@ -168,9 +168,9 @@ describe('basic client > events', () => {
|
|
|
168
168
|
|
|
169
169
|
it('renders with complex event handling and state updates', () => {
|
|
170
170
|
component Basic() {
|
|
171
|
-
let counter =
|
|
172
|
-
let history =
|
|
173
|
-
let isEven =
|
|
171
|
+
let counter = track(0);
|
|
172
|
+
let history = track<string[]>([]);
|
|
173
|
+
let isEven = track(true);
|
|
174
174
|
|
|
175
175
|
const handleIncrement = () => {
|
|
176
176
|
@counter++;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { flushSync, get, set } from 'ripple';
|
|
1
|
+
import { effect, flushSync, get, set, track, untrack } from 'ripple';
|
|
2
2
|
|
|
3
3
|
describe('basic client > get/set functions', () => {
|
|
4
4
|
it('gets tracked value', () => {
|
|
5
5
|
component Test() {
|
|
6
|
-
let count =
|
|
6
|
+
let count = track(0);
|
|
7
7
|
|
|
8
8
|
<div>{get(count)}</div>
|
|
9
9
|
}
|
|
@@ -16,7 +16,7 @@ describe('basic client > get/set functions', () => {
|
|
|
16
16
|
|
|
17
17
|
it('gets tracked value after mutation', () => {
|
|
18
18
|
component Test() {
|
|
19
|
-
let count =
|
|
19
|
+
let count = track(0);
|
|
20
20
|
|
|
21
21
|
<p>{get(count)}</p>
|
|
22
22
|
<button onClick={() => @count++}>{'increment'}</button>
|
|
@@ -36,7 +36,7 @@ describe('basic client > get/set functions', () => {
|
|
|
36
36
|
|
|
37
37
|
it('gets tracked value after multiple mutations', () => {
|
|
38
38
|
component Test() {
|
|
39
|
-
let count =
|
|
39
|
+
let count = track(0);
|
|
40
40
|
|
|
41
41
|
<p>{get(count)}</p>
|
|
42
42
|
<button
|
|
@@ -64,7 +64,7 @@ describe('basic client > get/set functions', () => {
|
|
|
64
64
|
|
|
65
65
|
it('sets tracked value', () => {
|
|
66
66
|
component Test() {
|
|
67
|
-
let count =
|
|
67
|
+
let count = track(0);
|
|
68
68
|
|
|
69
69
|
<p>{get(count)}</p>
|
|
70
70
|
<button onClick={() => set(count, 10)}>{'set to 10'}</button>
|
|
@@ -84,7 +84,7 @@ describe('basic client > get/set functions', () => {
|
|
|
84
84
|
|
|
85
85
|
it('sets tracked value multiple times', () => {
|
|
86
86
|
component Test() {
|
|
87
|
-
let count =
|
|
87
|
+
let count = track(0);
|
|
88
88
|
|
|
89
89
|
<p>{get(count)}</p>
|
|
90
90
|
<button
|
|
@@ -112,7 +112,7 @@ describe('basic client > get/set functions', () => {
|
|
|
112
112
|
|
|
113
113
|
it('sets tracked value based on previous value', () => {
|
|
114
114
|
component Test() {
|
|
115
|
-
let count =
|
|
115
|
+
let count = track(0);
|
|
116
116
|
|
|
117
117
|
<p>{get(count)}</p>
|
|
118
118
|
<button onClick={() => set(count, get(count) + 10)}>{'add 10'}</button>
|
|
@@ -138,7 +138,7 @@ describe('basic client > get/set functions', () => {
|
|
|
138
138
|
|
|
139
139
|
it('sets tracked value multiple times based on previous value', () => {
|
|
140
140
|
component Test() {
|
|
141
|
-
let count =
|
|
141
|
+
let count = track(0);
|
|
142
142
|
|
|
143
143
|
<p>{get(count)}</p>
|
|
144
144
|
<button
|
|
@@ -172,7 +172,7 @@ describe('basic client > get/set functions', () => {
|
|
|
172
172
|
|
|
173
173
|
it('gets value declared outside Ripple component', () => {
|
|
174
174
|
function store() {
|
|
175
|
-
return
|
|
175
|
+
return track(0);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
component Test() {
|
|
@@ -188,7 +188,7 @@ describe('basic client > get/set functions', () => {
|
|
|
188
188
|
|
|
189
189
|
it('sets value declared outside Ripple component', () => {
|
|
190
190
|
function store() {
|
|
191
|
-
return
|
|
191
|
+
return track(0);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
component Test() {
|
|
@@ -212,10 +212,10 @@ describe('basic client > get/set functions', () => {
|
|
|
212
212
|
|
|
213
213
|
it('works with effects', () => {
|
|
214
214
|
component Test() {
|
|
215
|
-
let count =
|
|
216
|
-
let double =
|
|
215
|
+
let count = track(0);
|
|
216
|
+
let double = track(0);
|
|
217
217
|
|
|
218
|
-
|
|
218
|
+
effect(() => {
|
|
219
219
|
set(double, get(count) * 2);
|
|
220
220
|
});
|
|
221
221
|
|
|
@@ -242,11 +242,11 @@ describe('basic client > get/set functions', () => {
|
|
|
242
242
|
|
|
243
243
|
it('works with effects and untrack', () => {
|
|
244
244
|
component Test() {
|
|
245
|
-
let count =
|
|
246
|
-
let double =
|
|
245
|
+
let count = track(0);
|
|
246
|
+
let double = track(0);
|
|
247
247
|
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
effect(() => {
|
|
249
|
+
untrack(() => {
|
|
250
250
|
set(double, get(count) * 2);
|
|
251
251
|
});
|
|
252
252
|
});
|
|
@@ -274,6 +274,6 @@ describe('basic client > get/set functions', () => {
|
|
|
274
274
|
});
|
|
275
275
|
|
|
276
276
|
it('throws on trying to create tracked Ripple component', () => {
|
|
277
|
-
expect(() =>
|
|
277
|
+
expect(() => track(0)).toThrow();
|
|
278
278
|
});
|
|
279
279
|
});
|