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.
Files changed (172) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +4 -10
  4. package/src/runtime/dynamic-client.js +33 -0
  5. package/src/runtime/dynamic-server.js +80 -0
  6. package/src/runtime/index-client.js +5 -13
  7. package/src/runtime/index-server.js +2 -0
  8. package/src/runtime/internal/client/blocks.js +6 -27
  9. package/src/runtime/internal/client/composite.js +11 -6
  10. package/src/runtime/internal/client/for.js +80 -5
  11. package/src/runtime/internal/client/index.js +0 -2
  12. package/src/runtime/internal/client/render.js +5 -2
  13. package/src/runtime/internal/client/types.d.ts +0 -10
  14. package/src/runtime/internal/server/index.js +8 -1
  15. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  16. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  18. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  19. package/tests/client/array/array.derived.test.tsrx +97 -109
  20. package/tests/client/array/array.iteration.test.tsrx +28 -28
  21. package/tests/client/array/array.mutations.test.tsrx +68 -68
  22. package/tests/client/array/array.static.test.tsrx +82 -92
  23. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  24. package/tests/client/async-suspend.test.tsrx +180 -179
  25. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  26. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  27. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  28. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  29. package/tests/client/basic/basic.components.test.tsrx +198 -220
  30. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  31. package/tests/client/basic/basic.events.test.tsrx +80 -85
  32. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  33. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  34. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  35. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  36. package/tests/client/basic/basic.styling.test.tsrx +16 -14
  37. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  38. package/tests/client/boundaries.test.tsrx +18 -18
  39. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  40. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  41. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  42. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  43. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  44. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  45. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  46. package/tests/client/composite/composite.dynamic-components.test.tsrx +62 -47
  47. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  48. package/tests/client/composite/composite.props.test.tsrx +66 -74
  49. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  50. package/tests/client/composite/composite.render.test.tsrx +92 -101
  51. package/tests/client/computed-properties.test.tsrx +14 -18
  52. package/tests/client/context.test.tsrx +14 -18
  53. package/tests/client/css/global-additional-cases.test.tsrx +493 -439
  54. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  55. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  56. package/tests/client/css/global-basic.test.tsrx +105 -98
  57. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  58. package/tests/client/css/global-combinators.test.tsrx +83 -78
  59. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  60. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  61. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  62. package/tests/client/css/global-nested.test.tsrx +88 -78
  63. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  64. package/tests/client/css/global-scoping.test.tsrx +145 -125
  65. package/tests/client/css/style-identifier.test.tsrx +65 -72
  66. package/tests/client/date.test.tsrx +83 -83
  67. package/tests/client/dynamic-elements.test.tsrx +318 -299
  68. package/tests/client/events.test.tsrx +252 -266
  69. package/tests/client/for.test.tsrx +120 -127
  70. package/tests/client/head.test.tsrx +74 -48
  71. package/tests/client/html.test.tsrx +37 -49
  72. package/tests/client/input-value.test.tsrx +1125 -1354
  73. package/tests/client/lazy-array.test.tsrx +10 -16
  74. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  75. package/tests/client/map.test.tsrx +39 -41
  76. package/tests/client/media-query.test.tsrx +15 -19
  77. package/tests/client/object.test.tsrx +46 -56
  78. package/tests/client/portal.test.tsrx +31 -37
  79. package/tests/client/ref.test.tsrx +173 -193
  80. package/tests/client/return.test.tsrx +62 -37
  81. package/tests/client/set.test.tsrx +33 -33
  82. package/tests/client/svg.test.tsrx +197 -216
  83. package/tests/client/switch.test.tsrx +201 -191
  84. package/tests/client/track-async-hydration.test.tsrx +14 -18
  85. package/tests/client/tracked-index-access.test.tsrx +18 -28
  86. package/tests/client/try.test.tsrx +494 -619
  87. package/tests/client/tsx.test.tsrx +286 -292
  88. package/tests/client/typescript-generics.test.tsrx +121 -129
  89. package/tests/client/url/url.derived.test.tsrx +21 -25
  90. package/tests/client/url/url.parsing.test.tsrx +35 -35
  91. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  92. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  93. package/tests/client/url/url.serialization.test.tsrx +8 -8
  94. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  95. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  96. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  97. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  98. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  99. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  100. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  101. package/tests/hydration/compiled/client/basic.js +390 -319
  102. package/tests/hydration/compiled/client/composite.js +52 -44
  103. package/tests/hydration/compiled/client/for.js +734 -604
  104. package/tests/hydration/compiled/client/head.js +183 -103
  105. package/tests/hydration/compiled/client/html.js +93 -86
  106. package/tests/hydration/compiled/client/if-children.js +95 -71
  107. package/tests/hydration/compiled/client/if.js +113 -89
  108. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  109. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  110. package/tests/hydration/compiled/client/reactivity.js +26 -24
  111. package/tests/hydration/compiled/client/return.js +8 -42
  112. package/tests/hydration/compiled/client/switch.js +208 -173
  113. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  114. package/tests/hydration/compiled/client/try.js +29 -21
  115. package/tests/hydration/compiled/server/basic.js +210 -221
  116. package/tests/hydration/compiled/server/composite.js +13 -14
  117. package/tests/hydration/compiled/server/for.js +427 -444
  118. package/tests/hydration/compiled/server/head.js +199 -189
  119. package/tests/hydration/compiled/server/html.js +33 -41
  120. package/tests/hydration/compiled/server/if-children.js +114 -117
  121. package/tests/hydration/compiled/server/if.js +77 -83
  122. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  123. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  124. package/tests/hydration/compiled/server/reactivity.js +24 -22
  125. package/tests/hydration/compiled/server/return.js +6 -18
  126. package/tests/hydration/compiled/server/switch.js +179 -176
  127. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  128. package/tests/hydration/compiled/server/try.js +31 -35
  129. package/tests/hydration/components/basic.tsrx +216 -258
  130. package/tests/hydration/components/composite.tsrx +32 -42
  131. package/tests/hydration/components/events.tsrx +81 -101
  132. package/tests/hydration/components/for.tsrx +270 -336
  133. package/tests/hydration/components/head.tsrx +43 -39
  134. package/tests/hydration/components/hmr.tsrx +16 -22
  135. package/tests/hydration/components/html-in-template.tsrx +15 -21
  136. package/tests/hydration/components/html.tsrx +442 -526
  137. package/tests/hydration/components/if-children.tsrx +107 -125
  138. package/tests/hydration/components/if.tsrx +68 -90
  139. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  140. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  141. package/tests/hydration/components/portal.tsrx +33 -41
  142. package/tests/hydration/components/reactivity.tsrx +26 -34
  143. package/tests/hydration/components/return.tsrx +4 -6
  144. package/tests/hydration/components/switch.tsrx +73 -78
  145. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  146. package/tests/hydration/components/try.tsrx +37 -51
  147. package/tests/hydration/switch.test.js +8 -8
  148. package/tests/server/await.test.tsrx +3 -3
  149. package/tests/server/basic.attributes.test.tsrx +117 -162
  150. package/tests/server/basic.components.test.tsrx +164 -194
  151. package/tests/server/basic.test.tsrx +299 -199
  152. package/tests/server/compiler.test.tsrx +142 -72
  153. package/tests/server/composite.props.test.tsrx +54 -58
  154. package/tests/server/composite.test.tsrx +165 -167
  155. package/tests/server/context.test.tsrx +13 -17
  156. package/tests/server/dynamic-elements.test.tsrx +147 -148
  157. package/tests/server/for.test.tsrx +115 -84
  158. package/tests/server/head.test.tsrx +54 -31
  159. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  160. package/tests/server/if.test.tsrx +49 -59
  161. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  162. package/tests/server/return.test.tsrx +58 -36
  163. package/tests/server/streaming-ssr.test.tsrx +4 -4
  164. package/tests/server/style-identifier.test.tsrx +61 -69
  165. package/tests/server/switch.test.tsrx +89 -97
  166. package/tests/server/track-async-serialization.test.tsrx +85 -103
  167. package/tests/server/try.test.tsrx +275 -360
  168. package/tests/utils/ref-types.test.js +72 -0
  169. package/tests/utils/vite-plugin-config.test.js +41 -74
  170. package/types/index.d.ts +29 -4
  171. package/src/runtime/internal/client/compat.js +0 -40
  172. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -3,15 +3,16 @@ import { compile } from '@tsrx/ripple';
