ripple 0.3.68 → 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.
Files changed (182) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -2
  4. package/src/runtime/element.js +1 -1
  5. package/src/runtime/index-client.js +11 -11
  6. package/src/runtime/index-server.js +7 -4
  7. package/src/runtime/internal/client/bindings.js +1 -1
  8. package/src/runtime/internal/client/blocks.js +13 -4
  9. package/src/runtime/internal/client/component.js +55 -0
  10. package/src/runtime/internal/client/composite.js +4 -2
  11. package/src/runtime/internal/client/expression.js +65 -7
  12. package/src/runtime/internal/client/hmr.js +54 -43
  13. package/src/runtime/internal/client/index.js +5 -1
  14. package/src/runtime/internal/client/portal.js +70 -69
  15. package/src/runtime/internal/client/render.js +3 -0
  16. package/src/runtime/internal/server/index.js +92 -8
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
  18. package/tests/client/array/array.copy-within.test.tsrx +33 -31
  19. package/tests/client/array/array.derived.test.tsrx +186 -169
  20. package/tests/client/array/array.iteration.test.tsrx +40 -37
  21. package/tests/client/array/array.mutations.test.tsrx +113 -101
  22. package/tests/client/array/array.static.test.tsrx +119 -101
  23. package/tests/client/array/array.to-methods.test.tsrx +24 -21
  24. package/tests/client/async-suspend.test.tsrx +247 -246
  25. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
  26. package/tests/client/basic/basic.attributes.test.tsrx +428 -423
  27. package/tests/client/basic/basic.collections.test.tsrx +109 -102
  28. package/tests/client/basic/basic.components.test.tsrx +323 -205
  29. package/tests/client/basic/basic.errors.test.tsrx +91 -91
  30. package/tests/client/basic/basic.events.test.tsrx +114 -115
  31. package/tests/client/basic/basic.get-set.test.tsrx +97 -87
  32. package/tests/client/basic/basic.hmr.test.tsrx +19 -16
  33. package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
  34. package/tests/client/basic/basic.rendering.test.tsrx +272 -182
  35. package/tests/client/basic/basic.styling.test.tsrx +23 -22
  36. package/tests/client/basic/basic.utilities.test.tsrx +10 -8
  37. package/tests/client/boundaries.test.tsrx +26 -26
  38. package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
  39. package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
  40. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
  41. package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
  42. package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
  43. package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
  44. package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
  45. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  46. package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
  47. package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
  48. package/tests/client/composite/composite.generics.test.tsrx +168 -192
  49. package/tests/client/composite/composite.props.test.tsrx +97 -81
  50. package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
  51. package/tests/client/composite/composite.render.test.tsrx +122 -105
  52. package/tests/client/computed-properties.test.tsrx +28 -28
  53. package/tests/client/context.test.tsrx +21 -21
  54. package/tests/client/css/global-additional-cases.test.tsrx +58 -58
  55. package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
  56. package/tests/client/css/global-at-rules.test.tsrx +10 -10
  57. package/tests/client/css/global-basic.test.tsrx +14 -14
  58. package/tests/client/css/global-classes-ids.test.tsrx +14 -14
  59. package/tests/client/css/global-combinators.test.tsrx +10 -10
  60. package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
  61. package/tests/client/css/global-edge-cases.test.tsrx +18 -18
  62. package/tests/client/css/global-keyframes.test.tsrx +12 -12
  63. package/tests/client/css/global-nested.test.tsrx +10 -10
  64. package/tests/client/css/global-pseudo.test.tsrx +12 -12
  65. package/tests/client/css/global-scoping.test.tsrx +20 -20
  66. package/tests/client/css/style-identifier.test.tsrx +143 -291
  67. package/tests/client/date.test.tsrx +146 -133
  68. package/tests/client/dynamic-elements.test.tsrx +398 -365
  69. package/tests/client/events.test.tsrx +292 -290
  70. package/tests/client/for.test.tsrx +156 -153
  71. package/tests/client/head.test.tsrx +105 -96
  72. package/tests/client/html.test.tsrx +122 -26
  73. package/tests/client/input-value.test.tsrx +1361 -1314
  74. package/tests/client/lazy-array.test.tsrx +16 -13
  75. package/tests/client/lazy-destructuring.test.tsrx +257 -213
  76. package/tests/client/map.test.tsrx +65 -60
  77. package/tests/client/media-query.test.tsrx +22 -20
  78. package/tests/client/object.test.tsrx +87 -81
  79. package/tests/client/portal.test.tsrx +57 -51
  80. package/tests/client/ref.test.tsrx +233 -202
  81. package/tests/client/return.test.tsrx +71 -2560
  82. package/tests/client/set.test.tsrx +54 -45
  83. package/tests/client/svg.test.tsrx +216 -186
  84. package/tests/client/switch.test.tsrx +194 -193
  85. package/tests/client/track-async-hydration.test.tsrx +18 -14
  86. package/tests/client/tracked-index-access.test.tsrx +28 -18
  87. package/tests/client/try.test.tsrx +675 -548
  88. package/tests/client/tsx.test.tsrx +373 -311
  89. package/tests/client/typescript-generics.test.tsrx +145 -145
  90. package/tests/client/url/url.derived.test.tsrx +33 -28
  91. package/tests/client/url/url.parsing.test.tsrx +61 -51
  92. package/tests/client/url/url.partial-removal.test.tsrx +56 -48
  93. package/tests/client/url/url.reactivity.test.tsrx +142 -125
  94. package/tests/client/url/url.serialization.test.tsrx +13 -11
  95. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
  96. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
  97. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
  98. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
  99. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
  100. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
  101. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
  102. package/tests/hydration/basic.test.js +3 -3
  103. package/tests/hydration/compiled/client/basic.js +586 -651
  104. package/tests/hydration/compiled/client/composite.js +79 -104
  105. package/tests/hydration/compiled/client/events.js +140 -148
  106. package/tests/hydration/compiled/client/for.js +1005 -1018
  107. package/tests/hydration/compiled/client/head.js +124 -134
  108. package/tests/hydration/compiled/client/hmr.js +41 -48
  109. package/tests/hydration/compiled/client/html-in-template.js +38 -41
  110. package/tests/hydration/compiled/client/html.js +970 -1314
  111. package/tests/hydration/compiled/client/if-children.js +234 -249
  112. package/tests/hydration/compiled/client/if.js +182 -189
  113. package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
  114. package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
  115. package/tests/hydration/compiled/client/portal.js +65 -85
  116. package/tests/hydration/compiled/client/reactivity.js +84 -90
  117. package/tests/hydration/compiled/client/return.js +38 -1939
  118. package/tests/hydration/compiled/client/switch.js +218 -224
  119. package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
  120. package/tests/hydration/compiled/client/try.js +123 -132
  121. package/tests/hydration/compiled/server/basic.js +773 -831
  122. package/tests/hydration/compiled/server/composite.js +166 -191
  123. package/tests/hydration/compiled/server/events.js +170 -184
  124. package/tests/hydration/compiled/server/for.js +851 -909
  125. package/tests/hydration/compiled/server/head.js +206 -216
  126. package/tests/hydration/compiled/server/hmr.js +64 -72
  127. package/tests/hydration/compiled/server/html-in-template.js +42 -76
  128. package/tests/hydration/compiled/server/html.js +1362 -1667
  129. package/tests/hydration/compiled/server/if-children.js +419 -445
  130. package/tests/hydration/compiled/server/if.js +194 -208
  131. package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
  132. package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
  133. package/tests/hydration/compiled/server/portal.js +152 -160
  134. package/tests/hydration/compiled/server/reactivity.js +94 -106
  135. package/tests/hydration/compiled/server/return.js +28 -2172
  136. package/tests/hydration/compiled/server/switch.js +274 -286
  137. package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
  138. package/tests/hydration/compiled/server/try.js +167 -185
  139. package/tests/hydration/components/basic.tsrx +320 -272
  140. package/tests/hydration/components/composite.tsrx +44 -32
  141. package/tests/hydration/components/events.tsrx +101 -91
  142. package/tests/hydration/components/for.tsrx +510 -452
  143. package/tests/hydration/components/head.tsrx +87 -80
  144. package/tests/hydration/components/hmr.tsrx +22 -17
  145. package/tests/hydration/components/html-in-template.tsrx +22 -17
  146. package/tests/hydration/components/html.tsrx +525 -443
  147. package/tests/hydration/components/if-children.tsrx +158 -148
  148. package/tests/hydration/components/if.tsrx +109 -95
  149. package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
  150. package/tests/hydration/components/nested-control-flow.tsrx +215 -203
  151. package/tests/hydration/components/portal.tsrx +41 -34
  152. package/tests/hydration/components/reactivity.tsrx +37 -27
  153. package/tests/hydration/components/return.tsrx +12 -556
  154. package/tests/hydration/components/switch.tsrx +120 -114
  155. package/tests/hydration/components/track-async-serialization.tsrx +107 -91
  156. package/tests/hydration/components/try.tsrx +55 -40
  157. package/tests/hydration/html.test.js +4 -4
  158. package/tests/hydration/return.test.js +13 -532
  159. package/tests/server/await.test.tsrx +3 -3
  160. package/tests/server/basic.attributes.test.tsrx +264 -195
  161. package/tests/server/basic.components.test.tsrx +296 -169
  162. package/tests/server/basic.test.tsrx +300 -198
  163. package/tests/server/compiler.test.tsrx +62 -60
  164. package/tests/server/composite.props.test.tsrx +77 -63
  165. package/tests/server/composite.test.tsrx +168 -192
  166. package/tests/server/context.test.tsrx +18 -12
  167. package/tests/server/dynamic-elements.test.tsrx +197 -180
  168. package/tests/server/for.test.tsrx +85 -78
  169. package/tests/server/head.test.tsrx +50 -43
  170. package/tests/server/html-nesting-validation.test.tsrx +8 -8
  171. package/tests/server/if.test.tsrx +57 -51
  172. package/tests/server/lazy-destructuring.test.tsrx +366 -294
  173. package/tests/server/return.test.tsrx +76 -1355
  174. package/tests/server/streaming-ssr.test.tsrx +4 -75
  175. package/tests/server/style-identifier.test.tsrx +169 -148
  176. package/tests/server/switch.test.tsrx +91 -85
  177. package/tests/server/track-async-serialization.test.tsrx +105 -85
  178. package/tests/server/try.test.tsrx +374 -280
  179. package/tests/utils/compiler-compat-config.test.js +2 -2
  180. package/tests/utils/runtime-imports.test.js +10 -0
  181. package/types/index.d.ts +8 -0
  182. package/tests/client/__snapshots__/html.test.rsrx.snap +0 -40
