ripple 0.3.67 → 0.3.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +143 -291
- 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 -148
- 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
|
@@ -3,27 +3,27 @@ import { compile } from '@tsrx/ripple';
|
|
|
3
3
|
|
|
4
4
|
describe('basic client > errors', () => {
|
|
5
5
|
it('renders with error handling simulation', () => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
function Basic() {
|
|
7
|
+
return <>
|
|
8
|
+
let &[hasError] = track(false);
|
|
9
|
+
let &[errorMessage] = track('');
|
|
10
|
+
const triggerError = () => {
|
|
11
|
+
try {
|
|
12
|
+
throw new Error('Test error');
|
|
13
|
+
} catch (e) {
|
|
14
|
+
hasError = true;
|
|
15
|
+
errorMessage = (e as Error).message;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
<div>
|
|
19
|
+
<button onClick={triggerError}>{'Trigger Error'}</button>
|
|
20
|
+
if (hasError) {
|
|
21
|
+
<div class="error">{'Error caught: ' + errorMessage}</div>
|
|
22
|
+
} else {
|
|
23
|
+
<div class="success">{'No error'}</div>
|
|
24
|
+
}
|
|
25
|
+
</div>
|
|
26
|
+
</>;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
render(Basic);
|
|
@@ -43,29 +43,29 @@ describe('basic client > errors', () => {
|
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
it('should throw error for unclosed tag', () => {
|
|
46
|
-
const malformedCode = `export default
|
|
46
|
+
const malformedCode = `export default function Example() { return <>
|
|
47
47
|
<div></span>
|
|
48
|
-
}`;
|
|
48
|
+
</>; }`;
|
|
49
49
|
expect(() => {
|
|
50
50
|
compile(malformedCode, 'test.tsrx');
|
|
51
51
|
}).toThrow('Expected closing tag to match opening tag');
|
|
52
52
|
});
|
|
53
53
|
|
|
54
54
|
it('should throw error for completely unclosed tag', () => {
|
|
55
|
-
const malformedCode = `export default
|
|
55
|
+
const malformedCode = `export default function Example() { return <>
|
|
56
56
|
<div>content
|
|
57
|
-
}`;
|
|
57
|
+
</>; }`;
|
|
58
58
|
|
|
59
59
|
expect(() => {
|
|
60
60
|
compile(malformedCode, 'test.tsrx');
|
|
61
|
-
}).toThrow('
|
|
61
|
+
}).toThrow('Expected closing tag to match opening tag');
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
it('should throw error for interpolating children as text', () => {
|
|
65
65
|
const code = `
|
|
66
|
-
export
|
|
66
|
+
export function Layout({ children }) { return <>
|
|
67
67
|
<div>{children}</div>
|
|
68
|
-
}
|
|
68
|
+
</>; }
|
|
69
69
|
`;
|
|
70
70
|
|
|
71
71
|
expect(() => {
|
|
@@ -75,9 +75,9 @@ describe('basic client > errors', () => {
|
|
|
75
75
|
|
|
76
76
|
it('should throw error for interpolating props.children as text', () => {
|
|
77
77
|
const code = `
|
|
78
|
-
export
|
|
78
|
+
export function Layout(props) { return <>
|
|
79
79
|
<div>{props.children}</div>
|
|
80
|
-
}
|
|
80
|
+
</>; }
|
|
81
81
|
`;
|
|
82
82
|
|
|
83
83
|
expect(() => {
|
|
@@ -87,9 +87,9 @@ describe('basic client > errors', () => {
|
|
|
87
87
|
|
|
88
88
|
it('should throw error for calling children as a function', () => {
|
|
89
89
|
const code = `
|
|
90
|
-
export
|
|
90
|
+
export function Layout({ children }) { return <>
|
|
91
91
|
{children()}
|
|
92
|
-
}
|
|
92
|
+
</>; }
|
|
93
93
|
`;
|
|
94
94
|
|
|
95
95
|
expect(() => {
|
|
@@ -101,9 +101,9 @@ describe('basic client > errors', () => {
|
|
|
101
101
|
|
|
102
102
|
it('should throw error for calling props.children as a function', () => {
|
|
103
103
|
const code = `
|
|
104
|
-
export
|
|
104
|
+
export function Layout(props) { return <>
|
|
105
105
|
{props.children()}
|
|
106
|
-
}
|
|
106
|
+
</>; }
|
|
107
107
|
`;
|
|
108
108
|
|
|
109
109
|
expect(() => {
|
|
@@ -114,18 +114,18 @@ describe('basic client > errors', () => {
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
it('errors on mutating tracked value inside computed track() evaluation', () => {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
117
|
+
function Basic() {
|
|
118
|
+
return <>
|
|
119
|
+
let &[count] = track(0);
|
|
120
|
+
const &[doubled] = track(() => {
|
|
121
|
+
try {
|
|
122
|
+
count *= 2;
|
|
123
|
+
} catch (e) {
|
|
124
|
+
error = (e as Error).message;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
<p>{doubled}</p>
|
|
128
|
+
</>;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
render(Basic);
|
|
@@ -136,20 +136,20 @@ describe('basic client > errors', () => {
|
|
|
136
136
|
});
|
|
137
137
|
|
|
138
138
|
it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
139
|
+
function Basic() {
|
|
140
|
+
return <>
|
|
141
|
+
let &[count] = track(0);
|
|
142
|
+
const &[doubled] = track(() => {
|
|
143
|
+
try {
|
|
144
|
+
untrack(() => {
|
|
145
|
+
count *= 2;
|
|
146
|
+
});
|
|
147
|
+
} catch (e) {
|
|
148
|
+
error = (e as Error).message;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
<p>{doubled}</p>
|
|
152
|
+
</>;
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
render(Basic);
|
|
@@ -160,19 +160,19 @@ describe('basic client > errors', () => {
|
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
it('errors on mutating a tracked variable in track() getter', () => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
163
|
+
function Basic() {
|
|
164
|
+
return <>
|
|
165
|
+
let &[count] = track(0);
|
|
166
|
+
const &[doubled] = track(0, (value) => {
|
|
167
|
+
try {
|
|
168
|
+
count += 1;
|
|
169
|
+
} catch (e) {
|
|
170
|
+
error = (e as Error).message;
|
|
171
|
+
}
|
|
172
|
+
return value;
|
|
173
|
+
});
|
|
174
|
+
<p>{doubled}</p>
|
|
175
|
+
</>;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
render(Basic);
|
|
@@ -184,14 +184,14 @@ describe('basic client > errors', () => {
|
|
|
184
184
|
|
|
185
185
|
it('should throw error for await inside client components', () => {
|
|
186
186
|
const code = `
|
|
187
|
-
export default
|
|
187
|
+
export default async function App() { return <>
|
|
188
188
|
let data = 'initial';
|
|
189
189
|
if (true) {
|
|
190
190
|
await new Promise(r => setTimeout(r, 100));
|
|
191
191
|
data = 'loaded';
|
|
192
192
|
}
|
|
193
193
|
<div>{data}</div>
|
|
194
|
-
}
|
|
194
|
+
</>; }
|
|
195
195
|
`;
|
|
196
196
|
expect(() => {
|
|
197
197
|
compile(code, 'test.tsrx', { mode: 'client' });
|
|
@@ -200,39 +200,39 @@ describe('basic client > errors', () => {
|
|
|
200
200
|
|
|
201
201
|
it('should throw error for while loop inside a component', () => {
|
|
202
202
|
const code = `
|
|
203
|
-
export default
|
|
203
|
+
export default function App() { return <>
|
|
204
204
|
let i = 0;
|
|
205
205
|
while (i < 10) {
|
|
206
206
|
i++;
|
|
207
207
|
}
|
|
208
208
|
<div>{i}</div>
|
|
209
|
-
}
|
|
209
|
+
</>; }
|
|
210
210
|
`;
|
|
211
211
|
expect(() => {
|
|
212
212
|
compile(code, 'test.tsrx');
|
|
213
|
-
}).toThrow('While loops are not supported in
|
|
213
|
+
}).toThrow('While loops are not supported in TSRX templates.');
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
it('should throw error for do...while loop inside a component', () => {
|
|
217
217
|
const code = `
|
|
218
|
-
export default
|
|
218
|
+
export default function App() { return <>
|
|
219
219
|
let i = 0;
|
|
220
220
|
do {
|
|
221
221
|
i++;
|
|
222
222
|
} while (i < 10);
|
|
223
223
|
<div>{i}</div>
|
|
224
|
-
}
|
|
224
|
+
</>; }
|
|
225
225
|
`;
|
|
226
226
|
expect(() => {
|
|
227
227
|
compile(code, 'test.tsrx');
|
|
228
|
-
}).toThrow('Do...while loops are not supported in
|
|
228
|
+
}).toThrow('Do...while loops are not supported in TSRX templates.');
|
|
229
229
|
});
|
|
230
230
|
|
|
231
231
|
it('should allow JSX fragments in TSRX templates as <tsx> shorthand', () => {
|
|
232
232
|
const code = `
|
|
233
|
-
export default
|
|
233
|
+
export default function SafeProfile() { return <>
|
|
234
234
|
<b><>{111}</></b>
|
|
235
|
-
}
|
|
235
|
+
</>; }
|
|
236
236
|
`;
|
|
237
237
|
|
|
238
238
|
expect(() => {
|
|
@@ -242,9 +242,9 @@ describe('basic client > errors', () => {
|
|
|
242
242
|
|
|
243
243
|
it('should allow JSX fragments inside tsx blocks', () => {
|
|
244
244
|
const code = `
|
|
245
|
-
export default
|
|
245
|
+
export default function SafeProfile() { return <>
|
|
246
246
|
<tsx><>{111}</></tsx>
|
|
247
|
-
}
|
|
247
|
+
</>; }
|
|
248
248
|
`;
|
|
249
249
|
|
|
250
250
|
expect(() => {
|
|
@@ -254,7 +254,7 @@ describe('basic client > errors', () => {
|
|
|
254
254
|
|
|
255
255
|
it('should not throw error for while loop inside a function within a component', () => {
|
|
256
256
|
const code = `
|
|
257
|
-
export default
|
|
257
|
+
export default function App() { return <>
|
|
258
258
|
const compute = () => {
|
|
259
259
|
let i = 0;
|
|
260
260
|
while (i < 10) {
|
|
@@ -263,7 +263,7 @@ describe('basic client > errors', () => {
|
|
|
263
263
|
return i;
|
|
264
264
|
};
|
|
265
265
|
<div>{compute()}</div>
|
|
266
|
-
}
|
|
266
|
+
</>; }
|
|
267
267
|
`;
|
|
268
268
|
expect(() => {
|
|
269
269
|
compile(code, 'test.tsrx');
|
|
@@ -272,7 +272,7 @@ describe('basic client > errors', () => {
|
|
|
272
272
|
|
|
273
273
|
it('should not throw error for do...while loop inside a function within a component', () => {
|
|
274
274
|
const code = `
|
|
275
|
-
export default
|
|
275
|
+
export default function App() { return <>
|
|
276
276
|
const compute = () => {
|
|
277
277
|
let i = 0;
|
|
278
278
|
do {
|
|
@@ -281,7 +281,7 @@ describe('basic client > errors', () => {
|
|
|
281
281
|
return i;
|
|
282
282
|
};
|
|
283
283
|
<div>{compute()}</div>
|
|
284
|
-
}
|
|
284
|
+
</>; }
|
|
285
285
|
`;
|
|
286
286
|
expect(() => {
|
|
287
287
|
compile(code, 'test.tsrx');
|
|
@@ -290,10 +290,10 @@ describe('basic client > errors', () => {
|
|
|
290
290
|
|
|
291
291
|
it('should throw error for variables using the reserved _$_ prefix', () => {
|
|
292
292
|
const code = `
|
|
293
|
-
export default
|
|
293
|
+
export default function App() { return <>
|
|
294
294
|
const _$_test = 'hello';
|
|
295
295
|
<div>{_$_test}</div>
|
|
296
|
-
}
|
|
296
|
+
</>; }
|
|
297
297
|
`;
|
|
298
298
|
expect(() => {
|
|
299
299
|
compile(code, 'test.tsrx');
|
|
@@ -3,22 +3,23 @@ import { flushSync, track } from 'ripple';
|
|
|
3
3
|
|
|
4
4
|
describe('basic client > events', () => {
|
|
5
5
|
it('renders with different event types', () => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
6
|
+
function Basic() {
|
|
7
|
+
return <>
|
|
8
|
+
let &[focusCount] = track(0);
|
|
9
|
+
let &[clickCount] = track(0);
|
|
10
|
+
<button
|
|
11
|
+
onFocus={() => {
|
|
12
|
+
focusCount++;
|
|
13
|
+
}}
|
|
14
|
+
onClick={() => {
|
|
15
|
+
clickCount++;
|
|
16
|
+
}}
|
|
17
|
+
>
|
|
18
|
+
{'Test Button'}
|
|
19
|
+
</button>
|
|
20
|
+
<div class="focus-count">{focusCount}</div>
|
|
21
|
+
<div class="click-count">{clickCount}</div>
|
|
22
|
+
</>;
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
render(Basic);
|
|
@@ -37,28 +38,29 @@ describe('basic client > events', () => {
|
|
|
37
38
|
});
|
|
38
39
|
|
|
39
40
|
it('renders with capture events', () => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}}
|
|
51
|
-
>
|
|
52
|
-
<button
|
|
53
|
-
onClick={() => {
|
|
54
|
-
bubbleClicks++;
|
|
41
|
+
function Basic() {
|
|
42
|
+
return <>
|
|
43
|
+
let &[captureClicks] = track(0);
|
|
44
|
+
let &[bubbleClicks] = track(0);
|
|
45
|
+
<div
|
|
46
|
+
onClick={{
|
|
47
|
+
handleEvent: () => {
|
|
48
|
+
captureClicks++;
|
|
49
|
+
},
|
|
50
|
+
capture: true,
|
|
55
51
|
}}
|
|
56
52
|
>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
<button
|
|
54
|
+
onClick={() => {
|
|
55
|
+
bubbleClicks++;
|
|
56
|
+
}}
|
|
57
|
+
>
|
|
58
|
+
{'Click me'}
|
|
59
|
+
</button>
|
|
60
|
+
<div class="capture-count">{captureClicks}</div>
|
|
61
|
+
<div class="bubble-count">{bubbleClicks}</div>
|
|
62
|
+
</div>
|
|
63
|
+
</>;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
render(Basic);
|
|
@@ -75,26 +77,25 @@ describe('basic client > events', () => {
|
|
|
75
77
|
});
|
|
76
78
|
|
|
77
79
|
it('renders with event listeners in spread props', () => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
</div>
|
|
80
|
+
function Basic() {
|
|
81
|
+
return <>
|
|
82
|
+
let &[count] = track(0);
|
|
83
|
+
const minus = {
|
|
84
|
+
onClick() {
|
|
85
|
+
count--;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const plus = {
|
|
89
|
+
onClick() {
|
|
90
|
+
count++;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
<div>
|
|
94
|
+
<button {...minus} class="minus">{'-'}</button>
|
|
95
|
+
<span class="count">{count}</span>
|
|
96
|
+
<button {...plus} class="plus">{'+'}</button>
|
|
97
|
+
</div>
|
|
98
|
+
</>;
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
render(Basic);
|
|
@@ -124,15 +125,16 @@ describe('basic client > events', () => {
|
|
|
124
125
|
});
|
|
125
126
|
|
|
126
127
|
it('removes event listeners from spread props when they are replaced by another prop', () => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
128
|
+
function Basic() {
|
|
129
|
+
return <>
|
|
130
|
+
let &[enabled] = track(true);
|
|
131
|
+
let &[count] = track(0);
|
|
132
|
+
<button class="target" {...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}>
|
|
133
|
+
{'target'}
|
|
134
|
+
</button>
|
|
135
|
+
<button class="toggle" onClick={() => (enabled = false)}>{'toggle'}</button>
|
|
136
|
+
<span class="count">{count}</span>
|
|
137
|
+
</>;
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
render(Basic);
|
|
@@ -154,26 +156,26 @@ describe('basic client > events', () => {
|
|
|
154
156
|
});
|
|
155
157
|
|
|
156
158
|
it('handles both delegated and non-delegated events in spread props', () => {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
159
|
+
function Basic() {
|
|
160
|
+
return <>
|
|
161
|
+
let &[clickCount] = track(0);
|
|
162
|
+
let &[focusCount] = track(0);
|
|
163
|
+
const mixedHandler = {
|
|
164
|
+
onClick() {
|
|
165
|
+
// Delegated event
|
|
166
|
+
clickCount++;
|
|
167
|
+
},
|
|
168
|
+
onFocus() {
|
|
169
|
+
// Non-delegated event
|
|
170
|
+
focusCount++;
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
<div>
|
|
174
|
+
<button {...mixedHandler} class="mixed-button">{'Test'}</button>
|
|
175
|
+
<span class="click-count">{clickCount}</span>
|
|
176
|
+
<span class="focus-count">{focusCount}</span>
|
|
177
|
+
</div>
|
|
178
|
+
</>;
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
render(Basic);
|
|
@@ -197,36 +199,33 @@ describe('basic client > events', () => {
|
|
|
197
199
|
});
|
|
198
200
|
|
|
199
201
|
it('renders with complex event handling and state updates', () => {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
<button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
|
|
228
|
-
<button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
|
|
229
|
-
<button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
|
|
202
|
+
function Basic() {
|
|
203
|
+
return <>
|
|
204
|
+
let &[counter] = track(0);
|
|
205
|
+
let &[history] = track<string[]>([]);
|
|
206
|
+
let &[isEven] = track(true);
|
|
207
|
+
const handleIncrement = () => {
|
|
208
|
+
counter++;
|
|
209
|
+
history = [...history, `Inc to ${counter}`];
|
|
210
|
+
isEven = counter % 2 === 0;
|
|
211
|
+
};
|
|
212
|
+
const handleDecrement = () => {
|
|
213
|
+
counter--;
|
|
214
|
+
history = [...history, `Dec to ${counter}`];
|
|
215
|
+
isEven = counter % 2 === 0;
|
|
216
|
+
};
|
|
217
|
+
const handleReset = () => {
|
|
218
|
+
counter = 0;
|
|
219
|
+
history = [...history, 'Reset'];
|
|
220
|
+
isEven = true;
|
|
221
|
+
};
|
|
222
|
+
<div class="counter">{counter}</div>
|
|
223
|
+
<div class="parity">{isEven ? 'Even' : 'Odd'}</div>
|
|
224
|
+
<div class="history-count">{history.length}</div>
|
|
225
|
+
<button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
|
|
226
|
+
<button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
|
|
227
|
+
<button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
|
|
228
|
+
</>;
|
|
230
229
|
}
|
|
231
230
|
|
|
232
231
|
render(Basic);
|