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,17 +3,18 @@ import { compile } from '@tsrx/ripple';
3
3
  describe('CSS :global with combinators', () => {
4
4
  it('handles :global with child combinator', () => {
5
5
  const source = `
6
- export function Test() { return <>
7
- <div>
8
- <span>{'content'}</span>
9
- </div>
10
-
11
- <style>
12
- div > :global(span) {
13
- color: red;
14
- }
15
- </style>
16
- </>; }`;
6
+ export function Test() @{
7
+ <>
8
+ <div>
9
+ <span>{'content'}</span>
10
+ </div>
11
+ <style>
12
+ div > :global(span) {
13
+ color: red;
14
+ }
15
+ </style>
16
+ </>
17
+ }`;
17
18
  const { css } = compile(source, 'test.tsrx');
18
19
 
19
20
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ > span {/);
@@ -22,22 +23,23 @@ export function Test() { return <>
22
23
 
23
24
  it('handles :global with adjacent sibling combinator', () => {
24
25
  const source = `
25
- export function Test() { return <>
26
- <div>
27
- <span>{'one'}</span>
28
- <span>{'two'}</span>
29
- </div>
30
-
31
- <style>
32
- span + :global(span) {
33
- color: red;
34
- }
35
-
36
- :global(div) + span {
37
- color: blue;
38
- }
39
- </style>
40
- </>; }`;
26
+ export function Test() @{
27
+ <>
28
+ <div>
29
+ <span>{'one'}</span>
30
+ <span>{'two'}</span>
31
+ </div>
32
+ <style>
33
+ span + :global(span) {
34
+ color: red;
35
+ }
36
+
37
+ :global(div) + span {
38
+ color: blue;
39
+ }
40
+ </style>
41
+ </>
42
+ }`;
41
43
  const { css } = compile(source, 'test.tsrx');
42
44
 
43
45
  expect(css).toMatch(/span\.tsrx-[a-z0-9]+ \+ span {/);
@@ -46,22 +48,23 @@ export function Test() { return <>
46
48
 
47
49
  it('handles :global with general sibling combinator', () => {
48
50
  const source = `
49
- export function Test() { return <>
50
- <div>
51
- <span>{'one'}</span>
52
- <span>{'two'}</span>
53
- </div>
54
-
55
- <style>
56
- span ~ :global(span) {
57
- color: red;
58
- }
59
-
60
- :global(div) ~ span {
61
- color: blue;
62
- }
63
- </style>
64
- </>; }`;
51
+ export function Test() @{
52
+ <>
53
+ <div>
54
+ <span>{'one'}</span>
55
+ <span>{'two'}</span>
56
+ </div>
57
+ <style>
58
+ span ~ :global(span) {
59
+ color: red;
60
+ }
61
+
62
+ :global(div) ~ span {
63
+ color: blue;
64
+ }
65
+ </style>
66
+ </>
67
+ }`;
65
68
  const { css } = compile(source, 'test.tsrx');
66
69
 
67
70
  expect(css).toContain('~');
@@ -72,24 +75,25 @@ export function Test() { return <>
72
75
 
73
76
  it('handles complex combinator chains with :global', () => {
74
77
  const source = `
75
- export function Test() { return <>
76
- <div>
77
- <span>
78
- <button>{'nested button'}</button>
79
- </span>
80
- <button>{'sibling button'}</button>
81
- </div>
82
-
83
- <style>
84
- div > :global(span > button) {
85
- color: red;
86
- }
87
-
88
- :global(div) > span + button {
89
- color: blue;
90
- }
91
- </style>
92
- </>; }`;
78
+ export function Test() @{
79
+ <>
80
+ <div>
81
+ <span>
82
+ <button>{'nested button'}</button>
83
+ </span>
84
+ <button>{'sibling button'}</button>
85
+ </div>
86
+ <style>
87
+ div > :global(span > button) {
88
+ color: red;
89
+ }
90
+
91
+ :global(div) > span + button {
92
+ color: blue;
93
+ }
94
+ </style>
95
+ </>
96
+ }`;
93
97
  const { css } = compile(source, 'test.tsrx');
94
98
 
95
99
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ > span > button {/);
@@ -98,23 +102,24 @@ export function Test() { return <>
98
102
 
99
103
  it('handles :global with descendant combinator', () => {
100
104
  const source = `
101
- export function Test() { return <>
102
- <div>
103
- <span>
104
- <button>{'click'}</button>
105
- </span>
106
- </div>
107
-
108
- <style>
109
- div :global(span button) {
110
- color: red;
111
- }
112
-
113
- :global(div) span button {
114
- color: blue;
115
- }
116
- </style>
117
- </>; }`;
105
+ export function Test() @{
106
+ <>
107
+ <div>
108
+ <span>
109
+ <button>{'click'}</button>
110
+ </span>
111
+ </div>
112
+ <style>
113
+ div :global(span button) {
114
+ color: red;
115
+ }
116
+
117
+ :global(div) span button {
118
+ color: blue;
119
+ }
120
+ </style>
121
+ </>
122
+ }`;
118
123
 
119
124
  const { css } = compile(source, 'test.tsrx');
120
125
 
@@ -3,27 +3,29 @@ import { compile } from '@tsrx/ripple';
3
3
  describe('CSS :global with complex nesting', () => {
4
4
  it('handles :global block with nested selectors', () => {
5
5
  const source = `
6
- export function Test() { return <>
7
- <div>
8
- <span>
9
- <button>{'click'}</button>
10
- </span>
11
- </div>
12
-
13
- <style>
14
- :global {
15
- div {
16
- span {
17
- color: red;
6
+ export function Test() @{
7
+ <>
8
+ <div>
9
+ <span>
10
+ <button>{'click'}</button>
11
+ </span>
12
+ </div>
13
+
14
+ <style>
15
+ :global {
16
+ div {
17
+ span {
18
+ color: red;
18
19
 
19
- button {
20
- color: blue;
20
+ button {
21
+ color: blue;
22
+ }
21
23
  }
22
24
  }
23
25
  }
24
- }
25
- </style>
26
- </>; }`;
26
+ </style>
27
+ </>
28
+ }`;
27
29
  const { css } = compile(source, 'test.tsrx');
28
30
 
29
31
  expect(css).not.toMatch(/div\.tsrx-[a-z0-9]+ {/);
@@ -33,25 +35,27 @@ export function Test() { return <>
33
35
 
34
36
  it('handles local block with :global nested inside', () => {
35
37
  const source = `
36
- export function Test() { return <>
37
- <div>
38
- <span>{'content'}</span>
39
- </div>
38
+ export function Test() @{
39
+ <>
40
+ <div>
41
+ <span>{'content'}</span>
42
+ </div>
40
43
 
41
- <style>
42
- div {
43
- color: red;
44
+ <style>
45
+ div {
46
+ color: red;
44
47
 
45
- :global(span) {
46
- color: blue;
47
- }
48
+ :global(span) {
49
+ color: blue;
50
+ }
48
51
 
49
- p {
50
- color: green;
52
+ p {
53
+ color: green;
54
+ }
51
55
  }
52
- }
53
- </style>
54
- </>; }`;
56
+ </style>
57
+ </>
58
+ }`;
55
59
  const { css } = compile(source, 'test.tsrx');
56
60
 
57
61
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ {/);
@@ -61,23 +65,25 @@ export function Test() { return <>
61
65
 
62
66
  it('handles :global block with local nested inside', () => {
63
67
  const source = `
64
- export function Test() { return <>
65
- <div>
66
- <span>
67
- <button>{'click'}</button>
68
- </span>
69
- </div>
70
-
71
- <style>
72
- :global {
73
- div {
74
- .local {
75
- color: red;
68
+ export function Test() @{
69
+ <>
70
+ <div>
71
+ <span>
72
+ <button>{'click'}</button>
73
+ </span>
74
+ </div>
75
+
76
+ <style>
77
+ :global {
78
+ div {
79
+ .local {
80
+ color: red;
81
+ }
76
82
  }
77
83
  }
78
- }
79
- </style>
80
- </>; }`;
84
+ </style>
85
+ </>
86
+ }`;
81
87
  const { css } = compile(source, 'test.tsrx');
82
88
 
83
89
  expect(css).toContain('div {');
@@ -88,27 +94,29 @@ export function Test() { return <>
88
94
 
89
95
  it('handles alternating :global and local nesting', () => {
90
96
  const source = `
91
- export function Test() { return <>
92
- <div>
93
- <span>
94
- <button>
95
- <em>{'text'}</em>
96
- </button>
97
- </span>
98
- </div>
99
-
100
- <style>
101
- div {
102
- :global(span) {
103
- button {
104
- :global(em) {
105
- color: red;
97
+ export function Test() @{
98
+ <>
99
+ <div>
100
+ <span>
101
+ <button>
102
+ <em>{'text'}</em>
103
+ </button>
104
+ </span>
105
+ </div>
106
+
107
+ <style>
108
+ div {
109
+ :global(span) {
110
+ button {
111
+ :global(em) {
112
+ color: red;
113
+ }
106
114
  }
107
115
  }
108
116
  }
109
- }
110
- </style>
111
- </>; }`;
117
+ </style>
118
+ </>
119
+ }`;
112
120
  const { css } = compile(source, 'test.tsrx');
113
121
 
114
122
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ {/);
@@ -119,27 +127,29 @@ export function Test() { return <>
119
127
 
120
128
  it('handles deeply nested :global blocks', () => {
121
129
  const source = `
122
- export function Test() { return <>
123
- <div>
124
- <span>
125
- <button>{'click'}</button>
126
- </span>
127
- </div>
128
-
129
- <style>
130
- div {
131
- :global {
132
- span {
133
- :global {
134
- button {
135
- color: red;
130
+ export function Test() @{
131
+ <>
132
+ <div>
133
+ <span>
134
+ <button>{'click'}</button>
135
+ </span>
136
+ </div>
137
+
138
+ <style>
139
+ div {
140
+ :global {
141
+ span {
142
+ :global {
143
+ button {
144
+ color: red;
145
+ }
136
146
  }
137
147
  }
138
148
  }
139
149
  }
140
- }
141
- </style>
142
- </>; }`;
150
+ </style>
151
+ </>
152
+ }`;
143
153
  const { css } = compile(source, 'test.tsrx');
144
154
 
145
155
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ {/);
@@ -151,27 +161,29 @@ export function Test() { return <>
151
161
 
152
162
  it('handles :global with nesting combinator &', () => {
153
163
  const source = `
154
- export function Test() { return <>
155
- <div class="container">
156
- <button class="active">{'click'}</button>
157
- </div>
158
-
159
- <style>
160
- .container {
161
- :global {
162
- &.active {
163
- color: red;
164
+ export function Test() @{
165
+ <>
166
+ <div class="container">
167
+ <button class="active">{'click'}</button>
168
+ </div>
169
+
170
+ <style>
171
+ .container {
172
+ :global {
173
+ &.active {
174
+ color: red;
175
+ }
164
176
  }
165
- }
166
177
 
167
- button {
168
- :global(&.pressed) {
169
- color: blue;
178
+ button {
179
+ :global(&.pressed) {
180
+ color: blue;
181
+ }
170
182
  }
171
183
  }
172
- }
173
- </style>
174
- </>; }`;
184
+ </style>
185
+ </>
186
+ }`;
175
187
  const { css } = compile(source, 'test.tsrx');
176
188
 
177
189
  expect(css).toMatch(/\.container\.tsrx-[a-z0-9]+ {/);
@@ -182,31 +194,33 @@ export function Test() { return <>
182
194
 
183
195
  it('handles complex :global nesting with multiple levels', () => {
184
196
  const source = `
185
- export function Test() { return <>
186
- <div>
187
- <nav>
188
- <ul>
189
- <li>
190
- <a href="#">{'link'}</a>
191
- </li>
192
- </ul>
193
- </nav>
194
- </div>
195
-
196
- <style>
197
- div {
198
- :global(nav) {
199
- ul {
200
- :global(li) {
201
- a {
202
- color: red;
197
+ export function Test() @{
198
+ <>
199
+ <div>
200
+ <nav>
201
+ <ul>
202
+ <li>
203
+ <a href="#">{'link'}</a>
204
+ </li>
205
+ </ul>
206
+ </nav>
207
+ </div>
208
+
209
+ <style>
210
+ div {
211
+ :global(nav) {
212
+ ul {
213
+ :global(li) {
214
+ a {
215
+ color: red;
216
+ }
203
217
  }
204
218
  }
205
219
  }
206
220
  }
207
- }
208
- </style>
209
- </>; }`;
221
+ </style>
222
+ </>
223
+ }`;
210
224
  const { css } = compile(source, 'test.tsrx');
211
225
 
212
226
  expect(css).toMatch(/div\.tsrx-[a-z0-9]+ {/);