ripple 0.3.72 → 0.3.74
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 +66 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -8
- package/src/runtime/index-client.js +3 -13
- package/src/runtime/internal/client/blocks.js +3 -25
- package/src/runtime/internal/client/for.js +80 -5
- package/src/runtime/internal/client/index.js +0 -2
- package/src/runtime/internal/client/types.d.ts +0 -10
- package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
- package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
- package/tests/client/array/array.copy-within.test.tsrx +19 -19
- package/tests/client/array/array.derived.test.tsrx +97 -109
- package/tests/client/array/array.iteration.test.tsrx +28 -28
- package/tests/client/array/array.mutations.test.tsrx +68 -68
- package/tests/client/array/array.static.test.tsrx +82 -92
- package/tests/client/array/array.to-methods.test.tsrx +15 -15
- package/tests/client/async-suspend.test.tsrx +180 -179
- package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
- package/tests/client/basic/basic.attributes.test.tsrx +273 -317
- package/tests/client/basic/basic.collections.test.tsrx +55 -61
- package/tests/client/basic/basic.components.test.tsrx +196 -218
- package/tests/client/basic/basic.errors.test.tsrx +70 -76
- package/tests/client/basic/basic.events.test.tsrx +80 -85
- package/tests/client/basic/basic.get-set.test.tsrx +54 -64
- package/tests/client/basic/basic.hmr.test.tsrx +15 -19
- package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
- package/tests/client/basic/basic.rendering.test.tsrx +273 -178
- package/tests/client/basic/basic.utilities.test.tsrx +8 -10
- package/tests/client/boundaries.test.tsrx +18 -18
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
- package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
- package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
- package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
- package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
- package/tests/client/composite/composite.generics.test.tsrx +165 -167
- package/tests/client/composite/composite.props.test.tsrx +66 -74
- package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
- package/tests/client/composite/composite.render.test.tsrx +92 -101
- package/tests/client/computed-properties.test.tsrx +14 -18
- package/tests/client/context.test.tsrx +14 -18
- package/tests/client/css/global-additional-cases.test.tsrx +491 -437
- package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
- package/tests/client/css/global-at-rules.test.tsrx +71 -66
- package/tests/client/css/global-basic.test.tsrx +105 -98
- package/tests/client/css/global-classes-ids.test.tsrx +128 -114
- package/tests/client/css/global-combinators.test.tsrx +83 -78
- package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
- package/tests/client/css/global-edge-cases.test.tsrx +138 -120
- package/tests/client/css/global-keyframes.test.tsrx +108 -96
- package/tests/client/css/global-nested.test.tsrx +88 -78
- package/tests/client/css/global-pseudo.test.tsrx +104 -98
- package/tests/client/css/global-scoping.test.tsrx +145 -125
- package/tests/client/css/style-identifier.test.tsrx +62 -69
- package/tests/client/date.test.tsrx +83 -83
- package/tests/client/dynamic-elements.test.tsrx +227 -283
- package/tests/client/events.test.tsrx +252 -266
- package/tests/client/for.test.tsrx +120 -127
- package/tests/client/head.test.tsrx +40 -48
- package/tests/client/html.test.tsrx +37 -49
- package/tests/client/input-value.test.tsrx +1125 -1354
- package/tests/client/lazy-array.test.tsrx +10 -16
- package/tests/client/lazy-destructuring.test.tsrx +169 -221
- package/tests/client/map.test.tsrx +39 -41
- package/tests/client/media-query.test.tsrx +15 -19
- package/tests/client/object.test.tsrx +46 -56
- package/tests/client/portal.test.tsrx +31 -37
- package/tests/client/ref.test.tsrx +173 -193
- package/tests/client/return.test.tsrx +62 -37
- package/tests/client/set.test.tsrx +33 -33
- package/tests/client/svg.test.tsrx +195 -215
- package/tests/client/switch.test.tsrx +201 -191
- package/tests/client/track-async-hydration.test.tsrx +14 -18
- package/tests/client/tracked-index-access.test.tsrx +18 -28
- package/tests/client/try.test.tsrx +494 -619
- package/tests/client/tsx.test.tsrx +286 -292
- package/tests/client/typescript-generics.test.tsrx +121 -129
- package/tests/client/url/url.derived.test.tsrx +21 -25
- package/tests/client/url/url.parsing.test.tsrx +35 -35
- package/tests/client/url/url.partial-removal.test.tsrx +32 -32
- package/tests/client/url/url.reactivity.test.tsrx +68 -72
- package/tests/client/url/url.serialization.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
- package/tests/hydration/compiled/client/basic.js +390 -319
- package/tests/hydration/compiled/client/composite.js +52 -44
- package/tests/hydration/compiled/client/for.js +734 -604
- package/tests/hydration/compiled/client/head.js +183 -103
- package/tests/hydration/compiled/client/html.js +93 -86
- package/tests/hydration/compiled/client/if-children.js +95 -71
- package/tests/hydration/compiled/client/if.js +113 -89
- package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
- package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
- package/tests/hydration/compiled/client/reactivity.js +26 -24
- package/tests/hydration/compiled/client/return.js +8 -42
- package/tests/hydration/compiled/client/switch.js +208 -173
- package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
- package/tests/hydration/compiled/client/try.js +29 -21
- package/tests/hydration/compiled/server/basic.js +210 -221
- package/tests/hydration/compiled/server/composite.js +13 -14
- package/tests/hydration/compiled/server/for.js +427 -444
- package/tests/hydration/compiled/server/head.js +199 -189
- package/tests/hydration/compiled/server/html.js +33 -41
- package/tests/hydration/compiled/server/if-children.js +114 -117
- package/tests/hydration/compiled/server/if.js +77 -83
- package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
- package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
- package/tests/hydration/compiled/server/reactivity.js +24 -22
- package/tests/hydration/compiled/server/return.js +6 -18
- package/tests/hydration/compiled/server/switch.js +179 -176
- package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
- package/tests/hydration/compiled/server/try.js +31 -35
- package/tests/hydration/components/basic.tsrx +216 -258
- package/tests/hydration/components/composite.tsrx +32 -42
- package/tests/hydration/components/events.tsrx +81 -101
- package/tests/hydration/components/for.tsrx +270 -336
- package/tests/hydration/components/head.tsrx +43 -39
- package/tests/hydration/components/hmr.tsrx +16 -22
- package/tests/hydration/components/html-in-template.tsrx +15 -21
- package/tests/hydration/components/html.tsrx +442 -526
- package/tests/hydration/components/if-children.tsrx +107 -125
- package/tests/hydration/components/if.tsrx +68 -90
- package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
- package/tests/hydration/components/nested-control-flow.tsrx +202 -216
- package/tests/hydration/components/portal.tsrx +33 -41
- package/tests/hydration/components/reactivity.tsrx +26 -34
- package/tests/hydration/components/return.tsrx +4 -6
- package/tests/hydration/components/switch.tsrx +73 -78
- package/tests/hydration/components/track-async-serialization.tsrx +83 -93
- package/tests/hydration/components/try.tsrx +37 -51
- package/tests/hydration/switch.test.js +8 -8
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +117 -162
- package/tests/server/basic.components.test.tsrx +163 -193
- package/tests/server/basic.test.tsrx +298 -198
- package/tests/server/compiler.test.tsrx +142 -72
- package/tests/server/composite.props.test.tsrx +54 -58
- package/tests/server/composite.test.tsrx +165 -167
- package/tests/server/context.test.tsrx +13 -17
- package/tests/server/dynamic-elements.test.tsrx +103 -135
- package/tests/server/for.test.tsrx +115 -84
- package/tests/server/head.test.tsrx +31 -31
- package/tests/server/html-nesting-validation.test.tsrx +16 -8
- package/tests/server/if.test.tsrx +49 -59
- package/tests/server/lazy-destructuring.test.tsrx +288 -366
- package/tests/server/return.test.tsrx +58 -36
- package/tests/server/streaming-ssr.test.tsrx +4 -4
- package/tests/server/style-identifier.test.tsrx +58 -66
- package/tests/server/switch.test.tsrx +89 -97
- package/tests/server/track-async-serialization.test.tsrx +85 -103
- package/tests/server/try.test.tsrx +275 -360
- package/tests/utils/ref-types.test.js +72 -0
- package/tests/utils/vite-plugin-config.test.js +41 -74
- package/types/index.d.ts +1 -0
- package/src/runtime/internal/client/compat.js +0 -40
- package/tests/utils/compiler-compat-config.test.js +0 -38
|
@@ -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
|
-
function Basic() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
function Basic() @{
|
|
7
|
+
let &[hasError] = track(false);
|
|
8
|
+
let &[errorMessage] = track('');
|
|
9
|
+
const triggerError = () => {
|
|
10
|
+
try {
|
|
11
|
+
throw new Error('Test error');
|
|
12
|
+
} catch (e) {
|
|
13
|
+
hasError = true;
|
|
14
|
+
errorMessage = (e as Error).message;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
<div>
|
|
18
|
+
<button onClick={triggerError}>{'Trigger Error'}</button>
|
|
19
|
+
@if (hasError) {
|
|
20
|
+
<div class="error">
|
|
21
|
+
{'Error caught: ' + errorMessage}
|
|
22
|
+
</div>
|
|
23
|
+
} @else {
|
|
24
|
+
<div class="success">{'No error'}</div>
|
|
25
|
+
}
|
|
26
|
+
</div>
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
render(Basic);
|
|
@@ -114,18 +114,16 @@ describe('basic client > errors', () => {
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
it('errors on mutating tracked value inside computed track() evaluation', () => {
|
|
117
|
-
function Basic() {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
<p>{doubled}</p>
|
|
128
|
-
</>;
|
|
117
|
+
function Basic() @{
|
|
118
|
+
let &[count] = track(0);
|
|
119
|
+
const &[doubled] = track(() => {
|
|
120
|
+
try {
|
|
121
|
+
count *= 2;
|
|
122
|
+
} catch (e) {
|
|
123
|
+
error = (e as Error).message;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
<p>{doubled}</p>
|
|
129
127
|
}
|
|
130
128
|
|
|
131
129
|
render(Basic);
|
|
@@ -136,20 +134,18 @@ describe('basic client > errors', () => {
|
|
|
136
134
|
});
|
|
137
135
|
|
|
138
136
|
it('errors on mutating tracked value inside untrack() in computed track() evaluation', () => {
|
|
139
|
-
function Basic() {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
<p>{doubled}</p>
|
|
152
|
-
</>;
|
|
137
|
+
function Basic() @{
|
|
138
|
+
let &[count] = track(0);
|
|
139
|
+
const &[doubled] = track(() => {
|
|
140
|
+
try {
|
|
141
|
+
untrack(() => {
|
|
142
|
+
count *= 2;
|
|
143
|
+
});
|
|
144
|
+
} catch (e) {
|
|
145
|
+
error = (e as Error).message;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
<p>{doubled}</p>
|
|
153
149
|
}
|
|
154
150
|
|
|
155
151
|
render(Basic);
|
|
@@ -160,19 +156,17 @@ describe('basic client > errors', () => {
|
|
|
160
156
|
});
|
|
161
157
|
|
|
162
158
|
it('errors on mutating a tracked variable in track() getter', () => {
|
|
163
|
-
function Basic() {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
<p>{doubled}</p>
|
|
175
|
-
</>;
|
|
159
|
+
function Basic() @{
|
|
160
|
+
let &[count] = track(0);
|
|
161
|
+
const &[doubled] = track(0, (value) => {
|
|
162
|
+
try {
|
|
163
|
+
count += 1;
|
|
164
|
+
} catch (e) {
|
|
165
|
+
error = (e as Error).message;
|
|
166
|
+
}
|
|
167
|
+
return value;
|
|
168
|
+
});
|
|
169
|
+
<p>{doubled}</p>
|
|
176
170
|
}
|
|
177
171
|
|
|
178
172
|
render(Basic);
|
|
@@ -184,48 +178,48 @@ describe('basic client > errors', () => {
|
|
|
184
178
|
|
|
185
179
|
it('should throw error for await inside client components', () => {
|
|
186
180
|
const code = `
|
|
187
|
-
export default async function App() {
|
|
181
|
+
export default async function App() @{
|
|
188
182
|
let data = 'initial';
|
|
189
183
|
if (true) {
|
|
190
184
|
await new Promise(r => setTimeout(r, 100));
|
|
191
185
|
data = 'loaded';
|
|
192
186
|
}
|
|
193
187
|
<div>{data}</div>
|
|
194
|
-
|
|
188
|
+
}
|
|
195
189
|
`;
|
|
196
190
|
expect(() => {
|
|
197
191
|
compile(code, 'test.tsrx', { mode: 'client' });
|
|
198
192
|
}).toThrow(/`await` is not allowed inside components\./);
|
|
199
193
|
});
|
|
200
194
|
|
|
201
|
-
it('should
|
|
195
|
+
it('should allow while loop setup inside a component', () => {
|
|
202
196
|
const code = `
|
|
203
|
-
export default function App() {
|
|
197
|
+
export default function App() @{
|
|
204
198
|
let i = 0;
|
|
205
199
|
while (i < 10) {
|
|
206
200
|
i++;
|
|
207
201
|
}
|
|
208
202
|
<div>{i}</div>
|
|
209
|
-
|
|
203
|
+
}
|
|
210
204
|
`;
|
|
211
205
|
expect(() => {
|
|
212
206
|
compile(code, 'test.tsrx');
|
|
213
|
-
}).toThrow(
|
|
207
|
+
}).not.toThrow();
|
|
214
208
|
});
|
|
215
209
|
|
|
216
|
-
it('should
|
|
210
|
+
it('should allow do...while loop setup inside a component', () => {
|
|
217
211
|
const code = `
|
|
218
|
-
export default function App() {
|
|
212
|
+
export default function App() @{
|
|
219
213
|
let i = 0;
|
|
220
214
|
do {
|
|
221
215
|
i++;
|
|
222
216
|
} while (i < 10);
|
|
223
217
|
<div>{i}</div>
|
|
224
|
-
|
|
218
|
+
}
|
|
225
219
|
`;
|
|
226
220
|
expect(() => {
|
|
227
221
|
compile(code, 'test.tsrx');
|
|
228
|
-
}).toThrow(
|
|
222
|
+
}).not.toThrow();
|
|
229
223
|
});
|
|
230
224
|
|
|
231
225
|
it('should allow JSX fragments in TSRX templates as <> shorthand', () => {
|
|
@@ -254,7 +248,7 @@ describe('basic client > errors', () => {
|
|
|
254
248
|
|
|
255
249
|
it('should not throw error for while loop inside a function within a component', () => {
|
|
256
250
|
const code = `
|
|
257
|
-
export default function App() {
|
|
251
|
+
export default function App() @{
|
|
258
252
|
const compute = () => {
|
|
259
253
|
let i = 0;
|
|
260
254
|
while (i < 10) {
|
|
@@ -263,7 +257,7 @@ describe('basic client > errors', () => {
|
|
|
263
257
|
return i;
|
|
264
258
|
};
|
|
265
259
|
<div>{compute()}</div>
|
|
266
|
-
|
|
260
|
+
}
|
|
267
261
|
`;
|
|
268
262
|
expect(() => {
|
|
269
263
|
compile(code, 'test.tsrx');
|
|
@@ -272,7 +266,7 @@ describe('basic client > errors', () => {
|
|
|
272
266
|
|
|
273
267
|
it('should not throw error for do...while loop inside a function within a component', () => {
|
|
274
268
|
const code = `
|
|
275
|
-
export default function App() {
|
|
269
|
+
export default function App() @{
|
|
276
270
|
const compute = () => {
|
|
277
271
|
let i = 0;
|
|
278
272
|
do {
|
|
@@ -281,7 +275,7 @@ describe('basic client > errors', () => {
|
|
|
281
275
|
return i;
|
|
282
276
|
};
|
|
283
277
|
<div>{compute()}</div>
|
|
284
|
-
|
|
278
|
+
}
|
|
285
279
|
`;
|
|
286
280
|
expect(() => {
|
|
287
281
|
compile(code, 'test.tsrx');
|
|
@@ -290,10 +284,10 @@ describe('basic client > errors', () => {
|
|
|
290
284
|
|
|
291
285
|
it('should throw error for variables using the reserved _$_ prefix', () => {
|
|
292
286
|
const code = `
|
|
293
|
-
export default function App() {
|
|
287
|
+
export default function App() @{
|
|
294
288
|
const _$_test = 'hello';
|
|
295
289
|
<div>{_$_test}</div>
|
|
296
|
-
|
|
290
|
+
}
|
|
297
291
|
`;
|
|
298
292
|
expect(() => {
|
|
299
293
|
compile(code, 'test.tsrx');
|
|
@@ -3,10 +3,10 @@ import { flushSync, track } from 'ripple';
|
|
|
3
3
|
|
|
4
4
|
describe('basic client > events', () => {
|
|
5
5
|
it('renders with different event types', () => {
|
|
6
|
-
function Basic() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
function Basic() @{
|
|
7
|
+
let &[focusCount] = track(0);
|
|
8
|
+
let &[clickCount] = track(0);
|
|
9
|
+
<>
|
|
10
10
|
<button
|
|
11
11
|
onFocus={() => {
|
|
12
12
|
focusCount++;
|
|
@@ -14,12 +14,10 @@ describe('basic client > events', () => {
|
|
|
14
14
|
onClick={() => {
|
|
15
15
|
clickCount++;
|
|
16
16
|
}}
|
|
17
|
-
>
|
|
18
|
-
{'Test Button'}
|
|
19
|
-
</button>
|
|
17
|
+
>{'Test Button'}</button>
|
|
20
18
|
<div class="focus-count">{focusCount}</div>
|
|
21
19
|
<div class="click-count">{clickCount}</div>
|
|
22
|
-
|
|
20
|
+
</>
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
render(Basic);
|
|
@@ -38,10 +36,10 @@ describe('basic client > events', () => {
|
|
|
38
36
|
});
|
|
39
37
|
|
|
40
38
|
it('renders with capture events', () => {
|
|
41
|
-
function Basic() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
function Basic() @{
|
|
40
|
+
let &[captureClicks] = track(0);
|
|
41
|
+
let &[bubbleClicks] = track(0);
|
|
42
|
+
<>
|
|
45
43
|
<div
|
|
46
44
|
onClick={{
|
|
47
45
|
handleEvent: () => {
|
|
@@ -54,13 +52,11 @@ describe('basic client > events', () => {
|
|
|
54
52
|
onClick={() => {
|
|
55
53
|
bubbleClicks++;
|
|
56
54
|
}}
|
|
57
|
-
>
|
|
58
|
-
{'Click me'}
|
|
59
|
-
</button>
|
|
55
|
+
>{'Click me'}</button>
|
|
60
56
|
<div class="capture-count">{captureClicks}</div>
|
|
61
57
|
<div class="bubble-count">{bubbleClicks}</div>
|
|
62
58
|
</div>
|
|
63
|
-
|
|
59
|
+
</>
|
|
64
60
|
}
|
|
65
61
|
|
|
66
62
|
render(Basic);
|
|
@@ -77,25 +73,23 @@ describe('basic client > events', () => {
|
|
|
77
73
|
});
|
|
78
74
|
|
|
79
75
|
it('renders with event listeners in spread props', () => {
|
|
80
|
-
function Basic() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
<
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
</div>
|
|
98
|
-
</>;
|
|
76
|
+
function Basic() @{
|
|
77
|
+
let &[count] = track(0);
|
|
78
|
+
const minus = {
|
|
79
|
+
onClick() {
|
|
80
|
+
count--;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const plus = {
|
|
84
|
+
onClick() {
|
|
85
|
+
count++;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
<div>
|
|
89
|
+
<button {...minus} class="minus">{'-'}</button>
|
|
90
|
+
<span class="count">{count}</span>
|
|
91
|
+
<button {...plus} class="plus">{'+'}</button>
|
|
92
|
+
</div>
|
|
99
93
|
}
|
|
100
94
|
|
|
101
95
|
render(Basic);
|
|
@@ -125,16 +119,17 @@ describe('basic client > events', () => {
|
|
|
125
119
|
});
|
|
126
120
|
|
|
127
121
|
it('removes event listeners from spread props when they are replaced by another prop', () => {
|
|
128
|
-
function Basic() {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
<button
|
|
133
|
-
|
|
134
|
-
|
|
122
|
+
function Basic() @{
|
|
123
|
+
let &[enabled] = track(true);
|
|
124
|
+
let &[count] = track(0);
|
|
125
|
+
<>
|
|
126
|
+
<button
|
|
127
|
+
class="target"
|
|
128
|
+
{...(enabled ? { onClick: () => count++ } : { title: 'disabled' })}
|
|
129
|
+
>{'target'}</button>
|
|
135
130
|
<button class="toggle" onClick={() => (enabled = false)}>{'toggle'}</button>
|
|
136
131
|
<span class="count">{count}</span>
|
|
137
|
-
|
|
132
|
+
</>
|
|
138
133
|
}
|
|
139
134
|
|
|
140
135
|
render(Basic);
|
|
@@ -156,26 +151,24 @@ describe('basic client > events', () => {
|
|
|
156
151
|
});
|
|
157
152
|
|
|
158
153
|
it('handles both delegated and non-delegated events in spread props', () => {
|
|
159
|
-
function Basic() {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
<
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
</div>
|
|
178
|
-
</>;
|
|
154
|
+
function Basic() @{
|
|
155
|
+
let &[clickCount] = track(0);
|
|
156
|
+
let &[focusCount] = track(0);
|
|
157
|
+
const mixedHandler = {
|
|
158
|
+
onClick() {
|
|
159
|
+
// Delegated event
|
|
160
|
+
clickCount++;
|
|
161
|
+
},
|
|
162
|
+
onFocus() {
|
|
163
|
+
// Non-delegated event
|
|
164
|
+
focusCount++;
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
<div>
|
|
168
|
+
<button {...mixedHandler} class="mixed-button">{'Test'}</button>
|
|
169
|
+
<span class="click-count">{clickCount}</span>
|
|
170
|
+
<span class="focus-count">{focusCount}</span>
|
|
171
|
+
</div>
|
|
179
172
|
}
|
|
180
173
|
|
|
181
174
|
render(Basic);
|
|
@@ -199,33 +192,35 @@ describe('basic client > events', () => {
|
|
|
199
192
|
});
|
|
200
193
|
|
|
201
194
|
it('renders with complex event handling and state updates', () => {
|
|
202
|
-
function Basic() {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
195
|
+
function Basic() @{
|
|
196
|
+
let &[counter] = track(0);
|
|
197
|
+
let &[history] = track<string[]>([]);
|
|
198
|
+
let &[isEven] = track(true);
|
|
199
|
+
const handleIncrement = () => {
|
|
200
|
+
counter++;
|
|
201
|
+
history = [...history, `Inc to ${counter}`];
|
|
202
|
+
isEven = counter % 2 === 0;
|
|
203
|
+
};
|
|
204
|
+
const handleDecrement = () => {
|
|
205
|
+
counter--;
|
|
206
|
+
history = [...history, `Dec to ${counter}`];
|
|
207
|
+
isEven = counter % 2 === 0;
|
|
208
|
+
};
|
|
209
|
+
const handleReset = () => {
|
|
210
|
+
counter = 0;
|
|
211
|
+
history = [...history, 'Reset'];
|
|
212
|
+
isEven = true;
|
|
213
|
+
};
|
|
214
|
+
<>
|
|
222
215
|
<div class="counter">{counter}</div>
|
|
223
|
-
<div class="parity">
|
|
216
|
+
<div class="parity">
|
|
217
|
+
{isEven ? 'Even' : 'Odd'}
|
|
218
|
+
</div>
|
|
224
219
|
<div class="history-count">{history.length}</div>
|
|
225
220
|
<button class="inc-btn" onClick={handleIncrement}>{'+'}</button>
|
|
226
221
|
<button class="dec-btn" onClick={handleDecrement}>{'-'}</button>
|
|
227
222
|
<button class="reset-btn" onClick={handleReset}>{'Reset'}</button>
|
|
228
|
-
|
|
223
|
+
</>
|
|
229
224
|
}
|
|
230
225
|
|
|
231
226
|
render(Basic);
|