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
|
@@ -2,8 +2,8 @@ import { create_ssr_stream } from 'ripple/server';
|
|
|
2
2
|
|
|
3
3
|
describe('create_ssr_stream', () => {
|
|
4
4
|
it('renders SSR HTML into the injected sink and exposes a web stream', async () => {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
function App() {
|
|
6
|
+
return <><div>{'Hello, streaming SSR!'}</div></>;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
const { stream, sink } = create_ssr_stream();
|
|
@@ -16,8 +16,8 @@ describe('create_ssr_stream', () => {
|
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
it('closes the public stream when streaming finishes successfully', async () => {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
function App() {
|
|
20
|
+
return <><p>{'stream closed'}</p></>;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
const { stream, sink } = create_ssr_stream();
|
|
@@ -42,74 +42,3 @@ describe('create_ssr_stream', () => {
|
|
|
42
42
|
expect(terminal_read.done).toBe(true);
|
|
43
43
|
});
|
|
44
44
|
});
|
|
45
|
-
|
|
46
|
-
// import { renderToStream } from 'ripple/server';
|
|
47
|
-
|
|
48
|
-
// describe('render to stream', () => {
|
|
49
|
-
// test('renderToStream renders a simple component', async ({ expect }) => {
|
|
50
|
-
// component Basic() {
|
|
51
|
-
// <div>{'Hello, streaming SSR!'}</div>
|
|
52
|
-
// }
|
|
53
|
-
|
|
54
|
-
// const stream = renderToStream(Basic);
|
|
55
|
-
|
|
56
|
-
// let result = '';
|
|
57
|
-
// await new Promise((resolve) => {
|
|
58
|
-
// stream.on('data', (chunk) => {
|
|
59
|
-
// result += chunk.toString();
|
|
60
|
-
// });
|
|
61
|
-
// stream.on('end', resolve);
|
|
62
|
-
// });
|
|
63
|
-
|
|
64
|
-
// expect(result).toBe('<div>Hello, streaming SSR!</div>');
|
|
65
|
-
// });
|
|
66
|
-
|
|
67
|
-
// test('renderToStream handles async components', async ({ expect }) => {
|
|
68
|
-
// component AsyncComponent() {
|
|
69
|
-
// await new Promise((resolve) => setTimeout(resolve, 10));
|
|
70
|
-
// <p>{'Async content loaded.'}</p>
|
|
71
|
-
// }
|
|
72
|
-
|
|
73
|
-
// const stream = renderToStream(AsyncComponent);
|
|
74
|
-
|
|
75
|
-
// let result = '';
|
|
76
|
-
// await new Promise((resolve) => {
|
|
77
|
-
// stream.on('data', (chunk) => {
|
|
78
|
-
// result += chunk.toString();
|
|
79
|
-
// });
|
|
80
|
-
// stream.on('end', resolve);
|
|
81
|
-
// });
|
|
82
|
-
|
|
83
|
-
// expect(result).toBe('<p>Async content loaded.</p>');
|
|
84
|
-
// });
|
|
85
|
-
|
|
86
|
-
// test('renderToStream handles await blocks with pending state', async ({ expect }) => {
|
|
87
|
-
// component AwaitComponent() {
|
|
88
|
-
// let data = 'initial';
|
|
89
|
-
// await new Promise((resolve) => setTimeout(() => {
|
|
90
|
-
// data = 'resolved';
|
|
91
|
-
// resolve('');
|
|
92
|
-
// }, 20));
|
|
93
|
-
// try {
|
|
94
|
-
// <div>
|
|
95
|
-
// {'Data: '}
|
|
96
|
-
// {data}
|
|
97
|
-
// </div>
|
|
98
|
-
// } pending {
|
|
99
|
-
// <div>{'Loading...'}</div>
|
|
100
|
-
// }
|
|
101
|
-
// }
|
|
102
|
-
|
|
103
|
-
// const stream = renderToStream(AwaitComponent);
|
|
104
|
-
|
|
105
|
-
// let result = '';
|
|
106
|
-
// await new Promise((resolve) => {
|
|
107
|
-
// stream.on('data', (chunk) => {
|
|
108
|
-
// result += chunk.toString();
|
|
109
|
-
// });
|
|
110
|
-
// stream.on('end', resolve);
|
|
111
|
-
// });
|
|
112
|
-
|
|
113
|
-
// expect(result).toBe('<!--[--><div>Loading...</div><div>Data: resolved</div><!--]-->');
|
|
114
|
-
// });
|
|
115
|
-
// });
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import { track } from 'ripple';
|
|
2
2
|
import { compile } from '@tsrx/ripple';
|
|
3
3
|
|
|
4
|
-
describe('
|
|
4
|
+
describe('style refs (server)', () => {
|
|
5
5
|
describe('basic usage with components', () => {
|
|
6
|
-
it('passes scoped
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
it('passes scoped classes to a child component via a style ref', async () => {
|
|
7
|
+
function Child({ className }: { className: string }) {
|
|
8
|
+
return <><div class={className}>{'styled child'}</div></>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
function Parent() {
|
|
12
|
+
let styles;
|
|
13
|
+
return <>
|
|
14
|
+
<Child className={styles.highlight} />
|
|
15
|
+
<style ref={(s) => (styles = s)}>
|
|
16
|
+
.highlight {
|
|
17
|
+
color: red;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
</>;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
const { body } = await render(Parent);
|
|
@@ -29,23 +31,27 @@ describe('{style} directive (server)', () => {
|
|
|
29
31
|
expect(classes.some((cls: string) => cls === 'highlight')).toBe(true);
|
|
30
32
|
});
|
|
31
33
|
|
|
32
|
-
it('passes multiple
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
it('passes multiple style ref classes to a child component', async () => {
|
|
35
|
+
function Child({ primary, secondary }: { primary: string; secondary: string }) {
|
|
36
|
+
return <>
|
|
37
|
+
<div class={primary}>{'primary'}</div>
|
|
38
|
+
<span class={secondary}>{'secondary'}</span>
|
|
39
|
+
</>;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
function Parent() {
|
|
43
|
+
let styles;
|
|
44
|
+
return <>
|
|
45
|
+
<Child primary={styles.primary} secondary={styles.secondary} />
|
|
46
|
+
<style ref={(s) => (styles = s)}>
|
|
47
|
+
.primary {
|
|
48
|
+
color: blue;
|
|
49
|
+
}
|
|
50
|
+
.secondary {
|
|
51
|
+
color: gray;
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
54
|
+
</>;
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
const { body } = await render(Parent);
|
|
@@ -68,19 +74,21 @@ describe('{style} directive (server)', () => {
|
|
|
68
74
|
});
|
|
69
75
|
|
|
70
76
|
describe('parent styling applied to child', () => {
|
|
71
|
-
it('allows parent to style child elements via
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
it('allows parent to style child elements via a style ref prop', async () => {
|
|
78
|
+
function Button({ extraClass }: { extraClass?: string }) {
|
|
79
|
+
return <><button class={extraClass ?? ''}>{'Click me'}</button></>;
|
|
74
80
|
}
|
|
75
81
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
function App() {
|
|
83
|
+
let styles;
|
|
84
|
+
return <>
|
|
85
|
+
<Button extraClass={styles.fancy} />
|
|
86
|
+
<style ref={(s) => (styles = s)}>
|
|
87
|
+
.fancy {
|
|
88
|
+
background: gold;
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
91
|
+
</>;
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
const { body } = await render(App);
|
|
@@ -93,25 +101,28 @@ describe('{style} directive (server)', () => {
|
|
|
93
101
|
expect(classes.some((cls: string) => cls === 'fancy')).toBe(true);
|
|
94
102
|
});
|
|
95
103
|
|
|
96
|
-
it('child can combine its own classes with parent
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
it('child can combine its own classes with a parent style ref class', async () => {
|
|
105
|
+
function Card({ className }: { className?: string }) {
|
|
106
|
+
return <>
|
|
107
|
+
<div class={['card-base', className ?? '']}>{'card content'}</div>
|
|
108
|
+
<style>
|
|
109
|
+
.card-base {
|
|
110
|
+
border: 1px solid black;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
</>;
|
|
105
114
|
}
|
|
106
115
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
116
|
+
function App() {
|
|
117
|
+
let styles;
|
|
118
|
+
return <>
|
|
119
|
+
<Card className={styles.themed} />
|
|
120
|
+
<style ref={(s) => (styles = s)}>
|
|
121
|
+
.themed {
|
|
122
|
+
background: purple;
|
|
123
|
+
}
|
|
124
|
+
</style>
|
|
125
|
+
</>;
|
|
115
126
|
}
|
|
116
127
|
|
|
117
128
|
const { body } = await render(App);
|
|
@@ -124,19 +135,18 @@ describe('{style} directive (server)', () => {
|
|
|
124
135
|
expect(classes.some((cls: string) => cls === 'themed')).toBe(true);
|
|
125
136
|
});
|
|
126
137
|
|
|
127
|
-
it(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
<span class={cls}>{'text'}</span>
|
|
132
|
-
}
|
|
138
|
+
it('passes a standalone class even when it also appears in descendant context', async () => {
|
|
139
|
+
function Child({ cls }: { cls: string }) {
|
|
140
|
+
return <><span class={cls}>{'text'}</span></>;
|
|
141
|
+
}
|
|
133
142
|
|
|
134
|
-
|
|
143
|
+
function App() {
|
|
144
|
+
let styles;
|
|
145
|
+
return <>
|
|
135
146
|
<div class="parent">
|
|
136
|
-
<Child cls={
|
|
147
|
+
<Child cls={styles.dual} />
|
|
137
148
|
</div>
|
|
138
|
-
|
|
139
|
-
<style>
|
|
149
|
+
<style ref={(s) => (styles = s)}>
|
|
140
150
|
.dual {
|
|
141
151
|
color: blue;
|
|
142
152
|
}
|
|
@@ -144,36 +154,38 @@ describe('{style} directive (server)', () => {
|
|
|
144
154
|
font-weight: bold;
|
|
145
155
|
}
|
|
146
156
|
</style>
|
|
147
|
-
|
|
157
|
+
</>;
|
|
158
|
+
}
|
|
148
159
|
|
|
149
|
-
|
|
150
|
-
|
|
160
|
+
const { body } = await render(App);
|
|
161
|
+
const { document } = parseHtml(body);
|
|
151
162
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
);
|
|
163
|
+
const span = document.querySelector('span');
|
|
164
|
+
expect(span).toBeTruthy();
|
|
165
|
+
const classes = Array.from(span.classList);
|
|
166
|
+
expect(classes.some((cls: string) => cls.startsWith('tsrx-'))).toBe(true);
|
|
167
|
+
expect(classes.some((cls: string) => cls === 'dual')).toBe(true);
|
|
168
|
+
});
|
|
159
169
|
});
|
|
160
170
|
|
|
161
|
-
it('passes scoped
|
|
162
|
-
|
|
163
|
-
|
|
171
|
+
it('passes scoped classes to a dynamic child component via a style ref', async () => {
|
|
172
|
+
function Child({ cls }: { cls: string }) {
|
|
173
|
+
return <><span class={cls}>{'text'}</span></>;
|
|
164
174
|
}
|
|
165
175
|
|
|
166
|
-
|
|
167
|
-
let
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
176
|
+
function Parent() {
|
|
177
|
+
let styles;
|
|
178
|
+
return <>
|
|
179
|
+
let dynamic = track(() => Child);
|
|
180
|
+
<div class="wrapper">
|
|
181
|
+
<@dynamic cls={styles.text} />
|
|
182
|
+
</div>
|
|
183
|
+
<style ref={(s) => (styles = s)}>
|
|
184
|
+
.text {
|
|
185
|
+
color: red;
|
|
186
|
+
}
|
|
187
|
+
</style>
|
|
188
|
+
</>;
|
|
177
189
|
}
|
|
178
190
|
|
|
179
191
|
const { body } = await render(Parent);
|
|
@@ -187,33 +199,37 @@ describe('{style} directive (server)', () => {
|
|
|
187
199
|
});
|
|
188
200
|
|
|
189
201
|
it('preserves caller scoped hash through wrapper children', async () => {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
202
|
+
function Wrapper({ children }) {
|
|
203
|
+
return <>
|
|
204
|
+
<div class="green">
|
|
205
|
+
{'Wrapper'}
|
|
206
|
+
{children}
|
|
207
|
+
</div>
|
|
208
|
+
<style>
|
|
209
|
+
.green {
|
|
210
|
+
color: green;
|
|
211
|
+
}
|
|
212
|
+
</style>
|
|
213
|
+
</>;
|
|
201
214
|
}
|
|
202
215
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
216
|
+
function Child() {
|
|
217
|
+
return <>
|
|
218
|
+
<div class="red">{'Child'}</div>
|
|
219
|
+
<style>
|
|
220
|
+
.red {
|
|
221
|
+
color: red;
|
|
222
|
+
}
|
|
223
|
+
</style>
|
|
224
|
+
</>;
|
|
211
225
|
}
|
|
212
226
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
<
|
|
216
|
-
|
|
227
|
+
function App() {
|
|
228
|
+
return <>
|
|
229
|
+
<Wrapper>
|
|
230
|
+
<Child />
|
|
231
|
+
</Wrapper>
|
|
232
|
+
</>;
|
|
217
233
|
}
|
|
218
234
|
|
|
219
235
|
const { body } = await render(App);
|
|
@@ -232,22 +248,22 @@ describe('{style} directive (server)', () => {
|
|
|
232
248
|
});
|
|
233
249
|
|
|
234
250
|
it('applies caller scoped hash to slotted children through dynamic components', async () => {
|
|
235
|
-
|
|
236
|
-
|
|
251
|
+
function Wrapper({ children }) {
|
|
252
|
+
return <><section>{children}</section></>;
|
|
237
253
|
}
|
|
238
254
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
255
|
+
function App() {
|
|
256
|
+
return <>
|
|
257
|
+
const DynamicWrapper = track(() => Wrapper);
|
|
258
|
+
<@DynamicWrapper>
|
|
259
|
+
<div class="green">{'Slotted child'}</div>
|
|
260
|
+
</@DynamicWrapper>
|
|
261
|
+
<style>
|
|
262
|
+
.green {
|
|
263
|
+
color: green;
|
|
264
|
+
}
|
|
265
|
+
</style>
|
|
266
|
+
</>;
|
|
251
267
|
}
|
|
252
268
|
|
|
253
269
|
const { body } = await render(App);
|
|
@@ -261,40 +277,45 @@ describe('{style} directive (server)', () => {
|
|
|
261
277
|
});
|
|
262
278
|
|
|
263
279
|
describe('server compiler output', () => {
|
|
264
|
-
it('
|
|
280
|
+
it('emits style class maps', () => {
|
|
265
281
|
const source = `
|
|
266
|
-
|
|
282
|
+
function Child({ cls }: { cls: string }) { return <>
|
|
267
283
|
<div class={cls}>{'text'}</div>
|
|
268
|
-
}
|
|
269
|
-
export
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
284
|
+
</>; }
|
|
285
|
+
export function App() {
|
|
286
|
+
let styles;
|
|
287
|
+
return <>
|
|
288
|
+
<Child cls={styles.highlight} />
|
|
289
|
+
|
|
290
|
+
<style ref={(s) => styles = s}>
|
|
291
|
+
.highlight {
|
|
292
|
+
color: red;
|
|
293
|
+
}
|
|
294
|
+
</style>
|
|
295
|
+
</>;
|
|
277
296
|
}`;
|
|
278
297
|
const { code } = compile(source, 'test.tsrx', { mode: 'server' });
|
|
279
298
|
|
|
280
299
|
expect(code).toContain('highlight');
|
|
281
|
-
expect(code).toMatch(/tsrx-[a-z0-9]
|
|
300
|
+
expect(code).toMatch(/tsrx-[a-z0-9]+ highlight/);
|
|
282
301
|
expect(code).toContain('register_css');
|
|
283
302
|
});
|
|
284
303
|
|
|
285
304
|
it('includes CSS hash in rendered HTML', async () => {
|
|
286
|
-
|
|
287
|
-
|
|
305
|
+
function Child({ cls }: { cls: string }) {
|
|
306
|
+
return <><div class={cls}>{'hello'}</div></>;
|
|
288
307
|
}
|
|
289
308
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
309
|
+
function App() {
|
|
310
|
+
let styles;
|
|
311
|
+
return <>
|
|
312
|
+
<Child cls={styles.styled} />
|
|
313
|
+
<style ref={(s) => (styles = s)}>
|
|
314
|
+
.styled {
|
|
315
|
+
font-weight: bold;
|
|
316
|
+
}
|
|
317
|
+
</style>
|
|
318
|
+
</>;
|
|
298
319
|
}
|
|
299
320
|
|
|
300
321
|
const { body, css } = await render(App);
|