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.
- package/CHANGELOG.md +39 -0
- package/package.json +16 -7
- package/src/compiler/errors.js +1 -1
- package/src/compiler/identifier-utils.js +2 -0
- package/src/compiler/index.d.ts +2 -6
- package/src/compiler/phases/1-parse/index.js +171 -233
- package/src/compiler/phases/2-analyze/index.js +192 -16
- package/src/compiler/phases/2-analyze/prune.js +2 -2
- package/src/compiler/phases/3-transform/client/index.js +308 -91
- package/src/compiler/phases/3-transform/segments.js +43 -15
- package/src/compiler/phases/3-transform/server/index.js +71 -21
- package/src/compiler/scope.js +31 -12
- package/src/compiler/source-map-utils.js +4 -6
- package/src/compiler/types/acorn.d.ts +11 -0
- package/src/compiler/types/estree-jsx.d.ts +11 -0
- package/src/compiler/types/estree.d.ts +11 -0
- package/src/compiler/types/import.d.ts +32 -18
- package/src/compiler/types/index.d.ts +75 -23
- package/src/compiler/types/parse.d.ts +7 -10
- package/src/compiler/utils.js +48 -0
- package/src/runtime/array.js +53 -22
- package/src/runtime/date.js +15 -5
- package/src/runtime/index-client.js +41 -7
- package/src/runtime/index-server.js +7 -7
- package/src/runtime/internal/client/bindings.js +2 -2
- package/src/runtime/internal/client/blocks.js +40 -1
- package/src/runtime/internal/client/context.js +8 -0
- package/src/runtime/internal/client/for.js +3 -3
- package/src/runtime/internal/client/index.js +32 -5
- package/src/runtime/internal/client/render.js +20 -8
- package/src/runtime/internal/client/runtime.js +9 -7
- package/src/runtime/internal/client/try.js +15 -22
- package/src/runtime/internal/client/utils.js +1 -1
- package/src/runtime/internal/server/context.js +8 -0
- package/src/runtime/internal/server/index.js +99 -6
- package/src/runtime/map.js +7 -7
- package/src/runtime/media-query.js +10 -1
- package/src/runtime/object.js +6 -6
- package/src/runtime/proxy.js +6 -6
- package/src/runtime/set.js +11 -11
- package/src/runtime/url-search-params.js +13 -2
- package/src/runtime/url.js +15 -5
- package/src/utils/builders.js +13 -3
- package/tests/client/array/array.copy-within.test.ripple +11 -11
- package/tests/client/array/array.derived.test.ripple +42 -42
- package/tests/client/array/array.iteration.test.ripple +12 -12
- package/tests/client/array/array.mutations.test.ripple +25 -25
- package/tests/client/array/array.static.test.ripple +103 -106
- package/tests/client/array/array.to-methods.test.ripple +8 -8
- package/tests/client/async-suspend.test.ripple +94 -0
- package/tests/client/basic/basic.attributes.test.ripple +31 -31
- package/tests/client/basic/basic.collections.test.ripple +7 -7
- package/tests/client/basic/basic.components.test.ripple +48 -10
- package/tests/client/basic/basic.errors.test.ripple +46 -31
- package/tests/client/basic/basic.events.test.ripple +11 -11
- package/tests/client/basic/basic.get-set.test.ripple +18 -18
- package/tests/client/basic/basic.reactivity.test.ripple +47 -42
- package/tests/client/basic/basic.rendering.test.ripple +7 -7
- package/tests/client/basic/basic.utilities.test.ripple +4 -4
- package/tests/client/boundaries.test.ripple +7 -7
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.ripple.snap +2 -2
- package/tests/client/compiler/compiler.assignments.test.ripple +21 -21
- package/tests/client/compiler/compiler.basic.test.ripple +223 -82
- package/tests/client/compiler/compiler.tracked-access.test.ripple +8 -9
- package/tests/client/composite/composite.dynamic-components.test.ripple +8 -8
- package/tests/client/composite/composite.generics.test.ripple +4 -4
- package/tests/client/composite/composite.props.test.ripple +9 -9
- package/tests/client/composite/composite.reactivity.test.ripple +32 -26
- package/tests/client/composite/composite.render.test.ripple +13 -4
- package/tests/client/computed-properties.test.ripple +3 -3
- package/tests/client/context.test.ripple +3 -3
- package/tests/client/css/global-additional-cases.test.ripple +4 -4
- package/tests/client/css/style-identifier.test.ripple +49 -41
- package/tests/client/date.test.ripple +40 -40
- package/tests/client/dynamic-elements.test.ripple +165 -30
- package/tests/client/events.test.ripple +25 -25
- package/tests/client/for.test.ripple +76 -8
- package/tests/client/function-overload.test.ripple +0 -1
- package/tests/client/head.test.ripple +7 -7
- package/tests/client/html.test.ripple +2 -2
- package/tests/client/input-value.test.ripple +174 -176
- package/tests/client/map.test.ripple +21 -21
- package/tests/client/media-query.test.ripple +4 -4
- package/tests/client/object.test.ripple +12 -12
- package/tests/client/portal.test.ripple +4 -4
- package/tests/client/ref.test.ripple +5 -5
- package/tests/client/return.test.ripple +17 -17
- package/tests/client/set.test.ripple +16 -16
- package/tests/client/svg.test.ripple +6 -7
- package/tests/client/switch.test.ripple +10 -10
- package/tests/client/tracked-expression.test.ripple +1 -3
- package/tests/client/try.test.ripple +33 -4
- package/tests/client/url/url.derived.test.ripple +10 -9
- package/tests/client/url/url.parsing.test.ripple +10 -10
- package/tests/client/url/url.partial-removal.test.ripple +10 -10
- package/tests/client/url/url.reactivity.test.ripple +17 -17
- package/tests/client/url/url.serialization.test.ripple +4 -4
- package/tests/client/url-search-params/url-search-params.derived.test.ripple +11 -10
- package/tests/client/url-search-params/url-search-params.initialization.test.ripple +5 -7
- package/tests/client/url-search-params/url-search-params.iteration.test.ripple +13 -13
- package/tests/client/url-search-params/url-search-params.mutation.test.ripple +19 -19
- package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +17 -17
- package/tests/client/url-search-params/url-search-params.serialization.test.ripple +5 -5
- package/tests/client/url-search-params/url-search-params.tracked-url.test.ripple +5 -5
- package/tests/hydration/compiled/client/events.js +8 -11
- package/tests/hydration/compiled/client/for.js +20 -23
- package/tests/hydration/compiled/client/head.js +17 -19
- package/tests/hydration/compiled/client/hmr.js +1 -3
- package/tests/hydration/compiled/client/html.js +1 -15
- package/tests/hydration/compiled/client/if-children.js +7 -9
- package/tests/hydration/compiled/client/if.js +5 -7
- package/tests/hydration/compiled/client/mixed-control-flow.js +3 -5
- package/tests/hydration/compiled/client/portal.js +1 -1
- package/tests/hydration/compiled/client/reactivity.js +9 -11
- package/tests/hydration/compiled/client/return.js +11 -13
- package/tests/hydration/compiled/client/switch.js +4 -6
- package/tests/hydration/compiled/server/basic.js +0 -1
- package/tests/hydration/compiled/server/composite.js +0 -3
- package/tests/hydration/compiled/server/events.js +8 -12
- package/tests/hydration/compiled/server/for.js +20 -23
- package/tests/hydration/compiled/server/head.js +17 -19
- package/tests/hydration/compiled/server/hmr.js +1 -4
- package/tests/hydration/compiled/server/html.js +1 -35
- package/tests/hydration/compiled/server/if-children.js +7 -11
- package/tests/hydration/compiled/server/if.js +5 -7
- package/tests/hydration/compiled/server/mixed-control-flow.js +3 -5
- package/tests/hydration/compiled/server/portal.js +1 -9
- package/tests/hydration/compiled/server/reactivity.js +9 -11
- package/tests/hydration/compiled/server/return.js +11 -13
- package/tests/hydration/compiled/server/switch.js +4 -6
- package/tests/hydration/components/events.ripple +8 -9
- package/tests/hydration/components/for.ripple +20 -21
- package/tests/hydration/components/head.ripple +6 -8
- package/tests/hydration/components/hmr.ripple +1 -2
- package/tests/hydration/components/html.ripple +1 -3
- package/tests/hydration/components/if-children.ripple +7 -8
- package/tests/hydration/components/if.ripple +5 -6
- package/tests/hydration/components/mixed-control-flow.ripple +4 -6
- package/tests/hydration/components/portal.ripple +1 -1
- package/tests/hydration/components/reactivity.ripple +9 -10
- package/tests/hydration/components/return.ripple +11 -12
- package/tests/hydration/components/switch.ripple +6 -8
- package/tests/server/await.test.ripple +2 -2
- package/tests/server/basic.attributes.test.ripple +19 -21
- package/tests/server/basic.components.test.ripple +13 -7
- package/tests/server/basic.test.ripple +20 -21
- package/tests/server/compiler.test.ripple +5 -5
- package/tests/server/composite.props.test.ripple +6 -7
- package/tests/server/composite.test.ripple +4 -4
- package/tests/server/context.test.ripple +1 -3
- package/tests/server/dynamic-elements.test.ripple +24 -24
- package/tests/server/head.test.ripple +5 -7
- package/tests/server/style-identifier.test.ripple +16 -17
- package/types/index.d.ts +266 -62
- package/types/server.d.ts +6 -6
package/src/runtime/url.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { get, set, safe_scope, tracked } from './internal/client/runtime.js';
|
|
2
|
-
import { REPLACE,
|
|
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 {
|
|
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
|
|
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
|
|
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
|
+
}
|
package/src/utils/builders.js
CHANGED
|
@@ -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 = {
|
|
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
|
-
|
|
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 {
|
|
1
|
+
import { flushSync, RippleArray } from 'ripple';
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('RippleArray copyWithin', () => {
|
|
4
4
|
it('handles copyWithin operation with reactivity', () => {
|
|
5
5
|
component ArrayTest() {
|
|
6
|
-
let items = new
|
|
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
|
|
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
|
|
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,
|
|
1
|
+
import { flushSync, RippleArray } from 'ripple';
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('RippleArray > derived', () => {
|
|
4
4
|
it('handles array methods that return values (map, filter, etc.)', () => {
|
|
5
5
|
component ArrayTest() {
|
|
6
|
-
let items = new
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
1
|
+
import { flushSync, RippleArray } from 'ripple';
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('RippleArray > iteration', () => {
|
|
4
4
|
it('handles entries method with reactivity', () => {
|
|
5
5
|
component ArrayTest() {
|
|
6
|
-
let items = new
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
1
|
+
import { flushSync, RippleArray } from 'ripple';
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('RippleArray > mutations', () => {
|
|
4
4
|
it('handles direct assignment and length tracking', () => {
|
|
5
5
|
component ArrayTest() {
|
|
6
|
-
let items =
|
|
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:
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>
|