ripple 0.2.216 → 0.3.0

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 (155) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/package.json +16 -7
  3. package/src/compiler/errors.js +1 -1
  4. package/src/compiler/identifier-utils.js +2 -0
  5. package/src/compiler/index.d.ts +2 -6
  6. package/src/compiler/phases/1-parse/index.js +171 -233
  7. package/src/compiler/phases/2-analyze/index.js +192 -16
  8. package/src/compiler/phases/2-analyze/prune.js +2 -2
  9. package/src/compiler/phases/3-transform/client/index.js +308 -91
  10. package/src/compiler/phases/3-transform/segments.js +43 -15
  11. package/src/compiler/phases/3-transform/server/index.js +71 -21
  12. package/src/compiler/scope.js +31 -12
  13. package/src/compiler/source-map-utils.js +4 -6
  14. package/src/compiler/types/acorn.d.ts +11 -0
  15. package/src/compiler/types/estree-jsx.d.ts +11 -0
  16. package/src/compiler/types/estree.d.ts +11 -0
  17. package/src/compiler/types/import.d.ts +32 -18
  18. package/src/compiler/types/index.d.ts +75 -23
  19. package/src/compiler/types/parse.d.ts +7 -10
  20. package/src/compiler/utils.js +48 -0
  21. package/src/runtime/array.js +53 -22
  22. package/src/runtime/date.js +15 -5
  23. package/src/runtime/index-client.js +41 -7
  24. package/src/runtime/index-server.js +7 -7
  25. package/src/runtime/internal/client/bindings.js +2 -2
  26. package/src/runtime/internal/client/blocks.js +40 -1
  27. package/src/runtime/internal/client/context.js +8 -0
  28. package/src/runtime/internal/client/for.js +3 -3
  29. package/src/runtime/internal/client/index.js +32 -5
  30. package/src/runtime/internal/client/render.js +20 -8
  31. package/src/runtime/internal/client/runtime.js +9 -7
  32. package/src/runtime/internal/client/try.js +15 -22
  33. package/src/runtime/internal/client/utils.js +1 -1
  34. package/src/runtime/internal/server/context.js +8 -0
  35. package/src/runtime/internal/server/index.js +99 -6
  36. package/src/runtime/map.js +7 -7
  37. package/src/runtime/media-query.js +10 -1
  38. package/src/runtime/object.js +6 -6
  39. package/src/runtime/proxy.js +6 -6
  40. package/src/runtime/set.js +11 -11
  41. package/src/runtime/url-search-params.js +13 -2
  42. package/src/runtime/url.js +15 -5
  43. package/src/utils/builders.js +13 -3
  44. package/tests/client/array/array.copy-within.test.ripple +11 -11
  45. package/tests/client/array/array.derived.test.ripple +42 -42
  46. package/tests/client/array/array.iteration.test.ripple +12 -12
  47. package/tests/client/array/array.mutations.test.ripple +25 -25
  48. package/tests/client/array/array.static.test.ripple +103 -106
  49. package/tests/client/array/array.to-methods.test.ripple +8 -8
  50. package/tests/client/async-suspend.test.ripple +94 -0
  51. package/tests/client/basic/basic.attributes.test.ripple +31 -31
  52. package/tests/client/basic/basic.collections.test.ripple +7 -7
  53. package/tests/client/basic/basic.components.test.ripple +48 -10
  54. package/tests/client/basic/basic.errors.test.ripple +46 -31
  55. package/tests/client/basic/basic.events.test.ripple +11 -11
  56. package/tests/client/basic/basic.get-set.test.ripple +18 -18
  57. package/tests/client/basic/basic.reactivity.test.ripple +47 -42
  58. package/tests/client/basic/basic.rendering.test.ripple +7 -7
  59. package/tests/client/basic/basic.utilities.test.ripple +4 -4
  60. package/tests/client/boundaries.test.ripple +7 -7
  61. package/tests/client/compiler/__snapshots__/compiler.assignments.test.ripple.snap +2 -2
  62. package/tests/client/compiler/compiler.assignments.test.ripple +21 -21
  63. package/tests/client/compiler/compiler.basic.test.ripple +223 -82
  64. package/tests/client/compiler/compiler.tracked-access.test.ripple +8 -9
  65. package/tests/client/composite/composite.dynamic-components.test.ripple +8 -8
  66. package/tests/client/composite/composite.generics.test.ripple +4 -4
  67. package/tests/client/composite/composite.props.test.ripple +9 -9
  68. package/tests/client/composite/composite.reactivity.test.ripple +32 -26
  69. package/tests/client/composite/composite.render.test.ripple +13 -4
  70. package/tests/client/computed-properties.test.ripple +3 -3
  71. package/tests/client/context.test.ripple +3 -3
  72. package/tests/client/css/global-additional-cases.test.ripple +4 -4
  73. package/tests/client/css/style-identifier.test.ripple +49 -41
  74. package/tests/client/date.test.ripple +40 -40
  75. package/tests/client/dynamic-elements.test.ripple +165 -30
  76. package/tests/client/events.test.ripple +25 -25
  77. package/tests/client/for.test.ripple +76 -8
  78. package/tests/client/function-overload.test.ripple +0 -1
  79. package/tests/client/head.test.ripple +7 -7
  80. package/tests/client/html.test.ripple +2 -2
  81. package/tests/client/input-value.test.ripple +174 -176
  82. package/tests/client/map.test.ripple +21 -21
  83. package/tests/client/media-query.test.ripple +4 -4
  84. package/tests/client/object.test.ripple +12 -12
  85. package/tests/client/portal.test.ripple +4 -4
  86. package/tests/client/ref.test.ripple +5 -5
  87. package/tests/client/return.test.ripple +17 -17
  88. package/tests/client/set.test.ripple +16 -16
  89. package/tests/client/svg.test.ripple +6 -7
  90. package/tests/client/switch.test.ripple +10 -10
  91. package/tests/client/tracked-expression.test.ripple +1 -3
  92. package/tests/client/try.test.ripple +33 -4
  93. package/tests/client/url/url.derived.test.ripple +10 -9
  94. package/tests/client/url/url.parsing.test.ripple +10 -10
  95. package/tests/client/url/url.partial-removal.test.ripple +10 -10
  96. package/tests/client/url/url.reactivity.test.ripple +17 -17
  97. package/tests/client/url/url.serialization.test.ripple +4 -4
  98. package/tests/client/url-search-params/url-search-params.derived.test.ripple +11 -10
  99. package/tests/client/url-search-params/url-search-params.initialization.test.ripple +5 -7
  100. package/tests/client/url-search-params/url-search-params.iteration.test.ripple +13 -13
  101. package/tests/client/url-search-params/url-search-params.mutation.test.ripple +19 -19
  102. package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +17 -17
  103. package/tests/client/url-search-params/url-search-params.serialization.test.ripple +5 -5
  104. package/tests/client/url-search-params/url-search-params.tracked-url.test.ripple +5 -5
  105. package/tests/hydration/compiled/client/events.js +8 -11
  106. package/tests/hydration/compiled/client/for.js +20 -23
  107. package/tests/hydration/compiled/client/head.js +17 -19
  108. package/tests/hydration/compiled/client/hmr.js +1 -3
  109. package/tests/hydration/compiled/client/html.js +1 -15
  110. package/tests/hydration/compiled/client/if-children.js +7 -9
  111. package/tests/hydration/compiled/client/if.js +5 -7
  112. package/tests/hydration/compiled/client/mixed-control-flow.js +3 -5
  113. package/tests/hydration/compiled/client/portal.js +1 -1
  114. package/tests/hydration/compiled/client/reactivity.js +9 -11
  115. package/tests/hydration/compiled/client/return.js +11 -13
  116. package/tests/hydration/compiled/client/switch.js +4 -6
  117. package/tests/hydration/compiled/server/basic.js +0 -1
  118. package/tests/hydration/compiled/server/composite.js +0 -3
  119. package/tests/hydration/compiled/server/events.js +8 -12
  120. package/tests/hydration/compiled/server/for.js +20 -23
  121. package/tests/hydration/compiled/server/head.js +17 -19
  122. package/tests/hydration/compiled/server/hmr.js +1 -4
  123. package/tests/hydration/compiled/server/html.js +1 -35
  124. package/tests/hydration/compiled/server/if-children.js +7 -11
  125. package/tests/hydration/compiled/server/if.js +5 -7
  126. package/tests/hydration/compiled/server/mixed-control-flow.js +3 -5
  127. package/tests/hydration/compiled/server/portal.js +1 -9
  128. package/tests/hydration/compiled/server/reactivity.js +9 -11
  129. package/tests/hydration/compiled/server/return.js +11 -13
  130. package/tests/hydration/compiled/server/switch.js +4 -6
  131. package/tests/hydration/components/events.ripple +8 -9
  132. package/tests/hydration/components/for.ripple +20 -21
  133. package/tests/hydration/components/head.ripple +6 -8
  134. package/tests/hydration/components/hmr.ripple +1 -2
  135. package/tests/hydration/components/html.ripple +1 -3
  136. package/tests/hydration/components/if-children.ripple +7 -8
  137. package/tests/hydration/components/if.ripple +5 -6
  138. package/tests/hydration/components/mixed-control-flow.ripple +4 -6
  139. package/tests/hydration/components/portal.ripple +1 -1
  140. package/tests/hydration/components/reactivity.ripple +9 -10
  141. package/tests/hydration/components/return.ripple +11 -12
  142. package/tests/hydration/components/switch.ripple +6 -8
  143. package/tests/server/await.test.ripple +2 -2
  144. package/tests/server/basic.attributes.test.ripple +19 -21
  145. package/tests/server/basic.components.test.ripple +13 -7
  146. package/tests/server/basic.test.ripple +20 -21
  147. package/tests/server/compiler.test.ripple +5 -5
  148. package/tests/server/composite.props.test.ripple +6 -7
  149. package/tests/server/composite.test.ripple +4 -4
  150. package/tests/server/context.test.ripple +1 -3
  151. package/tests/server/dynamic-elements.test.ripple +24 -24
  152. package/tests/server/head.test.ripple +5 -7
  153. package/tests/server/style-identifier.test.ripple +16 -17
  154. package/types/index.d.ts +266 -62
  155. package/types/server.d.ts +6 -6
