@joist/observable 4.0.0-next.4 → 4.0.0-next.41
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/README.md +8 -4
- package/package.json +5 -7
- package/src/lib/metadata.test.ts +12 -16
- package/src/lib/metadata.ts +29 -22
- package/src/lib/observe.test.ts +47 -53
- package/src/lib/observe.ts +53 -42
- package/src/lib.ts +1 -0
- package/target/lib/metadata.d.ts +13 -12
- package/target/lib/metadata.js +16 -14
- package/target/lib/metadata.js.map +1 -1
- package/target/lib/metadata.test.js +11 -16
- package/target/lib/metadata.test.js.map +1 -1
- package/target/lib/observe.d.ts +2 -2
- package/target/lib/observe.js +37 -30
- package/target/lib/observe.js.map +1 -1
- package/target/lib/observe.test.js +42 -69
- package/target/lib/observe.test.js.map +1 -1
- package/target/lib.d.ts +1 -0
- package/target/lib.js +1 -0
- package/target/lib.js.map +1 -1
- package/src/lib/watch.test.ts +0 -24
- package/src/lib/watch.ts +0 -11
- package/target/lib/watch.d.ts +0 -2
- package/target/lib/watch.js +0 -9
- package/target/lib/watch.js.map +0 -1
- package/target/lib/watch.test.d.ts +0 -1
- package/target/lib/watch.test.js +0 -35
- package/target/lib/watch.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,17 +5,21 @@ Adds the ability to monitor class properties (static and instance) for changes
|
|
|
5
5
|
#### Installation:
|
|
6
6
|
|
|
7
7
|
```BASH
|
|
8
|
-
npm i @joist/observable
|
|
8
|
+
npm i @joist/observable@next
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
```TS
|
|
12
12
|
import { observe, effect } from '@joist/observable';
|
|
13
13
|
|
|
14
14
|
class AppState {
|
|
15
|
-
@observe
|
|
16
|
-
|
|
15
|
+
@observe()
|
|
16
|
+
accessor todos: string[] = [];
|
|
17
17
|
|
|
18
|
-
@
|
|
18
|
+
@observe()
|
|
19
|
+
accessor userName?: string;
|
|
20
|
+
|
|
21
|
+
@effect()
|
|
22
|
+
onChange(changes: Changes) {
|
|
19
23
|
console.log(changes);
|
|
20
24
|
}
|
|
21
25
|
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joist/observable",
|
|
3
|
-
"version": "4.0.0-next.
|
|
3
|
+
"version": "4.0.0-next.41",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./target/lib.js",
|
|
6
6
|
"module": "./target/lib.js",
|
|
7
7
|
"exports": {
|
|
8
|
-
".":
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"./*": {
|
|
12
|
-
"import": "./target/lib/*.js"
|
|
13
|
-
}
|
|
8
|
+
".": "./target/lib.js",
|
|
9
|
+
"./*": "./target/lib/*",
|
|
10
|
+
"./package.json": "./package.json"
|
|
14
11
|
},
|
|
15
12
|
"files": [
|
|
16
13
|
"src",
|
|
@@ -57,6 +54,7 @@
|
|
|
57
54
|
"test": {
|
|
58
55
|
"command": "wtr --config wtr.config.mjs",
|
|
59
56
|
"files": [
|
|
57
|
+
"wtr.config.mjs",
|
|
60
58
|
"target/**"
|
|
61
59
|
],
|
|
62
60
|
"output": [],
|
package/src/lib/metadata.test.ts
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ObservableInstanceMetaDataStore } from './metadata.js';
|
|
1
|
+
import { assert } from 'chai';
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
it('should return default metadata', () => {
|
|
6
|
-
const key = {};
|
|
7
|
-
const data = new ObservableInstanceMetaDataStore().read(key);
|
|
3
|
+
import { Changes, ObservableInstanceMetaDataStore } from './metadata.js';
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
13
|
-
});
|
|
5
|
+
it('should return default metadata', () => {
|
|
6
|
+
const key = {};
|
|
7
|
+
const data = new ObservableInstanceMetaDataStore().read(key);
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
assert.deepEqual(data, { changes: new Changes(), scheduler: null });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should return the same metadata object after init', () => {
|
|
13
|
+
const key = {};
|
|
14
|
+
const data = new ObservableInstanceMetaDataStore();
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
});
|
|
16
|
+
assert.equal(data.read(key), data.read(key));
|
|
21
17
|
});
|
package/src/lib/metadata.ts
CHANGED
|
@@ -1,43 +1,50 @@
|
|
|
1
1
|
(Symbol as any).metadata ??= Symbol('Symbol.metadata');
|
|
2
2
|
|
|
3
|
-
export type EffectFn = (changes:
|
|
3
|
+
export type EffectFn<T> = (changes: Changes<T>) => void;
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
|
|
5
|
+
export class Changes<T> extends Map<keyof T, { oldValue: unknown; newValue: unknown }> {}
|
|
6
|
+
|
|
7
|
+
export class ObservableInstanceMetadata<T> {
|
|
8
|
+
scheduler: Promise<void> | null = null;
|
|
9
|
+
changes: Changes<T> = new Changes();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class ObservableInstanceMetaDataStore extends WeakMap<
|
|
13
|
+
object,
|
|
14
|
+
ObservableInstanceMetadata<unknown>
|
|
15
|
+
> {
|
|
16
|
+
read<T extends object>(key: T): ObservableInstanceMetadata<T> {
|
|
7
17
|
let data = this.get(key);
|
|
8
18
|
|
|
9
19
|
if (!data) {
|
|
10
|
-
data =
|
|
20
|
+
data = new ObservableInstanceMetadata();
|
|
11
21
|
|
|
12
22
|
this.set(key, data);
|
|
13
23
|
}
|
|
14
24
|
|
|
15
25
|
return data;
|
|
16
26
|
}
|
|
17
|
-
|
|
18
|
-
abstract init(): Metadata;
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
export class
|
|
22
|
-
|
|
23
|
-
changes = new Set<string | symbol>();
|
|
29
|
+
export class ObservableMetadata<T> {
|
|
30
|
+
effects: Set<EffectFn<T>> = new Set();
|
|
24
31
|
}
|
|
25
32
|
|
|
26
|
-
export class
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
}
|
|
33
|
+
export class ObservableMetadataStore extends WeakMap<object, ObservableMetadata<unknown>> {
|
|
34
|
+
read<T extends object>(key: object): ObservableMetadata<T> {
|
|
35
|
+
let data = this.get(key);
|
|
31
36
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
37
|
+
if (!data) {
|
|
38
|
+
data = new ObservableMetadata();
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
this.set(key, data);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return data as ObservableMetadata<T>;
|
|
39
44
|
}
|
|
40
45
|
}
|
|
41
46
|
|
|
42
|
-
export const instanceMetadataStore =
|
|
43
|
-
|
|
47
|
+
export const instanceMetadataStore: ObservableInstanceMetaDataStore =
|
|
48
|
+
new ObservableInstanceMetaDataStore();
|
|
49
|
+
|
|
50
|
+
export const observableMetadataStore: ObservableMetadataStore = new ObservableMetadataStore();
|
package/src/lib/observe.test.ts
CHANGED
|
@@ -1,108 +1,102 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assert } from 'chai';
|
|
2
2
|
|
|
3
3
|
import { effect, observe } from './observe.js';
|
|
4
|
+
import { Changes } from './metadata.js';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
it('should work with static accessors', () => {
|
|
7
|
+
return new Promise<void>((resolve) => {
|
|
7
8
|
class Counter {
|
|
8
|
-
@observe
|
|
9
|
+
@observe()
|
|
10
|
+
static accessor value = 0;
|
|
9
11
|
|
|
10
|
-
@effect static onPropChanged() {
|
|
11
|
-
|
|
12
|
+
@effect() static onPropChanged() {
|
|
13
|
+
assert.equal(Counter.value, 1);
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
resolve();
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
assert.equal(Counter.value, 0);
|
|
18
20
|
|
|
19
21
|
Counter.value++;
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
assert.equal(Counter.value, 1);
|
|
22
24
|
});
|
|
25
|
+
});
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
it('should work with instance accessors', () => {
|
|
28
|
+
return new Promise<void>((resolve) => {
|
|
25
29
|
class Counter {
|
|
26
|
-
@observe
|
|
30
|
+
@observe()
|
|
31
|
+
accessor value = 0;
|
|
27
32
|
|
|
28
33
|
// confirm it works with private methods
|
|
29
34
|
// @ts-ignore
|
|
30
|
-
@effect #onChange() {
|
|
31
|
-
|
|
35
|
+
@effect() #onChange() {
|
|
36
|
+
assert.equal(this.value, 1);
|
|
32
37
|
|
|
33
|
-
|
|
38
|
+
resolve();
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
const counter = new Counter();
|
|
38
43
|
|
|
39
|
-
|
|
44
|
+
assert.equal(counter.value, 0);
|
|
40
45
|
|
|
41
46
|
counter.value++;
|
|
42
47
|
|
|
43
|
-
|
|
48
|
+
assert.equal(counter.value, 1);
|
|
44
49
|
});
|
|
50
|
+
});
|
|
45
51
|
|
|
46
|
-
|
|
52
|
+
it('should return a set of changed props', () => {
|
|
53
|
+
return new Promise<void>((resolve) => {
|
|
47
54
|
class Counter {
|
|
48
|
-
@observe accessor value = 0;
|
|
49
|
-
|
|
50
|
-
@effect onChange(changes: Set<symbol | string>) {
|
|
51
|
-
expect(changes.has('value')).to.be.true;
|
|
52
|
-
|
|
53
|
-
done();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const counter = new Counter();
|
|
58
|
-
counter.value++;
|
|
59
|
-
});
|
|
55
|
+
@observe() accessor value = 0;
|
|
60
56
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
@effect() onChange(changes: Changes<this>) {
|
|
58
|
+
assert.deepEqual(changes.get('value'), {
|
|
59
|
+
oldValue: 0,
|
|
60
|
+
newValue: 1
|
|
61
|
+
});
|
|
64
62
|
|
|
65
|
-
|
|
66
|
-
this.dispatchEvent(new Event('changed'));
|
|
63
|
+
resolve();
|
|
67
64
|
}
|
|
68
65
|
}
|
|
69
66
|
|
|
70
67
|
const counter = new Counter();
|
|
71
|
-
|
|
72
|
-
counter.addEventListener('changed', () => {
|
|
73
|
-
expect(counter.value).to.equal(1);
|
|
74
|
-
|
|
75
|
-
done();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
68
|
counter.value++;
|
|
79
69
|
});
|
|
70
|
+
});
|
|
80
71
|
|
|
81
|
-
|
|
72
|
+
it('should upgrade custom elements', () => {
|
|
73
|
+
return new Promise<void>((resolve) => {
|
|
82
74
|
class Counter extends HTMLElement {
|
|
83
|
-
@observe
|
|
75
|
+
@observe()
|
|
76
|
+
accessor value = 0;
|
|
84
77
|
|
|
85
78
|
constructor() {
|
|
86
79
|
super();
|
|
87
80
|
|
|
88
|
-
|
|
81
|
+
assert.equal(this.value, 100);
|
|
89
82
|
}
|
|
90
83
|
|
|
91
|
-
@effect onChange() {
|
|
92
|
-
|
|
84
|
+
@effect() onChange() {
|
|
85
|
+
assert.equal(this.value, 101);
|
|
93
86
|
|
|
94
|
-
|
|
87
|
+
resolve();
|
|
95
88
|
}
|
|
96
89
|
}
|
|
97
90
|
|
|
98
|
-
|
|
99
|
-
|
|
91
|
+
const el = document.createElement('observable-1') as Counter;
|
|
92
|
+
el.value = 100;
|
|
100
93
|
|
|
101
|
-
|
|
102
|
-
el.value++;
|
|
103
|
-
});
|
|
94
|
+
document.body.append(el);
|
|
104
95
|
|
|
105
|
-
|
|
96
|
+
customElements.whenDefined('observable-1').then(() => {
|
|
97
|
+
el.value++;
|
|
106
98
|
});
|
|
99
|
+
|
|
100
|
+
customElements.define('observable-1', Counter);
|
|
107
101
|
});
|
|
108
102
|
});
|
package/src/lib/observe.ts
CHANGED
|
@@ -1,51 +1,62 @@
|
|
|
1
1
|
import { EffectFn, instanceMetadataStore, observableMetadataStore } from './metadata.js';
|
|
2
2
|
|
|
3
|
-
export function observe
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
3
|
+
export function observe() {
|
|
4
|
+
return function observeDecorator<This extends object, Value>(
|
|
5
|
+
base: ClassAccessorDecoratorTarget<This, Value>,
|
|
6
|
+
ctx: ClassAccessorDecoratorContext<This, Value>
|
|
7
|
+
): ClassAccessorDecoratorResult<This, Value> {
|
|
8
|
+
const observableMeta = observableMetadataStore.read<This>(ctx.metadata);
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
init(value) {
|
|
12
|
+
let val: Value | null = null;
|
|
13
|
+
|
|
14
|
+
// START: Make upgradable custom elements work
|
|
15
|
+
try {
|
|
16
|
+
val = ctx.access.get(this);
|
|
17
|
+
} catch {}
|
|
18
|
+
|
|
19
|
+
if (val) {
|
|
20
|
+
Reflect.deleteProperty(this, ctx.name);
|
|
21
|
+
|
|
22
|
+
return val;
|
|
23
|
+
}
|
|
24
|
+
// END
|
|
25
|
+
|
|
26
|
+
return value;
|
|
27
|
+
},
|
|
28
|
+
set(value) {
|
|
29
|
+
const instanceMeta = instanceMetadataStore.read<This>(this);
|
|
30
|
+
|
|
31
|
+
if (instanceMeta.scheduler === null) {
|
|
32
|
+
instanceMeta.scheduler = Promise.resolve().then(() => {
|
|
33
|
+
for (let effect of observableMeta.effects) {
|
|
34
|
+
effect.call(this, instanceMeta.changes);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
instanceMeta.scheduler = null;
|
|
38
|
+
instanceMeta.changes.clear();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
instanceMeta.changes.set(ctx.name as keyof This, {
|
|
43
|
+
oldValue: base.get.call(this) as This[keyof This],
|
|
44
|
+
newValue: value as This[keyof This]
|
|
37
45
|
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
instanceMeta.changes.add(ctx.name);
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
base.set.call(this, value);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
44
50
|
};
|
|
45
51
|
}
|
|
46
52
|
|
|
47
|
-
export function effect
|
|
48
|
-
|
|
53
|
+
export function effect() {
|
|
54
|
+
return function effectDecorator<T extends object>(
|
|
55
|
+
value: EffectFn<T>,
|
|
56
|
+
ctx: ClassMethodDecoratorContext<T>
|
|
57
|
+
): void {
|
|
58
|
+
const data = observableMetadataStore.read<T>(ctx.metadata);
|
|
49
59
|
|
|
50
|
-
|
|
60
|
+
data.effects.add(value);
|
|
61
|
+
};
|
|
51
62
|
}
|
package/src/lib.ts
CHANGED
package/target/lib/metadata.d.ts
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
export type EffectFn = (changes:
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export type EffectFn<T> = (changes: Changes<T>) => void;
|
|
2
|
+
export declare class Changes<T> extends Map<keyof T, {
|
|
3
|
+
oldValue: unknown;
|
|
4
|
+
newValue: unknown;
|
|
5
|
+
}> {
|
|
5
6
|
}
|
|
6
|
-
export declare class ObservableInstanceMetadata {
|
|
7
|
+
export declare class ObservableInstanceMetadata<T> {
|
|
7
8
|
scheduler: Promise<void> | null;
|
|
8
|
-
changes:
|
|
9
|
+
changes: Changes<T>;
|
|
9
10
|
}
|
|
10
|
-
export declare class ObservableInstanceMetaDataStore extends
|
|
11
|
-
|
|
11
|
+
export declare class ObservableInstanceMetaDataStore extends WeakMap<object, ObservableInstanceMetadata<unknown>> {
|
|
12
|
+
read<T extends object>(key: T): ObservableInstanceMetadata<T>;
|
|
12
13
|
}
|
|
13
|
-
export declare class ObservableMetadata {
|
|
14
|
-
effects: Set<EffectFn
|
|
14
|
+
export declare class ObservableMetadata<T> {
|
|
15
|
+
effects: Set<EffectFn<T>>;
|
|
15
16
|
}
|
|
16
|
-
export declare class ObservableMetadataStore extends
|
|
17
|
-
|
|
17
|
+
export declare class ObservableMetadataStore extends WeakMap<object, ObservableMetadata<unknown>> {
|
|
18
|
+
read<T extends object>(key: object): ObservableMetadata<T>;
|
|
18
19
|
}
|
|
19
20
|
export declare const instanceMetadataStore: ObservableInstanceMetaDataStore;
|
|
20
21
|
export declare const observableMetadataStore: ObservableMetadataStore;
|
package/target/lib/metadata.js
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
Symbol.metadata ??= Symbol('Symbol.metadata');
|
|
2
|
-
export class
|
|
2
|
+
export class Changes extends Map {
|
|
3
|
+
}
|
|
4
|
+
export class ObservableInstanceMetadata {
|
|
5
|
+
scheduler = null;
|
|
6
|
+
changes = new Changes();
|
|
7
|
+
}
|
|
8
|
+
export class ObservableInstanceMetaDataStore extends WeakMap {
|
|
3
9
|
read(key) {
|
|
4
10
|
let data = this.get(key);
|
|
5
11
|
if (!data) {
|
|
6
|
-
data =
|
|
12
|
+
data = new ObservableInstanceMetadata();
|
|
7
13
|
this.set(key, data);
|
|
8
14
|
}
|
|
9
15
|
return data;
|
|
10
16
|
}
|
|
11
17
|
}
|
|
12
|
-
export class ObservableInstanceMetadata {
|
|
13
|
-
scheduler = null;
|
|
14
|
-
changes = new Set();
|
|
15
|
-
}
|
|
16
|
-
export class ObservableInstanceMetaDataStore extends MetadataStore {
|
|
17
|
-
init() {
|
|
18
|
-
return new ObservableInstanceMetadata();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
18
|
export class ObservableMetadata {
|
|
22
19
|
effects = new Set();
|
|
23
20
|
}
|
|
24
|
-
export class ObservableMetadataStore extends
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
export class ObservableMetadataStore extends WeakMap {
|
|
22
|
+
read(key) {
|
|
23
|
+
let data = this.get(key);
|
|
24
|
+
if (!data) {
|
|
25
|
+
data = new ObservableMetadata();
|
|
26
|
+
this.set(key, data);
|
|
27
|
+
}
|
|
28
|
+
return data;
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
export const instanceMetadataStore = new ObservableInstanceMetaDataStore();
|
|
@@ -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;AAIvD,MAAM,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAIvD,MAAM,OAAO,OAAW,SAAQ,GAAsD;CAAG;AAEzF,MAAM,OAAO,0BAA0B;IACrC,SAAS,GAAyB,IAAI,CAAC;IACvC,OAAO,GAAe,IAAI,OAAO,EAAE,CAAC;CACrC;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,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,OAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;CACvC;AAED,MAAM,OAAO,uBAAwB,SAAQ,OAA4C;IACvF,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,GAA4B,IAAI,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ObservableInstanceMetaDataStore } from './metadata.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
it('should return the same metadata object after init', () => {
|
|
13
|
-
const key = {};
|
|
14
|
-
const data = new ObservableInstanceMetaDataStore();
|
|
15
|
-
expect(data.read(key)).to.equal(data.read(key));
|
|
16
|
-
});
|
|
1
|
+
import { assert } from 'chai';
|
|
2
|
+
import { Changes, ObservableInstanceMetaDataStore } from './metadata.js';
|
|
3
|
+
it('should return default metadata', () => {
|
|
4
|
+
const key = {};
|
|
5
|
+
const data = new ObservableInstanceMetaDataStore().read(key);
|
|
6
|
+
assert.deepEqual(data, { changes: new Changes(), scheduler: null });
|
|
7
|
+
});
|
|
8
|
+
it('should return the same metadata object after init', () => {
|
|
9
|
+
const key = {};
|
|
10
|
+
const data = new ObservableInstanceMetaDataStore();
|
|
11
|
+
assert.equal(data.read(key), data.read(key));
|
|
17
12
|
});
|
|
18
13
|
//# sourceMappingURL=metadata.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/lib/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
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,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,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.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { EffectFn } from './metadata.js';
|
|
2
|
-
export declare function observe<This extends object, Value>(base: ClassAccessorDecoratorTarget<This, Value>, ctx: ClassAccessorDecoratorContext<This, Value>)
|
|
3
|
-
export declare function effect<T extends object>(value: EffectFn
|
|
2
|
+
export declare function observe(): <This extends object, Value>(base: ClassAccessorDecoratorTarget<This, Value>, ctx: ClassAccessorDecoratorContext<This, Value>) => ClassAccessorDecoratorResult<This, Value>;
|
|
3
|
+
export declare function effect(): <T extends object>(value: EffectFn<T>, ctx: ClassMethodDecoratorContext<T>) => void;
|
package/target/lib/observe.js
CHANGED
|
@@ -1,37 +1,44 @@
|
|
|
1
1
|
import { instanceMetadataStore, observableMetadataStore } from './metadata.js';
|
|
2
|
-
export function observe(
|
|
3
|
-
return {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
val =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
instanceMeta.scheduler
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
2
|
+
export function observe() {
|
|
3
|
+
return function observeDecorator(base, ctx) {
|
|
4
|
+
const observableMeta = observableMetadataStore.read(ctx.metadata);
|
|
5
|
+
return {
|
|
6
|
+
init(value) {
|
|
7
|
+
let val = null;
|
|
8
|
+
try {
|
|
9
|
+
val = ctx.access.get(this);
|
|
10
|
+
}
|
|
11
|
+
catch { }
|
|
12
|
+
if (val) {
|
|
13
|
+
Reflect.deleteProperty(this, ctx.name);
|
|
14
|
+
return val;
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
},
|
|
18
|
+
set(value) {
|
|
19
|
+
const instanceMeta = instanceMetadataStore.read(this);
|
|
20
|
+
if (instanceMeta.scheduler === null) {
|
|
21
|
+
instanceMeta.scheduler = Promise.resolve().then(() => {
|
|
22
|
+
for (let effect of observableMeta.effects) {
|
|
23
|
+
effect.call(this, instanceMeta.changes);
|
|
24
|
+
}
|
|
25
|
+
instanceMeta.scheduler = null;
|
|
26
|
+
instanceMeta.changes.clear();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
instanceMeta.changes.set(ctx.name, {
|
|
30
|
+
oldValue: base.get.call(this),
|
|
31
|
+
newValue: value
|
|
26
32
|
});
|
|
33
|
+
base.set.call(this, value);
|
|
27
34
|
}
|
|
28
|
-
|
|
29
|
-
base.set.call(this, value);
|
|
30
|
-
}
|
|
35
|
+
};
|
|
31
36
|
};
|
|
32
37
|
}
|
|
33
|
-
export function effect(
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
export function effect() {
|
|
39
|
+
return function effectDecorator(value, ctx) {
|
|
40
|
+
const data = observableMetadataStore.read(ctx.metadata);
|
|
41
|
+
data.effects.add(value);
|
|
42
|
+
};
|
|
36
43
|
}
|
|
37
44
|
//# sourceMappingURL=observe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAEzF,MAAM,UAAU,OAAO,
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAEzF,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,GAAiB,IAAI,CAAC;gBAG7B,IAAI,CAAC;oBACH,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,IAAI,GAAG,EAAE,CAAC;oBACR,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,KAAK;gBACP,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;gBAE5D,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;oBACpC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;wBACnD,KAAK,IAAI,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;4BAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;wBAC1C,CAAC;wBAED,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;wBAC9B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC/B,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAkB,EAAE;oBAC/C,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAqB;oBACjD,QAAQ,EAAE,KAAyB;iBACpC,CAAC,CAAC;gBAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esDecorate, __runInitializers, __setFunctionName } from "tslib";
|
|
2
|
-
import {
|
|
2
|
+
import { assert } from 'chai';
|
|
3
3
|
import { effect, observe } from './observe.js';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
it('should work with static accessors', () => {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
6
|
let Counter = (() => {
|
|
7
7
|
let _staticExtraInitializers = [];
|
|
8
8
|
let _static_value_decorators;
|
|
@@ -12,8 +12,8 @@ describe('observable: observe()', () => {
|
|
|
12
12
|
return class Counter {
|
|
13
13
|
static {
|
|
14
14
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
15
|
-
_static_value_decorators = [observe];
|
|
16
|
-
_static_onPropChanged_decorators = [effect];
|
|
15
|
+
_static_value_decorators = [observe()];
|
|
16
|
+
_static_onPropChanged_decorators = [effect()];
|
|
17
17
|
__esDecorate(this, null, _static_value_decorators, { kind: "accessor", name: "value", static: true, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _static_value_initializers, _static_value_extraInitializers);
|
|
18
18
|
__esDecorate(this, null, _static_onPropChanged_decorators, { kind: "method", name: "onPropChanged", static: true, private: false, access: { has: obj => "onPropChanged" in obj, get: obj => obj.onPropChanged }, metadata: _metadata }, null, _staticExtraInitializers);
|
|
19
19
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -22,19 +22,21 @@ describe('observable: observe()', () => {
|
|
|
22
22
|
static get value() { return Counter.#value_accessor_storage; }
|
|
23
23
|
static set value(value) { Counter.#value_accessor_storage = value; }
|
|
24
24
|
static onPropChanged() {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
assert.equal(Counter.value, 1);
|
|
26
|
+
resolve();
|
|
27
27
|
}
|
|
28
28
|
static {
|
|
29
29
|
__runInitializers(this, _static_value_extraInitializers);
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
})();
|
|
33
|
-
|
|
33
|
+
assert.equal(Counter.value, 0);
|
|
34
34
|
Counter.value++;
|
|
35
|
-
|
|
35
|
+
assert.equal(Counter.value, 1);
|
|
36
36
|
});
|
|
37
|
-
|
|
37
|
+
});
|
|
38
|
+
it('should work with instance accessors', () => {
|
|
39
|
+
return new Promise((resolve) => {
|
|
38
40
|
let Counter = (() => {
|
|
39
41
|
let _instanceExtraInitializers = [];
|
|
40
42
|
let _value_decorators;
|
|
@@ -45,12 +47,12 @@ describe('observable: observe()', () => {
|
|
|
45
47
|
return class Counter {
|
|
46
48
|
static {
|
|
47
49
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
48
|
-
_value_decorators = [observe];
|
|
49
|
-
_private_onChange_decorators = [effect];
|
|
50
|
+
_value_decorators = [observe()];
|
|
51
|
+
_private_onChange_decorators = [effect()];
|
|
50
52
|
__esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
|
|
51
53
|
__esDecorate(this, _private_onChange_descriptor = { value: __setFunctionName(function () {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
assert.equal(this.value, 1);
|
|
55
|
+
resolve();
|
|
54
56
|
}, "#onChange") }, _private_onChange_decorators, { kind: "method", name: "#onChange", static: false, private: true, access: { has: obj => #onChange in obj, get: obj => obj.#onChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
55
57
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
56
58
|
}
|
|
@@ -64,11 +66,13 @@ describe('observable: observe()', () => {
|
|
|
64
66
|
};
|
|
65
67
|
})();
|
|
66
68
|
const counter = new Counter();
|
|
67
|
-
|
|
69
|
+
assert.equal(counter.value, 0);
|
|
68
70
|
counter.value++;
|
|
69
|
-
|
|
71
|
+
assert.equal(counter.value, 1);
|
|
70
72
|
});
|
|
71
|
-
|
|
73
|
+
});
|
|
74
|
+
it('should return a set of changed props', () => {
|
|
75
|
+
return new Promise((resolve) => {
|
|
72
76
|
let Counter = (() => {
|
|
73
77
|
let _instanceExtraInitializers = [];
|
|
74
78
|
let _value_decorators;
|
|
@@ -78,8 +82,8 @@ describe('observable: observe()', () => {
|
|
|
78
82
|
return class Counter {
|
|
79
83
|
static {
|
|
80
84
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
81
|
-
_value_decorators = [observe];
|
|
82
|
-
_onChange_decorators = [effect];
|
|
85
|
+
_value_decorators = [observe()];
|
|
86
|
+
_onChange_decorators = [effect()];
|
|
83
87
|
__esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
|
|
84
88
|
__esDecorate(this, null, _onChange_decorators, { kind: "method", name: "onChange", static: false, private: false, access: { has: obj => "onChange" in obj, get: obj => obj.onChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
85
89
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -88,54 +92,23 @@ describe('observable: observe()', () => {
|
|
|
88
92
|
get value() { return this.#value_accessor_storage; }
|
|
89
93
|
set value(value) { this.#value_accessor_storage = value; }
|
|
90
94
|
onChange(changes) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
})();
|
|
99
|
-
const counter = new Counter();
|
|
100
|
-
counter.value++;
|
|
101
|
-
});
|
|
102
|
-
it('should work as an even emitter', (done) => {
|
|
103
|
-
let Counter = (() => {
|
|
104
|
-
let _classSuper = EventTarget;
|
|
105
|
-
let _instanceExtraInitializers = [];
|
|
106
|
-
let _value_decorators;
|
|
107
|
-
let _value_initializers = [];
|
|
108
|
-
let _value_extraInitializers = [];
|
|
109
|
-
let _onChange_decorators;
|
|
110
|
-
return class Counter extends _classSuper {
|
|
111
|
-
static {
|
|
112
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
113
|
-
_value_decorators = [observe];
|
|
114
|
-
_onChange_decorators = [effect];
|
|
115
|
-
__esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
|
|
116
|
-
__esDecorate(this, null, _onChange_decorators, { kind: "method", name: "onChange", static: false, private: false, access: { has: obj => "onChange" in obj, get: obj => obj.onChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
117
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
118
|
-
}
|
|
119
|
-
#value_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _value_initializers, 0));
|
|
120
|
-
get value() { return this.#value_accessor_storage; }
|
|
121
|
-
set value(value) { this.#value_accessor_storage = value; }
|
|
122
|
-
onChange() {
|
|
123
|
-
this.dispatchEvent(new Event('changed'));
|
|
95
|
+
assert.deepEqual(changes.get('value'), {
|
|
96
|
+
oldValue: 0,
|
|
97
|
+
newValue: 1
|
|
98
|
+
});
|
|
99
|
+
resolve();
|
|
124
100
|
}
|
|
125
101
|
constructor() {
|
|
126
|
-
super(...arguments);
|
|
127
102
|
__runInitializers(this, _value_extraInitializers);
|
|
128
103
|
}
|
|
129
104
|
};
|
|
130
105
|
})();
|
|
131
106
|
const counter = new Counter();
|
|
132
|
-
counter.addEventListener('changed', () => {
|
|
133
|
-
expect(counter.value).to.equal(1);
|
|
134
|
-
done();
|
|
135
|
-
});
|
|
136
107
|
counter.value++;
|
|
137
108
|
});
|
|
138
|
-
|
|
109
|
+
});
|
|
110
|
+
it('should upgrade custom elements', () => {
|
|
111
|
+
return new Promise((resolve) => {
|
|
139
112
|
let Counter = (() => {
|
|
140
113
|
let _classSuper = HTMLElement;
|
|
141
114
|
let _instanceExtraInitializers = [];
|
|
@@ -146,8 +119,8 @@ describe('observable: observe()', () => {
|
|
|
146
119
|
return class Counter extends _classSuper {
|
|
147
120
|
static {
|
|
148
121
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
149
|
-
_value_decorators = [observe];
|
|
150
|
-
_onChange_decorators = [effect];
|
|
122
|
+
_value_decorators = [observe()];
|
|
123
|
+
_onChange_decorators = [effect()];
|
|
151
124
|
__esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
|
|
152
125
|
__esDecorate(this, null, _onChange_decorators, { kind: "method", name: "onChange", static: false, private: false, access: { has: obj => "onChange" in obj, get: obj => obj.onChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
153
126
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -158,21 +131,21 @@ describe('observable: observe()', () => {
|
|
|
158
131
|
constructor() {
|
|
159
132
|
super();
|
|
160
133
|
__runInitializers(this, _value_extraInitializers);
|
|
161
|
-
|
|
134
|
+
assert.equal(this.value, 100);
|
|
162
135
|
}
|
|
163
136
|
onChange() {
|
|
164
|
-
|
|
165
|
-
|
|
137
|
+
assert.equal(this.value, 101);
|
|
138
|
+
resolve();
|
|
166
139
|
}
|
|
167
140
|
};
|
|
168
141
|
})();
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
customElements.define('observable-1', Counter);
|
|
142
|
+
const el = document.createElement('observable-1');
|
|
143
|
+
el.value = 100;
|
|
144
|
+
document.body.append(el);
|
|
145
|
+
customElements.whenDefined('observable-1').then(() => {
|
|
146
|
+
el.value++;
|
|
175
147
|
});
|
|
148
|
+
customElements.define('observable-1', Counter);
|
|
176
149
|
});
|
|
177
150
|
});
|
|
178
151
|
//# sourceMappingURL=observe.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.test.js","sourceRoot":"","sources":["../../src/lib/observe.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"observe.test.js","sourceRoot":"","sources":["../../src/lib/observe.test.ts"],"names":[],"mappings":"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"}
|
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"}
|
|
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,EAAE,MAAM,mBAAmB,CAAC"}
|
package/src/lib/watch.test.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { expect } from '@open-wc/testing';
|
|
2
|
-
|
|
3
|
-
import { observe } from './observe.js';
|
|
4
|
-
import { watch } from './watch.js';
|
|
5
|
-
|
|
6
|
-
describe('observable: observe()', () => {
|
|
7
|
-
it('should watch externally from the class', (done) => {
|
|
8
|
-
class Counter {
|
|
9
|
-
@observe static accessor value = 0;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
watch(Counter, () => {
|
|
13
|
-
expect(Counter.value).to.equal(1);
|
|
14
|
-
|
|
15
|
-
done();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
expect(Counter.value).to.equal(0);
|
|
19
|
-
|
|
20
|
-
Counter.value++;
|
|
21
|
-
|
|
22
|
-
expect(Counter.value).to.equal(1);
|
|
23
|
-
});
|
|
24
|
-
});
|
package/src/lib/watch.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { EffectFn, observableMetadataStore } from './metadata.js';
|
|
2
|
-
|
|
3
|
-
export function watch(value: new () => object, cb: EffectFn) {
|
|
4
|
-
const key = value[Symbol.metadata];
|
|
5
|
-
|
|
6
|
-
if (key) {
|
|
7
|
-
const meta = observableMetadataStore.read(key);
|
|
8
|
-
|
|
9
|
-
meta.effects.add(cb);
|
|
10
|
-
}
|
|
11
|
-
}
|
package/target/lib/watch.d.ts
DELETED
package/target/lib/watch.js
DELETED
package/target/lib/watch.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/lib/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,UAAU,KAAK,CAAC,KAAuB,EAAE,EAAY;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/target/lib/watch.test.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { expect } from '@open-wc/testing';
|
|
3
|
-
import { observe } from './observe.js';
|
|
4
|
-
import { watch } from './watch.js';
|
|
5
|
-
describe('observable: observe()', () => {
|
|
6
|
-
it('should watch externally from the class', (done) => {
|
|
7
|
-
let Counter = (() => {
|
|
8
|
-
let _static_value_decorators;
|
|
9
|
-
let _static_value_initializers = [];
|
|
10
|
-
let _static_value_extraInitializers = [];
|
|
11
|
-
return class Counter {
|
|
12
|
-
static {
|
|
13
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
14
|
-
_static_value_decorators = [observe];
|
|
15
|
-
__esDecorate(this, null, _static_value_decorators, { kind: "accessor", name: "value", static: true, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _static_value_initializers, _static_value_extraInitializers);
|
|
16
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
17
|
-
}
|
|
18
|
-
static #value_accessor_storage = __runInitializers(this, _static_value_initializers, 0);
|
|
19
|
-
static get value() { return Counter.#value_accessor_storage; }
|
|
20
|
-
static set value(value) { Counter.#value_accessor_storage = value; }
|
|
21
|
-
static {
|
|
22
|
-
__runInitializers(this, _static_value_extraInitializers);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
})();
|
|
26
|
-
watch(Counter, () => {
|
|
27
|
-
expect(Counter.value).to.equal(1);
|
|
28
|
-
done();
|
|
29
|
-
});
|
|
30
|
-
expect(Counter.value).to.equal(0);
|
|
31
|
-
Counter.value++;
|
|
32
|
-
expect(Counter.value).to.equal(1);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
//# sourceMappingURL=watch.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../src/lib/watch.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,wCAAwC,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,OAAO;;;;yBAAP,OAAO;;;gDACV,OAAO;oBAAC,0KAAgB,KAAK,6BAAL,KAAK,mGAAK;;;gBAA1B,MAAM,+EAAkB,CAAC,EAAC;gBAA1B,MAAM,KAAU,KAAK,YAD1B,OAAO,2BACwB;gBAA1B,WAAgB,KAAK,UAD1B,OAAO,mCACwB;;;;;;QAGrC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAElC,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAElC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|