ripple 0.3.68 → 0.3.70
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 +126 -259
- 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 -131
- 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
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import { track } from 'ripple';
|
|
2
2
|
import { compile } from '@tsrx/ripple';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
const external_styles = <style>
|
|
5
|
+
.external {
|
|
6
|
+
color: tomato;
|
|
7
|
+
}
|
|
8
|
+
</style>;
|
|
9
|
+
|
|
10
|
+
describe('style class maps', () => {
|
|
5
11
|
describe('basic usage with components', () => {
|
|
6
|
-
it('passes scoped
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
it('passes scoped classes to a child component via a style expression', () => {
|
|
13
|
+
function Child({ className }: { className: string }) {
|
|
14
|
+
return <><div class={className}>{'styled child'}</div></>;
|
|
9
15
|
}
|
|
10
16
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<style>
|
|
17
|
+
function Parent() {
|
|
18
|
+
const styles = <style>
|
|
15
19
|
.highlight {
|
|
16
20
|
color: red;
|
|
17
21
|
}
|
|
18
|
-
</style
|
|
22
|
+
</style>;
|
|
23
|
+
|
|
24
|
+
return <><Child className={styles.highlight} /></>;
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
render(Parent);
|
|
@@ -28,23 +34,25 @@ describe('{style} directive', () => {
|
|
|
28
34
|
expect(classes.some((cls: string) => cls === 'highlight')).toBe(true);
|
|
29
35
|
});
|
|
30
36
|
|
|
31
|
-
it('passes multiple
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
it('passes multiple style expression classes to a child component', () => {
|
|
38
|
+
function Child({ primary, secondary }: { primary: string; secondary: string }) {
|
|
39
|
+
return <>
|
|
40
|
+
<div class={primary}>{'primary'}</div>
|
|
41
|
+
<span class={secondary}>{'secondary'}</span>
|
|
42
|
+
</>;
|
|
35
43
|
}
|
|
36
44
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<style>
|
|
45
|
+
function Parent() {
|
|
46
|
+
const styles = <style>
|
|
41
47
|
.primary {
|
|
42
48
|
color: blue;
|
|
43
49
|
}
|
|
44
50
|
.secondary {
|
|
45
51
|
color: gray;
|
|
46
52
|
}
|
|
47
|
-
</style
|
|
53
|
+
</style>;
|
|
54
|
+
|
|
55
|
+
return <><Child primary={styles.primary} secondary={styles.secondary} /></>;
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
render(Parent);
|
|
@@ -64,40 +72,44 @@ describe('{style} directive', () => {
|
|
|
64
72
|
expect(spanClasses.some((cls: string) => cls === 'secondary')).toBe(true);
|
|
65
73
|
});
|
|
66
74
|
|
|
67
|
-
it('allows
|
|
75
|
+
it('allows style expression classes on child components with children', () => {
|
|
68
76
|
const source = `
|
|
69
|
-
|
|
77
|
+
function Child({ className }) { return <>
|
|
70
78
|
<div class={className}>"hello world"</div>
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<style>
|
|
79
|
+
</>; }
|
|
80
|
+
function App() {
|
|
81
|
+
const styles = <style>
|
|
76
82
|
.container {
|
|
77
83
|
color: red;
|
|
78
84
|
}
|
|
79
|
-
</style
|
|
85
|
+
</style>;
|
|
86
|
+
|
|
87
|
+
return <>
|
|
88
|
+
<Child className={styles.container}>"hello world"</Child>
|
|
89
|
+
</>;
|
|
80
90
|
}`;
|
|
81
91
|
|
|
82
92
|
expect(() => compile(source, 'test.tsrx')).not.toThrow();
|
|
83
93
|
});
|
|
84
94
|
|
|
85
|
-
it('passes scoped
|
|
86
|
-
|
|
87
|
-
|
|
95
|
+
it('passes scoped classes to a dynamic child component via a style expression', () => {
|
|
96
|
+
function Child({ cls }: { cls: string }) {
|
|
97
|
+
return <><span class={cls}>{'text'}</span></>;
|
|
88
98
|
}
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
<div class="wrapper">
|
|
93
|
-
<@dynamic cls={style 'text'} />
|
|
94
|
-
</div>
|
|
95
|
-
|
|
96
|
-
<style>
|
|
100
|
+
function Parent() {
|
|
101
|
+
const styles = <style>
|
|
97
102
|
.text {
|
|
98
103
|
color: red;
|
|
99
104
|
}
|
|
100
|
-
</style
|
|
105
|
+
</style>;
|
|
106
|
+
|
|
107
|
+
return <>
|
|
108
|
+
let dynamic = track(() => Child);
|
|
109
|
+
<div class="wrapper">
|
|
110
|
+
<@dynamic cls={styles.text} />
|
|
111
|
+
</div>
|
|
112
|
+
</>;
|
|
101
113
|
}
|
|
102
114
|
|
|
103
115
|
render(Parent);
|
|
@@ -109,25 +121,44 @@ component App() {
|
|
|
109
121
|
expect(classes.some((cls: string) => cls === 'text')).toBe(true);
|
|
110
122
|
});
|
|
111
123
|
|
|
112
|
-
it('
|
|
113
|
-
|
|
114
|
-
|
|
124
|
+
it('passes style expression classes declared outside the component', () => {
|
|
125
|
+
function Child({ cls }: { cls: string }) {
|
|
126
|
+
return <><span class={cls}>{'text'}</span></>;
|
|
127
|
+
}
|
|
115
128
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
border: 1px solid black;
|
|
119
|
-
}
|
|
120
|
-
</style>
|
|
129
|
+
function Parent() {
|
|
130
|
+
return <Child cls={external_styles.external} />;
|
|
121
131
|
}
|
|
122
132
|
|
|
123
|
-
|
|
124
|
-
|
|
133
|
+
render(Parent);
|
|
134
|
+
|
|
135
|
+
const span = container.querySelector('span');
|
|
136
|
+
expect(span).toBeTruthy();
|
|
137
|
+
const classes = Array.from(span.classList);
|
|
138
|
+
expect(classes.some((cls: string) => cls.startsWith('tsrx-'))).toBe(true);
|
|
139
|
+
expect(classes.some((cls: string) => cls === 'external')).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('child can combine its own classes with a parent style expression class', () => {
|
|
143
|
+
function Card({ className }: { className?: string }) {
|
|
144
|
+
return <>
|
|
145
|
+
<div class={['card-base', className ?? '']}>{'card content'}</div>
|
|
146
|
+
<style>
|
|
147
|
+
.card-base {
|
|
148
|
+
border: 1px solid black;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
151
|
+
</>;
|
|
152
|
+
}
|
|
125
153
|
|
|
126
|
-
|
|
154
|
+
function App() {
|
|
155
|
+
const styles = <style>
|
|
127
156
|
.themed {
|
|
128
157
|
background: purple;
|
|
129
158
|
}
|
|
130
|
-
</style
|
|
159
|
+
</style>;
|
|
160
|
+
|
|
161
|
+
return <><Card className={styles.themed} /></>;
|
|
131
162
|
}
|
|
132
163
|
|
|
133
164
|
render(App);
|
|
@@ -139,24 +170,26 @@ component App() {
|
|
|
139
170
|
expect(classes.some((cls: string) => cls === 'themed')).toBe(true);
|
|
140
171
|
});
|
|
141
172
|
|
|
142
|
-
it('passes standalone class
|
|
143
|
-
|
|
144
|
-
|
|
173
|
+
it('passes a standalone class even when it also appears in descendant context', () => {
|
|
174
|
+
function Child({ cls }: { cls: string }) {
|
|
175
|
+
return <><span class={cls}>{'text'}</span></>;
|
|
145
176
|
}
|
|
146
177
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
<Child cls={style 'dual'} />
|
|
150
|
-
</div>
|
|
151
|
-
|
|
152
|
-
<style>
|
|
178
|
+
function App() {
|
|
179
|
+
const styles = <style>
|
|
153
180
|
.dual {
|
|
154
181
|
color: blue;
|
|
155
182
|
}
|
|
156
183
|
.parent .dual {
|
|
157
184
|
font-weight: bold;
|
|
158
185
|
}
|
|
159
|
-
</style
|
|
186
|
+
</style>;
|
|
187
|
+
|
|
188
|
+
return <>
|
|
189
|
+
<div class="parent">
|
|
190
|
+
<Child cls={styles.dual} />
|
|
191
|
+
</div>
|
|
192
|
+
</>;
|
|
160
193
|
}
|
|
161
194
|
|
|
162
195
|
render(App);
|
|
@@ -169,246 +202,80 @@ component App() {
|
|
|
169
202
|
});
|
|
170
203
|
});
|
|
171
204
|
|
|
172
|
-
describe('
|
|
173
|
-
it('
|
|
174
|
-
const source = `
|
|
175
|
-
component App() {
|
|
176
|
-
<div class={style 'box'}>{'content'}</div>
|
|
177
|
-
|
|
178
|
-
<style>
|
|
179
|
-
.box {
|
|
180
|
-
padding: 10px;
|
|
181
|
-
}
|
|
182
|
-
</style>
|
|
183
|
-
}`;
|
|
184
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/cannot be used directly on DOM elements/);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('errors when {style} is used directly on a DOM element class', () => {
|
|
188
|
-
const source = `
|
|
189
|
-
component App() {
|
|
190
|
-
<div class={style 'container'}>{'content'}</div>
|
|
191
|
-
|
|
192
|
-
<style>
|
|
193
|
-
.container {
|
|
194
|
-
margin: 0 auto;
|
|
195
|
-
}
|
|
196
|
-
</style>
|
|
197
|
-
}`;
|
|
198
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/cannot be used directly on DOM elements/);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('errors when {style} references a class in a compound selector passed to component', () => {
|
|
202
|
-
const source = `
|
|
203
|
-
component Child({ cls }) {
|
|
204
|
-
<span class={cls}>{'text'}</span>
|
|
205
|
-
}
|
|
206
|
-
component App() {
|
|
207
|
-
<Child cls={style 'special'} />
|
|
208
|
-
|
|
209
|
-
<style>
|
|
210
|
-
span.special {
|
|
211
|
-
color: red;
|
|
212
|
-
}
|
|
213
|
-
</style>
|
|
214
|
-
}`;
|
|
215
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('errors if descendant class is attempted to be passed in to child component', () => {
|
|
219
|
-
const source = `
|
|
220
|
-
component Child({ cls }: { cls: string }) {
|
|
221
|
-
<span class={cls}>{'text'}</span>
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
component App() {
|
|
225
|
-
<div class="wrapper">
|
|
226
|
-
<Child
|
|
227
|
-
cls={style 'nested'}
|
|
228
|
-
/>
|
|
229
|
-
</div>
|
|
230
|
-
|
|
231
|
-
<style>
|
|
232
|
-
.wrapper .nested {
|
|
233
|
-
color: red;
|
|
234
|
-
}
|
|
235
|
-
</style>
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
render(App);
|
|
239
|
-
`;
|
|
240
|
-
|
|
241
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('errors if combinator class is attempted to be passed in to child component', () => {
|
|
245
|
-
const source = `
|
|
246
|
-
component Child({ cls }) {
|
|
247
|
-
<p class={cls}>{'text'}</p>
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
component App() {
|
|
251
|
-
<div class="parent">
|
|
252
|
-
<Child
|
|
253
|
-
// @ts-expect-error - cannot use child combinator class as standalone
|
|
254
|
-
// @ripple-expect-error - cannot use child combinator class as standalone
|
|
255
|
-
cls={style 'child'}
|
|
256
|
-
/>
|
|
257
|
-
</div>
|
|
258
|
-
|
|
259
|
-
<style>
|
|
260
|
-
.parent > .child {
|
|
261
|
-
font-size: 14px;
|
|
262
|
-
}
|
|
263
|
-
</style>
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
render(App);
|
|
267
|
-
`;
|
|
268
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it('errors if compound class is attempted to be passed in to child component', () => {
|
|
272
|
-
const source = `
|
|
273
|
-
component Child({ cls }) {
|
|
274
|
-
<p class={cls}>{'text'}</p>
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
component App() {
|
|
278
|
-
<div class="parent">
|
|
279
|
-
<Child
|
|
280
|
-
// @ts-expect-error - cannot use compound class as standalone
|
|
281
|
-
// @ripple-expect-error - cannot use compound class as standalone
|
|
282
|
-
cls={style 'child'}
|
|
283
|
-
/>
|
|
284
|
-
</div>
|
|
285
|
-
|
|
286
|
-
<style>
|
|
287
|
-
.parent.child {
|
|
288
|
-
font-size: 14px;
|
|
289
|
-
}
|
|
290
|
-
</style>
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
render(App);
|
|
294
|
-
`;
|
|
295
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it('errors if descendant {style} class is used on a dynamic component', () => {
|
|
299
|
-
const source = `
|
|
300
|
-
|
|
301
|
-
component Child({ cls }) {
|
|
302
|
-
<span class={cls}>{'text'}</span>
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
component App() {
|
|
306
|
-
let dynamic = track(() => Child);
|
|
307
|
-
<div class="wrapper">
|
|
308
|
-
<@dynamic cls={style 'nested'} />
|
|
309
|
-
</div>
|
|
310
|
-
|
|
311
|
-
<style>
|
|
312
|
-
.wrapper .nested {
|
|
313
|
-
color: red;
|
|
314
|
-
}
|
|
315
|
-
</style>
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
render(App);
|
|
319
|
-
`;
|
|
320
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
it('errors when {style} references a class that does not exist in the style block', () => {
|
|
324
|
-
const source = `
|
|
325
|
-
component Child({ cls }) {
|
|
326
|
-
<div class={cls}>{'text'}</div>
|
|
327
|
-
}
|
|
328
|
-
component App() {
|
|
329
|
-
<Child cls={style 'missing'} />
|
|
330
|
-
|
|
331
|
-
<style>
|
|
332
|
-
.other {
|
|
333
|
-
color: blue;
|
|
334
|
-
}
|
|
335
|
-
</style>
|
|
336
|
-
}`;
|
|
337
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(/does not exist as a stand-alone class/);
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it('errors when {style} is used with a dynamic expression', () => {
|
|
205
|
+
describe('removed syntax', () => {
|
|
206
|
+
it('does not parse the old style directive in attributes', () => {
|
|
341
207
|
const source = `
|
|
342
|
-
|
|
208
|
+
function Child({ cls }) { return <>
|
|
343
209
|
<div class={cls}>{'text'}</div>
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
<Child cls={style 'highlight' + key} />
|
|
210
|
+
</>; }
|
|
211
|
+
function App() { return <>
|
|
212
|
+
<Child cls={style 'highlight'} />
|
|
348
213
|
|
|
349
214
|
<style>
|
|
350
215
|
.highlight {
|
|
351
216
|
color: red;
|
|
352
217
|
}
|
|
353
218
|
</style>
|
|
354
|
-
}`;
|
|
355
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(
|
|
219
|
+
</>; }`;
|
|
220
|
+
expect(() => compile(source, 'test.tsrx')).toThrow();
|
|
356
221
|
});
|
|
357
222
|
|
|
358
|
-
it('
|
|
359
|
-
const source = `
|
|
223
|
+
it('does not parse the old style directive as a child expression', () => {
|
|
224
|
+
const source = `function App() { return <>
|
|
360
225
|
<div>{style 'foo'}</div>
|
|
361
226
|
<style>
|
|
362
227
|
.foo {
|
|
363
228
|
color: red;
|
|
364
229
|
}
|
|
365
230
|
</style>
|
|
366
|
-
}`;
|
|
367
|
-
expect(() => compile(source, 'test.tsrx')).toThrow(
|
|
368
|
-
/can only be used as an element attribute value/,
|
|
369
|
-
);
|
|
231
|
+
</>; }`;
|
|
232
|
+
expect(() => compile(source, 'test.tsrx')).toThrow();
|
|
370
233
|
});
|
|
371
234
|
});
|
|
372
235
|
|
|
373
236
|
describe('compiler output', () => {
|
|
374
|
-
it('
|
|
237
|
+
it('emits style class maps for client mode', () => {
|
|
375
238
|
const source = `
|
|
376
|
-
|
|
239
|
+
function Child({ cls }) { return <>
|
|
377
240
|
<div class={cls}>{'text'}</div>
|
|
378
|
-
}
|
|
379
|
-
export
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
<style>
|
|
241
|
+
</>; }
|
|
242
|
+
export function App() {
|
|
243
|
+
const styles = <style>
|
|
383
244
|
.highlight {
|
|
384
245
|
color: red;
|
|
385
246
|
}
|
|
386
|
-
</style
|
|
247
|
+
</style>;
|
|
248
|
+
|
|
249
|
+
return <>
|
|
250
|
+
<Child cls={styles.highlight} />
|
|
251
|
+
</>;
|
|
387
252
|
}`;
|
|
388
253
|
const { code } = compile(source, 'test.tsrx');
|
|
389
254
|
|
|
390
255
|
expect(code).toContain('highlight');
|
|
391
|
-
expect(code).toMatch(/tsrx-[a-z0-9]
|
|
256
|
+
expect(code).toMatch(/tsrx-[a-z0-9]+ highlight/);
|
|
392
257
|
});
|
|
393
258
|
|
|
394
|
-
it('
|
|
259
|
+
it('emits style class maps for server mode', () => {
|
|
395
260
|
const source = `
|
|
396
|
-
|
|
261
|
+
function Child({ cls }) { return <>
|
|
397
262
|
<div class={cls}>{'text'}</div>
|
|
398
|
-
}
|
|
399
|
-
export
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
<style>
|
|
263
|
+
</>; }
|
|
264
|
+
export function App() {
|
|
265
|
+
const styles = <style>
|
|
403
266
|
.highlight {
|
|
404
267
|
color: red;
|
|
405
268
|
}
|
|
406
|
-
</style
|
|
269
|
+
</style>;
|
|
270
|
+
|
|
271
|
+
return <>
|
|
272
|
+
<Child cls={styles.highlight} />
|
|
273
|
+
</>;
|
|
407
274
|
}`;
|
|
408
275
|
const { code } = compile(source, 'test.tsrx', { mode: 'server' });
|
|
409
276
|
|
|
410
277
|
expect(code).toContain('highlight');
|
|
411
|
-
expect(code).toMatch(/tsrx-[a-z0-9]
|
|
278
|
+
expect(code).toMatch(/tsrx-[a-z0-9]+ highlight/);
|
|
412
279
|
});
|
|
413
280
|
});
|
|
414
281
|
});
|