@@ -1,14 +1,14 @@
1
- import { get, set, safe_scope, tracked } from './internal/client/runtime.js';
2
- import { REPLACE, TrackedURLSearchParams } from './url-search-params.js';
1
+ import { get, set, safe_scope, tracked, with_scope } from './internal/client/runtime.js';
2
+ import { REPLACE, RippleURLSearchParams } from './url-search-params.js';
3
3
 
4
- /** @type {TrackedURL | null} */
4
+ /** @type {RippleURL | null} */
5
5
  let current_url = null;
6
6
 
7
7
  export function get_current_url() {
8
8
  return current_url;
9
9
  }
10
10
 
11
- export class TrackedURL extends URL {
11
+ export class RippleURL extends URL {
12
12
  #block = safe_scope();
13
13
  #protocol = tracked(super.protocol, this.#block);
14
14
  #username = tracked(super.username, this.#block);
@@ -29,7 +29,7 @@ export class TrackedURL extends URL {
29
29
  super(url);
30
30
 
31
31
  current_url = this;
32
- this.#searchParams = new TrackedURLSearchParams(url.searchParams);
32
+ this.#searchParams = new RippleURLSearchParams(url.searchParams);
33
33
  current_url = null;
34
34
  }
35
35
 
@@ -162,3 +162,13 @@ export class TrackedURL extends URL {
162
162
  return this.href;
163
163
  }
164
164
  }
165
+
166
+ /**
167
+ * @param {import('#client').Block} block
168
+ * @param {string | URL} url
169
+ * @param {string | URL} [base]
170
+ * @returns {RippleURL}
171
+ */
172
+ export function ripple_url(block, url, base) {
173
+ return with_scope(block, () => new RippleURL(url, base));
174
+ }
@@ -325,7 +325,13 @@ export function get(name, body) {
325
325
  */
326
326
  export function id(name, loc_info) {
327
327
  /** @type {AST.Identifier} */
328
- const node = { type: 'Identifier', name, metadata: { path: [] } };
328
+ const node = {
329
+ type: 'Identifier',
330
+ name,
331
+ optional: false,
332
+ decorators: [],
333
+ metadata: { path: [] },
334
+ };
329
335
 
330
336
  return set_location(node, loc_info);
331
337
  }
@@ -414,10 +420,14 @@ export function member_id(path) {
414
420
 
415
421
  /**
416
422
  * @param {Array<AST.Property | AST.SpreadElement>} properties
423
+ * @param {AST.NodeWithLocation} [loc_info]
417
424
  * @returns {AST.ObjectExpression}
418
425
  */
419
- export function object(properties) {
420
- return { type: 'ObjectExpression', properties, metadata: { path: [] } };
426
+ export function object(properties, loc_info) {
427
+ /** @type {AST.ObjectExpression} */
428
+ const node = { type: 'ObjectExpression', properties, metadata: { path: [] } };
429
+
430
+ return set_location(node, loc_info);
421
431
  }
422
432
 
423
433
  /**
@@ -1,12 +1,12 @@
1
- import { track, flushSync, TrackedArray } from 'ripple';
1
+ import { flushSync, RippleArray } from 'ripple';
2
2
 
3
- describe('TrackedArray copyWithin', () => {
3
+ describe('RippleArray copyWithin', () => {
4
4
  it('handles copyWithin operation with reactivity', () => {
5
5
  component ArrayTest() {
6
- let items = new TrackedArray(1, 2, 3, 4, 5);
7
- let firstItem = track(() => items[0]);
8
- let thirdItem = track(() => items[2]);
9
- let fourthItem = track(() => items[3]);
6
+ let items = new RippleArray(1, 2, 3, 4, 5);
7
+ let firstItem = #ripple.track(() => items[0]);
8
+ let thirdItem = #ripple.track(() => items[2]);
9
+ let fourthItem = #ripple.track(() => items[3]);
10
10
 
11
11
  <button onClick={() => items.copyWithin(0, 3)}>{'copy end to start'}</button>
12
12
  <button onClick={() => items.copyWithin(2, 0, 2)}>{'copy start to middle'}</button>
@@ -48,9 +48,9 @@ describe('TrackedArray copyWithin', () => {
48
48
 
49
49
  it('handles copyWithin with negative indexes and reactivity', () => {
50
50
  component ArrayTest() {
51
- let items = new TrackedArray(1, 2, 3, 4, 5);
52
- let secondItem = track(() => items[1]);
53
- let thirdItem = track(() => items[2]);
51
+ let items = new RippleArray(1, 2, 3, 4, 5);
52
+ let secondItem = #ripple.track(() => items[1]);
53
+ let thirdItem = #ripple.track(() => items[2]);
54
54
 
55
55
  <button onClick={() => items.copyWithin(-4, -2)}>{'copy with negative indexes'}</button>
56
56
  <pre>{JSON.stringify(items)}</pre>
@@ -79,8 +79,8 @@ describe('TrackedArray copyWithin', () => {
79
79
 
80
80
  it('handles copyWithin with overlapping ranges', () => {
81
81
  component ArrayTest() {
82
- let items = new TrackedArray(1, 2, 3, 4, 5);
83
- let entries = track(() => Array.from(items.entries()));
82
+ let items = new RippleArray(1, 2, 3, 4, 5);
83
+ let entries = #ripple.track(() => Array.from(items.entries()));
84
84
 
85
85
  <button onClick={() => items.copyWithin(2, 1, 4)}>{'copy with overlap'}</button>
86
86
  <pre>{JSON.stringify(items)}</pre>
@@ -1,13 +1,13 @@
1
- import { flushSync, track, TrackedArray } from 'ripple';
1
+ import { flushSync, RippleArray } from 'ripple';
2
2
 
3
- describe('TrackedArray > derived', () => {
3
+ describe('RippleArray > derived', () => {
4
4
  it('handles array methods that return values (map, filter, etc.)', () => {
5
5
  component ArrayTest() {
6
- let items = new TrackedArray(1, 2, 3, 4, 5);
7
- let doubled = track(() => items.map((x) => x * 2));
8
- let filtered = track(() => items.filter((x) => x % 2 === 0));
9
- let reduced = track(() => items.reduce((acc, val) => acc + val, 0));
10
- let includes = track(() => items.includes(3));
6
+ let items = new RippleArray(1, 2, 3, 4, 5);
7
+ let doubled = #ripple.track(() => items.map((x) => x * 2));
8
+ let filtered = #ripple.track(() => items.filter((x) => x % 2 === 0));
9
+ let reduced = #ripple.track(() => items.reduce((acc, val) => acc + val, 0));
10
+ let includes = #ripple.track(() => items.includes(3));
11
11
 
12
12
  <button onClick={() => items.push(6)}>{'add item'}</button>
13
13
  <pre>{JSON.stringify(@doubled)}</pre>
@@ -38,8 +38,8 @@ describe('TrackedArray > derived', () => {
38
38
 
39
39
  it('handles concat method with reactivity', () => {
40
40
  component ArrayTest() {
41
- let items = new TrackedArray(1, 2, 3);
42
- let concatenated = track(() => items.concat([4, 5], 6, [7, 8]));
41
+ let items = new RippleArray(1, 2, 3);
42
+ let concatenated = #ripple.track(() => items.concat([4, 5], 6, [7, 8]));
43
43
 
44
44
  <button onClick={() => items.push(3.5)}>{'add to original'}</button>
45
45
  <pre>{JSON.stringify(items)}</pre>
@@ -64,8 +64,8 @@ describe('TrackedArray > derived', () => {
64
64
 
65
65
  it('handles array slice method with reactivity', () => {
66
66
  component ArrayTest() {
67
- let items = new TrackedArray(1, 2, 3, 4, 5);
68
- let sliced = track(() => items.slice(1, 4));
67
+ let items = new RippleArray(1, 2, 3, 4, 5);
68
+ let sliced = #ripple.track(() => items.slice(1, 4));
69
69
 
70
70
  <button onClick={() => (items[2] = 30)}>{'change middle'}</button>
71
71
  <pre>{JSON.stringify(items)}</pre>
@@ -90,9 +90,9 @@ describe('TrackedArray > derived', () => {
90
90
 
91
91
  it('handles find and findIndex methods with reactivity', () => {
92
92
  component ArrayTest() {
93
- let items = new TrackedArray(5, 10, 15, 20, 25);
94
- let found = track(() => items.find((x) => x > 12));
95
- let foundIndex = track(() => items.findIndex((x) => x > 12));
93
+ let items = new RippleArray(5, 10, 15, 20, 25);
94
+ let found = #ripple.track(() => items.find((x) => x > 12));
95
+ let foundIndex = #ripple.track(() => items.findIndex((x) => x > 12));
96
96
 
97
97
  <button
98
98
  onClick={() => {
@@ -124,9 +124,9 @@ describe('TrackedArray > derived', () => {
124
124
 
125
125
  it('handles findLast and findLastIndex methods with reactivity', () => {
126
126
  component ArrayTest() {
127
- let items = new TrackedArray(5, 15, 10, 20, 15);
128
- let foundLast = track(() => items.findLast((x) => x === 15));
129
- let foundLastIndex = track(() => items.findLastIndex((x) => x === 15));
127
+ let items = new RippleArray(5, 15, 10, 20, 15);
128
+ let foundLast = #ripple.track(() => items.findLast((x) => x === 15));
129
+ let foundLastIndex = #ripple.track(() => items.findLastIndex((x) => x === 15));
130
130
 
131
131
  <button
132
132
  onClick={() => {
@@ -158,8 +158,8 @@ describe('TrackedArray > derived', () => {
158
158
 
159
159
  it('handles every method with reactivity', () => {
160
160
  component ArrayTest() {
161
- let items = new TrackedArray(2, 4, 6, 8);
162
- let allEven = track(() => items.every((x) => x % 2 === 0));
161
+ let items = new RippleArray(2, 4, 6, 8);
162
+ let allEven = #ripple.track(() => items.every((x) => x % 2 === 0));
163
163
 
164
164
  <button onClick={() => items.push(3)}>{'add odd'}</button>
165
165
  <button
@@ -194,8 +194,8 @@ describe('TrackedArray > derived', () => {
194
194
 
195
195
  it('handles flat method with reactivity', () => {
196
196
  component ArrayTest() {
197
- let items = new TrackedArray<number | number[]>([1, 2], [3, 4], 5);
198
- let flattened = track(() => items.flat());
197
+ let items = new RippleArray<number | number[]>([1, 2], [3, 4], 5);
198
+ let flattened = #ripple.track(() => items.flat());
199
199
 
200
200
  <button onClick={() => (items[0] = [6, 7, 8])}>{'change nested'}</button>
201
201
  <pre>{JSON.stringify(items)}</pre>
@@ -220,8 +220,8 @@ describe('TrackedArray > derived', () => {
220
220
 
221
221
  it('handles flatMap method with reactivity', () => {
222
222
  component ArrayTest() {
223
- let items = new TrackedArray(1, 2, 3);
224
- let flatMapped = track(() => items.flatMap((x) => [x, x * 2]));
223
+ let items = new RippleArray(1, 2, 3);
224
+ let flatMapped = #ripple.track(() => items.flatMap((x) => [x, x * 2]));
225
225
 
226
226
  <button onClick={() => items.push(4)}>{'add item'}</button>
227
227
  <pre>{JSON.stringify(items)}</pre>
@@ -246,8 +246,8 @@ describe('TrackedArray > derived', () => {
246
246
 
247
247
  it('handles join method with reactivity', () => {
248
248
  component ArrayTest() {
249
- let items = new TrackedArray('apple', 'banana', 'cherry');
250
- let joined = track(() => items.join(', '));
249
+ let items = new RippleArray('apple', 'banana', 'cherry');
250
+ let joined = #ripple.track(() => items.join(', '));
251
251
 
252
252
  <button onClick={() => items.push('date')}>{'add item'}</button>
253
253
  <pre>{JSON.stringify(items)}</pre>
@@ -274,8 +274,8 @@ describe('TrackedArray > derived', () => {
274
274
 
275
275
  it('handles lastIndexOf method with reactivity', () => {
276
276
  component ArrayTest() {
277
- let items = new TrackedArray(1, 2, 3, 2, 1);
278
- let lastIndex = track(() => items.lastIndexOf(2));
277
+ let items = new RippleArray(1, 2, 3, 2, 1);
278
+ let lastIndex = #ripple.track(() => items.lastIndexOf(2));
279
279
 
280
280
  <button
281
281
  onClick={() => {
@@ -306,8 +306,8 @@ describe('TrackedArray > derived', () => {
306
306
 
307
307
  it('handles reduceRight method with reactivity', () => {
308
308
  component ArrayTest() {
309
- let items = new TrackedArray('a', 'b', 'c');
310
- let reduced = track(() => items.reduceRight((acc, val) => acc + val, ''));
309
+ let items = new RippleArray('a', 'b', 'c');
310
+ let reduced = #ripple.track(() => items.reduceRight((acc, val) => acc + val, ''));
311
311
 
312
312
  <button onClick={() => items.push('d')}>{'add item'}</button>
313
313
  <pre>{JSON.stringify(items)}</pre>
@@ -332,8 +332,8 @@ describe('TrackedArray > derived', () => {
332
332
 
333
333
  it('handles some method with reactivity', () => {
334
334
  component ArrayTest() {
335
- let items = new TrackedArray(1, 3, 5, 7);
336
- let hasEven = track(() => items.some((x) => x % 2 === 0));
335
+ let items = new RippleArray(1, 3, 5, 7);
336
+ let hasEven = #ripple.track(() => items.some((x) => x % 2 === 0));
337
337
 
338
338
  <button onClick={() => items.push(2)}>{'add even'}</button>
339
339
  <button
@@ -368,8 +368,8 @@ describe('TrackedArray > derived', () => {
368
368
 
369
369
  it('handles toLocaleString method with reactivity', () => {
370
370
  component ArrayTest() {
371
- let items = new TrackedArray(1000, 2000, 3000);
372
- let localized = track(() => items.toLocaleString('en-US'));
371
+ let items = new RippleArray(1000, 2000, 3000);
372
+ let localized = #ripple.track(() => items.toLocaleString('en-US'));
373
373
 
374
374
  <button
375
375
  onClick={() => {
@@ -400,8 +400,8 @@ describe('TrackedArray > derived', () => {
400
400
 
401
401
  it('handles toString method with reactivity', () => {
402
402
  component ArrayTest() {
403
- let items = new TrackedArray(1, 2, 3);
404
- let string = track(() => items.toString());
403
+ let items = new RippleArray(1, 2, 3);
404
+ let string = #ripple.track(() => items.toString());
405
405
 
406
406
  <button onClick={() => items.push(4)}>{'add item'}</button>
407
407
  <pre>{JSON.stringify(items)}</pre>
@@ -430,8 +430,8 @@ describe('TrackedArray > derived', () => {
430
430
  }
431
431
 
432
432
  component ArrayTest() {
433
- let items = new TrackedArray(1, 2, 3, 4);
434
- let withReplaced = track(() => items.with(2, 30));
433
+ let items = new RippleArray(1, 2, 3, 4);
434
+ let withReplaced = #ripple.track(() => items.with(2, 30));
435
435
 
436
436
  <button onClick={() => (items[2] = 50)}>{'change original'}</button>
437
437
  <pre>{JSON.stringify(items)}</pre>
@@ -456,7 +456,7 @@ describe('TrackedArray > derived', () => {
456
456
 
457
457
  it('handles toJSON method', () => {
458
458
  component ArrayTest() {
459
- let items = new TrackedArray(1, 2, 3);
459
+ let items = new RippleArray(1, 2, 3);
460
460
 
461
461
  <button onClick={() => items.push(4)}>{'add'}</button>
462
462
  <pre>{JSON.stringify(items)}</pre>
@@ -478,10 +478,10 @@ describe('TrackedArray > derived', () => {
478
478
 
479
479
  it('handles at method with reactivity', () => {
480
480
  component ArrayTest() {
481
- let items = new TrackedArray(10, 20, 30, 40, 50);
482
- let atIndex2 = track(() => items.at(2));
483
- let atNegative1 = track(() => items.at(-1));
484
- let atNegative2 = track(() => items.at(-2));
481
+ let items = new RippleArray(10, 20, 30, 40, 50);
482
+ let atIndex2 = #ripple.track(() => items.at(2));
483
+ let atNegative1 = #ripple.track(() => items.at(-1));
484
+ let atNegative2 = #ripple.track(() => items.at(-2));
485
485
 
486
486
  <button onClick={() => (items[2] = 300)}>{'change index 2'}</button>
487
487
  <button onClick={() => (items[items.length - 1] = 500)}>{'change last'}</button>
@@ -1,10 +1,10 @@
1
- import { flushSync, track, effect, untrack, TrackedArray } from 'ripple';
1
+ import { flushSync, RippleArray } from 'ripple';
2
2
 
3
- describe('TrackedArray > iteration', () => {
3
+ describe('RippleArray > iteration', () => {
4
4
  it('handles entries method with reactivity', () => {
5
5
  component ArrayTest() {
6
- let items = new TrackedArray('a', 'b', 'c');
7
- let entries = track(() => Array.from(items.entries()));
6
+ let items = new RippleArray('a', 'b', 'c');
7
+ let entries = #ripple.track(() => Array.from(items.entries()));
8
8
 
9
9
  <button onClick={() => items.push('d')}>{'add item'}</button>
10
10
  <pre>{JSON.stringify(items)}</pre>
@@ -31,8 +31,8 @@ describe('TrackedArray > iteration', () => {
31
31
 
32
32
  it('handles keys method with reactivity', () => {
33
33
  component ArrayTest() {
34
- let items = new TrackedArray('a', 'b', 'c');
35
- let keys = track(() => Array.from(items.keys()));
34
+ let items = new RippleArray('a', 'b', 'c');
35
+ let keys = #ripple.track(() => Array.from(items.keys()));
36
36
 
37
37
  <button onClick={() => items.push('d')}>{'add item'}</button>
38
38
  <pre>{JSON.stringify(items)}</pre>
@@ -57,8 +57,8 @@ describe('TrackedArray > iteration', () => {
57
57
 
58
58
  it('handles values method with reactivity', () => {
59
59
  component ArrayTest() {
60
- let items = new TrackedArray('a', 'b', 'c');
61
- let values = track(() => Array.from(items.values()));
60
+ let items = new RippleArray('a', 'b', 'c');
61
+ let values = #ripple.track(() => Array.from(items.values()));
62
62
 
63
63
  <button onClick={() => items.push('d')}>{'add item'}</button>
64
64
  <pre>{JSON.stringify(items)}</pre>
@@ -83,13 +83,13 @@ describe('TrackedArray > iteration', () => {
83
83
 
84
84
  it('handles Symbol.iterator with reactivity', () => {
85
85
  component ArrayTest() {
86
- let items = new TrackedArray(1, 2, 3);
87
- let sum = track(0);
86
+ let items = new RippleArray(1, 2, 3);
87
+ let sum = #ripple.track(0);
88
88
 
89
- effect(() => {
89
+ #ripple.effect(() => {
90
90
  @sum = 0;
91
91
  for (const item of items) {
92
- untrack(() => {
92
+ #ripple.untrack(() => {
93
93
  @sum += item;
94
94
  });
95
95
  }
@@ -1,16 +1,16 @@
1
- import { flushSync, track, TrackedArray } from 'ripple';
1
+ import { flushSync, RippleArray } from 'ripple';
2
2
 
3
- describe('TrackedArray > mutations', () => {
3
+ describe('RippleArray > mutations', () => {
4
4
  it('handles direct assignment and length tracking', () => {
5
5
  component ArrayTest() {
6
- let items = new TrackedArray(1, 2, 3);
6
+ let items = #ripple[1, 2, 3];
7
7
 
8
8
  <button onClick={() => (items[items.length] = items.length + 1)}>{'increment'}</button>
9
9
 
10
10
  <Child {items} />
11
11
  }
12
12
 
13
- component Child({ items }: { items: TrackedArray<number> }) {
13
+ component Child({ items }: { items: RippleArray<number> }) {
14
14
  <pre>{JSON.stringify(items)}</pre>
15
15
  <pre>{items.length}</pre>
16
16
  }
@@ -34,8 +34,8 @@ describe('TrackedArray > mutations', () => {
34
34
 
35
35
  it('handles push and pop operations with reactivity', () => {
36
36
  component ArrayTest() {
37
- let items = new TrackedArray(1, 2, 3);
38
- let lastItem = track(() => items[items.length - 1]);
37
+ let items = #ripple[1, 2, 3];
38
+ let lastItem = #ripple.track(() => items[items.length - 1]);
39
39
 
40
40
  <button onClick={() => items.push(4)}>{'push'}</button>
41
41
  <button onClick={() => items.pop()}>{'pop'}</button>
@@ -73,8 +73,8 @@ describe('TrackedArray > mutations', () => {
73
73
 
74
74
  it('handles shift and unshift operations with reactivity', () => {
75
75
  component ArrayTest() {
76
- let items = new TrackedArray(2, 3, 4);
77
- let firstItem = track(() => items[0]);
76
+ let items = #ripple[2, 3, 4];
77
+ let firstItem = #ripple.track(() => items[0]);
78
78
 
79
79
  <button onClick={() => items.unshift(1)}>{'unshift'}</button>
80
80
  <button onClick={() => items.shift()}>{'shift'}</button>
@@ -112,8 +112,8 @@ describe('TrackedArray > mutations', () => {
112
112
 
113
113
  it('handles splice operation with reactivity', () => {
114
114
  component ArrayTest() {
115
- let items = new TrackedArray<number | string>(1, 2, 3, 4, 5);
116
- let middleItem = track(() => items[2]);
115
+ let items: RippleArray<number | string> = #ripple[1, 2, 3, 4, 5];
116
+ let middleItem = #ripple.track(() => items[2]);
117
117
 
118
118
  <button onClick={() => items.splice(1, 2, 'a', 'b')}>{'splice'}</button>
119
119
  <pre>{JSON.stringify(items)}</pre>
@@ -141,8 +141,8 @@ describe('TrackedArray > mutations', () => {
141
141
 
142
142
  it('handles fill operation with reactivity', () => {
143
143
  component ArrayTest() {
144
- let items = new TrackedArray(1, 2, 3, 4, 5);
145
- let secondItem = track(() => items[1]);
144
+ let items = #ripple[1, 2, 3, 4, 5];
145
+ let secondItem = #ripple.track(() => items[1]);
146
146
 
147
147
  <button onClick={() => items.fill(0, 1, 4)}>{'fill'}</button>
148
148
  <pre>{JSON.stringify(items)}</pre>
@@ -167,9 +167,9 @@ describe('TrackedArray > mutations', () => {
167
167
 
168
168
  it('handles reverse operation with reactivity', () => {
169
169
  component ArrayTest() {
170
- let items = new TrackedArray(1, 2, 3, 4, 5);
171
- let firstItem = track(() => items[0]);
172
- let lastItem = track(() => items[4]);
170
+ let items = #ripple[1, 2, 3, 4, 5];
171
+ let firstItem = #ripple.track(() => items[0]);
172
+ let lastItem = #ripple.track(() => items[4]);
173
173
 
174
174
  <button onClick={() => items.reverse()}>{'reverse'}</button>
175
175
  <pre>{JSON.stringify(items)}</pre>
@@ -197,8 +197,8 @@ describe('TrackedArray > mutations', () => {
197
197
 
198
198
  it('handles sort operation with reactivity', () => {
199
199
  component ArrayTest() {
200
- let items = new TrackedArray(5, 3, 1, 4, 2);
201
- let secondItem = track(() => items[1]);
200
+ let items = new RippleArray(5, 3, 1, 4, 2);
201
+ let secondItem = #ripple.track(() => items[1]);
202
202
 
203
203
  <button onClick={() => items.sort()}>{'sort ascending'}</button>
204
204
  <button onClick={() => items.sort((a, b) => b - a)}>{'sort descending'}</button>
@@ -232,7 +232,7 @@ describe('TrackedArray > mutations', () => {
232
232
 
233
233
  it('handles array modification through forEach()', () => {
234
234
  component ArrayTest() {
235
- let items = new TrackedArray(1, 2, 3);
235
+ let items = new RippleArray(1, 2, 3);
236
236
 
237
237
  <button onClick={() => items.forEach((item, i) => (items[i] = item * 2))}>
238
238
  {'double all'}
@@ -256,7 +256,7 @@ describe('TrackedArray > mutations', () => {
256
256
 
257
257
  it('handles array modification through iterator', () => {
258
258
  component ArrayTest() {
259
- let items = new TrackedArray(1, 2, 3);
259
+ let items = new RippleArray(1, 2, 3);
260
260
 
261
261
  <button onClick={() => items.forEach((item, i) => (items[i] = item * 2))}>
262
262
  {'double all'}
@@ -287,9 +287,9 @@ describe('TrackedArray > mutations', () => {
287
287
 
288
288
  it('handles array index access with reactivity', () => {
289
289
  component ArrayTest() {
290
- let items = new TrackedArray(10, 20, 30);
291
- let firstItem = track(() => items[0]);
292
- let secondItem = track(() => items[1]);
290
+ let items = new RippleArray(10, 20, 30);
291
+ let firstItem = #ripple.track(() => items[0]);
292
+ let secondItem = #ripple.track(() => items[1]);
293
293
 
294
294
  <button onClick={() => (items[0] = 100)}>{'change first'}</button>
295
295
  <pre>{@firstItem}</pre>
@@ -320,8 +320,8 @@ describe('TrackedArray > mutations', () => {
320
320
 
321
321
  it('handles length property for reactivity', () => {
322
322
  component ArrayTest() {
323
- let items = new TrackedArray(1, 2, 3);
324
- let length = track(() => items.length);
323
+ let items = new RippleArray(1, 2, 3);
324
+ let length = #ripple.track(() => items.length);
325
325
 
326
326
  <button onClick={() => (items.length = 5)}>{'expand'}</button>
327
327
  <button onClick={() => (items.length = 2)}>{'shrink'}</button>
@@ -355,7 +355,7 @@ describe('TrackedArray > mutations', () => {
355
355
 
356
356
  it('handles setting length property and resizing the array', () => {
357
357
  component ArrayTest() {
358
- let items = new TrackedArray(1, 2, 3, 4, 5);
358
+ let items = new RippleArray(1, 2, 3, 4, 5);
359
359
 
360
360
  <button onClick={() => (items.length = 3)}>{'truncate'}</button>
361
361
  <button onClick={() => (items.length = 7)}>{'expand'}</button>