@joist/observable 4.2.2 → 4.2.3-next.1
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/package.json +1 -1
- package/src/lib/metadata.test.ts +5 -1
- package/src/lib/metadata.ts +8 -5
- package/src/lib/observe.ts +9 -4
- package/src/lib.ts +5 -1
- package/target/lib/metadata.d.ts +6 -4
- package/target/lib/metadata.js +1 -0
- package/target/lib/metadata.js.map +1 -1
- package/target/lib/metadata.test.js +5 -1
- package/target/lib/metadata.test.js.map +1 -1
- package/target/lib/observe.js +7 -3
- package/target/lib/observe.js.map +1 -1
- package/target/lib.d.ts +2 -1
- package/target/lib.js +1 -0
- package/target/lib.js.map +1 -1
package/package.json
CHANGED
package/src/lib/metadata.test.ts
CHANGED
|
@@ -6,7 +6,11 @@ it("should return default metadata", () => {
|
|
|
6
6
|
const key = {};
|
|
7
7
|
const data = new ObservableInstanceMetaDataStore().read(key);
|
|
8
8
|
|
|
9
|
-
assert.deepEqual(data, {
|
|
9
|
+
assert.deepEqual(data, {
|
|
10
|
+
changes: new Changes(),
|
|
11
|
+
scheduler: null,
|
|
12
|
+
bindings: new Set<() => void>(),
|
|
13
|
+
});
|
|
10
14
|
});
|
|
11
15
|
|
|
12
16
|
it("should return the same metadata object after init", () => {
|
package/src/lib/metadata.ts
CHANGED
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
export type EffectFn<T> = (changes: Changes<T>) => void;
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
export interface Change<T> {
|
|
6
|
+
oldValue: T;
|
|
7
|
+
newValue: T;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class Changes<T> extends Map<keyof T, Change<unknown>> {}
|
|
9
11
|
|
|
10
12
|
export class ObservableInstanceMetadata<T> {
|
|
11
13
|
scheduler: Promise<void> | null = null;
|
|
12
14
|
changes: Changes<T> = new Changes();
|
|
15
|
+
bindings: Set<(changes: Changes<T>) => void> = new Set();
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
export class ObservableInstanceMetaDataStore extends WeakMap<
|
|
@@ -25,7 +28,7 @@ export class ObservableInstanceMetaDataStore extends WeakMap<
|
|
|
25
28
|
this.set(key, data);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
return data
|
|
31
|
+
return data as ObservableInstanceMetadata<T>;
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
34
|
|
package/src/lib/observe.ts
CHANGED
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
observableMetadataStore,
|
|
5
5
|
} from "./metadata.js";
|
|
6
6
|
|
|
7
|
+
const INIT_VALUE = Symbol("init");
|
|
8
|
+
|
|
7
9
|
export function observe() {
|
|
8
10
|
return function observeDecorator<This extends object, Value>(
|
|
9
11
|
base: ClassAccessorDecoratorTarget<This, Value>,
|
|
@@ -13,14 +15,14 @@ export function observe() {
|
|
|
13
15
|
|
|
14
16
|
return {
|
|
15
17
|
init(value) {
|
|
16
|
-
let val: Value |
|
|
18
|
+
let val: Value | typeof INIT_VALUE = INIT_VALUE;
|
|
17
19
|
|
|
18
20
|
// START: Make upgradable custom elements work
|
|
19
21
|
try {
|
|
20
22
|
val = ctx.access.get(this);
|
|
21
23
|
} catch {}
|
|
22
24
|
|
|
23
|
-
if (val) {
|
|
25
|
+
if (val !== INIT_VALUE) {
|
|
24
26
|
Reflect.deleteProperty(this, ctx.name);
|
|
25
27
|
|
|
26
28
|
return val;
|
|
@@ -31,16 +33,19 @@ export function observe() {
|
|
|
31
33
|
},
|
|
32
34
|
set(newValue: Value) {
|
|
33
35
|
const oldValue = base.get.call(this);
|
|
36
|
+
const instanceMeta = instanceMetadataStore.read<This>(this);
|
|
34
37
|
|
|
35
38
|
if (newValue !== oldValue) {
|
|
36
|
-
const instanceMeta = instanceMetadataStore.read<This>(this);
|
|
37
|
-
|
|
38
39
|
if (instanceMeta.scheduler === null) {
|
|
39
40
|
instanceMeta.scheduler = Promise.resolve().then(() => {
|
|
40
41
|
for (const effect of observableMeta.effects) {
|
|
41
42
|
effect.call(this, instanceMeta.changes);
|
|
42
43
|
}
|
|
43
44
|
|
|
45
|
+
for (const binding of instanceMeta.bindings) {
|
|
46
|
+
binding.call(this, instanceMeta.changes);
|
|
47
|
+
}
|
|
48
|
+
|
|
44
49
|
instanceMeta.scheduler = null;
|
|
45
50
|
instanceMeta.changes.clear();
|
|
46
51
|
});
|
package/src/lib.ts
CHANGED
package/target/lib/metadata.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export type EffectFn<T> = (changes: Changes<T>) => void;
|
|
2
|
-
export
|
|
3
|
-
oldValue:
|
|
4
|
-
newValue:
|
|
5
|
-
}
|
|
2
|
+
export interface Change<T> {
|
|
3
|
+
oldValue: T;
|
|
4
|
+
newValue: T;
|
|
5
|
+
}
|
|
6
|
+
export declare class Changes<T> extends Map<keyof T, Change<unknown>> {
|
|
6
7
|
}
|
|
7
8
|
export declare class ObservableInstanceMetadata<T> {
|
|
8
9
|
scheduler: Promise<void> | null;
|
|
9
10
|
changes: Changes<T>;
|
|
11
|
+
bindings: Set<(changes: Changes<T>) => void>;
|
|
10
12
|
}
|
|
11
13
|
export declare class ObservableInstanceMetaDataStore extends WeakMap<object, ObservableInstanceMetadata<unknown>> {
|
|
12
14
|
read<T extends object>(key: T): ObservableInstanceMetadata<T>;
|
package/target/lib/metadata.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AASvD,MAAM,OAAO,OAAW,SAAQ,GAA6B;CAAG;AAEhE,MAAM,OAAO,0BAA0B;IACrC,SAAS,GAAyB,IAAI,CAAC;IACvC,OAAO,GAAe,IAAI,OAAO,EAAE,CAAC;IACpC,QAAQ,GAAuC,IAAI,GAAG,EAAE,CAAC;CAC1D;AAED,MAAM,OAAO,+BAAgC,SAAQ,OAGpD;IACC,IAAI,CAAmB,GAAM;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,0BAA0B,EAAE,CAAC;YAExC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAqC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,OAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;CACvC;AAED,MAAM,OAAO,uBAAwB,SAAQ,OAG5C;IACC,IAAI,CAAmB,GAAW;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAEhC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAA6B,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,IAAI,+BAA+B,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAClC,IAAI,uBAAuB,EAAE,CAAC"}
|
|
@@ -3,7 +3,11 @@ import { Changes, ObservableInstanceMetaDataStore } from "./metadata.js";
|
|
|
3
3
|
it("should return default metadata", () => {
|
|
4
4
|
const key = {};
|
|
5
5
|
const data = new ObservableInstanceMetaDataStore().read(key);
|
|
6
|
-
assert.deepEqual(data, {
|
|
6
|
+
assert.deepEqual(data, {
|
|
7
|
+
changes: new Changes(),
|
|
8
|
+
scheduler: null,
|
|
9
|
+
bindings: new Set(),
|
|
10
|
+
});
|
|
7
11
|
});
|
|
8
12
|
it("should return the same metadata object after init", () => {
|
|
9
13
|
const key = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/lib/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEzE,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/lib/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEzE,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,OAAO,EAAE,IAAI,OAAO,EAAE;QACtB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI,GAAG,EAAc;KAChC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
|
package/target/lib/observe.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { instanceMetadataStore, observableMetadataStore, } from "./metadata.js";
|
|
2
|
+
const INIT_VALUE = Symbol("init");
|
|
2
3
|
export function observe() {
|
|
3
4
|
return function observeDecorator(base, ctx) {
|
|
4
5
|
const observableMeta = observableMetadataStore.read(ctx.metadata);
|
|
5
6
|
return {
|
|
6
7
|
init(value) {
|
|
7
|
-
let val =
|
|
8
|
+
let val = INIT_VALUE;
|
|
8
9
|
try {
|
|
9
10
|
val = ctx.access.get(this);
|
|
10
11
|
}
|
|
11
12
|
catch { }
|
|
12
|
-
if (val) {
|
|
13
|
+
if (val !== INIT_VALUE) {
|
|
13
14
|
Reflect.deleteProperty(this, ctx.name);
|
|
14
15
|
return val;
|
|
15
16
|
}
|
|
@@ -17,13 +18,16 @@ export function observe() {
|
|
|
17
18
|
},
|
|
18
19
|
set(newValue) {
|
|
19
20
|
const oldValue = base.get.call(this);
|
|
21
|
+
const instanceMeta = instanceMetadataStore.read(this);
|
|
20
22
|
if (newValue !== oldValue) {
|
|
21
|
-
const instanceMeta = instanceMetadataStore.read(this);
|
|
22
23
|
if (instanceMeta.scheduler === null) {
|
|
23
24
|
instanceMeta.scheduler = Promise.resolve().then(() => {
|
|
24
25
|
for (const effect of observableMeta.effects) {
|
|
25
26
|
effect.call(this, instanceMeta.changes);
|
|
26
27
|
}
|
|
28
|
+
for (const binding of instanceMeta.bindings) {
|
|
29
|
+
binding.call(this, instanceMeta.changes);
|
|
30
|
+
}
|
|
27
31
|
instanceMeta.scheduler = null;
|
|
28
32
|
instanceMeta.changes.clear();
|
|
29
33
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,OAAO;IACrB,OAAO,SAAS,gBAAgB,CAC9B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO;YACL,IAAI,CAAC,KAAK;gBACR,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,UAAU,OAAO;IACrB,OAAO,SAAS,gBAAgB,CAC9B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO;YACL,IAAI,CAAC,KAAK;gBACR,IAAI,GAAG,GAA8B,UAAU,CAAC;gBAGhD,IAAI,CAAC;oBACH,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACvB,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEvC,OAAO,GAAG,CAAC;gBACb,CAAC;gBAGD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,CAAC,QAAe;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;gBAE5D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;wBACpC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;4BACnD,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gCAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC1C,CAAC;4BAED,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gCAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC3C,CAAC;4BAED,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;4BAC9B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC/B,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAkB,EAAE;wBAC/C,QAAQ;wBACR,QAAQ;qBACT,CAAC,CAAC;oBAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,SAAS,eAAe,CAC7B,KAAkB,EAClB,GAAmC;QAEnC,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC"}
|
package/target/lib.d.ts
CHANGED
package/target/lib.js
CHANGED
package/target/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAU,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
|