async-reactivity 2.0.13 → 2.0.15
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/lib/computed.js +1 -1
- package/lib/listener.js +7 -17
- package/lib/listener.test.js +12 -17
- package/package.json +1 -1
- package/src/computed.ts +3 -3
- package/src/listener.test.ts +12 -17
- package/src/listener.ts +8 -20
- package/types/computed.d.ts +2 -2
- package/types/computed.d.ts.map +1 -1
- package/types/defaultIsEqual.d.ts.map +1 -1
- package/types/listener.d.ts +5 -9
- package/types/listener.d.ts.map +1 -1
package/lib/computed.js
CHANGED
|
@@ -62,7 +62,7 @@ export default class Computed extends Tracker {
|
|
|
62
62
|
}
|
|
63
63
|
this.state = ComputedState.Computing;
|
|
64
64
|
this.clearDependencies();
|
|
65
|
-
const newValue = this.getter(this.trackDependency);
|
|
65
|
+
const newValue = this.getter(this.trackDependency, this._value);
|
|
66
66
|
if (this.isEqual(newValue, this._value)) {
|
|
67
67
|
this.handlePromiseThen(this.lastComputeAttemptPromise, this._value);
|
|
68
68
|
this.validateDependents();
|
package/lib/listener.js
CHANGED
|
@@ -1,36 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import Ref from "./ref.js";
|
|
2
|
+
import defaultIsEqual from "./defaultIsEqual.js";
|
|
3
|
+
export default class Listener extends Ref {
|
|
4
4
|
start;
|
|
5
5
|
stop;
|
|
6
6
|
listening = false;
|
|
7
|
-
constructor({
|
|
8
|
-
super();
|
|
9
|
-
this.init = init;
|
|
7
|
+
constructor(_value, { start, stop }, isEqual = (defaultIsEqual)) {
|
|
8
|
+
super(_value, isEqual);
|
|
10
9
|
this.start = start;
|
|
11
10
|
this.stop = stop;
|
|
12
11
|
}
|
|
13
12
|
addDependent(dependent) {
|
|
14
13
|
super.addDependent(dependent);
|
|
15
14
|
if (!this.listening) {
|
|
16
|
-
this.start((value) => {
|
|
17
|
-
this._value = value;
|
|
18
|
-
this.invalidate();
|
|
19
|
-
});
|
|
20
15
|
this.listening = true;
|
|
16
|
+
this.start();
|
|
21
17
|
}
|
|
22
18
|
}
|
|
23
19
|
removeDependent(dependent) {
|
|
24
20
|
super.removeDependent(dependent);
|
|
25
21
|
if (this.dependents.size === 0) {
|
|
26
|
-
this.stop();
|
|
27
22
|
this.listening = false;
|
|
23
|
+
this.stop();
|
|
28
24
|
}
|
|
29
25
|
}
|
|
30
|
-
get value() {
|
|
31
|
-
if (this._value === undefined) {
|
|
32
|
-
this._value = this.init();
|
|
33
|
-
}
|
|
34
|
-
return this._value;
|
|
35
|
-
}
|
|
36
26
|
}
|
package/lib/listener.test.js
CHANGED
|
@@ -2,30 +2,27 @@ import 'mocha';
|
|
|
2
2
|
import assert from 'assert';
|
|
3
3
|
import { mock } from 'node:test';
|
|
4
4
|
import { Watcher, Listener } from './index.js';
|
|
5
|
-
describe('listener', function () {
|
|
5
|
+
describe.only('listener', function () {
|
|
6
6
|
it('wait for dependent', function () {
|
|
7
7
|
assert.doesNotThrow(() => {
|
|
8
|
-
new Listener({
|
|
9
|
-
init: () => { throw new Error(); },
|
|
8
|
+
new Listener(1, {
|
|
10
9
|
start: () => { throw new Error(); },
|
|
11
10
|
stop: () => { throw new Error(); },
|
|
12
11
|
});
|
|
13
12
|
});
|
|
14
13
|
});
|
|
15
14
|
it('init', function () {
|
|
16
|
-
const listener = new Listener({
|
|
17
|
-
init: () => 1,
|
|
15
|
+
const listener = new Listener(1, {
|
|
18
16
|
start: () => { throw new Error(); },
|
|
19
17
|
stop: () => { throw new Error(); },
|
|
20
18
|
});
|
|
21
19
|
assert.strictEqual(listener.value, 1);
|
|
22
20
|
});
|
|
23
21
|
it('start', async function () {
|
|
24
|
-
const listener = new Listener({
|
|
25
|
-
|
|
26
|
-
start: (setter) => {
|
|
22
|
+
const listener = new Listener(1, {
|
|
23
|
+
start: () => {
|
|
27
24
|
setTimeout(() => {
|
|
28
|
-
|
|
25
|
+
listener.value = 2;
|
|
29
26
|
}, 10);
|
|
30
27
|
},
|
|
31
28
|
stop: () => { },
|
|
@@ -41,12 +38,11 @@ describe('listener', function () {
|
|
|
41
38
|
it('stop', async function () {
|
|
42
39
|
let gate = false;
|
|
43
40
|
let timeout;
|
|
44
|
-
const listener = new Listener({
|
|
45
|
-
|
|
46
|
-
start: (setter) => {
|
|
41
|
+
const listener = new Listener(1, {
|
|
42
|
+
start: () => {
|
|
47
43
|
timeout = setTimeout(() => {
|
|
48
44
|
gate = true;
|
|
49
|
-
|
|
45
|
+
listener.value = 2;
|
|
50
46
|
}, 10);
|
|
51
47
|
},
|
|
52
48
|
stop: () => {
|
|
@@ -61,11 +57,10 @@ describe('listener', function () {
|
|
|
61
57
|
});
|
|
62
58
|
it('stop + start', async function () {
|
|
63
59
|
let timeout;
|
|
64
|
-
const listener = new Listener({
|
|
65
|
-
|
|
66
|
-
start: (setter) => {
|
|
60
|
+
const listener = new Listener(1, {
|
|
61
|
+
start: () => {
|
|
67
62
|
timeout = setTimeout(() => {
|
|
68
|
-
|
|
63
|
+
listener.value = 2;
|
|
69
64
|
}, 10);
|
|
70
65
|
},
|
|
71
66
|
stop: () => {
|
package/package.json
CHANGED
package/src/computed.ts
CHANGED
|
@@ -4,8 +4,8 @@ import Tracker from "./tracker.js";
|
|
|
4
4
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
5
5
|
|
|
6
6
|
export declare type TrackValue = <T>(dependency: Dependency<T>) => T;
|
|
7
|
-
export declare type ComputeFunc<T> = (value: TrackValue) => T;
|
|
8
|
-
export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1) => T2;
|
|
7
|
+
export declare type ComputeFunc<T> = (value: TrackValue, previousValue?: T) => T;
|
|
8
|
+
export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1, previousValue?: T2) => T2;
|
|
9
9
|
|
|
10
10
|
enum ComputedState {
|
|
11
11
|
Invalid,
|
|
@@ -74,7 +74,7 @@ export default class Computed<T extends TBase, TBase = T> extends Tracker<T> imp
|
|
|
74
74
|
this.state = ComputedState.Computing;
|
|
75
75
|
this.clearDependencies();
|
|
76
76
|
|
|
77
|
-
const newValue: T = this.getter(this.trackDependency);
|
|
77
|
+
const newValue: T = this.getter(this.trackDependency, this._value);
|
|
78
78
|
if (this.isEqual(newValue, this._value!)) {
|
|
79
79
|
this.handlePromiseThen(this.lastComputeAttemptPromise!, this._value);
|
|
80
80
|
this.validateDependents();
|
package/src/listener.test.ts
CHANGED
|
@@ -3,11 +3,10 @@ import assert from 'assert';
|
|
|
3
3
|
import { mock } from 'node:test';
|
|
4
4
|
import { Watcher, Listener } from './index.js';
|
|
5
5
|
|
|
6
|
-
describe('listener', function () {
|
|
6
|
+
describe.only('listener', function () {
|
|
7
7
|
it('wait for dependent', function () {
|
|
8
8
|
assert.doesNotThrow(() => {
|
|
9
|
-
new Listener({
|
|
10
|
-
init: () => { throw new Error(); },
|
|
9
|
+
new Listener(1, {
|
|
11
10
|
start: () => { throw new Error(); },
|
|
12
11
|
stop: () => { throw new Error(); },
|
|
13
12
|
});
|
|
@@ -15,8 +14,7 @@ describe('listener', function () {
|
|
|
15
14
|
});
|
|
16
15
|
|
|
17
16
|
it('init', function () {
|
|
18
|
-
const listener = new Listener({
|
|
19
|
-
init: () => 1,
|
|
17
|
+
const listener = new Listener(1, {
|
|
20
18
|
start: () => { throw new Error(); },
|
|
21
19
|
stop: () => { throw new Error(); },
|
|
22
20
|
});
|
|
@@ -25,11 +23,10 @@ describe('listener', function () {
|
|
|
25
23
|
});
|
|
26
24
|
|
|
27
25
|
it('start', async function () {
|
|
28
|
-
const listener = new Listener({
|
|
29
|
-
|
|
30
|
-
start: (setter) => {
|
|
26
|
+
const listener = new Listener(1, {
|
|
27
|
+
start: () => {
|
|
31
28
|
setTimeout(() => {
|
|
32
|
-
|
|
29
|
+
listener.value = 2;
|
|
33
30
|
}, 10);
|
|
34
31
|
},
|
|
35
32
|
stop: () => { },
|
|
@@ -50,12 +47,11 @@ describe('listener', function () {
|
|
|
50
47
|
it('stop', async function () {
|
|
51
48
|
let gate = false;
|
|
52
49
|
let timeout: NodeJS.Timeout;
|
|
53
|
-
const listener = new Listener({
|
|
54
|
-
|
|
55
|
-
start: (setter) => {
|
|
50
|
+
const listener = new Listener(1, {
|
|
51
|
+
start: () => {
|
|
56
52
|
timeout = setTimeout(() => {
|
|
57
53
|
gate = true;
|
|
58
|
-
|
|
54
|
+
listener.value = 2;
|
|
59
55
|
}, 10);
|
|
60
56
|
},
|
|
61
57
|
stop: () => {
|
|
@@ -76,11 +72,10 @@ describe('listener', function () {
|
|
|
76
72
|
|
|
77
73
|
it('stop + start', async function () {
|
|
78
74
|
let timeout: NodeJS.Timeout;
|
|
79
|
-
const listener = new Listener({
|
|
80
|
-
|
|
81
|
-
start: (setter) => {
|
|
75
|
+
const listener = new Listener(1, {
|
|
76
|
+
start: () => {
|
|
82
77
|
timeout = setTimeout(() => {
|
|
83
|
-
|
|
78
|
+
listener.value = 2;
|
|
84
79
|
}, 10);
|
|
85
80
|
},
|
|
86
81
|
stop: () => {
|
package/src/listener.ts
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import Dependency from "./dependency.js";
|
|
2
1
|
import Dependent from "./dependent.js";
|
|
3
|
-
import
|
|
2
|
+
import Ref from "./ref.js";
|
|
3
|
+
import defaultIsEqual from "./defaultIsEqual.js";
|
|
4
4
|
|
|
5
|
-
export default class Listener<T
|
|
6
|
-
private
|
|
7
|
-
private start: (setter: (value: T) => void) => void;
|
|
5
|
+
export default class Listener<T extends TBase, TBase = T> extends Ref<T> {
|
|
6
|
+
private start: () => void;
|
|
8
7
|
private stop: () => void;
|
|
9
8
|
private listening = false;
|
|
10
9
|
|
|
11
|
-
constructor(
|
|
12
|
-
super();
|
|
10
|
+
constructor(_value: T, { start, stop }: { start: () => void, stop: () => void }, isEqual = defaultIsEqual<TBase>) {
|
|
11
|
+
super(_value, isEqual);
|
|
13
12
|
|
|
14
|
-
this.init = init;
|
|
15
13
|
this.start = start;
|
|
16
14
|
this.stop = stop;
|
|
17
15
|
}
|
|
@@ -19,26 +17,16 @@ export default class Listener<T> extends Tracker<T> implements Dependency<T> {
|
|
|
19
17
|
public addDependent(dependent: Dependent): void {
|
|
20
18
|
super.addDependent(dependent);
|
|
21
19
|
if (!this.listening) {
|
|
22
|
-
this.start((value) => {
|
|
23
|
-
this._value = value;
|
|
24
|
-
this.invalidate();
|
|
25
|
-
});
|
|
26
20
|
this.listening = true;
|
|
21
|
+
this.start();
|
|
27
22
|
}
|
|
28
23
|
}
|
|
29
24
|
|
|
30
25
|
public removeDependent(dependent: Dependent): void {
|
|
31
26
|
super.removeDependent(dependent);
|
|
32
27
|
if (this.dependents.size === 0) {
|
|
33
|
-
this.stop();
|
|
34
28
|
this.listening = false;
|
|
29
|
+
this.stop();
|
|
35
30
|
}
|
|
36
31
|
}
|
|
37
|
-
|
|
38
|
-
public get value() {
|
|
39
|
-
if (this._value === undefined) {
|
|
40
|
-
this._value = this.init();
|
|
41
|
-
}
|
|
42
|
-
return this._value;
|
|
43
|
-
}
|
|
44
32
|
}
|
package/types/computed.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import Dependent from "./dependent.js";
|
|
|
3
3
|
import Tracker from "./tracker.js";
|
|
4
4
|
import defaultIsEqual from "./defaultIsEqual.js";
|
|
5
5
|
export declare type TrackValue = <T>(dependency: Dependency<T>) => T;
|
|
6
|
-
export declare type ComputeFunc<T> = (value: TrackValue) => T;
|
|
7
|
-
export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1) => T2;
|
|
6
|
+
export declare type ComputeFunc<T> = (value: TrackValue, previousValue?: T) => T;
|
|
7
|
+
export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1, previousValue?: T2) => T2;
|
|
8
8
|
export default class Computed<T extends TBase, TBase = T> extends Tracker<T> implements Dependent, Dependency<T> {
|
|
9
9
|
getter: ComputeFunc<T>;
|
|
10
10
|
isEqual: typeof defaultIsEqual<TBase>;
|
package/types/computed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACjF,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAWzG,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5G,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAI;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAA0C;IACxE,OAAO,CAAC,yBAAyB,CAAC,CAAgB;gBAEtC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,oCAAwB;IAOnE,OAAO,CAAC,qBAAqB;IAS7B,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,OAAO,CAAC,OAAO;IA0Cf,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,iBAAiB;IAMlB,UAAU;IAUV,eAAe;IAKf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;IAI3C,OAAO,CAAC,kBAAkB;IAMnB,OAAO;CAOjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultIsEqual.d.ts","sourceRoot":"","sources":["../src/defaultIsEqual.ts"],"names":[],"mappings":"yBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"defaultIsEqual.d.ts","sourceRoot":"","sources":["../src/defaultIsEqual.ts"],"names":[],"mappings":"yBAAgB,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAA/B,wBAA8C"}
|
package/types/listener.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import Dependency from "./dependency.js";
|
|
2
1
|
import Dependent from "./dependent.js";
|
|
3
|
-
import
|
|
4
|
-
export default class Listener<T
|
|
5
|
-
private init;
|
|
2
|
+
import Ref from "./ref.js";
|
|
3
|
+
export default class Listener<T extends TBase, TBase = T> extends Ref<T> {
|
|
6
4
|
private start;
|
|
7
5
|
private stop;
|
|
8
6
|
private listening;
|
|
9
|
-
constructor(
|
|
10
|
-
|
|
11
|
-
start: (setter: (value: T) => void) => void;
|
|
7
|
+
constructor(_value: T, { start, stop }: {
|
|
8
|
+
start: () => void;
|
|
12
9
|
stop: () => void;
|
|
13
|
-
});
|
|
10
|
+
}, isEqual?: (v1: TBase, v2: TBase) => boolean);
|
|
14
11
|
addDependent(dependent: Dependent): void;
|
|
15
12
|
removeDependent(dependent: Dependent): void;
|
|
16
|
-
get value(): T;
|
|
17
13
|
}
|
|
18
14
|
//# sourceMappingURL=listener.d.ts.map
|
package/types/listener.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,GAAG,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,EAAE,OAAO,oCAAwB;IAOzG,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAQxC,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;CAOrD"}
|