3
3
  describe('CSS :global basic tests', () => {
4
4
  it('applies global selector to all elements', () => {
5
5
  const source = `
6
- export function Test() { return <>
7
- <div>{'content'}</div>
8
-
9
- <style>
10
- :global(div) {
11
- color: red;
12
- }
13
- </style>
14
- </>; }`;
6
+ export function Test() @{
7
+ <>
8
+ <div>{'content'}</div>
9
+ <style>
10
+ :global(div) {
11
+ color: red;
12
+ }
13
+ </style>
14
+ </>
15
+ }`;
15
16
  const { css } = compile(source, 'test.tsrx');
16
17
 
17
18
  expect(css).toContain('div {');
@@ -21,19 +22,20 @@ export function Test() { return <>
21
22
 
22
23
  it('applies global selector with class', () => {
23
24
  const source = `
24
- export function Test() { return <>
25
- <div class="foo">{'content'}</div>
26
-
27
- <style>
28
- :global(div.foo) {
29
- color: pink;
30
- }
31
-
32
- :global(.foo) {
33
- font-weight: bold;
34
- }
35
- </style>
36
- </>; }`;
25
+ export function Test() @{
26
+ <>
27
+ <div class="foo">{'content'}</div>
28
+ <style>
29
+ :global(div.foo) {
30
+ color: pink;
31
+ }
32
+
33
+ :global(.foo) {
34
+ font-weight: bold;
35
+ }
36
+ </style>
37
+ </>
38
+ }`;
37
39
  const { css } = compile(source, 'test.tsrx');
38
40
 
39
41
  expect(css).toContain('div.foo {');
@@ -43,21 +45,22 @@ export function Test() { return <>
43
45
 
44
46
  it('mixes global and local selectors', () => {
45
47
  const source = `
46
- export function Test() { return <>
47
- <div>
48
- <p class="foo">{'red/bold'}</p>
49
- </div>
50
-
51
- <style>
52
- :global(div) .foo {
53
- color: red;
54
- }
55
-
56
- :global(div) > .foo {
57
- font-weight: bold;
58
- }
59
- </style>
60
- </>; }`;
48
+ export function Test() @{
49
+ <>
50
+ <div>
51
+ <p class="foo">{'red/bold'}</p>
52
+ </div>
53
+ <style>
54
+ :global(div) .foo {
55
+ color: red;
56
+ }
57
+
58
+ :global(div) > .foo {
59
+ font-weight: bold;
60
+ }
61
+ </style>
62
+ </>
63
+ }`;
61
64
  const { css } = compile(source, 'test.tsrx');
62
65
 
63
66
  expect(css).toContain('div .foo');
@@ -67,21 +70,22 @@ export function Test() { return <>
67
70
 
68
71
  it('handles global block syntax', () => {
69
72
  const source = `
70
- export function Test() { return <>
71
- <div>{'content'}</div>
72
-
73
- <style>
74
- :global {
75
- .x {
76
- color: green;
77
- }
78
-
79
- .a, .selector, .list {
80
- color: green;
73
+ export function Test() @{
74
+ <>
75
+ <div>{'content'}</div>
76
+ <style>
77
+ :global {
78
+ .x {
79
+ color: green;
80
+ }
81
+
82
+ .a, .selector, .list {
83
+ color: green;
84
+ }
81
85
  }
82
- }
83
- </style>
84
- </>; }`;
86
+ </style>
87
+ </>
88
+ }`;
85
89
  const { css } = compile(source, 'test.tsrx');
86
90
 
87
91
  expect(css).toContain('.x {');
@@ -91,19 +95,20 @@ export function Test() { return <>
91
95
 
92
96
  it('handles global with pseudo-classes', () => {
93
97
  const source = `
94
- export function Test() { return <>
95
- <button>{'click'}</button>
96
-
97
- <style>
98
- :global(button:hover) {
99
- opacity: 0.8;
100
- }
101
-
102
- :global(button):focus {
103
- outline: none;
104
- }
105
- </style>
106
- </>; }`;
98
+ export function Test() @{
99
+ <>
100
+ <button>{'click'}</button>
101
+ <style>
102
+ :global(button:hover) {
103
+ opacity: 0.8;
104
+ }
105
+
106
+ :global(button):focus {
107
+ outline: none;
108
+ }
109
+ </style>
110
+ </>
111
+ }`;
107
112
  const { css } = compile(source, 'test.tsrx');
108
113
 
109
114
  expect(css).toContain('button:hover {');
@@ -113,17 +118,18 @@ export function Test() { return <>
113
118
 
114
119
  it('handles multiple global selectors in selector list', () => {
115
120
  const source = `
116
- export function Test() { return <>
117
- <div>{'content'}</div>
118
-
119
- <style>
120
- :global(html),
121
- :global(body) {
122
- margin: 0;
123
- padding: 0;
124
- }
125
- </style>
126
- </>; }`;
121
+ export function Test() @{
122
+ <>
123
+ <div>{'content'}</div>
124
+ <style>
125
+ :global(html),
126
+ :global(body) {
127
+ margin: 0;
128
+ padding: 0;
129
+ }
130
+ </style>
131
+ </>
132
+ }`;
127
133
  const { css } = compile(source, 'test.tsrx');
128
134
 
129
135
  expect(css).toContain('html,');
@@ -132,29 +138,30 @@ export function Test() { return <>
132
138
 
133
139
  it('scopes local selectors while keeping globals unscoped', () => {
134
140
  const source = `
135
- export function Test() { return <>
136
- <div class="styled-container">
137
- <h1>{'Styled heading'}</h1>
138
- <p class="text">{'Styled paragraph'}</p>
139
- </div>
140
-
141
- <style>
142
- .styled-container {
143
- background-color: rgb(0, 0, 255);
144
- padding: 16px;
145
- }
146
-
147
- :global(h1) {
148
- color: rgb(255, 255, 255);
149
- font-size: 32px;
150
- }
151
-
152
- .text {
153
- color: rgb(200, 200, 200);
154
- font-size: 14px;
155
- }
156
- </style>
157
- </>; }`;
141
+ export function Test() @{
142
+ <>
143
+ <div class="styled-container">
144
+ <h1>{'Styled heading'}</h1>
145
+ <p class="text">{'Styled paragraph'}</p>
146
+ </div>
147
+ <style>
148
+ .styled-container {
149
+ background-color: rgb(0, 0, 255);
150
+ padding: 16px;
151
+ }
152
+
153
+ :global(h1) {
154
+ color: rgb(255, 255, 255);
155
+ font-size: 32px;
156
+ }
157
+
158
+ .text {
159
+ color: rgb(200, 200, 200);
160
+ font-size: 14px;
161
+ }
162
+ </style>
163
+ </>
164
+ }`;
158
165
  const { css } = compile(source, 'test.tsrx');
159
166
 
160
167
  expect(css).toMatch(/\.styled-container\.tsrx-[a-z0-9]+/);
@@ -3,15 +3,17 @@ import { compile } from '@tsrx/ripple';
3
3
  describe('CSS :global with classes and IDs', () => {
4
4
  it('handles :global with single class', () => {
5
5
  const source = `
6
- export function Test() { return <>
7
- <div class="foo">{'content'}</div>
8
-
9
- <style>
10
- :global(.foo) {
11
- color: red;
12
- }
13
- </style>
14
- </>; }`;
6
+ export function Test() @{
7
+ <>
8
+ <div class="foo">{'content'}</div>
9
+
10
+ <style>
11
+ :global(.foo) {
12
+ color: red;
13
+ }
14
+ </style>
15
+ </>
16
+ }`;
15
17
  const { css } = compile(source, 'test.tsrx');
16
18
 
17
19
  expect(css).toContain('.foo {');
@@ -20,23 +22,25 @@ export function Test() { return <>
20
22
 
21
23
  it('handles :global with chained classes', () => {
22
24
  const source = `
23
- export function Test() { return <>
24
- <div class="foo bar">{'content'}</div>
25
-
26
- <style>
27
- :global(.foo.bar) {
28
- color: red;
29
- }
30
-
31
- :global(.foo).bar {
32
- color: blue;
33
- }
34
-
35
- .foo:global(.bar) {
36
- color: green;
37
- }
38
- </style>
39
- </>; }`;
25
+ export function Test() @{
26
+ <>
27
+ <div class="foo bar">{'content'}</div>
28
+
29
+ <style>
30
+ :global(.foo.bar) {
31
+ color: red;
32
+ }
33
+
34
+ :global(.foo).bar {
35
+ color: blue;
36
+ }
37
+
38
+ .foo:global(.bar) {
39
+ color: green;
40
+ }
41
+ </style>
42
+ </>
43
+ }`;
40
44
  const { css } = compile(source, 'test.tsrx');
41
45
 
42
46
  expect(css).toContain('.foo.bar {');
@@ -46,21 +50,23 @@ export function Test() { return <>
46
50
 
47
51
  it('handles local class inside :global selector', () => {
48
52
  const source = `
49
- export function Test() { return <>
50
- <div class="outer">
51
- <span class="inner">{'content'}</span>
52
- </div>
53
-
54
- <style>
55
- :global(.outer) .inner {
56
- color: red;
57
- }
58
-
59
- :global(div) .foo {
60
- color: blue;
61
- }
62
- </style>
63
- </>; }`;
53
+ export function Test() @{
54
+ <>
55
+ <div class="outer">
56
+ <span class="inner">{'content'}</span>
57
+ </div>
58
+
59
+ <style>
60
+ :global(.outer) .inner {
61
+ color: red;
62
+ }
63
+
64
+ :global(div) .foo {
65
+ color: blue;
66
+ }
67
+ </style>
68
+ </>
69
+ }`;
64
70
  const { css } = compile(source, 'test.tsrx');
65
71
 
66
72
  expect(css).toMatch(/\.outer \.inner\.tsrx-[a-z0-9]+ {/);
@@ -69,25 +75,27 @@ export function Test() { return <>
69
75
 
70
76
  it('handles :global with ID selectors', () => {
71
77
  const source = `
72
- export function Test() { return <>
73
- <div id="app">
74
- <div id="content">{'text'}</div>
75
- </div>
76
-
77
- <style>
78
- :global(#app) {
79
- width: 100%;
80
- }
81
-
82
- :global(#app) #content {
83
- padding: 20px;
84
- }
85
-
86
- div :global(#content) {
87
- margin: 0;
88
- }
89
- </style>
90
- </>; }`;
78
+ export function Test() @{
79
+ <>
80
+ <div id="app">
81
+ <div id="content">{'text'}</div>
82
+ </div>
83
+
84
+ <style>
85
+ :global(#app) {
86
+ width: 100%;
87
+ }
88
+
89
+ :global(#app) #content {
90
+ padding: 20px;
91
+ }
92
+
93
+ div :global(#content) {
94
+ margin: 0;
95
+ }
96
+ </style>
97
+ </>
98
+ }`;
91
99
  const { css } = compile(source, 'test.tsrx');
92
100
 
93
101
  expect(css).toContain('#app {');
@@ -98,23 +106,25 @@ export function Test() { return <>
98
106
 
99
107
  it('handles :global with class and ID combination', () => {
100
108
  const source = `
101
- export function Test() { return <>
102
- <div id="app" class="container">{'content'}</div>
103
-
104
- <style>
105
- :global(#app.container) {
106
- color: red;
107
- }
108
-
109
- :global(.container)#app {
110
- color: blue;
111
- }
112
-
113
- #app:global(.container) {
114
- color: green;
115
- }
116
- </style>
117
- </>; }`;
109
+ export function Test() @{
110
+ <>
111
+ <div id="app" class="container">{'content'}</div>
112
+
113
+ <style>
114
+ :global(#app.container) {
115
+ color: red;
116
+ }
117
+
118
+ :global(.container)#app {
119
+ color: blue;
120
+ }
121
+
122
+ #app:global(.container) {
123
+ color: green;
124
+ }
125
+ </style>
126
+ </>
127
+ }`;
118
128
  const { css } = compile(source, 'test.tsrx');
119
129
 
120
130
  expect(css).toContain('#app.container {');
@@ -124,23 +134,25 @@ export function Test() { return <>
124
134
 
125
135
  it('handles multiple classes with :global', () => {
126
136
  const source = `
127
- export function Test() { return <>
128
- <div class="a b c">{'content'}</div>
129
-
130
- <style>
131
- :global(.a).b.c {
132
- color: red;
133
- }
134
-
135
- .a:global(.b).c {
136
- color: blue;
137
- }
138
-
139
- .a.b:global(.c) {
140
- color: green;
141
- }
142
- </style>
143
- </>; }`;
137
+ export function Test() @{
138
+ <>
139
+ <div class="a b c">{'content'}</div>
140
+
141
+ <style>
142
+ :global(.a).b.c {
143
+ color: red;
144
+ }
145
+
146
+ .a:global(.b).c {
147
+ color: blue;
148
+ }
149
+
150
+ .a.b:global(.c) {
151
+ color: green;
152
+ }
153
+ </style>
154
+ </>
155
+ }`;
144
156
  const { css } = compile(source, 'test.tsrx');
145
157
 
146
158
  expect((css.match(/\.a\.b\.c\.tsrx-[a-z0-9]+ {/g) || []).length).toBe(2);
@@ -149,27 +161,29 @@ export function Test() { return <>
149
161
 
150
162
  it('handles :global with class descendant selectors', () => {
151
163
  const source = `
152
- export function Test() { return <>
153
- <div class="outer">
154
- <div class="middle">
155
- <div class="inner">{'content'}</div>
164
+ export function Test() @{
165
+ <>
166
+ <div class="outer">
167
+ <div class="middle">
168
+ <div class="inner">{'content'}</div>
169
+ </div>
156
170
  </div>
157
- </div>
158
-
159
- <style>
160
- :global(.outer) .middle .inner {
161
- color: red;
162
- }
163
-
164
- .outer :global(.middle .inner) {
165
- color: blue;
166
- }
167
-
168
- .outer .middle:global(.inner) {
169
- color: green;
170
- }
171
- </style>
172
- </>; }`;
171
+
172
+ <style>
173
+ :global(.outer) .middle .inner {
174
+ color: red;
175
+ }
176
+
177
+ .outer :global(.middle .inner) {
178
+ color: blue;
179
+ }
180
+
181
+ .outer .middle:global(.inner) {
182
+ color: green;
183
+ }
184
+ </style>
185
+ </>
186
+ }`;
173
187
  const { css } = compile(source, 'test.tsrx');
174
188
 
175
189
  expect(css).toMatch(/\.outer \.middle\.tsrx-[a-z0-9]+ \.inner:where\(\.tsrx-[a-z0-9]+\)/);