@joist/observable 4.2.3-next.13 → 4.2.3-next.14
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/observe.ts +5 -2
- package/target/lib/observe.js +5 -2
- package/target/lib/observe.js.map +1 -1
- package/src/lib/computed.test.ts +0 -55
- package/target/lib/computed.test.d.ts +0 -1
- package/target/lib/computed.test.js +0 -100
- package/target/lib/computed.test.js.map +0 -1
package/package.json
CHANGED
package/src/lib/observe.ts
CHANGED
|
@@ -9,7 +9,7 @@ export function observe<This extends object, Value>(mapper?: (instance: This) =>
|
|
|
9
9
|
): ClassAccessorDecoratorResult<This, Value> {
|
|
10
10
|
const observableMeta = observableMetadataStore.read<This>(ctx.metadata);
|
|
11
11
|
|
|
12
|
-
observableMeta.effects.add(function (this: This) {
|
|
12
|
+
observableMeta.effects.add(function mapperFn(this: This) {
|
|
13
13
|
if (mapper) {
|
|
14
14
|
ctx.access.set(this, mapper(this));
|
|
15
15
|
}
|
|
@@ -31,11 +31,14 @@ export function observe<This extends object, Value>(mapper?: (instance: This) =>
|
|
|
31
31
|
}
|
|
32
32
|
// END
|
|
33
33
|
|
|
34
|
+
return value;
|
|
35
|
+
},
|
|
36
|
+
get() {
|
|
34
37
|
if (mapper) {
|
|
35
38
|
return mapper(this);
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
return
|
|
41
|
+
return base.get.call(this);
|
|
39
42
|
},
|
|
40
43
|
set(newValue: Value) {
|
|
41
44
|
const oldValue = base.get.call(this);
|
package/target/lib/observe.js
CHANGED
|
@@ -3,7 +3,7 @@ const INIT_VALUE = Symbol("init");
|
|
|
3
3
|
export function observe(mapper) {
|
|
4
4
|
return function observeDecorato(base, ctx) {
|
|
5
5
|
const observableMeta = observableMetadataStore.read(ctx.metadata);
|
|
6
|
-
observableMeta.effects.add(function () {
|
|
6
|
+
observableMeta.effects.add(function mapperFn() {
|
|
7
7
|
if (mapper) {
|
|
8
8
|
ctx.access.set(this, mapper(this));
|
|
9
9
|
}
|
|
@@ -19,10 +19,13 @@ export function observe(mapper) {
|
|
|
19
19
|
Reflect.deleteProperty(this, ctx.name);
|
|
20
20
|
return val;
|
|
21
21
|
}
|
|
22
|
+
return value;
|
|
23
|
+
},
|
|
24
|
+
get() {
|
|
22
25
|
if (mapper) {
|
|
23
26
|
return mapper(this);
|
|
24
27
|
}
|
|
25
|
-
return
|
|
28
|
+
return base.get.call(this);
|
|
26
29
|
},
|
|
27
30
|
set(newValue) {
|
|
28
31
|
const oldValue = base.get.call(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE9F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,UAAU,OAAO,CAA6B,MAAkC;IACpF,OAAO,SAAS,eAAe,CAC7B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"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"}
|
package/src/lib/computed.test.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { expect } from "@open-wc/testing";
|
|
2
|
-
import { observe } from "./observe.js";
|
|
3
|
-
|
|
4
|
-
describe("computed decorator", () => {
|
|
5
|
-
it("should compute values based on other properties", async () => {
|
|
6
|
-
class TestClass {
|
|
7
|
-
@observe()
|
|
8
|
-
accessor firstName = "John";
|
|
9
|
-
|
|
10
|
-
@observe()
|
|
11
|
-
accessor lastName = "Doe";
|
|
12
|
-
|
|
13
|
-
@observe((i) => `${i.firstName} ${i.lastName}`)
|
|
14
|
-
accessor fullName = "";
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const instance = new TestClass();
|
|
18
|
-
expect(instance.fullName).to.equal("John Doe");
|
|
19
|
-
|
|
20
|
-
// Update dependencies
|
|
21
|
-
instance.firstName = "Jane";
|
|
22
|
-
|
|
23
|
-
await Promise.resolve();
|
|
24
|
-
|
|
25
|
-
expect(instance.fullName).to.equal("Jane Doe");
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("should handle multiple computed properties", async () => {
|
|
29
|
-
class TestClass {
|
|
30
|
-
@observe()
|
|
31
|
-
accessor x = 2;
|
|
32
|
-
|
|
33
|
-
@observe()
|
|
34
|
-
accessor y = 3;
|
|
35
|
-
|
|
36
|
-
@observe((i) => i.x + i.y)
|
|
37
|
-
accessor sum = 0;
|
|
38
|
-
|
|
39
|
-
@observe((i) => i.x * i.y)
|
|
40
|
-
accessor product = 0;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const instance = new TestClass();
|
|
44
|
-
expect(instance.sum).to.equal(5);
|
|
45
|
-
expect(instance.product).to.equal(6);
|
|
46
|
-
|
|
47
|
-
// Update dependencies
|
|
48
|
-
instance.x = 4;
|
|
49
|
-
|
|
50
|
-
await Promise.resolve();
|
|
51
|
-
|
|
52
|
-
expect(instance.sum).to.equal(7);
|
|
53
|
-
expect(instance.product).to.equal(12);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { expect } from "@open-wc/testing";
|
|
3
|
-
import { observe } from "./observe.js";
|
|
4
|
-
describe("computed decorator", () => {
|
|
5
|
-
it("should compute values based on other properties", async () => {
|
|
6
|
-
let TestClass = (() => {
|
|
7
|
-
let _firstName_decorators;
|
|
8
|
-
let _firstName_initializers = [];
|
|
9
|
-
let _firstName_extraInitializers = [];
|
|
10
|
-
let _lastName_decorators;
|
|
11
|
-
let _lastName_initializers = [];
|
|
12
|
-
let _lastName_extraInitializers = [];
|
|
13
|
-
let _fullName_decorators;
|
|
14
|
-
let _fullName_initializers = [];
|
|
15
|
-
let _fullName_extraInitializers = [];
|
|
16
|
-
return class TestClass {
|
|
17
|
-
static {
|
|
18
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
19
|
-
_firstName_decorators = [observe()];
|
|
20
|
-
_lastName_decorators = [observe()];
|
|
21
|
-
_fullName_decorators = [observe((i) => `${i.firstName} ${i.lastName}`)];
|
|
22
|
-
__esDecorate(this, null, _firstName_decorators, { kind: "accessor", name: "firstName", static: false, private: false, access: { has: obj => "firstName" in obj, get: obj => obj.firstName, set: (obj, value) => { obj.firstName = value; } }, metadata: _metadata }, _firstName_initializers, _firstName_extraInitializers);
|
|
23
|
-
__esDecorate(this, null, _lastName_decorators, { kind: "accessor", name: "lastName", static: false, private: false, access: { has: obj => "lastName" in obj, get: obj => obj.lastName, set: (obj, value) => { obj.lastName = value; } }, metadata: _metadata }, _lastName_initializers, _lastName_extraInitializers);
|
|
24
|
-
__esDecorate(this, null, _fullName_decorators, { kind: "accessor", name: "fullName", static: false, private: false, access: { has: obj => "fullName" in obj, get: obj => obj.fullName, set: (obj, value) => { obj.fullName = value; } }, metadata: _metadata }, _fullName_initializers, _fullName_extraInitializers);
|
|
25
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
26
|
-
}
|
|
27
|
-
#firstName_accessor_storage = __runInitializers(this, _firstName_initializers, "John");
|
|
28
|
-
get firstName() { return this.#firstName_accessor_storage; }
|
|
29
|
-
set firstName(value) { this.#firstName_accessor_storage = value; }
|
|
30
|
-
#lastName_accessor_storage = (__runInitializers(this, _firstName_extraInitializers), __runInitializers(this, _lastName_initializers, "Doe"));
|
|
31
|
-
get lastName() { return this.#lastName_accessor_storage; }
|
|
32
|
-
set lastName(value) { this.#lastName_accessor_storage = value; }
|
|
33
|
-
#fullName_accessor_storage = (__runInitializers(this, _lastName_extraInitializers), __runInitializers(this, _fullName_initializers, ""));
|
|
34
|
-
get fullName() { return this.#fullName_accessor_storage; }
|
|
35
|
-
set fullName(value) { this.#fullName_accessor_storage = value; }
|
|
36
|
-
constructor() {
|
|
37
|
-
__runInitializers(this, _fullName_extraInitializers);
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
const instance = new TestClass();
|
|
42
|
-
expect(instance.fullName).to.equal("John Doe");
|
|
43
|
-
instance.firstName = "Jane";
|
|
44
|
-
await Promise.resolve();
|
|
45
|
-
expect(instance.fullName).to.equal("Jane Doe");
|
|
46
|
-
});
|
|
47
|
-
it("should handle multiple computed properties", async () => {
|
|
48
|
-
let TestClass = (() => {
|
|
49
|
-
let _x_decorators;
|
|
50
|
-
let _x_initializers = [];
|
|
51
|
-
let _x_extraInitializers = [];
|
|
52
|
-
let _y_decorators;
|
|
53
|
-
let _y_initializers = [];
|
|
54
|
-
let _y_extraInitializers = [];
|
|
55
|
-
let _sum_decorators;
|
|
56
|
-
let _sum_initializers = [];
|
|
57
|
-
let _sum_extraInitializers = [];
|
|
58
|
-
let _product_decorators;
|
|
59
|
-
let _product_initializers = [];
|
|
60
|
-
let _product_extraInitializers = [];
|
|
61
|
-
return class TestClass {
|
|
62
|
-
static {
|
|
63
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
64
|
-
_x_decorators = [observe()];
|
|
65
|
-
_y_decorators = [observe()];
|
|
66
|
-
_sum_decorators = [observe((i) => i.x + i.y)];
|
|
67
|
-
_product_decorators = [observe((i) => i.x * i.y)];
|
|
68
|
-
__esDecorate(this, null, _x_decorators, { kind: "accessor", name: "x", static: false, private: false, access: { has: obj => "x" in obj, get: obj => obj.x, set: (obj, value) => { obj.x = value; } }, metadata: _metadata }, _x_initializers, _x_extraInitializers);
|
|
69
|
-
__esDecorate(this, null, _y_decorators, { kind: "accessor", name: "y", static: false, private: false, access: { has: obj => "y" in obj, get: obj => obj.y, set: (obj, value) => { obj.y = value; } }, metadata: _metadata }, _y_initializers, _y_extraInitializers);
|
|
70
|
-
__esDecorate(this, null, _sum_decorators, { kind: "accessor", name: "sum", static: false, private: false, access: { has: obj => "sum" in obj, get: obj => obj.sum, set: (obj, value) => { obj.sum = value; } }, metadata: _metadata }, _sum_initializers, _sum_extraInitializers);
|
|
71
|
-
__esDecorate(this, null, _product_decorators, { kind: "accessor", name: "product", static: false, private: false, access: { has: obj => "product" in obj, get: obj => obj.product, set: (obj, value) => { obj.product = value; } }, metadata: _metadata }, _product_initializers, _product_extraInitializers);
|
|
72
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
73
|
-
}
|
|
74
|
-
#x_accessor_storage = __runInitializers(this, _x_initializers, 2);
|
|
75
|
-
get x() { return this.#x_accessor_storage; }
|
|
76
|
-
set x(value) { this.#x_accessor_storage = value; }
|
|
77
|
-
#y_accessor_storage = (__runInitializers(this, _x_extraInitializers), __runInitializers(this, _y_initializers, 3));
|
|
78
|
-
get y() { return this.#y_accessor_storage; }
|
|
79
|
-
set y(value) { this.#y_accessor_storage = value; }
|
|
80
|
-
#sum_accessor_storage = (__runInitializers(this, _y_extraInitializers), __runInitializers(this, _sum_initializers, 0));
|
|
81
|
-
get sum() { return this.#sum_accessor_storage; }
|
|
82
|
-
set sum(value) { this.#sum_accessor_storage = value; }
|
|
83
|
-
#product_accessor_storage = (__runInitializers(this, _sum_extraInitializers), __runInitializers(this, _product_initializers, 0));
|
|
84
|
-
get product() { return this.#product_accessor_storage; }
|
|
85
|
-
set product(value) { this.#product_accessor_storage = value; }
|
|
86
|
-
constructor() {
|
|
87
|
-
__runInitializers(this, _product_extraInitializers);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
})();
|
|
91
|
-
const instance = new TestClass();
|
|
92
|
-
expect(instance.sum).to.equal(5);
|
|
93
|
-
expect(instance.product).to.equal(6);
|
|
94
|
-
instance.x = 4;
|
|
95
|
-
await Promise.resolve();
|
|
96
|
-
expect(instance.sum).to.equal(7);
|
|
97
|
-
expect(instance.product).to.equal(12);
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
//# sourceMappingURL=computed.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computed.test.js","sourceRoot":"","sources":["../../src/lib/computed.test.ts"],"names":[],"mappings":"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"}
|