ripple 0.3.72 → 0.3.76
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 +116 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +4 -10
- package/src/runtime/dynamic-client.js +33 -0
- package/src/runtime/dynamic-server.js +80 -0
- package/src/runtime/index-client.js +5 -13
- package/src/runtime/index-server.js +2 -0
- package/src/runtime/internal/client/blocks.js +6 -27
- package/src/runtime/internal/client/composite.js +11 -6
- package/src/runtime/internal/client/for.js +80 -5
- package/src/runtime/internal/client/index.js +0 -2
- package/src/runtime/internal/client/render.js +5 -2
- package/src/runtime/internal/client/types.d.ts +0 -10
- package/src/runtime/internal/server/index.js +8 -1
- 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 +198 -220
- 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.styling.test.tsrx +16 -14
- 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 +62 -47
- 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 +493 -439
- 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 +65 -72
- package/tests/client/date.test.tsrx +83 -83
- package/tests/client/dynamic-elements.test.tsrx +318 -299
- package/tests/client/events.test.tsrx +252 -266
- package/tests/client/for.test.tsrx +120 -127
- package/tests/client/head.test.tsrx +74 -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 +197 -216
- 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 +164 -194
- package/tests/server/basic.test.tsrx +299 -199
- 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 +147 -148
- package/tests/server/for.test.tsrx +115 -84
- package/tests/server/head.test.tsrx +54 -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 +61 -69
- 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 +29 -4
- package/src/runtime/internal/client/compat.js +0 -40
- package/tests/utils/compiler-compat-config.test.js +0 -38
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { track } from 'ripple';
|
|
1
|
+
import { Dynamic, track } from 'ripple';
|
|
2
2
|
import type {
|
|
3
3
|
Tracked,
|
|
4
4
|
PropsWithChildren,
|
|
@@ -18,17 +18,16 @@ describe('basic server > components & composition', () => {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
it('renders with component composition and children', async () => {
|
|
21
|
-
function Card(props: PropsWithChildren<{}>) {
|
|
22
|
-
|
|
21
|
+
function Card(props: PropsWithChildren<{}>) @{
|
|
22
|
+
<div class="card">{props.children}</div>
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
</>;
|
|
25
|
+
function children() @{
|
|
26
|
+
<p>{'Card content here'}</p>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function Basic() @{
|
|
30
|
+
<Card {children} />
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
const { body } = await render(Basic);
|
|
@@ -42,21 +41,16 @@ describe('basic server > components & composition', () => {
|
|
|
42
41
|
});
|
|
43
42
|
|
|
44
43
|
it('does not render a falsy component call', async () => {
|
|
45
|
-
function Card(props: PropsWithChildrenOptional<{ test: Component }>) {
|
|
46
|
-
|
|
47
|
-
<div class="card">
|
|
48
|
-
{props.children}
|
|
49
|
-
</div>
|
|
50
|
-
</>;
|
|
44
|
+
function Card(props: PropsWithChildrenOptional<{ test: Component }>) @{
|
|
45
|
+
<div class="card">{props.children}</div>
|
|
51
46
|
}
|
|
52
47
|
|
|
53
|
-
function
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
</>;
|
|
48
|
+
function test() {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function Basic() @{
|
|
53
|
+
<Card {test} />
|
|
60
54
|
}
|
|
61
55
|
|
|
62
56
|
const { body } = await render(Basic);
|
|
@@ -71,17 +65,16 @@ describe('basic server > components & composition', () => {
|
|
|
71
65
|
});
|
|
72
66
|
|
|
73
67
|
it('renders a component when children is set a component prop', async () => {
|
|
74
|
-
function Card(props: PropsWithChildren<{}>) {
|
|
75
|
-
|
|
68
|
+
function Card(props: PropsWithChildren<{}>) @{
|
|
69
|
+
<div class="card">{props.children}</div>
|
|
76
70
|
}
|
|
77
71
|
|
|
78
|
-
function
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
</>;
|
|
72
|
+
function children() @{
|
|
73
|
+
<p>{'Card content here'}</p>
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function Basic() @{
|
|
77
|
+
<Card {children} />
|
|
85
78
|
}
|
|
86
79
|
|
|
87
80
|
const { body } = await render(Basic);
|
|
@@ -95,12 +88,14 @@ describe('basic server > components & composition', () => {
|
|
|
95
88
|
});
|
|
96
89
|
|
|
97
90
|
it('renders direct component function calls as values', async () => {
|
|
98
|
-
function Test({ label }: { label: string }) {
|
|
99
|
-
|
|
91
|
+
function Test({ label }: { label: string }) @{
|
|
92
|
+
<span>{label}</span>
|
|
100
93
|
}
|
|
101
94
|
|
|
102
|
-
function App() {
|
|
103
|
-
|
|
95
|
+
function App() @{
|
|
96
|
+
<>
|
|
97
|
+
{Test({ label: 'direct call' })}
|
|
98
|
+
</>
|
|
104
99
|
}
|
|
105
100
|
|
|
106
101
|
const { body } = await render(App);
|
|
@@ -115,8 +110,8 @@ describe('basic server > components & composition', () => {
|
|
|
115
110
|
return [item, 'B', null, undefined];
|
|
116
111
|
}
|
|
117
112
|
|
|
118
|
-
function App() {
|
|
119
|
-
|
|
113
|
+
function App() @{
|
|
114
|
+
<Test />
|
|
120
115
|
}
|
|
121
116
|
|
|
122
117
|
const { body } = await render(App);
|
|
@@ -126,13 +121,13 @@ describe('basic server > components & composition', () => {
|
|
|
126
121
|
});
|
|
127
122
|
|
|
128
123
|
it('throws when a TSRXElement value is used as a component type', async () => {
|
|
129
|
-
function Test() {
|
|
130
|
-
|
|
124
|
+
function Test() @{
|
|
125
|
+
<span>{'value'}</span>
|
|
131
126
|
}
|
|
132
127
|
|
|
133
|
-
function App() {
|
|
128
|
+
function App() @{
|
|
134
129
|
const El = Test({});
|
|
135
|
-
|
|
130
|
+
<El />
|
|
136
131
|
}
|
|
137
132
|
|
|
138
133
|
const result = await render_expected_invalid_component(App);
|
|
@@ -145,8 +140,8 @@ describe('basic server > components & composition', () => {
|
|
|
145
140
|
return 'plain';
|
|
146
141
|
}
|
|
147
142
|
|
|
148
|
-
function App() {
|
|
149
|
-
|
|
143
|
+
function App() @{
|
|
144
|
+
<Func />
|
|
150
145
|
}
|
|
151
146
|
|
|
152
147
|
const { body } = await render(App);
|
|
@@ -155,12 +150,12 @@ describe('basic server > components & composition', () => {
|
|
|
155
150
|
});
|
|
156
151
|
|
|
157
152
|
it('allows a compat-only function as a component type', async () => {
|
|
158
|
-
function CompatOnly() {
|
|
159
|
-
|
|
153
|
+
function CompatOnly() @{
|
|
154
|
+
<div>{'compat'}</div>
|
|
160
155
|
}
|
|
161
156
|
|
|
162
|
-
function App() {
|
|
163
|
-
|
|
157
|
+
function App() @{
|
|
158
|
+
<CompatOnly />
|
|
164
159
|
}
|
|
165
160
|
|
|
166
161
|
const { body } = await render(App);
|
|
@@ -173,8 +168,8 @@ describe('basic server > components & composition', () => {
|
|
|
173
168
|
variant: string;
|
|
174
169
|
label: string;
|
|
175
170
|
onClick: EventListener;
|
|
176
|
-
}>) {
|
|
177
|
-
|
|
171
|
+
}>) @{
|
|
172
|
+
<button class={props.variant} onClick={props.onClick}>{props.label}</button>
|
|
178
173
|
}
|
|
179
174
|
|
|
180
175
|
function Card(props: PropsWithExtras<{
|
|
@@ -182,27 +177,27 @@ describe('basic server > components & composition', () => {
|
|
|
182
177
|
content: string;
|
|
183
178
|
buttonText: string;
|
|
184
179
|
onAction: EventListener;
|
|
185
|
-
}>) {
|
|
186
|
-
|
|
187
|
-
<
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
</div>
|
|
192
|
-
</>;
|
|
180
|
+
}>) @{
|
|
181
|
+
<div class="card">
|
|
182
|
+
<h3>{props.title}</h3>
|
|
183
|
+
<p>{props.content}</p>
|
|
184
|
+
<Button variant="primary" label={props.buttonText} onClick={props.onAction} />
|
|
185
|
+
</div>
|
|
193
186
|
}
|
|
194
187
|
|
|
195
|
-
function Basic() {
|
|
196
|
-
|
|
197
|
-
|
|
188
|
+
function Basic() @{
|
|
189
|
+
let &[clicked] = track(false);
|
|
190
|
+
<>
|
|
198
191
|
<Card
|
|
199
192
|
title="Test Card"
|
|
200
193
|
content="This is a test card"
|
|
201
194
|
buttonText="Click me"
|
|
202
195
|
onAction={() => (clicked = true)}
|
|
203
196
|
/>
|
|
204
|
-
<div class="status">
|
|
205
|
-
|
|
197
|
+
<div class="status">
|
|
198
|
+
{clicked ? 'Clicked' : 'Not clicked'}
|
|
199
|
+
</div>
|
|
200
|
+
</>
|
|
206
201
|
}
|
|
207
202
|
|
|
208
203
|
const { body } = await render(Basic);
|
|
@@ -225,27 +220,25 @@ describe('basic server > components & composition', () => {
|
|
|
225
220
|
function ChildComponent(props: PropsWithExtras<{
|
|
226
221
|
text: Tracked<string>;
|
|
227
222
|
count: Tracked<number>;
|
|
228
|
-
}>) {
|
|
229
|
-
|
|
223
|
+
}>) @{
|
|
224
|
+
<>
|
|
230
225
|
<div class="child-content">{props.text.value}</div>
|
|
231
226
|
<div class="child-count">{props.count.value}</div>
|
|
232
|
-
|
|
227
|
+
</>
|
|
233
228
|
}
|
|
234
229
|
|
|
235
|
-
function Basic() {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
230
|
+
function Basic() @{
|
|
231
|
+
let &[message, messageTracked] = track('Hello');
|
|
232
|
+
let &[number, numberTracked] = track(1);
|
|
233
|
+
<>
|
|
239
234
|
<ChildComponent text={messageTracked} count={numberTracked} />
|
|
240
235
|
<button
|
|
241
236
|
onClick={() => {
|
|
242
237
|
message = message === 'Hello' ? 'Goodbye' : 'Hello';
|
|
243
238
|
number++;
|
|
244
239
|
}}
|
|
245
|
-
>
|
|
246
|
-
|
|
247
|
-
</button>
|
|
248
|
-
</>;
|
|
240
|
+
>{'Update Props'}</button>
|
|
241
|
+
</>
|
|
249
242
|
}
|
|
250
243
|
|
|
251
244
|
const { body } = await render(Basic);
|
|
@@ -259,16 +252,16 @@ describe('basic server > components & composition', () => {
|
|
|
259
252
|
});
|
|
260
253
|
|
|
261
254
|
it('renders components as named and anonymous properties', async () => {
|
|
262
|
-
function Span() {
|
|
263
|
-
|
|
255
|
+
function Span() @{
|
|
256
|
+
<span>{'Hello from Span'}</span>
|
|
264
257
|
}
|
|
265
258
|
|
|
266
|
-
function Button({ children }: PropsWithChildren<{}>) {
|
|
267
|
-
|
|
259
|
+
function Button({ children }: PropsWithChildren<{}>) @{
|
|
260
|
+
<button>{children}</button>
|
|
268
261
|
}
|
|
269
262
|
|
|
270
|
-
function ArrowButton({ children }: PropsWithChildren<{}>) {
|
|
271
|
-
|
|
263
|
+
function ArrowButton({ children }: PropsWithChildren<{}>) @{
|
|
264
|
+
<button class="arrow-button">{children}</button>
|
|
272
265
|
}
|
|
273
266
|
|
|
274
267
|
const UI = {
|
|
@@ -277,18 +270,17 @@ describe('basic server > components & composition', () => {
|
|
|
277
270
|
arrowButton: ArrowButton,
|
|
278
271
|
};
|
|
279
272
|
|
|
280
|
-
function
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
</>;
|
|
273
|
+
function children() @{
|
|
274
|
+
<span>{'Click me!'}</span>
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function App() @{
|
|
278
|
+
<div>
|
|
279
|
+
<h1>{'Component as Property Test'}</h1>
|
|
280
|
+
<UI.span />
|
|
281
|
+
<UI.button {children} />
|
|
282
|
+
<UI.arrowButton {children} />
|
|
283
|
+
</div>
|
|
292
284
|
}
|
|
293
285
|
|
|
294
286
|
const { body } = await render(App);
|
|
@@ -308,16 +300,18 @@ describe('basic server > components & composition', () => {
|
|
|
308
300
|
});
|
|
309
301
|
|
|
310
302
|
it('handles empty string children', async () => {
|
|
311
|
-
function Button({ children }: PropsWithChildren<{}>) {
|
|
312
|
-
|
|
303
|
+
function Button({ children }: PropsWithChildren<{}>) @{
|
|
304
|
+
<>
|
|
305
|
+
{children}
|
|
306
|
+
</>
|
|
313
307
|
}
|
|
314
308
|
|
|
315
|
-
function App() {
|
|
316
|
-
|
|
317
|
-
|
|
309
|
+
function App() @{
|
|
310
|
+
let content = '';
|
|
311
|
+
<>
|
|
318
312
|
<Button>{''}</Button>
|
|
319
313
|
<Button>{content}</Button>
|
|
320
|
-
|
|
314
|
+
</>
|
|
321
315
|
}
|
|
322
316
|
|
|
323
317
|
const { body } = await render(App);
|
|
@@ -328,18 +322,16 @@ describe('basic server > components & composition', () => {
|
|
|
328
322
|
|
|
329
323
|
it('handles component without any output', async () => {
|
|
330
324
|
function Noop() {
|
|
331
|
-
return
|
|
325
|
+
return null;
|
|
332
326
|
}
|
|
333
327
|
|
|
334
|
-
function Op() {
|
|
335
|
-
|
|
328
|
+
function Op() @{
|
|
329
|
+
<div>{'Some HTML content'}</div>
|
|
336
330
|
}
|
|
337
331
|
|
|
338
|
-
function App() {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
<@Content />
|
|
342
|
-
</>;
|
|
332
|
+
function App() @{
|
|
333
|
+
let Content = track(() => Noop);
|
|
334
|
+
<Dynamic is={Content} />
|
|
343
335
|
}
|
|
344
336
|
|
|
345
337
|
const { body } = await render(App);
|
|
@@ -349,12 +341,12 @@ describe('basic server > components & composition', () => {
|
|
|
349
341
|
});
|
|
350
342
|
|
|
351
343
|
it('renders explicit children prop without spread', async () => {
|
|
352
|
-
function Card(props: PropsWithChildren<{}>) {
|
|
353
|
-
|
|
344
|
+
function Card(props: PropsWithChildren<{}>) @{
|
|
345
|
+
<div class="card">{props.children}</div>
|
|
354
346
|
}
|
|
355
347
|
|
|
356
|
-
function App() {
|
|
357
|
-
|
|
348
|
+
function App() @{
|
|
349
|
+
<Card children="fallback text" />
|
|
358
350
|
}
|
|
359
351
|
|
|
360
352
|
const { body } = await render(App);
|
|
@@ -363,15 +355,13 @@ describe('basic server > components & composition', () => {
|
|
|
363
355
|
});
|
|
364
356
|
|
|
365
357
|
it('renders explicit children before spread', async () => {
|
|
366
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
367
|
-
|
|
358
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
359
|
+
<div class="card">{props.children}</div>
|
|
368
360
|
}
|
|
369
361
|
|
|
370
|
-
function App() {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
<Card children="fallback text" {...extra} />
|
|
374
|
-
</>;
|
|
362
|
+
function App() @{
|
|
363
|
+
const extra = { id: '1' };
|
|
364
|
+
<Card children="fallback text" {...extra} />
|
|
375
365
|
}
|
|
376
366
|
|
|
377
367
|
const { body } = await render(App);
|
|
@@ -380,15 +370,13 @@ describe('basic server > components & composition', () => {
|
|
|
380
370
|
});
|
|
381
371
|
|
|
382
372
|
it('renders spread before explicit children', async () => {
|
|
383
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
384
|
-
|
|
373
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
374
|
+
<div class="card">{props.children}</div>
|
|
385
375
|
}
|
|
386
376
|
|
|
387
|
-
function App() {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
<Card {...extra} children="fallback text" />
|
|
391
|
-
</>;
|
|
377
|
+
function App() @{
|
|
378
|
+
const extra = { id: '1' };
|
|
379
|
+
<Card {...extra} children="fallback text" />
|
|
392
380
|
}
|
|
393
381
|
|
|
394
382
|
const { body } = await render(App);
|
|
@@ -397,17 +385,15 @@ describe('basic server > components & composition', () => {
|
|
|
397
385
|
});
|
|
398
386
|
|
|
399
387
|
it('template children override explicit children before spread', async () => {
|
|
400
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
401
|
-
|
|
388
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
389
|
+
<div class="card">{props.children}</div>
|
|
402
390
|
}
|
|
403
391
|
|
|
404
|
-
function App() {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
<
|
|
408
|
-
|
|
409
|
-
</Card>
|
|
410
|
-
</>;
|
|
392
|
+
function App() @{
|
|
393
|
+
const extra = { id: '1' };
|
|
394
|
+
<Card children="fallback text" {...extra}>
|
|
395
|
+
<span>{'template content'}</span>
|
|
396
|
+
</Card>
|
|
411
397
|
}
|
|
412
398
|
|
|
413
399
|
const { body } = await render(App);
|
|
@@ -417,17 +403,15 @@ describe('basic server > components & composition', () => {
|
|
|
417
403
|
});
|
|
418
404
|
|
|
419
405
|
it('template children override explicit children after spread', async () => {
|
|
420
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
421
|
-
|
|
406
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
407
|
+
<div class="card">{props.children}</div>
|
|
422
408
|
}
|
|
423
409
|
|
|
424
|
-
function App() {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
<
|
|
428
|
-
|
|
429
|
-
</Card>
|
|
430
|
-
</>;
|
|
410
|
+
function App() @{
|
|
411
|
+
const extra = { id: '1' };
|
|
412
|
+
<Card {...extra} children="fallback text">
|
|
413
|
+
<span>{'template content'}</span>
|
|
414
|
+
</Card>
|
|
431
415
|
}
|
|
432
416
|
|
|
433
417
|
const { body } = await render(App);
|
|
@@ -437,19 +421,13 @@ describe('basic server > components & composition', () => {
|
|
|
437
421
|
});
|
|
438
422
|
|
|
439
423
|
it('spread can override explicit children when no template children', async () => {
|
|
440
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
441
|
-
|
|
424
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
425
|
+
<div class="card">{props.children}</div>
|
|
442
426
|
}
|
|
443
427
|
|
|
444
|
-
function App() {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
<Card
|
|
448
|
-
// @ts-ignore
|
|
449
|
-
children="explicit"
|
|
450
|
-
{...extra}
|
|
451
|
-
/>
|
|
452
|
-
</>;
|
|
428
|
+
function App() @{
|
|
429
|
+
const extra = { id: '1', children: 'from spread' };
|
|
430
|
+
<Card children="explicit" {...extra} />
|
|
453
431
|
}
|
|
454
432
|
|
|
455
433
|
const { body } = await render(App);
|
|
@@ -458,15 +436,13 @@ describe('basic server > components & composition', () => {
|
|
|
458
436
|
});
|
|
459
437
|
|
|
460
438
|
it('explicit children overrides spread children when it comes after', async () => {
|
|
461
|
-
function Card(props: PropsWithChildren<{ id: string }>) {
|
|
462
|
-
|
|
439
|
+
function Card(props: PropsWithChildren<{ id: string }>) @{
|
|
440
|
+
<div class="card">{props.children}</div>
|
|
463
441
|
}
|
|
464
442
|
|
|
465
|
-
function App() {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
<Card {...extra} children="explicit" />
|
|
469
|
-
</>;
|
|
443
|
+
function App() @{
|
|
444
|
+
const extra = { id: '1', children: 'from spread' };
|
|
445
|
+
<Card {...extra} children="explicit" />
|
|
470
446
|
}
|
|
471
447
|
|
|
472
448
|
const { body } = await render(App);
|
|
@@ -475,20 +451,18 @@ describe('basic server > components & composition', () => {
|
|
|
475
451
|
});
|
|
476
452
|
|
|
477
453
|
it('renders components declared inside composite element children', async () => {
|
|
478
|
-
function Wrapper(props: PropsWithChildren<{}>) {
|
|
479
|
-
|
|
454
|
+
function Wrapper(props: PropsWithChildren<{}>) @{
|
|
455
|
+
<div class="wrapper">{props.children}</div>
|
|
480
456
|
}
|
|
481
457
|
|
|
482
|
-
function
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
function Inner() {
|
|
486
|
-
return <><span class="inner">{'inner content'}</span></>;
|
|
487
|
-
}
|
|
458
|
+
function Inner() @{
|
|
459
|
+
<div class="inner">{'inner content'}</div>
|
|
460
|
+
}
|
|
488
461
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
462
|
+
function App() @{
|
|
463
|
+
<Wrapper>
|
|
464
|
+
<Inner />
|
|
465
|
+
</Wrapper>
|
|
492
466
|
}
|
|
493
467
|
|
|
494
468
|
const { body } = await render(App);
|
|
@@ -497,29 +471,25 @@ describe('basic server > components & composition', () => {
|
|
|
497
471
|
});
|
|
498
472
|
|
|
499
473
|
it('renders nested components declared inside composite children with prop passing', async () => {
|
|
500
|
-
function Wrapper(props: PropsWithChildren<{}>) {
|
|
501
|
-
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
function
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
<Child {Z} />
|
|
521
|
-
</Wrapper>
|
|
522
|
-
</>;
|
|
474
|
+
function Wrapper(props: PropsWithChildren<{}>) @{
|
|
475
|
+
<div class="wrapper">{props.children}</div>
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
function Z() @{
|
|
479
|
+
<span class="z">{'I am Z'}</span>
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
function Child(props: { Z: Component }) @{
|
|
483
|
+
<div class="child">
|
|
484
|
+
{'Child Component: '}
|
|
485
|
+
<props.Z />
|
|
486
|
+
</div>
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
function App() @{
|
|
490
|
+
<Wrapper>
|
|
491
|
+
<Child {Z} />
|
|
492
|
+
</Wrapper>
|
|
523
493
|
}
|
|
524
494
|
|
|
525
495
|
const { body } = await render(App);
|