ripple 0.3.127 → 0.4.0
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 +293 -0
- package/package.json +10 -4
- package/src/runtime/element.js +23 -6
- package/src/runtime/index-client.js +81 -41
- package/src/runtime/index-server.js +1 -0
- package/src/runtime/internal/client/blocks.js +192 -114
- package/src/runtime/internal/client/component.js +4 -30
- package/src/runtime/internal/client/composite.js +12 -13
- package/src/runtime/internal/client/constants.js +14 -5
- package/src/runtime/internal/client/context.js +12 -19
- package/src/runtime/internal/client/css.js +7 -9
- package/src/runtime/internal/client/events.js +178 -90
- package/src/runtime/internal/client/expression.js +185 -124
- package/src/runtime/internal/client/for.js +616 -264
- package/src/runtime/internal/client/head.js +10 -5
- package/src/runtime/internal/client/html.js +1 -0
- package/src/runtime/internal/client/hydration.js +152 -10
- package/src/runtime/internal/client/if.js +239 -50
- package/src/runtime/internal/client/index.js +9 -13
- package/src/runtime/internal/client/operations.js +44 -51
- package/src/runtime/internal/client/portal.js +163 -85
- package/src/runtime/internal/client/render.js +44 -25
- package/src/runtime/internal/client/rpc.js +3 -3
- package/src/runtime/internal/client/runtime.js +799 -576
- package/src/runtime/internal/client/selector.js +77 -0
- package/src/runtime/internal/client/template.js +133 -158
- package/src/runtime/internal/client/transport.js +38 -0
- package/src/runtime/internal/client/try.js +465 -426
- package/src/runtime/internal/client/types.d.ts +65 -21
- package/src/runtime/internal/client/utils.js +1 -3
- package/src/runtime/internal/server/dynamic.js +20 -21
- package/src/runtime/internal/server/index.js +327 -275
- package/src/runtime/internal/server/rpc.js +3 -2
- package/src/runtime/internal/server/transport.js +16 -0
- package/src/runtime/transport.js +21 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +0 -5
- package/tests/client/array/array.copy-within.test.tsrx +12 -12
- package/tests/client/array/array.derived.test.tsrx +46 -46
- package/tests/client/array/array.iteration.test.tsrx +10 -10
- package/tests/client/array/array.mutations.test.tsrx +20 -20
- package/tests/client/array/array.static.test.tsrx +11 -11
- package/tests/client/array/array.to-methods.test.tsrx +6 -6
- package/tests/client/async-suspend.test.tsrx +74 -75
- package/tests/client/basic/basic.attributes.test.tsrx +86 -83
- package/tests/client/basic/basic.collections.test.tsrx +12 -12
- package/tests/client/basic/basic.components.test.tsrx +99 -25
- package/tests/client/basic/basic.errors.test.tsrx +18 -18
- package/tests/client/basic/basic.events.test.tsrx +42 -42
- package/tests/client/basic/basic.get-set.test.tsrx +8 -8
- package/tests/client/basic/basic.reactivity.test.tsrx +97 -29
- package/tests/client/basic/basic.rendering.test.tsrx +25 -25
- package/tests/client/basic/basic.utilities.test.tsrx +3 -3
- package/tests/client/boundaries.test.tsrx +8 -8
- package/tests/client/boxed-locals.test.tsrx +452 -0
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +6 -6
- package/tests/client/compiler/compiler.assignments.test.tsrx +9 -73
- package/tests/client/compiler/compiler.attributes.test.tsrx +23 -23
- package/tests/client/compiler/compiler.basic.test.tsrx +15 -60
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +18 -43
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +2 -2
- package/tests/client/composite/__snapshots__/composite.render.test.tsrx.snap +0 -1
- package/tests/client/composite/composite.dynamic-components.test.tsrx +77 -6
- package/tests/client/composite/composite.props.test.tsrx +149 -12
- package/tests/client/composite/composite.reactivity.test.tsrx +51 -52
- package/tests/client/composite/composite.render.test.tsrx +26 -9
- package/tests/client/css/scoped-styles.test.tsrx +8 -8
- package/tests/client/date.test.tsrx +42 -42
- package/tests/client/derived-release.test.tsrx +370 -0
- package/tests/client/dynamic-elements.test.tsrx +45 -45
- package/tests/client/events.test.tsrx +97 -71
- package/tests/client/for-selector.test.tsrx +221 -0
- package/tests/client/for-single-root-items.test.tsrx +118 -3
- package/tests/client/for.test.tsrx +332 -31
- package/tests/client/head.test.tsrx +19 -19
- package/tests/client/html.test.tsrx +11 -9
- package/tests/client/if-block.test.tsrx +80 -0
- package/tests/client/map.test.tsrx +16 -16
- package/tests/client/media-query.test.tsrx +7 -7
- package/tests/client/portal.test.tsrx +224 -26
- package/tests/client/primitive-text.test.tsrx +50 -0
- package/tests/client/prop-kind-switch.test.tsrx +141 -0
- package/tests/client/ref.test.tsrx +17 -17
- package/tests/client/return.test.tsrx +26 -3
- package/tests/client/root-boundary.test.tsrx +42 -0
- package/tests/client/scoped-flush.test.tsrx +8 -8
- package/tests/client/set.test.tsrx +6 -6
- package/tests/client/svg.test.tsrx +11 -11
- package/tests/client/switch.test.tsrx +44 -44
- package/tests/client/track-async-hydration.test.tsrx +4 -4
- package/tests/client/try.test.tsrx +151 -83
- package/tests/client/tsx.test.tsrx +43 -40
- package/tests/client/url/url.derived.test.tsrx +6 -6
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +10 -10
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +10 -10
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +18 -18
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +2 -2
- package/tests/hydration/basic.test.js +74 -1
- package/tests/hydration/build-components.js +22 -1
- package/tests/hydration/compiled/client/basic.js +1142 -713
- package/tests/hydration/compiled/client/composite.js +151 -100
- package/tests/hydration/compiled/client/events.js +190 -150
- package/tests/hydration/compiled/client/for.js +1472 -1126
- package/tests/hydration/compiled/client/fragment-cursor.js +2341 -0
- package/tests/hydration/compiled/client/head.js +255 -199
- package/tests/hydration/compiled/client/hmr.js +54 -41
- package/tests/hydration/compiled/client/html-in-template.js +54 -39
- package/tests/hydration/compiled/client/html.js +1633 -1263
- package/tests/hydration/compiled/client/if-children.js +420 -270
- package/tests/hydration/compiled/client/if-fragment-controlflow.js +363 -317
- package/tests/hydration/compiled/client/if.js +229 -219
- package/tests/hydration/compiled/client/mixed-control-flow.js +420 -400
- package/tests/hydration/compiled/client/nested-control-flow.js +1326 -1255
- package/tests/hydration/compiled/client/portal.js +87 -95
- package/tests/hydration/compiled/client/reactivity.js +140 -83
- package/tests/hydration/compiled/client/return.js +28 -19
- package/tests/hydration/compiled/client/streaming.js +390 -306
- package/tests/hydration/compiled/client/switch.js +258 -266
- package/tests/hydration/compiled/client/track-async-serialization.js +448 -280
- package/tests/hydration/compiled/client/try.js +173 -129
- package/tests/hydration/compiled/client/typed-text.js +71 -0
- package/tests/hydration/compiled/fixtures/money.js +10 -0
- package/tests/hydration/compiled/server/basic.js +123 -6
- package/tests/hydration/compiled/server/composite.js +16 -30
- package/tests/hydration/compiled/server/events.js +19 -19
- package/tests/hydration/compiled/server/for.js +109 -49
- package/tests/hydration/compiled/server/fragment-cursor.js +1687 -0
- package/tests/hydration/compiled/server/head.js +20 -28
- package/tests/hydration/compiled/server/hmr.js +2 -2
- package/tests/hydration/compiled/server/html.js +71 -247
- package/tests/hydration/compiled/server/if-children.js +107 -15
- package/tests/hydration/compiled/server/if.js +11 -15
- package/tests/hydration/compiled/server/mixed-control-flow.js +8 -8
- package/tests/hydration/compiled/server/portal.js +14 -22
- package/tests/hydration/compiled/server/reactivity.js +14 -46
- package/tests/hydration/compiled/server/streaming.js +19 -19
- package/tests/hydration/compiled/server/switch.js +8 -8
- package/tests/hydration/compiled/server/track-async-serialization.js +150 -23
- package/tests/hydration/compiled/server/try.js +8 -8
- package/tests/hydration/compiled/server/typed-text.js +17 -0
- package/tests/hydration/components/basic.tsrx +44 -8
- package/tests/hydration/components/composite.tsrx +2 -2
- package/tests/hydration/components/events.tsrx +25 -25
- package/tests/hydration/components/for.tsrx +115 -67
- package/tests/hydration/components/fragment-cursor.tsrx +650 -0
- package/tests/hydration/components/head.tsrx +16 -16
- package/tests/hydration/components/hmr.tsrx +2 -2
- package/tests/hydration/components/html.tsrx +7 -7
- package/tests/hydration/components/if-children.tsrx +72 -25
- package/tests/hydration/components/if.tsrx +18 -18
- package/tests/hydration/components/mixed-control-flow.tsrx +11 -11
- package/tests/hydration/components/portal.tsrx +3 -3
- package/tests/hydration/components/reactivity.tsrx +16 -16
- package/tests/hydration/components/streaming.tsrx +20 -20
- package/tests/hydration/components/switch.tsrx +20 -20
- package/tests/hydration/components/text-types.ts +4 -0
- package/tests/hydration/components/track-async-serialization.tsrx +80 -26
- package/tests/hydration/components/try.tsrx +8 -8
- package/tests/hydration/components/typed-text.tsrx +22 -0
- package/tests/hydration/fixtures/money.js +10 -0
- package/tests/hydration/for.test.js +36 -0
- package/tests/hydration/fragment-cursor.test.js +111 -0
- package/tests/hydration/if-children.test.js +24 -0
- package/tests/hydration/streaming.test.js +19 -0
- package/tests/hydration/track-async-serialization.test.js +87 -2
- package/tests/hydration/tsconfig.text-types.json +10 -0
- package/tests/hydration/typed-text.test.js +34 -0
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +42 -42
- package/tests/server/basic.components.test.tsrx +64 -8
- package/tests/server/basic.test.tsrx +34 -32
- package/tests/server/compiler.test.tsrx +1 -70
- package/tests/server/composite.props.test.tsrx +6 -6
- package/tests/server/dynamic-elements.test.tsrx +31 -8
- package/tests/server/for.test.tsrx +94 -0
- package/tests/server/head.test.tsrx +11 -11
- package/tests/server/scoped-styles.test.tsrx +2 -2
- package/tests/server/streaming-ssr.test.tsrx +48 -43
- package/tests/server/track-async-serialization.test.tsrx +204 -21
- package/tests/server/try.test.tsrx +48 -48
- package/tests/types/transport.ts +40 -0
- package/tests/utils/vite-plugin-config.test.js +23 -0
- package/types/index.d.ts +48 -7
- package/types/server.d.ts +3 -0
- package/types/transport.d.ts +15 -0
- package/src/runtime/internal/client/switch.js +0 -113
- package/src/utils/errors.js +0 -13
- package/tests/client/lazy-array.test.tsrx +0 -31
- package/tests/client/lazy-destructuring.test.tsrx +0 -438
- package/tests/client/tracked-index-access.test.tsrx +0 -113
- package/tests/server/lazy-destructuring.test.tsrx +0 -595
- package/tests/server/tracked-index-access.test.tsrx +0 -76
|
@@ -3,11 +3,11 @@ import { flushSync, track } from 'ripple';
|
|
|
3
3
|
describe('switch statements', () => {
|
|
4
4
|
it('renders simple switch with literal cases', () => {
|
|
5
5
|
function App() @{
|
|
6
|
-
|
|
6
|
+
const value = track('b');
|
|
7
7
|
<>
|
|
8
|
-
<button onClick={() => (value = 'c')}>{'Change to C'}</button>
|
|
9
|
-
<button onClick={() => (value = 'a')}>{'Change to A'}</button>
|
|
10
|
-
@switch (value) {
|
|
8
|
+
<button onClick={() => (value.value = 'c')}>{'Change to C'}</button>
|
|
9
|
+
<button onClick={() => (value.value = 'a')}>{'Change to A'}</button>
|
|
10
|
+
@switch (value.value) {
|
|
11
11
|
@case 'a': {
|
|
12
12
|
<div>Case A</div>
|
|
13
13
|
}
|
|
@@ -39,10 +39,10 @@ describe('switch statements', () => {
|
|
|
39
39
|
|
|
40
40
|
it('renders switch with reactive discriminant', () => {
|
|
41
41
|
function App() @{
|
|
42
|
-
|
|
42
|
+
const count = track(1);
|
|
43
43
|
<>
|
|
44
|
-
<button onClick={() => count++}>{'Increment'}</button>
|
|
45
|
-
@switch (count) {
|
|
44
|
+
<button onClick={() => count.value++}>{'Increment'}</button>
|
|
45
|
+
@switch (count.value) {
|
|
46
46
|
@case 1: {
|
|
47
47
|
<div>{'Count is 1'}</div>
|
|
48
48
|
}
|
|
@@ -72,12 +72,12 @@ describe('switch statements', () => {
|
|
|
72
72
|
|
|
73
73
|
it('renders switch with default clause only', () => {
|
|
74
74
|
function App() @{
|
|
75
|
-
|
|
75
|
+
const value = track('x');
|
|
76
76
|
<>
|
|
77
|
-
<button onClick={() => (value = 'y')}>{'Change Value'}</button>
|
|
78
|
-
@switch (value) {
|
|
77
|
+
<button onClick={() => (value.value = 'y')}>{'Change Value'}</button>
|
|
78
|
+
@switch (value.value) {
|
|
79
79
|
@default: {
|
|
80
|
-
<div>{'Default for ' + value}</div>
|
|
80
|
+
<div>{'Default for ' + value.value}</div>
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
</>
|
|
@@ -94,11 +94,11 @@ describe('switch statements', () => {
|
|
|
94
94
|
|
|
95
95
|
it('renders switch with isolated empty cases', () => {
|
|
96
96
|
function App() @{
|
|
97
|
-
|
|
97
|
+
const value = track('a');
|
|
98
98
|
<>
|
|
99
|
-
<button onClick={() => (value = 'b')}>{'Change to B'}</button>
|
|
100
|
-
<button onClick={() => (value = 'c')}>{'Change to C'}</button>
|
|
101
|
-
@switch (value) {
|
|
99
|
+
<button onClick={() => (value.value = 'b')}>{'Change to B'}</button>
|
|
100
|
+
<button onClick={() => (value.value = 'c')}>{'Change to C'}</button>
|
|
101
|
+
@switch (value.value) {
|
|
102
102
|
@case 'a': {
|
|
103
103
|
<div>Case A</div>
|
|
104
104
|
}
|
|
@@ -138,28 +138,28 @@ describe('switch statements', () => {
|
|
|
138
138
|
|
|
139
139
|
it('renders switch with template content and reacts to tracked changes', () => {
|
|
140
140
|
function App() @{
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
const status = track('active');
|
|
142
|
+
const message = track('');
|
|
143
143
|
<>
|
|
144
|
-
<button onClick={() => (status = 'pending')}>{'Pending'}</button>
|
|
145
|
-
<button onClick={() => (status = 'completed')}>{'Completed'}</button>
|
|
146
|
-
<button onClick={() => (status = 'error')}>{'Error'}</button>
|
|
147
|
-
@switch (status) {
|
|
144
|
+
<button onClick={() => (status.value = 'pending')}>{'Pending'}</button>
|
|
145
|
+
<button onClick={() => (status.value = 'completed')}>{'Completed'}</button>
|
|
146
|
+
<button onClick={() => (status.value = 'error')}>{'Error'}</button>
|
|
147
|
+
@switch (status.value) {
|
|
148
148
|
@case 'active': {
|
|
149
|
-
message = 'Currently active.';
|
|
150
|
-
<div>{'Status: ' + message}</div>
|
|
149
|
+
message.value = 'Currently active.';
|
|
150
|
+
<div>{'Status: ' + message.value}</div>
|
|
151
151
|
}
|
|
152
152
|
@case 'pending': {
|
|
153
|
-
message = 'Waiting for completion.';
|
|
154
|
-
<div>{'Status: ' + message}</div>
|
|
153
|
+
message.value = 'Waiting for completion.';
|
|
154
|
+
<div>{'Status: ' + message.value}</div>
|
|
155
155
|
}
|
|
156
156
|
@case 'completed': {
|
|
157
|
-
message = 'Task finished!';
|
|
158
|
-
<div class="success">{'Status: ' + message}</div>
|
|
157
|
+
message.value = 'Task finished!';
|
|
158
|
+
<div class="success">{'Status: ' + message.value}</div>
|
|
159
159
|
}
|
|
160
160
|
@default: {
|
|
161
|
-
message = 'An error occurred.';
|
|
162
|
-
<div class="error">{'Status: ' + message}</div>
|
|
161
|
+
message.value = 'An error occurred.';
|
|
162
|
+
<div class="error">{'Status: ' + message.value}</div>
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
</>
|
|
@@ -191,10 +191,10 @@ describe('switch statements', () => {
|
|
|
191
191
|
'renders switch with isolated cases and reacts to tracked changes without recreating DOM unnecessarily',
|
|
192
192
|
() => {
|
|
193
193
|
function App() @{
|
|
194
|
-
|
|
194
|
+
const status = track(0);
|
|
195
195
|
<>
|
|
196
196
|
<div>
|
|
197
|
-
@switch (status) {
|
|
197
|
+
@switch (status.value) {
|
|
198
198
|
@case -1: {
|
|
199
199
|
}
|
|
200
200
|
@case 0: {
|
|
@@ -223,7 +223,7 @@ describe('switch statements', () => {
|
|
|
223
223
|
</div>
|
|
224
224
|
<button
|
|
225
225
|
onClick={() => {
|
|
226
|
-
status = (status + 1) % 5;
|
|
226
|
+
status.value = (status.value + 1) % 5;
|
|
227
227
|
}}
|
|
228
228
|
>{'Next Status'}</button>
|
|
229
229
|
</>
|
|
@@ -263,19 +263,19 @@ describe('switch statements', () => {
|
|
|
263
263
|
|
|
264
264
|
it('renders a middle switch case without falling through to later cases', () => {
|
|
265
265
|
function App() @{
|
|
266
|
-
|
|
266
|
+
const value = track('x');
|
|
267
267
|
<>
|
|
268
|
-
<button onClick={() => (value = 'a')}>{'Set A'}</button>
|
|
269
|
-
<button onClick={() => (value = 'b')}>{'Set B'}</button>
|
|
270
|
-
<button onClick={() => (value = 'c')}>{'Set C'}</button>
|
|
271
|
-
<button onClick={() => (value = 'x')}>{'Set X'}</button>
|
|
268
|
+
<button onClick={() => (value.value = 'a')}>{'Set A'}</button>
|
|
269
|
+
<button onClick={() => (value.value = 'b')}>{'Set B'}</button>
|
|
270
|
+
<button onClick={() => (value.value = 'c')}>{'Set C'}</button>
|
|
271
|
+
<button onClick={() => (value.value = 'x')}>{'Set X'}</button>
|
|
272
272
|
<div>
|
|
273
|
-
@switch (value) {
|
|
273
|
+
@switch (value.value) {
|
|
274
274
|
@case 'a': {
|
|
275
275
|
<div>{' Case A'}</div>
|
|
276
276
|
}
|
|
277
277
|
@case 'x': {
|
|
278
|
-
<div>{' Default Case for ' + value}</div>
|
|
278
|
+
<div>{' Default Case for ' + value.value}</div>
|
|
279
279
|
}
|
|
280
280
|
@case 'b': {
|
|
281
281
|
<div>{' Case B'}</div>
|
|
@@ -363,16 +363,16 @@ describe('switch statements', () => {
|
|
|
363
363
|
|
|
364
364
|
it('renders switch with isolated block-scoped cases', () => {
|
|
365
365
|
function App() @{
|
|
366
|
-
|
|
366
|
+
const level = track(1);
|
|
367
367
|
<>
|
|
368
368
|
<button
|
|
369
369
|
onClick={() => {
|
|
370
|
-
if (level === 1) level = 2;
|
|
371
|
-
else if (level === 2) level = 3;
|
|
372
|
-
else level = 1;
|
|
370
|
+
if (level.value === 1) level.value = 2;
|
|
371
|
+
else if (level.value === 2) level.value = 3;
|
|
372
|
+
else level.value = 1;
|
|
373
373
|
}}
|
|
374
374
|
>{'Toggle'}</button>
|
|
375
|
-
@switch (level) {
|
|
375
|
+
@switch (level.value) {
|
|
376
376
|
@case 1: {
|
|
377
377
|
<div class="level">{'Level 1'}</div>
|
|
378
378
|
}
|
|
@@ -7,8 +7,8 @@ describe('trackAsync hydration from serialized data (client)', () => {
|
|
|
7
7
|
|
|
8
8
|
function App() @{
|
|
9
9
|
@try {
|
|
10
|
-
|
|
11
|
-
<p class="result">{data}</p>
|
|
10
|
+
const data = trackAsync(() => Promise.resolve('fallback'));
|
|
11
|
+
<p class="result">{data.value}</p>
|
|
12
12
|
} @pending {
|
|
13
13
|
<p class="loading">{'loading...'}</p>
|
|
14
14
|
}
|
|
@@ -31,8 +31,8 @@ describe('trackAsync hydration from serialized data (client)', () => {
|
|
|
31
31
|
|
|
32
32
|
function App() @{
|
|
33
33
|
@try {
|
|
34
|
-
|
|
35
|
-
<span class="value">{value}</span>
|
|
34
|
+
const value = trackAsync(() => promise);
|
|
35
|
+
<span class="value">{value.value}</span>
|
|
36
36
|
} @pending {
|
|
37
37
|
<span class="pending">{'waiting'}</span>
|
|
38
38
|
}
|