ripple 0.3.68 → 0.3.70
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 +57 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -2
- package/src/runtime/element.js +1 -1
- package/src/runtime/index-client.js +11 -11
- package/src/runtime/index-server.js +7 -4
- package/src/runtime/internal/client/bindings.js +1 -1
- package/src/runtime/internal/client/blocks.js +13 -4
- package/src/runtime/internal/client/component.js +55 -0
- package/src/runtime/internal/client/composite.js +4 -2
- package/src/runtime/internal/client/expression.js +65 -7
- package/src/runtime/internal/client/hmr.js +54 -43
- package/src/runtime/internal/client/index.js +5 -1
- package/src/runtime/internal/client/portal.js +70 -69
- package/src/runtime/internal/client/render.js +3 -0
- package/src/runtime/internal/server/index.js +92 -8
- package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
- package/tests/client/array/array.copy-within.test.tsrx +33 -31
- package/tests/client/array/array.derived.test.tsrx +186 -169
- package/tests/client/array/array.iteration.test.tsrx +40 -37
- package/tests/client/array/array.mutations.test.tsrx +113 -101
- package/tests/client/array/array.static.test.tsrx +119 -101
- package/tests/client/array/array.to-methods.test.tsrx +24 -21
- package/tests/client/async-suspend.test.tsrx +247 -246
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
- package/tests/client/basic/basic.attributes.test.tsrx +428 -423
- package/tests/client/basic/basic.collections.test.tsrx +109 -102
- package/tests/client/basic/basic.components.test.tsrx +323 -205
- package/tests/client/basic/basic.errors.test.tsrx +91 -91
- package/tests/client/basic/basic.events.test.tsrx +114 -115
- package/tests/client/basic/basic.get-set.test.tsrx +97 -87
- package/tests/client/basic/basic.hmr.test.tsrx +19 -16
- package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
- package/tests/client/basic/basic.rendering.test.tsrx +272 -182
- package/tests/client/basic/basic.styling.test.tsrx +23 -22
- package/tests/client/basic/basic.utilities.test.tsrx +10 -8
- package/tests/client/boundaries.test.tsrx +26 -26
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
- package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
- package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
- package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
- package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
- package/tests/client/composite/composite.generics.test.tsrx +168 -192
- package/tests/client/composite/composite.props.test.tsrx +97 -81
- package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
- package/tests/client/composite/composite.render.test.tsrx +122 -105
- package/tests/client/computed-properties.test.tsrx +28 -28
- package/tests/client/context.test.tsrx +21 -21
- package/tests/client/css/global-additional-cases.test.tsrx +58 -58
- package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
- package/tests/client/css/global-at-rules.test.tsrx +10 -10
- package/tests/client/css/global-basic.test.tsrx +14 -14
- package/tests/client/css/global-classes-ids.test.tsrx +14 -14
- package/tests/client/css/global-combinators.test.tsrx +10 -10
- package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
- package/tests/client/css/global-edge-cases.test.tsrx +18 -18
- package/tests/client/css/global-keyframes.test.tsrx +12 -12
- package/tests/client/css/global-nested.test.tsrx +10 -10
- package/tests/client/css/global-pseudo.test.tsrx +12 -12
- package/tests/client/css/global-scoping.test.tsrx +20 -20
- package/tests/client/css/style-identifier.test.tsrx +126 -259
- package/tests/client/date.test.tsrx +146 -133
- package/tests/client/dynamic-elements.test.tsrx +398 -365
- package/tests/client/events.test.tsrx +292 -290
- package/tests/client/for.test.tsrx +156 -153
- package/tests/client/head.test.tsrx +105 -96
- package/tests/client/html.test.tsrx +122 -26
- package/tests/client/input-value.test.tsrx +1361 -1314
- package/tests/client/lazy-array.test.tsrx +16 -13
- package/tests/client/lazy-destructuring.test.tsrx +257 -213
- package/tests/client/map.test.tsrx +65 -60
- package/tests/client/media-query.test.tsrx +22 -20
- package/tests/client/object.test.tsrx +87 -81
- package/tests/client/portal.test.tsrx +57 -51
- package/tests/client/ref.test.tsrx +233 -202
- package/tests/client/return.test.tsrx +71 -2560
- package/tests/client/set.test.tsrx +54 -45
- package/tests/client/svg.test.tsrx +216 -186
- package/tests/client/switch.test.tsrx +194 -193
- package/tests/client/track-async-hydration.test.tsrx +18 -14
- package/tests/client/tracked-index-access.test.tsrx +28 -18
- package/tests/client/try.test.tsrx +675 -548
- package/tests/client/tsx.test.tsrx +373 -311
- package/tests/client/typescript-generics.test.tsrx +145 -145
- package/tests/client/url/url.derived.test.tsrx +33 -28
- package/tests/client/url/url.parsing.test.tsrx +61 -51
- package/tests/client/url/url.partial-removal.test.tsrx +56 -48
- package/tests/client/url/url.reactivity.test.tsrx +142 -125
- package/tests/client/url/url.serialization.test.tsrx +13 -11
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
- package/tests/hydration/basic.test.js +3 -3
- package/tests/hydration/compiled/client/basic.js +586 -651
- package/tests/hydration/compiled/client/composite.js +79 -104
- package/tests/hydration/compiled/client/events.js +140 -148
- package/tests/hydration/compiled/client/for.js +1005 -1018
- package/tests/hydration/compiled/client/head.js +124 -134
- package/tests/hydration/compiled/client/hmr.js +41 -48
- package/tests/hydration/compiled/client/html-in-template.js +38 -41
- package/tests/hydration/compiled/client/html.js +970 -1314
- package/tests/hydration/compiled/client/if-children.js +234 -249
- package/tests/hydration/compiled/client/if.js +182 -189
- package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
- package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
- package/tests/hydration/compiled/client/portal.js +65 -85
- package/tests/hydration/compiled/client/reactivity.js +84 -90
- package/tests/hydration/compiled/client/return.js +38 -1939
- package/tests/hydration/compiled/client/switch.js +218 -224
- package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
- package/tests/hydration/compiled/client/try.js +123 -132
- package/tests/hydration/compiled/server/basic.js +773 -831
- package/tests/hydration/compiled/server/composite.js +166 -191
- package/tests/hydration/compiled/server/events.js +170 -184
- package/tests/hydration/compiled/server/for.js +851 -909
- package/tests/hydration/compiled/server/head.js +206 -216
- package/tests/hydration/compiled/server/hmr.js +64 -72
- package/tests/hydration/compiled/server/html-in-template.js +42 -76
- package/tests/hydration/compiled/server/html.js +1362 -1667
- package/tests/hydration/compiled/server/if-children.js +419 -445
- package/tests/hydration/compiled/server/if.js +194 -208
- package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
- package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
- package/tests/hydration/compiled/server/portal.js +152 -160
- package/tests/hydration/compiled/server/reactivity.js +94 -106
- package/tests/hydration/compiled/server/return.js +28 -2172
- package/tests/hydration/compiled/server/switch.js +274 -286
- package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
- package/tests/hydration/compiled/server/try.js +167 -185
- package/tests/hydration/components/basic.tsrx +320 -272
- package/tests/hydration/components/composite.tsrx +44 -32
- package/tests/hydration/components/events.tsrx +101 -91
- package/tests/hydration/components/for.tsrx +510 -452
- package/tests/hydration/components/head.tsrx +87 -80
- package/tests/hydration/components/hmr.tsrx +22 -17
- package/tests/hydration/components/html-in-template.tsrx +22 -17
- package/tests/hydration/components/html.tsrx +525 -443
- package/tests/hydration/components/if-children.tsrx +158 -148
- package/tests/hydration/components/if.tsrx +109 -95
- package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
- package/tests/hydration/components/nested-control-flow.tsrx +215 -203
- package/tests/hydration/components/portal.tsrx +41 -34
- package/tests/hydration/components/reactivity.tsrx +37 -27
- package/tests/hydration/components/return.tsrx +12 -556
- package/tests/hydration/components/switch.tsrx +120 -114
- package/tests/hydration/components/track-async-serialization.tsrx +107 -91
- package/tests/hydration/components/try.tsrx +55 -40
- package/tests/hydration/html.test.js +4 -4
- package/tests/hydration/return.test.js +13 -532
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +264 -195
- package/tests/server/basic.components.test.tsrx +296 -169
- package/tests/server/basic.test.tsrx +300 -198
- package/tests/server/compiler.test.tsrx +62 -60
- package/tests/server/composite.props.test.tsrx +77 -63
- package/tests/server/composite.test.tsrx +168 -192
- package/tests/server/context.test.tsrx +18 -12
- package/tests/server/dynamic-elements.test.tsrx +197 -180
- package/tests/server/for.test.tsrx +85 -78
- package/tests/server/head.test.tsrx +50 -43
- package/tests/server/html-nesting-validation.test.tsrx +8 -8
- package/tests/server/if.test.tsrx +57 -51
- package/tests/server/lazy-destructuring.test.tsrx +366 -294
- package/tests/server/return.test.tsrx +76 -1355
- package/tests/server/streaming-ssr.test.tsrx +4 -75
- package/tests/server/style-identifier.test.tsrx +169 -131
- package/tests/server/switch.test.tsrx +91 -85
- package/tests/server/track-async-serialization.test.tsrx +105 -85
- package/tests/server/try.test.tsrx +374 -280
- package/tests/utils/compiler-compat-config.test.js +2 -2
- package/tests/utils/runtime-imports.test.js +10 -0
- package/types/index.d.ts +8 -0
- package/tests/client/__snapshots__/html.test.rsrx.snap +0 -40
|
@@ -14,19 +14,19 @@ describe('passing reactivity between boundaries tests', () => {
|
|
|
14
14
|
return double;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
function App() {
|
|
18
|
+
return <>
|
|
19
|
+
let &[count, countTracked] = track(0);
|
|
20
|
+
const &[double] = createDouble(countTracked);
|
|
21
|
+
<div>{'Double: ' + double}</div>
|
|
22
|
+
<button
|
|
23
|
+
onClick={() => {
|
|
24
|
+
count++;
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
{'Increment'}
|
|
28
|
+
</button>
|
|
29
|
+
</>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
render(App);
|
|
@@ -63,19 +63,19 @@ describe('passing reactivity between boundaries tests', () => {
|
|
|
63
63
|
return { double };
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
function App() {
|
|
67
|
+
return <>
|
|
68
|
+
let count = track(0);
|
|
69
|
+
const { double } = createDouble({ count });
|
|
70
|
+
<div>{'Double: ' + double.value}</div>
|
|
71
|
+
<button
|
|
72
|
+
onClick={() => {
|
|
73
|
+
count.value++;
|
|
74
|
+
}}
|
|
75
|
+
>
|
|
76
|
+
{'Increment'}
|
|
77
|
+
</button>
|
|
78
|
+
</>;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
render(App);
|
|
@@ -4,9 +4,9 @@ exports[`compiler > assignments > compiles tracked values in effect with assignm
|
|
|
4
4
|
|
|
5
5
|
exports[`compiler > assignments > compiles tracked values in effect with update expressions 1`] = `
|
|
6
6
|
"_$_.untrack(() => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
state.preIncrement = _$_.update_pre(lazy);
|
|
8
|
+
state.postIncrement = _$_.update(lazy);
|
|
9
|
+
state.preDecrement = _$_.update_pre(lazy, -1);
|
|
10
|
+
state.postDecrement = _$_.update(lazy, -1);
|
|
11
|
+
});"
|
|
12
12
|
`;
|
|
@@ -4,9 +4,9 @@ exports[`compiler > assignments > compiles tracked values in effect with assignm
|
|
|
4
4
|
|
|
5
5
|
exports[`compiler > assignments > compiles tracked values in effect with update expressions 1`] = `
|
|
6
6
|
"_$_.untrack(() => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
state.preIncrement = _$_.update_pre(lazy);
|
|
8
|
+
state.postIncrement = _$_.update(lazy);
|
|
9
|
+
state.preDecrement = _$_.update_pre(lazy, -1);
|
|
10
|
+
state.postDecrement = _$_.update(lazy, -1);
|
|
11
|
+
});"
|
|
12
12
|
`;
|
|
@@ -1,72 +1,68 @@
|
|
|
1
1
|
import { RippleArray, effect, track, untrack } from 'ripple';
|
|
2
2
|
import { compile } from '@tsrx/ripple';
|
|
3
3
|
|
|
4
|
-
const EFFECT_BODY_REGEX = /_\$\_\.effect\(\(\) => \{([\s\S]*?)\n\t\}\);/;
|
|
4
|
+
const EFFECT_BODY_REGEX = /_\$\_\.effect\(\(\) => \{([\s\S]*?)\n\t\t\}\);/;
|
|
5
5
|
|
|
6
6
|
describe('compiler > assignments', () => {
|
|
7
7
|
it('properly handles JS assignments, reads and updates to array indices', () => {
|
|
8
8
|
const logs: (number | undefined)[] = [];
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
logs.push(--items2[0]);
|
|
67
|
-
logs.push(--items2[i]);
|
|
68
|
-
logs.push(--items3[0]);
|
|
69
|
-
logs.push(--items3[i]);
|
|
10
|
+
function App() {
|
|
11
|
+
return <>
|
|
12
|
+
let items: number[] = [];
|
|
13
|
+
let tracked_items = track<number[]>([]);
|
|
14
|
+
let items2 = new Array();
|
|
15
|
+
let items3: RippleArray<number> = new RippleArray();
|
|
16
|
+
let i = 0;
|
|
17
|
+
logs.push(items[0]);
|
|
18
|
+
logs.push(items[i]);
|
|
19
|
+
logs.push(tracked_items.value[0]);
|
|
20
|
+
logs.push(tracked_items.value[i]);
|
|
21
|
+
logs.push(items2[0]);
|
|
22
|
+
logs.push(items2[i]);
|
|
23
|
+
logs.push(items3[0]);
|
|
24
|
+
logs.push(items3[i]);
|
|
25
|
+
items[0] = 123;
|
|
26
|
+
items[i] = 123;
|
|
27
|
+
tracked_items.value[0] = 123;
|
|
28
|
+
tracked_items.value[i] = 123;
|
|
29
|
+
items2[0] = 123;
|
|
30
|
+
items2[i] = 123;
|
|
31
|
+
items3[0] = 123;
|
|
32
|
+
items3[i] = 123;
|
|
33
|
+
logs.push(items[0]);
|
|
34
|
+
logs.push(items[i]);
|
|
35
|
+
logs.push(tracked_items.value[0]);
|
|
36
|
+
logs.push(tracked_items.value[i]);
|
|
37
|
+
logs.push(items2[0]);
|
|
38
|
+
logs.push(items2[i]);
|
|
39
|
+
logs.push(items3[0]);
|
|
40
|
+
logs.push(items3[i]);
|
|
41
|
+
items[0]++;
|
|
42
|
+
items[i]++;
|
|
43
|
+
tracked_items.value[0]++;
|
|
44
|
+
tracked_items.value[i]++;
|
|
45
|
+
items2[0]++;
|
|
46
|
+
items2[i]++;
|
|
47
|
+
items3[0]++;
|
|
48
|
+
items3[i]++;
|
|
49
|
+
logs.push(items[0]);
|
|
50
|
+
logs.push(items[i]);
|
|
51
|
+
logs.push(tracked_items.value[0]);
|
|
52
|
+
logs.push(tracked_items.value[i]);
|
|
53
|
+
logs.push(items2[0]);
|
|
54
|
+
logs.push(items2[i]);
|
|
55
|
+
logs.push(items3[0]);
|
|
56
|
+
logs.push(items3[i]);
|
|
57
|
+
logs.push(--items[0]);
|
|
58
|
+
logs.push(--items[i]);
|
|
59
|
+
logs.push(--tracked_items.value[0]);
|
|
60
|
+
logs.push(--tracked_items.value[i]);
|
|
61
|
+
logs.push(--items2[0]);
|
|
62
|
+
logs.push(--items2[i]);
|
|
63
|
+
logs.push(--items3[0]);
|
|
64
|
+
logs.push(--items3[i]);
|
|
65
|
+
</>;
|
|
70
66
|
}
|
|
71
67
|
|
|
72
68
|
render(App);
|
|
@@ -109,13 +105,13 @@ describe('compiler > assignments', () => {
|
|
|
109
105
|
|
|
110
106
|
it('compiles tracked values in effect with assignment expression', () => {
|
|
111
107
|
const source = `import { track, effect } from 'ripple';
|
|
112
|
-
|
|
108
|
+
function App() { return <>
|
|
113
109
|
let &[count] = track(0);
|
|
114
110
|
|
|
115
111
|
effect(() => {
|
|
116
112
|
state.count = count;
|
|
117
113
|
});
|
|
118
|
-
}`;
|
|
114
|
+
</>; }`;
|
|
119
115
|
const result = compile(source, 'test.tsrx');
|
|
120
116
|
const effect_match = result.code.match(EFFECT_BODY_REGEX);
|
|
121
117
|
expect(effect_match?.[1].trim()).toMatchSnapshot();
|
|
@@ -123,7 +119,7 @@ component App() {
|
|
|
123
119
|
|
|
124
120
|
it('compiles tracked values in effect with update expressions', () => {
|
|
125
121
|
const source = `import { track, effect, untrack } from 'ripple';
|
|
126
|
-
|
|
122
|
+
function App() { return <>
|
|
127
123
|
let &[count] = track(5);
|
|
128
124
|
|
|
129
125
|
effect(() => {
|
|
@@ -134,7 +130,7 @@ component App() {
|
|
|
134
130
|
state.postDecrement = count--;
|
|
135
131
|
});
|
|
136
132
|
});
|
|
137
|
-
}`;
|
|
133
|
+
</>; }`;
|
|
138
134
|
const result = compile(source, 'test.tsrx');
|
|
139
135
|
const effect_match = result.code.match(EFFECT_BODY_REGEX);
|
|
140
136
|
expect(effect_match?.[1].trim()).toMatchSnapshot();
|
|
@@ -142,15 +138,15 @@ component App() {
|
|
|
142
138
|
|
|
143
139
|
it('compiles unknown lazy array destructuring through lazy array helpers', () => {
|
|
144
140
|
const source = `import { track } from 'ripple';
|
|
145
|
-
|
|
141
|
+
function Child({ tr: &[count, tr] }) { return <>
|
|
146
142
|
count++;
|
|
147
143
|
tr[0]++;
|
|
148
144
|
<div>{count}</div>
|
|
149
|
-
}
|
|
150
|
-
|
|
145
|
+
</>; }
|
|
146
|
+
function App() { return <>
|
|
151
147
|
let tracked = track(0);
|
|
152
148
|
<Child tr={tracked} />
|
|
153
|
-
}`;
|
|
149
|
+
</>; }`;
|
|
154
150
|
const { code } = compile(source, 'test.tsrx', { mode: 'client' });
|
|
155
151
|
|
|
156
152
|
expect(code).toContain('_$_.lazy_array_get(lazy, 0)');
|
|
@@ -162,13 +158,13 @@ component App() {
|
|
|
162
158
|
});
|
|
163
159
|
|
|
164
160
|
it('compiles writes to unknown lazy array index 1 through lazy array helpers', () => {
|
|
165
|
-
const source = `
|
|
161
|
+
const source = `function Child({ pair: &[first, second] }) { return <>
|
|
166
162
|
second = 10;
|
|
167
163
|
<div>{first}</div>
|
|
168
|
-
}
|
|
169
|
-
|
|
164
|
+
</>; }
|
|
165
|
+
function App() { return <>
|
|
170
166
|
<Child pair={[0, 1]} />
|
|
171
|
-
}`;
|
|
167
|
+
</>; }`;
|
|
172
168
|
const { code } = compile(source, 'test.tsrx', { mode: 'client' });
|
|
173
169
|
|
|
174
170
|
expect(code).toContain('_$_.lazy_array_set(lazy, 10, 1)');
|
|
@@ -176,13 +172,13 @@ component App() {
|
|
|
176
172
|
});
|
|
177
173
|
|
|
178
174
|
it('does not double-wrap member access on lazy array value bindings', () => {
|
|
179
|
-
const source = `
|
|
175
|
+
const source = `function Child({ pair: &[first] }) { return <>
|
|
180
176
|
let value = first[0];
|
|
181
177
|
<div>{value}</div>
|
|
182
|
-
}
|
|
183
|
-
|
|
178
|
+
</>; }
|
|
179
|
+
function App() { return <>
|
|
184
180
|
<Child pair={[{ 0: 'x' }]} />
|
|
185
|
-
}`;
|
|
181
|
+
</>; }`;
|
|
186
182
|
const { code } = compile(source, 'test.tsrx', { mode: 'client' });
|
|
187
183
|
|
|
188
184
|
expect(code).toContain('let value = _$_.lazy_array_get(lazy, 0)[0];');
|
|
@@ -191,13 +187,13 @@ component App() {
|
|
|
191
187
|
|
|
192
188
|
it('throws on indexed access through known tracked lazy destructures', () => {
|
|
193
189
|
const source = `import { track } from 'ripple';
|
|
194
|
-
|
|
190
|
+
function App() { return <>
|
|
195
191
|
let &[value, tracked_ref] = track({ 0: 'x' });
|
|
196
192
|
let nested = value[0];
|
|
197
193
|
tracked_ref[0] = { 0: 'y' };
|
|
198
194
|
let next = value[0];
|
|
199
195
|
<div>{nested}{next}</div>
|
|
200
|
-
}`;
|
|
196
|
+
</>; }`;
|
|
201
197
|
|
|
202
198
|
expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
|
|
203
199
|
/Use \.value or &\[\] lazy destructuring/,
|
|
@@ -206,14 +202,14 @@ component App() {
|
|
|
206
202
|
|
|
207
203
|
it('throws on known tracked indexed access', () => {
|
|
208
204
|
const source = `import { track } from 'ripple';
|
|
209
|
-
|
|
205
|
+
function App() { return <>
|
|
210
206
|
let tracked = track(0);
|
|
211
207
|
tracked[0]++;
|
|
212
208
|
tracked[0] = tracked[0] + 1;
|
|
213
209
|
let value = tracked[0];
|
|
214
210
|
let ref = tracked[1];
|
|
215
211
|
<div>{value}</div>
|
|
216
|
-
}`;
|
|
212
|
+
</>; }`;
|
|
217
213
|
|
|
218
214
|
expect(() => compile(source, 'test.tsrx', { mode: 'client' })).toThrow(
|
|
219
215
|
/Use \.value or &\[\] lazy destructuring/,
|
|
@@ -3,13 +3,13 @@ import { parse, compile } from '@tsrx/ripple';
|
|
|
3
3
|
describe('compiler > attributes', () => {
|
|
4
4
|
it('generates valid JavaScript for component props with hyphenated attributes', () => {
|
|
5
5
|
const source = `
|
|
6
|
-
|
|
6
|
+
function Child(props) { return <>
|
|
7
7
|
<div />
|
|
8
|
-
}
|
|
8
|
+
</>; }
|
|
9
9
|
|
|
10
|
-
export default
|
|
10
|
+
export default function App() { return <>
|
|
11
11
|
<Child data-scope="test" aria-label="accessible" class="valid" />
|
|
12
|
-
}`;
|
|
12
|
+
</>; }`;
|
|
13
13
|
|
|
14
14
|
const result = compile(source, 'test.tsrx', { mode: 'client' });
|
|
15
15
|
|
|
@@ -29,8 +29,8 @@ describe('compiler > attributes', () => {
|
|
|
29
29
|
|
|
30
30
|
testCases.forEach(({ attr, expected }) => {
|
|
31
31
|
const source = `
|
|
32
|
-
|
|
33
|
-
export default
|
|
32
|
+
function Child(props) { return <> <div /> </>; }
|
|
33
|
+
export default function App() { return <> <Child ${attr} /> </>; }`;
|
|
34
34
|
|
|
35
35
|
const result = compile(source, 'test.tsrx', { mode: 'client' });
|
|
36
36
|
expect(result.code).toMatch(expected);
|
|
@@ -39,11 +39,11 @@ describe('compiler > attributes', () => {
|
|
|
39
39
|
|
|
40
40
|
it('handles mixed valid and invalid attribute identifiers correctly', () => {
|
|
41
41
|
const source = `
|
|
42
|
-
|
|
42
|
+
function Child(props) { return <>
|
|
43
43
|
<div />
|
|
44
|
-
}
|
|
44
|
+
</>; }
|
|
45
45
|
|
|
46
|
-
export default
|
|
46
|
+
export default function App() { return <>
|
|
47
47
|
<Child
|
|
48
48
|
validProp="valid"
|
|
49
49
|
class="valid"
|
|
@@ -52,7 +52,7 @@ describe('compiler > attributes', () => {
|
|
|
52
52
|
aria-invalid="invalid"
|
|
53
53
|
custom-prop="invalid"
|
|
54
54
|
/>
|
|
55
|
-
}`;
|
|
55
|
+
</>; }`;
|
|
56
56
|
|
|
57
57
|
const result = compile(source, 'test.tsrx', { mode: 'client' });
|
|
58
58
|
|
|
@@ -69,18 +69,18 @@ describe('compiler > attributes', () => {
|
|
|
69
69
|
|
|
70
70
|
it('ensures generated code is syntactically valid JavaScript', () => {
|
|
71
71
|
const source = `
|
|
72
|
-
|
|
72
|
+
function Child(props) { return <>
|
|
73
73
|
<div />
|
|
74
|
-
}
|
|
74
|
+
</>; }
|
|
75
75
|
|
|
76
|
-
export default
|
|
76
|
+
export default function App() { return <>
|
|
77
77
|
<Child data-scope="test" />
|
|
78
|
-
}`;
|
|
78
|
+
</>; }`;
|
|
79
79
|
|
|
80
80
|
const result = compile(source, 'test.tsrx', { mode: 'client' });
|
|
81
81
|
|
|
82
82
|
// Extract the props object from the generated code and test it's valid JavaScript
|
|
83
|
-
const match = result.code.match(/
|
|
83
|
+
const match = result.code.match(/_\$_.render_component\(Child,\s*[^,]+,\s*(\{[^}]+\})/);
|
|
84
84
|
expect(match).toBeTruthy();
|
|
85
85
|
|
|
86
86
|
const propsObject = match?.[1];
|