@@ -2,213 +2,189 @@ import { RippleArray, RippleMap } from 'ripple';
2
2
 
3
3
  describe('generics', () => {
4
4
  it('handles advanced generic ambiguity and edge cases', () => {
5
- component App() {
6
- // Ambiguous generics vs JSX / less-than parsing scenarios
7
-
8
- // 7. Generic following optional chaining
9
- const maybe = {
10
- factory: function <T>() {
5
+ function App() {
6
+ return <>
7
+ const maybe = {
8
+ factory: function <T>() {
9
+ return {
10
+ make: function <U>() {
11
+ return 1;
12
+ },
13
+ };
14
+ },
15
+ };
16
+ const g = maybe?.factory<number>()?.make<boolean>();
17
+ // 8. Comparison operator (ensure '<' here NOT misparsed as generics)
18
+ let x = 10, y = 20;
19
+ const h =
20
+ x < y ? 'lt' : 'ge';
21
+ // 9. Chained comparisons with intervening generics
22
+ class Box<T> {
23
+ value: T;
24
+
25
+ constructor(value: T) {
26
+ this.value = value;
27
+ }
28
+
29
+ open<U>() {
30
+ return new Box<number>(1);
31
+ }
32
+ }
33
+ const limit = 100;
34
+ const i =
35
+ new Box<number>(2).value < limit ? 'ok' : 'no';
36
+ // 10. JSX / Element should still work
37
+ <div class="still-works">
38
+ <span>{'Test'}</span>
39
+ </div>
40
+ // 11. Generic function call vs Element: Identifier followed by generic args
41
+ function identity<T>(value: T): T {
42
+ return value;
43
+ }
44
+ const j = identity<number>(42);
45
+ // 12. Member + generic call immediately followed by another call
46
+ class Factory {
47
+ create<T>() {
48
+ return (value: T) => value;
49
+ }
50
+ }
51
+ const factory = new Factory();
52
+ const k = factory.create<number>()(123);
53
+ // 13. Multiple generic segments in chain
54
+ function foo<T>() {
55
+ return {
56
+ bar: function <U>() {
57
+ return {
58
+ baz: function <V>() {
59
+ return true;
60
+ },
61
+ };
62
+ },
63
+ };
64
+ }
65
+ const l = foo<number>().bar<string>().baz<boolean>();
66
+ // 14. Generic with constraint + default
67
+ type Extractor<T extends { id: number } = { id: number }> = (v: T) => number;
68
+ const m: Extractor<{ id: number }> = (v) => v.id;
69
+ // 15. Generic in angle after "new" + trailing call
70
+ class Wrapper<T> {
71
+ value: T;
72
+
73
+ constructor() {
74
+ this.value = null as unknown as T;
75
+ }
76
+
77
+ unwrap<U>() {
78
+ return null as unknown as U;
79
+ }
80
+ }
81
+ const n = new Wrapper<number>().unwrap<string>();
82
+ // 16. Angle brackets inside type assertion vs generic call
83
+ function getUnknown(): unknown {
84
+ return new Map<string, number>([['a', 1]]);
85
+ }
86
+ getUnknown.factory = function <T>() {
11
87
  return {
12
88
  make: function <U>() {
13
- return 1;
89
+ return 2;
14
90
  },
15
91
  };
16
- },
17
- };
18
- const g = maybe?.factory<number>()?.make<boolean>();
19
-
20
- // 8. Comparison operator (ensure '<' here NOT misparsed as generics)
21
- let x = 10, y = 20;
22
- const h =
23
- x < y ? 'lt' : 'ge';
24
-
25
- // 9. Chained comparisons with intervening generics
26
- class Box<T> {
27
- value: T;
28
-
29
- constructor(value: T) {
30
- this.value = value;
92
+ };
93
+ const raw = getUnknown();
94
+ const o = (raw as Map<string, number>).get('a');
95
+ // 17. Generic with comma + trailing less-than comparison on next token
96
+ class Pair<T1, T2> {
97
+ first: T1;
98
+
99
+ second: T2;
100
+
101
+ constructor() {
102
+ this.first = null as unknown as T1;
103
+ this.second = null as unknown as T2;
104
+ }
31
105
  }
32
-
33
- open<U>() {
34
- return new Box<number>(1);
106
+ const p = new Pair<number, string>();
107
+ const q =
108
+ 1 < 2 ? p : null;
109
+ // 18. Nested generics with line breaks resembling JSX indentation
110
+ interface Node<T> {
111
+ value: T;
35
112
  }
36
- }
37
- const limit = 100;
38
- const i =
39
- new Box<number>(2).value < limit ? 'ok' : 'no';
40
-
41
- // 10. JSX / Element should still work
42
- <div class="still-works">
43
- <span>{'Test'}</span>
44
- </div>
113
+ interface Edge<W> {
114
+ weight: W;
115
+ }
116
+ class Graph<N, E> {
117
+ nodes: N[];
45
118
 
46
- // 11. Generic function call vs Element: Identifier followed by generic args
47
- function identity<T>(value: T): T {
48
- return value;
49
- }
50
- const j = identity<number>(42);
119
+ edges: E[];
51
120
 
52
- // 12. Member + generic call immediately followed by another call
53
- class Factory {
54
- create<T>() {
121
+ constructor() {
122
+ this.nodes = [];
123
+ this.edges = [];
124
+ }
125
+ }
126
+ const r = new Graph<Node<string>, Edge<number>>();
127
+ // 19. Ternary containing generics in both branches
128
+ let flag = true;
129
+ const s = flag ? new Box<number>(1) : new Box<string>('string');
130
+ // 20. Generic inside template expression
131
+ const t = `length=${new RippleArray<number>().length}`;
132
+ // 21. Optional chaining + generic + property access
133
+ const registry = new RippleMap<string, number>();
134
+ const u = registry.get('id')?.toString();
135
+ // 22. Generic call used as callee for another call
136
+ function make<T>() {
55
137
  return (value: T) => value;
56
138
  }
57
- }
58
- const factory = new Factory();
59
- const k = factory.create<number>()(123);
60
-
61
- // 13. Multiple generic segments in chain
62
- function foo<T>() {
63
- return {
64
- bar: function <U>() {
139
+ const v = make<number>()(10);
140
+ // 23. Generic followed by tagged template (ensure not confused with JSX)
141
+ function tagFn<T>(strings: TemplateStringsArray, ...values) {
142
+ return values[0];
143
+ }
144
+ const tagResult = tagFn`value`;
145
+ // 24. Sequence mixing: (a < b) + generic call in same statement
146
+ function compute<T>(x: T, y: T): T {
147
+ return y;
148
+ }
149
+ const w = x < y && compute<number>(x, y);
150
+ // Additional component focusing on edge crankers
151
+
152
+ // 28. Generic after parenthesized new expression
153
+ const aa = (new Box<number>(1)).open<string>();
154
+ // 29. Generic chain right after closing paren of IIFE
155
+ class Builder<Kind> {
156
+ finalize<Result>() {
65
157
  return {
66
- baz: function <V>() {
67
- return true;
68
- },
158
+ result: null as unknown as Result,
69
159
  };
70
- },
71
- };
72
- }
73
- const l = foo<number>().bar<string>().baz<boolean>();
74
-
75
- // 14. Generic with constraint + default
76
- type Extractor<T extends { id: number } = { id: number }> = (v: T) => number;
77
- const m: Extractor<{ id: number }> = (v) => v.id;
78
-
79
- // 15. Generic in angle after "new" + trailing call
80
- class Wrapper<T> {
81
- value: T;
82
-
83
- constructor() {
84
- this.value = null as unknown as T;
160
+ }
85
161
  }
86
-
87
- unwrap<U>() {
88
- return null as unknown as U;
162
+ const builder = new Builder<Number>();
163
+ const result = (function () {
164
+ return builder;
165
+ }() as Builder<Number>).finalize<boolean>();
166
+ // 30. Angle bracket start of conditional expression line
167
+ function adjust<T>(value: T): T {
168
+ return value;
89
169
  }
90
- }
91
- const n = new Wrapper<number>().unwrap<string>();
92
-
93
- // 16. Angle brackets inside type assertion vs generic call
94
- function getUnknown(): unknown {
95
- return new Map<string, number>([['a', 1]]);
96
- }
97
- getUnknown.factory = function <T>() {
98
- return {
99
- make: function <U>() {
100
- return 2;
101
- },
102
- };
103
- };
104
- const raw = getUnknown();
105
- const o = (raw as Map<string, number>).get('a');
106
-
107
- // 17. Generic with comma + trailing less-than comparison on next token
108
- class Pair<T1, T2> {
109
- first: T1;
110
-
111
- second: T2;
112
-
113
- constructor() {
114
- this.first = null as unknown as T1;
115
- this.second = null as unknown as T2;
116
- }
117
- }
118
- const p = new Pair<number, string>();
119
- const q =
120
- 1 < 2 ? p : null;
121
-
122
- // 18. Nested generics with line breaks resembling JSX indentation
123
- interface Node<T> {
124
- value: T;
125
- }
126
- interface Edge<W> {
127
- weight: W;
128
- }
129
- class Graph<N, E> {
130
- nodes: N[];
131
-
132
- edges: E[];
133
-
134
- constructor() {
135
- this.nodes = [];
136
- this.edges = [];
170
+ const val =
171
+ new Wrapper<number>().value < 100 ? adjust<number>(10) : adjust<number>(20);
172
+ // 32. Generic with comments inside angle list
173
+ class Mapper<Key, Value> {
174
+ map: Map<Key, Value>;
175
+
176
+ constructor() {
177
+ this.map = new Map<Key, Value>();
178
+ }
137
179
  }
138
- }
139
- const r = new Graph<Node<string>, Edge<number>>();
140
-
141
- // 19. Ternary containing generics in both branches
142
- let flag = true;
143
- const s = flag ? new Box<number>(1) : new Box<string>('string');
144
-
145
- // 20. Generic inside template expression
146
- const t = `length=${new RippleArray<number>().length}`;
147
-
148
- // 21. Optional chaining + generic + property access
149
- const registry = new RippleMap<string, number>();
150
- const u = registry.get('id')?.toString();
151
-
152
- // 22. Generic call used as callee for another call
153
- function make<T>() {
154
- return (value: T) => value;
155
- }
156
- const v = make<number>()(10);
157
-
158
- // 23. Generic followed by tagged template (ensure not confused with JSX)
159
- function tagFn<T>(strings: TemplateStringsArray, ...values) {
160
- return values[0];
161
- }
162
- const tagResult = tagFn`value`;
163
-
164
- // 24. Sequence mixing: (a < b) + generic call in same statement
165
- function compute<T>(x: T, y: T): T {
166
- return y;
167
- }
168
-
169
- const w = x < y && compute<number>(x, y);
170
-
171
- // Additional component focusing on edge crankers
172
-
173
- // 28. Generic after parenthesized new expression
174
- const aa = (new Box<number>(1)).open<string>();
175
-
176
- // 29. Generic chain right after closing paren of IIFE
177
- class Builder<Kind> {
178
- finalize<Result>() {
179
- return {
180
- result: null as unknown as Result,
181
- };
182
- }
183
- }
184
- const builder = new Builder<Number>();
185
- const result = (function () {
186
- return builder;
187
- }() as Builder<Number>).finalize<boolean>();
188
-
189
- // 30. Angle bracket start of conditional expression line
190
- function adjust<T>(value: T): T {
191
- return value;
192
- }
193
- const val =
194
- new Wrapper<number>().value < 100 ? adjust<number>(10) : adjust<number>(20);
195
-
196
- // 32. Generic with comments inside angle list
197
- class Mapper<Key, Value> {
198
- map: Map<Key, Value>;
199
-
200
- constructor() {
201
- this.map = new Map<Key, Value>();
202
- }
203
- }
204
- const gg = new Mapper<
205
- // key type
206
- string /* value type */,
207
- number
208
- >();
209
-
210
- // 33. Map of generic instance as key
211
- const mm = new Map<RippleArray<number>, RippleArray<string>>();
180
+ const gg = new Mapper<
181
+ // key type
182
+ string /* value type */,
183
+ number
184
+ >();
185
+ // 33. Map of generic instance as key
186
+ const mm = new Map<RippleArray<number>, RippleArray<string>>();
187
+ </>;
212
188
  }
213
189
 
214
190
  render(App);
@@ -4,22 +4,28 @@ describe('Context API', () => {
4
4
  it('handles context override in nested components', async () => {
5
5
  const MessageContext = Context('default');
6
6
 
7
- component Inner() {
8
- const msg = MessageContext.get();
9
- <span>{msg}</span>
7
+ function Inner() {
8
+ return <>
9
+ const msg = MessageContext.get();
10
+ <span>{msg}</span>
11
+ </>;
10
12
  }
11
13
 
12
- component Middle() {
13
- MessageContext.set('middle');
14
- <div>
15
- <Inner />
16
- </div>
14
+ function Middle() {
15
+ return <>
16
+ MessageContext.set('middle');
17
+ <div>
18
+ <Inner />
19
+ </div>
20
+ </>;
17
21
  }
18
22
 
19
- component Outer() {
20
- MessageContext.set('outer');
21
- <Middle />
22
- <Inner />
23
+ function Outer() {
24
+ return <>
25
+ MessageContext.set('outer');
26
+ <Middle />
27
+ <Inner />
28
+ </>;
23
29
  }
24
30
 
25
31
  const { body } = await render(Outer);