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
@@ -1,200 +1,192 @@
1
1
  describe('generic patterns', () => {
2
2
  it('tests simple generic function', () => {
3
- function App() {
4
- return <>
5
- const e = new Map<string, Promise<number>>();
6
- const a = new Array<number>();
7
- const b = new Array<string>();
8
- <div class="still-works">
9
- <span>{'Test'}</span>
10
- </div>
11
- const someSource = new Array<number>(1, 2, 3);
12
- const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
13
- </>;
3
+ function App() @{
4
+ const e = new Map<string, Promise<number>>();
5
+ const a = new Array<number>();
6
+ const b = new Array<string>();
7
+ const someSource = new Array<number>(1, 2, 3);
8
+ const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
9
+ <div class="still-works">
10
+ <span>{'Test'}</span>
11
+ </div>
14
12
  }
15
13
 
16
14
  render(App);
17
15
  });
18
16
 
19
17
  it('tests member expression)', () => {
20
- function App() {
21
- return <>
22
- class List<T> {
23
- items: T[];
24
- constructor() {
25
- this.items = [];
26
- }
18
+ function App() @{
19
+ class List<T> {
20
+ items: T[];
21
+ constructor() {
22
+ this.items = [];
27
23
  }
28
- <div class="still-works">
29
- <span>{'Test'}</span>
30
- </div>
31
- class Containers {
32
- static List<T>() {
33
- return new List<T>();
34
- }
24
+ }
25
+ class Containers {
26
+ static List<T>() {
27
+ return new List<T>();
35
28
  }
36
- const c = Containers.List<string>();
37
- </>;
29
+ }
30
+ const c = Containers.List<string>();
31
+ <div class="still-works">
32
+ <span>{'Test'}</span>
33
+ </div>
38
34
  }
39
35
 
40
36
  render(App);
41
37
  });
42
38
 
43
39
  it('tests simple generic function with return type', () => {
44
- function App() {
45
- return <>
46
- function getBuilder() {
47
- return {
48
- build: function <T>() {
49
- return 'test';
50
- },
51
- };
52
- }
53
- </>;
40
+ function App() @{
41
+ function getBuilder() {
42
+ return {
43
+ build: function <T>() {
44
+ return 'test';
45
+ },
46
+ };
47
+ }
48
+ <></>
54
49
  }
55
50
 
56
51
  render(App);
57
52
  });
58
53
 
59
54
  it('tests simple generic function with return type and no arrow function', () => {
60
- function App() {
61
- return <>
62
- function getBuilder() {
63
- return {
64
- build<T>(): T {
65
- return 'test' as unknown as T;
66
- },
67
- };
68
- }
69
- <div class="still-works">
70
- <span>{'Test'}</span>
71
- </div>
72
- const f = getBuilder().build<string>();
73
- </>;
55
+ function App() @{
56
+ function getBuilder() {
57
+ return {
58
+ build<T>(): T {
59
+ return 'test' as unknown as T;
60
+ },
61
+ };
62
+ }
63
+ const f = getBuilder().build<string>();
64
+ <div class="still-works">
65
+ <span>{'Test'}</span>
66
+ </div>
74
67
  }
75
68
 
76
69
  render(App);
77
70
  });
78
71
 
79
72
  it('tests simple generic arrow function with return type', () => {
80
- function App() {
81
- return <>
82
- function getBuilder() {
83
- return <T,>() => ({
84
- build<T>(): T {
85
- return 'test' as unknown as T;
86
- },
87
- });
88
- }
89
- type ResultType = string;
90
- const f = getBuilder()<ResultType>().build<string>();
91
- </>;
73
+ function App() @{
74
+ function getBuilder() {
75
+ return <T,>() => ({
76
+ build<T>(): T {
77
+ return 'test' as unknown as T;
78
+ },
79
+ });
80
+ }
81
+ type ResultType = string;
82
+ const f = getBuilder()<ResultType>().build<string>();
83
+ <></>
92
84
  }
93
85
 
94
86
  render(App);
95
87
  });
96
88
 
97
89
  it('tests simple generic arrow function with explicit return type', () => {
98
- function App() {
99
- return <>
100
- function getBuilder() {
101
- return <T,>() => ({
102
- build<U>(): U {
103
- return 'test' as U;
104
- },
105
- });
106
- }
90
+ function App() @{
91
+ function getBuilder() {
92
+ return <T,>() => ({
93
+ build<U>(): U {
94
+ return 'test' as U;
95
+ },
96
+ });
97
+ }
98
+ type ResultType = string;
99
+ const f = getBuilder()<ResultType>().build<string>();
100
+ <>
107
101
  <div class="still-works">
108
102
  <span>{'Test'}</span>
109
103
  </div>
110
- type ResultType = string;
111
- const f = getBuilder()<ResultType>().build<string>();
112
104
  <div>{f}</div>
113
- </>;
105
+ </>
114
106
  }
115
107
 
116
108
  render(App);
117
109
  });
118
110
 
119
111
  it('tests complex generic arrow function with return type', () => {
120
- function App() {
121
- return <>
122
- function getBuilder() {
123
- return <T,>() => ({
124
- build<V, T, U>(): { build: () => V; data: T; key: U } {
125
- return {
126
- build(): V {
127
- return 'test' as V;
128
- },
129
- data: undefined as T,
130
- key: undefined as U,
131
- };
132
- },
133
- });
134
- }
112
+ function App() @{
113
+ function getBuilder() {
114
+ return <T,>() => ({
115
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
116
+ return {
117
+ build(): V {
118
+ return 'test' as V;
119
+ },
120
+ data: undefined as T,
121
+ key: undefined as U,
122
+ };
123
+ },
124
+ });
125
+ }
126
+ type ResultType = string;
127
+ const f = getBuilder()<ResultType>().build<string, object, string>();
128
+ <>
135
129
  <div class="still-works">
136
130
  <span>{'Test'}</span>
137
131
  </div>
138
- type ResultType = string;
139
- const f = getBuilder()<ResultType>().build<string, object, string>();
140
132
  <div>{f}</div>
141
- </>;
133
+ </>
142
134
  }
143
135
 
144
136
  render(App);
145
137
  });
146
138
 
147
139
  it('tests more complex generic arrow function with return type', () => {
148
- function App() {
149
- return <>
150
- function getBuilder() {
151
- return <T,>() => ({
152
- build<V, T, U>(): { build: () => V; data: T; key: U } {
153
- return {
154
- build(): V {
155
- return 'test' as V;
156
- },
157
- data: undefined as T,
158
- key: undefined as U,
159
- };
160
- },
161
- });
162
- }
140
+ function App() @{
141
+ function getBuilder() {
142
+ return <T,>() => ({
143
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
144
+ return {
145
+ build(): V {
146
+ return 'test' as V;
147
+ },
148
+ data: undefined as T,
149
+ key: undefined as U,
150
+ };
151
+ },
152
+ });
153
+ }
154
+ type ResultType = string;
155
+ const f = getBuilder()<ResultType>().build<string, object, string>();
156
+ <>
163
157
  <div class="still-works">
164
158
  <span>{'Test'}</span>
165
159
  </div>
166
- type ResultType = string;
167
- const f = getBuilder()<ResultType>().build<string, object, string>();
168
160
  <div>{f}</div>
169
- </>;
161
+ </>
170
162
  }
171
163
 
172
164
  render(App);
173
165
  });
174
166
 
175
167
  it('tests most complex generic arrow function with return type', () => {
176
- function App() {
177
- return <>
178
- function getBuilder() {
179
- return <T,>() => ({
180
- build<V, T, U>(): { build: () => V; data: T; key: U } {
181
- return {
182
- build(): V {
183
- return 42 as V;
184
- },
185
- data: undefined as T,
186
- key: undefined as U,
187
- };
188
- },
189
- });
190
- }
168
+ function App() @{
169
+ function getBuilder() {
170
+ return <T,>() => ({
171
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
172
+ return {
173
+ build(): V {
174
+ return 42 as V;
175
+ },
176
+ data: undefined as T,
177
+ key: undefined as U,
178
+ };
179
+ },
180
+ });
181
+ }
182
+ type ResultType = string;
183
+ const f = getBuilder()<ResultType>().build<number, object, string>();
184
+ <>
191
185
  <div class="still-works">
192
186
  <span>{'Test'}</span>
193
187
  </div>
194
- type ResultType = string;
195
- const f = getBuilder()<ResultType>().build<number, object, string>();
196
188
  <div>{f}</div>
197
- </>;
189
+ </>
198
190
  }
199
191
 
200
192
  render(App);
@@ -2,16 +2,16 @@ import { RippleURL, flushSync, track } from 'ripple';
2
2
 
3
3
  describe('RippleURL > derived', () => {
4
4
  it('handles reactive computed properties based on URL', () => {
5
- function URLTest() {
6
- return <>
7
- const url = RippleURL('https://example.com/users/123?tab=profile');
8
- let &[userId] = track(() => url.pathname.split('/').pop());
9
- let &[activeTab] = track(() => url.searchParams.get('tab'));
5
+ function URLTest() @{
6
+ const url = RippleURL('https://example.com/users/123?tab=profile');
7
+ let &[userId] = track(() => url.pathname.split('/').pop());
8
+ let &[activeTab] = track(() => url.searchParams.get('tab'));
9
+ <>
10
10
  <button onClick={() => (url.pathname = '/users/456')}>{'Change User'}</button>
11
11
  <button onClick={() => url.searchParams.set('tab', 'settings')}>{'Change Tab'}</button>
12
12
  <pre>{`User ID: ${userId}`}</pre>
13
13
  <pre>{`Active Tab: ${activeTab}`}</pre>
14
- </>;
14
+ </>
15
15
  }
16
16
 
17
17
  render(URLTest);
@@ -39,33 +39,29 @@ describe('RippleURL > derived', () => {
39
39
  });
40
40
 
41
41
  it('maintains reactivity across multiple components', () => {
42
- function ParentTest() {
43
- return <>
44
- const url = RippleURL('https://example.com/path?count=0');
42
+ function ParentTest() @{
43
+ const url = RippleURL('https://example.com/path?count=0');
44
+ <>
45
45
  <ChildA {url} />
46
46
  <ChildB {url} />
47
- </>;
47
+ </>
48
48
  }
49
49
 
50
- function ChildA({ url }: { url: RippleURL }) {
51
- return <>
52
- <button
53
- onClick={() => {
54
- const current = parseInt(url.searchParams.get('count') || '0', 10);
55
- url.searchParams.set('count', String(current + 1));
56
- }}
57
- >
58
- {'Increment Count'}
59
- </button>
60
- </>;
50
+ function ChildA({ url }: { url: RippleURL }) @{
51
+ <button
52
+ onClick={() => {
53
+ const current = parseInt(url.searchParams.get('count') || '0', 10);
54
+ url.searchParams.set('count', String(current + 1));
55
+ }}
56
+ >{'Increment Count'}</button>
61
57
  }
62
58
 
63
- function ChildB({ url }: { url: RippleURL }) {
64
- return <>
65
- let &[count] = track(() => url.searchParams.get('count'));
59
+ function ChildB({ url }: { url: RippleURL }) @{
60
+ let &[count] = track(() => url.searchParams.get('count'));
61
+ <>
66
62
  <pre>{url.href}</pre>
67
63
  <pre>{count}</pre>
68
- </>;
64
+ </>
69
65
  }
70
66
 
71
67
  render(ParentTest);
@@ -2,9 +2,9 @@ import { RippleURL, flushSync } from 'ripple';
2
2
 
3
3
  describe('RippleURL > parsing', () => {
4
4
  it('creates URL from string with reactivity', () => {
5
- function URLTest() {
6
- return <>
7
- const url = RippleURL('https://example.com:8080/path?foo=bar#section');
5
+ function URLTest() @{
6
+ const url = RippleURL('https://example.com:8080/path?foo=bar#section');
7
+ <>
8
8
  <pre>{url.href}</pre>
9
9
  <pre>{url.protocol}</pre>
10
10
  <pre>{url.hostname}</pre>
@@ -12,7 +12,7 @@ describe('RippleURL > parsing', () => {
12
12
  <pre>{url.pathname}</pre>
13
13
  <pre>{url.search}</pre>
14
14
  <pre>{url.hash}</pre>
15
- </>;
15
+ </>
16
16
  }
17
17
 
18
18
  render(URLTest);
@@ -29,12 +29,12 @@ describe('RippleURL > parsing', () => {
29
29
  });
30
30
 
31
31
  it('creates URL from string with base URL', () => {
32
- function URLTest() {
33
- return <>
34
- const url = RippleURL('/path?query=value', 'https://example.com');
32
+ function URLTest() @{
33
+ const url = RippleURL('/path?query=value', 'https://example.com');
34
+ <>
35
35
  <pre>{url.href}</pre>
36
36
  <pre>{url.origin}</pre>
37
- </>;
37
+ </>
38
38
  }
39
39
 
40
40
  render(URLTest);
@@ -46,13 +46,13 @@ describe('RippleURL > parsing', () => {
46
46
  });
47
47
 
48
48
  it('handles URL encoding correctly', () => {
49
- function URLTest() {
50
- return <>
51
- const url = RippleURL('https://example.com/path with spaces?key=value with spaces');
49
+ function URLTest() @{
50
+ const url = RippleURL('https://example.com/path with spaces?key=value with spaces');
51
+ <>
52
52
  <pre>{url.pathname}</pre>
53
53
  <pre>{url.search}</pre>
54
54
  <pre>{url.href}</pre>
55
- </>;
55
+ </>
56
56
  }
57
57
 
58
58
  render(URLTest);
@@ -65,13 +65,13 @@ describe('RippleURL > parsing', () => {
65
65
  });
66
66
 
67
67
  it('handles URL with file protocol', () => {
68
- function URLTest() {
69
- return <>
70
- const url = RippleURL('file:///Users/username/documents/file.txt');
68
+ function URLTest() @{
69
+ const url = RippleURL('file:///Users/username/documents/file.txt');
70
+ <>
71
71
  <pre>{url.protocol}</pre>
72
72
  <pre>{url.pathname}</pre>
73
73
  <pre>{url.href}</pre>
74
- </>;
74
+ </>
75
75
  }
76
76
 
77
77
  render(URLTest);
@@ -86,13 +86,13 @@ describe('RippleURL > parsing', () => {
86
86
  });
87
87
 
88
88
  it('handles URL with IPv4 address', () => {
89
- function URLTest() {
90
- return <>
91
- const url = RippleURL('https://192.168.1.1:8080/path');
89
+ function URLTest() @{
90
+ const url = RippleURL('https://192.168.1.1:8080/path');
91
+ <>
92
92
  <button onClick={() => (url.hostname = '10.0.0.1')}>{'Change IP'}</button>
93
93
  <pre>{url.href}</pre>
94
94
  <pre>{url.hostname}</pre>
95
- </>;
95
+ </>
96
96
  }
97
97
 
98
98
  render(URLTest);
@@ -112,14 +112,14 @@ describe('RippleURL > parsing', () => {
112
112
  });
113
113
 
114
114
  it('handles URL with localhost', () => {
115
- function URLTest() {
116
- return <>
117
- const url = RippleURL('http://localhost:3000/api/data');
115
+ function URLTest() @{
116
+ const url = RippleURL('http://localhost:3000/api/data');
117
+ <>
118
118
  <button onClick={() => (url.port = '8080')}>{'Change Port'}</button>
119
119
  <pre>{url.href}</pre>
120
120
  <pre>{url.hostname}</pre>
121
121
  <pre>{url.port}</pre>
122
- </>;
122
+ </>
123
123
  }
124
124
 
125
125
  render(URLTest);
@@ -141,15 +141,15 @@ describe('RippleURL > parsing', () => {
141
141
  });
142
142
 
143
143
  it('handles URL with multiple path segments', () => {
144
- function URLTest() {
145
- return <>
146
- const url = RippleURL('https://example.com/api/v1/users/123/profile');
147
- <button onClick={() => (url.pathname = '/api/v2/users/456/settings')}>
148
- {'Change Path'}
149
- </button>
144
+ function URLTest() @{
145
+ const url = RippleURL('https://example.com/api/v1/users/123/profile');
146
+ <>
147
+ <button
148
+ onClick={() => (url.pathname = '/api/v2/users/456/settings')}
149
+ >{'Change Path'}</button>
150
150
  <pre>{url.pathname}</pre>
151
151
  <pre>{url.href}</pre>
152
- </>;
152
+ </>
153
153
  }
154
154
 
155
155
  render(URLTest);
@@ -173,12 +173,12 @@ describe('RippleURL > parsing', () => {
173
173
  });
174
174
 
175
175
  it('handles relative URL paths correctly', () => {
176
- function URLTest() {
177
- return <>
178
- const url = RippleURL('../sibling/path', 'https://example.com/parent/current');
176
+ function URLTest() @{
177
+ const url = RippleURL('../sibling/path', 'https://example.com/parent/current');
178
+ <>
179
179
  <pre>{url.href}</pre>
180
180
  <pre>{url.pathname}</pre>
181
- </>;
181
+ </>
182
182
  }
183
183
 
184
184
  render(URLTest);