async-reactivity 2.2.1 → 2.2.2
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 +20 -15
- package/lib/tracker.js +18 -0
- package/package.json +1 -1
- package/src/computed.ts +20 -15
- package/types/computed.d.ts.map +1 -1
- package/types/tracker.d.ts +10 -0
- package/types/tracker.d.ts.map +1 -0
package/lib/computed.js
CHANGED
|
@@ -29,23 +29,27 @@ export default class Computed extends Effect {
|
|
|
29
29
|
if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
|
|
30
30
|
this.oldValue = this._value;
|
|
31
31
|
const newValue = this.run();
|
|
32
|
-
if (newValue
|
|
33
|
-
|
|
32
|
+
if (newValue instanceof Promise) {
|
|
33
|
+
// @ts-expect-error
|
|
34
|
+
this._value = Promise.all([newValue, this.oldValue])
|
|
35
|
+
.then(([newValue, oldValue]) => {
|
|
36
|
+
if (newValue === InSyncSymbol) {
|
|
37
|
+
this.validateDependents();
|
|
38
|
+
return oldValue;
|
|
39
|
+
}
|
|
40
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
41
|
+
this.validateDependents();
|
|
42
|
+
}
|
|
43
|
+
return newValue;
|
|
44
|
+
}).finally(() => {
|
|
45
|
+
if (this.state === EffectState.Waiting) {
|
|
46
|
+
this.oldValue = undefined;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
34
49
|
}
|
|
35
50
|
else {
|
|
36
|
-
if (newValue
|
|
37
|
-
|
|
38
|
-
this._value = Promise.all([newValue, this.oldValue])
|
|
39
|
-
.then(([newValue, oldValue]) => {
|
|
40
|
-
if (newValue === InSyncSymbol) {
|
|
41
|
-
this.validateDependents();
|
|
42
|
-
return oldValue;
|
|
43
|
-
}
|
|
44
|
-
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
45
|
-
this.validateDependents();
|
|
46
|
-
}
|
|
47
|
-
return newValue;
|
|
48
|
-
});
|
|
51
|
+
if (newValue === InSyncSymbol) {
|
|
52
|
+
this.validateDependents();
|
|
49
53
|
}
|
|
50
54
|
else {
|
|
51
55
|
this._value = newValue;
|
|
@@ -53,6 +57,7 @@ export default class Computed extends Effect {
|
|
|
53
57
|
this.validateDependents();
|
|
54
58
|
}
|
|
55
59
|
}
|
|
60
|
+
this.oldValue = undefined;
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
return this._value;
|
package/lib/tracker.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default class Tracker {
|
|
2
|
+
dependents = new Set();
|
|
3
|
+
_value;
|
|
4
|
+
addDependent(dependent) {
|
|
5
|
+
this.dependents.add(dependent);
|
|
6
|
+
}
|
|
7
|
+
removeDependent(dependent) {
|
|
8
|
+
this.dependents.delete(dependent);
|
|
9
|
+
}
|
|
10
|
+
invalidate() {
|
|
11
|
+
for (const dependent of [...this.dependents.keys()]) {
|
|
12
|
+
dependent.invalidate(this);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
get value() {
|
|
16
|
+
return this._value;
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
CHANGED
package/src/computed.ts
CHANGED
|
@@ -41,28 +41,33 @@ export default class Computed<T> extends Effect implements Dependent, Dependency
|
|
|
41
41
|
if (this.state === EffectState.Initial || this.state === EffectState.Scheduled) {
|
|
42
42
|
this.oldValue = this._value!;
|
|
43
43
|
const newValue = this.run() as T;
|
|
44
|
-
if (newValue
|
|
45
|
-
|
|
44
|
+
if (newValue instanceof Promise) {
|
|
45
|
+
// @ts-expect-error
|
|
46
|
+
this._value = Promise.all([newValue, this.oldValue])
|
|
47
|
+
.then(([newValue, oldValue]) => {
|
|
48
|
+
if (newValue === InSyncSymbol) {
|
|
49
|
+
this.validateDependents();
|
|
50
|
+
return oldValue;
|
|
51
|
+
}
|
|
52
|
+
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
53
|
+
this.validateDependents();
|
|
54
|
+
}
|
|
55
|
+
return newValue;
|
|
56
|
+
}).finally(() => {
|
|
57
|
+
if (this.state === EffectState.Waiting) {
|
|
58
|
+
this.oldValue = undefined;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
46
61
|
} else {
|
|
47
|
-
if (newValue
|
|
48
|
-
|
|
49
|
-
this._value = Promise.all([newValue, this.oldValue])
|
|
50
|
-
.then(([newValue, oldValue]) => {
|
|
51
|
-
if (newValue === InSyncSymbol) {
|
|
52
|
-
this.validateDependents();
|
|
53
|
-
return oldValue;
|
|
54
|
-
}
|
|
55
|
-
if (this.dependents.size > 0 && this.isEqual(newValue, oldValue)) {
|
|
56
|
-
this.validateDependents();
|
|
57
|
-
}
|
|
58
|
-
return newValue;
|
|
59
|
-
});
|
|
62
|
+
if (newValue === InSyncSymbol) {
|
|
63
|
+
this.validateDependents();
|
|
60
64
|
} else {
|
|
61
65
|
this._value = newValue;
|
|
62
66
|
if (this.dependents.size > 0 && this.isEqual(newValue, this.oldValue)) {
|
|
63
67
|
this.validateDependents();
|
|
64
68
|
}
|
|
65
69
|
}
|
|
70
|
+
this.oldValue = undefined;
|
|
66
71
|
}
|
|
67
72
|
}
|
|
68
73
|
|
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,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,CAAI;IACrB,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,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,cAAc,MAAM,qBAAqB,CAAC;AAGjD,OAAO,MAAqC,MAAM,aAAa,CAAC;AAEhE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;AACvI,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC;AAI9I,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,MAAO,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,CAAI;IACrB,OAAO,CAAC,MAAM,CAAC,CAAI;IACnB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAEhB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,4BAAoB,EAAE,UAAU,CAAC,EAAE,MAAM;IAkBpF,IAAW,KAAK,IAAI,CAAC,CAmCpB;IAED,OAAO,CAAC,kBAAkB;IAMnB,YAAY,CAAC,SAAS,EAAE,SAAS;IAOjC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,gBAAoB,GAAG,IAAI;IAKxE,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAW3C,eAAe;IAaf,KAAK;IAKL,OAAO;CAGjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Dependent from "./dependent.js";
|
|
2
|
+
export default class Tracker<T> {
|
|
3
|
+
protected dependents: Set<Dependent>;
|
|
4
|
+
protected _value?: T;
|
|
5
|
+
addDependent(dependent: Dependent): void;
|
|
6
|
+
removeDependent(dependent: Dependent): void;
|
|
7
|
+
invalidate(): void;
|
|
8
|
+
get value(): T | undefined;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;IAC1B,SAAS,CAAC,UAAU,iBAAwB;IAC5C,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEd,YAAY,CAAC,SAAS,EAAE,SAAS;IAIjC,eAAe,CAAC,SAAS,EAAE,SAAS;IAIpC,UAAU,IAAI,IAAI;IAMzB,IAAW,KAAK,kBAEf;CACJ"}
|