@joist/observable 4.0.1-next.0 → 4.0.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/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 accessor todos: string[] = [];
16
- @observe accessor userName?: string;
15
+ @observe()
16
+ accessor todos: string[] = [];
17
17
 
18
- @effect onChange(changes: Set<string | symbol>) {
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.1-next.0",
3
+ "version": "4.0.1",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
7
7
  "exports": {
8
- ".": {
9
- "import": "./target/lib.js"
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": [],
@@ -1,21 +1,17 @@
1
- import { expect } from '@open-wc/testing';
2
- import { ObservableInstanceMetaDataStore } from './metadata.js';
1
+ import { assert } from "chai";
3
2
 
4
- describe('meta:meta', () => {
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
- expect(data).to.deep.equal({
10
- changes: new Set(),
11
- scheduler: null
12
- });
13
- });
5
+ it("should return default metadata", () => {
6
+ const key = {};
7
+ const data = new ObservableInstanceMetaDataStore().read(key);
14
8
 
15
- it('should return the same metadata object after init', () => {
16
- const key = {};
17
- const data = new ObservableInstanceMetaDataStore();
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
- expect(data.read(key)).to.equal(data.read(key));
20
- });
16
+ assert.equal(data.read(key), data.read(key));
21
17
  });
@@ -1,43 +1,57 @@
1
- (Symbol as any).metadata ??= Symbol('Symbol.metadata');
1
+ (Symbol as any).metadata ??= Symbol("Symbol.metadata");
2
2
 
3
- export type EffectFn = (changes: Set<string | symbol>) => void;
3
+ export type EffectFn<T> = (changes: Changes<T>) => void;
4
4
 
5
- export abstract class MetadataStore<Metadata> extends WeakMap<object, Metadata> {
6
- read(key: object): Metadata {
5
+ export class Changes<T> extends Map<
6
+ keyof T,
7
+ { oldValue: unknown; newValue: unknown }
8
+ > {}
9
+
10
+ export class ObservableInstanceMetadata<T> {
11
+ scheduler: Promise<void> | null = null;
12
+ changes: Changes<T> = new Changes();
13
+ }
14
+
15
+ export class ObservableInstanceMetaDataStore extends WeakMap<
16
+ object,
17
+ ObservableInstanceMetadata<unknown>
18
+ > {
19
+ read<T extends object>(key: T): ObservableInstanceMetadata<T> {
7
20
  let data = this.get(key);
8
21
 
9
22
  if (!data) {
10
- data = this.init();
23
+ data = new ObservableInstanceMetadata();
11
24
 
12
25
  this.set(key, data);
13
26
  }
14
27
 
15
28
  return data;
16
29
  }
17
-
18
- abstract init(): Metadata;
19
30
  }
20
31
 
21
- export class ObservableInstanceMetadata {
22
- scheduler: Promise<void> | null = null;
23
- changes = new Set<string | symbol>();
32
+ export class ObservableMetadata<T> {
33
+ effects: Set<EffectFn<T>> = new Set();
24
34
  }
25
35
 
26
- export class ObservableInstanceMetaDataStore extends MetadataStore<ObservableInstanceMetadata> {
27
- init() {
28
- return new ObservableInstanceMetadata();
29
- }
30
- }
36
+ export class ObservableMetadataStore extends WeakMap<
37
+ object,
38
+ ObservableMetadata<unknown>
39
+ > {
40
+ read<T extends object>(key: object): ObservableMetadata<T> {
41
+ let data = this.get(key);
31
42
 
32
- export class ObservableMetadata {
33
- effects: Set<EffectFn> = new Set();
34
- }
43
+ if (!data) {
44
+ data = new ObservableMetadata();
35
45
 
36
- export class ObservableMetadataStore extends MetadataStore<ObservableMetadata> {
37
- init() {
38
- return new ObservableMetadata();
46
+ this.set(key, data);
47
+ }
48
+
49
+ return data as ObservableMetadata<T>;
39
50
  }
40
51
  }
41
52
 
42
- export const instanceMetadataStore = new ObservableInstanceMetaDataStore();
43
- export const observableMetadataStore = new ObservableMetadataStore();
53
+ export const instanceMetadataStore: ObservableInstanceMetaDataStore =
54
+ new ObservableInstanceMetaDataStore();
55
+
56
+ export const observableMetadataStore: ObservableMetadataStore =
57
+ new ObservableMetadataStore();
@@ -1,108 +1,103 @@
1
- import { expect, fixture, html } from '@open-wc/testing';
1
+ import { assert } from "chai";
2
2
 
3
- import { effect, observe } from './observe.js';
3
+ import type { Changes } from "./metadata.js";
4
+ import { effect, observe } from "./observe.js";
4
5
 
5
- describe('observable: observe()', () => {
6
- it('should work with static accessors', (done) => {
6
+ it("should work with static accessors", () => {
7
+ return new Promise<void>((resolve) => {
8
+ // biome-ignore lint/complexity/noStaticOnlyClass: <explanation>
7
9
  class Counter {
8
- @observe static accessor value = 0;
10
+ @observe()
11
+ static accessor value = 0;
9
12
 
10
- @effect static onPropChanged() {
11
- expect(Counter.value).to.equal(1);
13
+ @effect() static onPropChanged() {
14
+ assert.equal(Counter.value, 1);
12
15
 
13
- done();
16
+ resolve();
14
17
  }
15
18
  }
16
19
 
17
- expect(Counter.value).to.equal(0);
20
+ assert.equal(Counter.value, 0);
18
21
 
19
22
  Counter.value++;
20
23
 
21
- expect(Counter.value).to.equal(1);
24
+ assert.equal(Counter.value, 1);
22
25
  });
26
+ });
23
27
 
24
- it('should work with instance accessors', (done) => {
28
+ it("should work with instance accessors", () => {
29
+ return new Promise<void>((resolve) => {
25
30
  class Counter {
26
- @observe accessor value = 0;
31
+ @observe()
32
+ accessor value = 0;
27
33
 
28
34
  // confirm it works with private methods
29
35
  // @ts-ignore
30
- @effect #onChange() {
31
- expect(this.value).to.equal(1);
36
+ @effect() #onChange() {
37
+ assert.equal(this.value, 1);
32
38
 
33
- done();
39
+ resolve();
34
40
  }
35
41
  }
36
42
 
37
43
  const counter = new Counter();
38
44
 
39
- expect(counter.value).to.equal(0);
45
+ assert.equal(counter.value, 0);
40
46
 
41
47
  counter.value++;
42
48
 
43
- expect(counter.value).to.equal(1);
49
+ assert.equal(counter.value, 1);
44
50
  });
51
+ });
45
52
 
46
- it('should return a set of changed props', (done) => {
53
+ it("should return a set of changed props", () => {
54
+ return new Promise<void>((resolve) => {
47
55
  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
- });
56
+ @observe() accessor value = 0;
60
57
 
61
- it('should work as an even emitter', (done) => {
62
- class Counter extends EventTarget {
63
- @observe accessor value = 0;
58
+ @effect() onChange(changes: Changes<this>) {
59
+ assert.deepEqual(changes.get("value"), {
60
+ oldValue: 0,
61
+ newValue: 1,
62
+ });
64
63
 
65
- @effect onChange() {
66
- this.dispatchEvent(new Event('changed'));
64
+ resolve();
67
65
  }
68
66
  }
69
67
 
70
68
  const counter = new Counter();
71
-
72
- counter.addEventListener('changed', () => {
73
- expect(counter.value).to.equal(1);
74
-
75
- done();
76
- });
77
-
78
69
  counter.value++;
79
70
  });
71
+ });
80
72
 
81
- it('should upgrade custom elements', (done) => {
73
+ it("should upgrade custom elements", () => {
74
+ return new Promise<void>((resolve) => {
82
75
  class Counter extends HTMLElement {
83
- @observe accessor value = 0;
76
+ @observe()
77
+ accessor value = 0;
84
78
 
85
79
  constructor() {
86
80
  super();
87
81
 
88
- expect(this.value).to.equal(100);
82
+ assert.equal(this.value, 100);
89
83
  }
90
84
 
91
- @effect onChange() {
92
- expect(this.value).to.equal(101);
85
+ @effect() onChange() {
86
+ assert.equal(this.value, 101);
93
87
 
94
- done();
88
+ resolve();
95
89
  }
96
90
  }
97
91
 
98
- fixture<any>(html`<observable-1></observable-1>`).then((el) => {
99
- el.value = 100;
92
+ const el = document.createElement("observable-1") as Counter;
93
+ el.value = 100;
100
94
 
101
- customElements.whenDefined('observable-1').then(() => {
102
- el.value++;
103
- });
95
+ document.body.append(el);
104
96
 
105
- customElements.define('observable-1', Counter);
97
+ customElements.whenDefined("observable-1").then(() => {
98
+ el.value++;
106
99
  });
100
+
101
+ customElements.define("observable-1", Counter);
107
102
  });
108
103
  });
@@ -1,51 +1,70 @@
1
- import { EffectFn, instanceMetadataStore, observableMetadataStore } from './metadata.js';
2
-
3
- export function observe<This extends object, Value>(
4
- base: ClassAccessorDecoratorTarget<This, Value>,
5
- ctx: ClassAccessorDecoratorContext<This, Value>
6
- ): ClassAccessorDecoratorResult<This, Value> {
7
- return {
8
- init(value) {
9
- let val: Value | null = null;
10
-
11
- // START: Make upgradable custom elements work
12
- try {
13
- val = ctx.access.get(this);
14
- } catch {}
15
-
16
- if (val) {
17
- delete (<any>this)[ctx.name];
18
-
19
- return val;
20
- }
21
- // END
22
-
23
- return value;
24
- },
25
- set(value) {
26
- const instanceMeta = instanceMetadataStore.read(this);
27
- const observableMeta = observableMetadataStore.read(ctx.metadata);
28
-
29
- if (instanceMeta.scheduler === null) {
30
- instanceMeta.scheduler = Promise.resolve().then(() => {
31
- for (let effect of observableMeta.effects) {
32
- effect.call(this, instanceMeta.changes);
33
- }
1
+ import {
2
+ type EffectFn,
3
+ instanceMetadataStore,
4
+ observableMetadataStore,
5
+ } from "./metadata.js";
6
+
7
+ export function observe() {
8
+ return function observeDecorator<This extends object, Value>(
9
+ base: ClassAccessorDecoratorTarget<This, Value>,
10
+ ctx: ClassAccessorDecoratorContext<This, Value>,
11
+ ): ClassAccessorDecoratorResult<This, Value> {
12
+ const observableMeta = observableMetadataStore.read<This>(ctx.metadata);
13
+
14
+ return {
15
+ init(value) {
16
+ let val: Value | null = null;
17
+
18
+ // START: Make upgradable custom elements work
19
+ try {
20
+ val = ctx.access.get(this);
21
+ } catch {}
22
+
23
+ if (val) {
24
+ Reflect.deleteProperty(this, ctx.name);
25
+
26
+ return val;
27
+ }
28
+ // END
34
29
 
35
- instanceMeta.scheduler = null;
36
- instanceMeta.changes.clear();
37
- });
38
- }
30
+ return value;
31
+ },
32
+ set(newValue: Value) {
33
+ const oldValue = base.get.call(this);
39
34
 
40
- instanceMeta.changes.add(ctx.name);
35
+ if (newValue !== oldValue) {
36
+ const instanceMeta = instanceMetadataStore.read<This>(this);
41
37
 
42
- base.set.call(this, value);
43
- }
38
+ if (instanceMeta.scheduler === null) {
39
+ instanceMeta.scheduler = Promise.resolve().then(() => {
40
+ for (const effect of observableMeta.effects) {
41
+ effect.call(this, instanceMeta.changes);
42
+ }
43
+
44
+ instanceMeta.scheduler = null;
45
+ instanceMeta.changes.clear();
46
+ });
47
+ }
48
+
49
+ instanceMeta.changes.set(ctx.name as keyof This, {
50
+ oldValue,
51
+ newValue,
52
+ });
53
+
54
+ base.set.call(this, newValue);
55
+ }
56
+ },
57
+ };
44
58
  };
45
59
  }
46
60
 
47
- export function effect<T extends object>(value: EffectFn, ctx: ClassMethodDecoratorContext<T>) {
48
- const data = observableMetadataStore.read(ctx.metadata);
61
+ export function effect() {
62
+ return function effectDecorator<T extends object>(
63
+ value: EffectFn<T>,
64
+ ctx: ClassMethodDecoratorContext<T>,
65
+ ): void {
66
+ const data = observableMetadataStore.read<T>(ctx.metadata);
49
67
 
50
- data.effects.add(value);
68
+ data.effects.add(value);
69
+ };
51
70
  }
package/src/lib.ts CHANGED
@@ -1 +1,2 @@
1
- export { observe, effect } from './lib/observe.js';
1
+ export { observe, effect } from "./lib/observe.js";
2
+ export { Changes } from "./lib/metadata.js";
@@ -1,20 +1,21 @@
1
- export type EffectFn = (changes: Set<string | symbol>) => void;
2
- export declare abstract class MetadataStore<Metadata> extends WeakMap<object, Metadata> {
3
- read(key: object): Metadata;
4
- abstract init(): Metadata;
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: Set<string | symbol>;
9
+ changes: Changes<T>;
9
10
  }
10
- export declare class ObservableInstanceMetaDataStore extends MetadataStore<ObservableInstanceMetadata> {
11
- init(): ObservableInstanceMetadata;
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 MetadataStore<ObservableMetadata> {
17
- init(): ObservableMetadata;
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;
@@ -1,29 +1,31 @@
1
- Symbol.metadata ??= Symbol('Symbol.metadata');
2
- export class MetadataStore extends WeakMap {
1
+ Symbol.metadata ??= Symbol("Symbol.metadata");
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 = this.init();
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 MetadataStore {
25
- init() {
26
- return new ObservableMetadata();
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,OAAgB,aAAwB,SAAQ,OAAyB;IAC7E,IAAI,CAAC,GAAW;QACd,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAEnB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CAGF;AAED,MAAM,OAAO,0BAA0B;IACrC,SAAS,GAAyB,IAAI,CAAC;IACvC,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;CACtC;AAED,MAAM,OAAO,+BAAgC,SAAQ,aAAyC;IAC5F,IAAI;QACF,OAAO,IAAI,0BAA0B,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,OAAO,GAAkB,IAAI,GAAG,EAAE,CAAC;CACpC;AAED,MAAM,OAAO,uBAAwB,SAAQ,aAAiC;IAC5E,IAAI;QACF,OAAO,IAAI,kBAAkB,EAAE,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,+BAA+B,EAAE,CAAC;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,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;AAIvD,MAAM,OAAO,OAAW,SAAQ,GAG/B;CAAG;AAEJ,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,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"}
@@ -1,18 +1,13 @@
1
- import { expect } from '@open-wc/testing';
2
- import { ObservableInstanceMetaDataStore } from './metadata.js';
3
- describe('meta:meta', () => {
4
- it('should return default metadata', () => {
5
- const key = {};
6
- const data = new ObservableInstanceMetaDataStore().read(key);
7
- expect(data).to.deep.equal({
8
- changes: new Set(),
9
- scheduler: null
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,kBAAkB,CAAC;AAC1C,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEhE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7D,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,OAAO,EAAE,IAAI,GAAG,EAAE;YAClB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC;QAEnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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"}
@@ -1,3 +1,3 @@
1
- import { EffectFn } from './metadata.js';
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, ctx: ClassMethodDecoratorContext<T>): void;
1
+ import { type EffectFn } from "./metadata.js";
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;
@@ -1,37 +1,47 @@
1
- import { instanceMetadataStore, observableMetadataStore } from './metadata.js';
2
- export function observe(base, ctx) {
3
- return {
4
- init(value) {
5
- let val = null;
6
- try {
7
- val = ctx.access.get(this);
8
- }
9
- catch { }
10
- if (val) {
11
- delete this[ctx.name];
12
- return val;
13
- }
14
- return value;
15
- },
16
- set(value) {
17
- const instanceMeta = instanceMetadataStore.read(this);
18
- const observableMeta = observableMetadataStore.read(ctx.metadata);
19
- if (instanceMeta.scheduler === null) {
20
- instanceMeta.scheduler = Promise.resolve().then(() => {
21
- for (let effect of observableMeta.effects) {
22
- effect.call(this, instanceMeta.changes);
1
+ import { instanceMetadataStore, observableMetadataStore, } from "./metadata.js";
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(newValue) {
19
+ const oldValue = base.get.call(this);
20
+ if (newValue !== oldValue) {
21
+ const instanceMeta = instanceMetadataStore.read(this);
22
+ if (instanceMeta.scheduler === null) {
23
+ instanceMeta.scheduler = Promise.resolve().then(() => {
24
+ for (const effect of observableMeta.effects) {
25
+ effect.call(this, instanceMeta.changes);
26
+ }
27
+ instanceMeta.scheduler = null;
28
+ instanceMeta.changes.clear();
29
+ });
23
30
  }
24
- instanceMeta.scheduler = null;
25
- instanceMeta.changes.clear();
26
- });
27
- }
28
- instanceMeta.changes.add(ctx.name);
29
- base.set.call(this, value);
30
- }
31
+ instanceMeta.changes.set(ctx.name, {
32
+ oldValue,
33
+ newValue,
34
+ });
35
+ base.set.call(this, newValue);
36
+ }
37
+ },
38
+ };
31
39
  };
32
40
  }
33
- export function effect(value, ctx) {
34
- const data = observableMetadataStore.read(ctx.metadata);
35
- data.effects.add(value);
41
+ export function effect() {
42
+ return function effectDecorator(value, ctx) {
43
+ const data = observableMetadataStore.read(ctx.metadata);
44
+ data.effects.add(value);
45
+ };
36
46
  }
37
47
  //# 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,CACrB,IAA+C,EAC/C,GAA+C;IAE/C,OAAO;QACL,IAAI,CAAC,KAAK;YACR,IAAI,GAAG,GAAiB,IAAI,CAAC;YAG7B,IAAI,CAAC;gBACH,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,IAAI,GAAG,EAAE,CAAC;gBACR,OAAa,IAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAE7B,OAAO,GAAG,CAAC;YACb,CAAC;YAGD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,GAAG,CAAC,KAAK;YACP,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAElE,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBACpC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBACnD,KAAK,IAAI,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;wBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBAC1C,CAAC;oBAED,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;oBAC9B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACL,CAAC;YAED,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAmB,KAAe,EAAE,GAAmC;IAC3F,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
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,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,QAAe;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAErC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;oBAE5D,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,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"}
@@ -1,8 +1,8 @@
1
1
  import { __esDecorate, __runInitializers, __setFunctionName } from "tslib";
2
- import { expect, fixture, html } from '@open-wc/testing';
3
- import { effect, observe } from './observe.js';
4
- describe('observable: observe()', () => {
5
- it('should work with static accessors', (done) => {
2
+ import { assert } from "chai";
3
+ import { effect, observe } from "./observe.js";
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
- expect(Counter.value).to.equal(1);
26
- done();
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
- expect(Counter.value).to.equal(0);
33
+ assert.equal(Counter.value, 0);
34
34
  Counter.value++;
35
- expect(Counter.value).to.equal(1);
35
+ assert.equal(Counter.value, 1);
36
36
  });
37
- it('should work with instance accessors', (done) => {
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
- expect(this.value).to.equal(1);
53
- done();
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
- expect(counter.value).to.equal(0);
69
+ assert.equal(counter.value, 0);
68
70
  counter.value++;
69
- expect(counter.value).to.equal(1);
71
+ assert.equal(counter.value, 1);
70
72
  });
71
- it('should return a set of changed props', (done) => {
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
- expect(changes.has('value')).to.be.true;
92
- done();
93
- }
94
- constructor() {
95
- __runInitializers(this, _value_extraInitializers);
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
- it('should upgrade custom elements', (done) => {
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
- expect(this.value).to.equal(100);
134
+ assert.equal(this.value, 100);
162
135
  }
163
136
  onChange() {
164
- expect(this.value).to.equal(101);
165
- done();
137
+ assert.equal(this.value, 101);
138
+ resolve();
166
139
  }
167
140
  };
168
141
  })();
169
- fixture(html `<observable-1></observable-1>`).then((el) => {
170
- el.value = 100;
171
- customElements.whenDefined('observable-1').then(() => {
172
- el.value++;
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":"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"}
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
@@ -1 +1,2 @@
1
- export { observe, effect } from './lib/observe.js';
1
+ export { observe, effect } from "./lib/observe.js";
2
+ export { Changes } from "./lib/metadata.js";
package/target/lib.js CHANGED
@@ -1,2 +1,3 @@
1
- export { observe, effect } from './lib/observe.js';
1
+ export { observe, effect } from "./lib/observe.js";
2
+ export { Changes } from "./lib/metadata.js";
2
3
  //# sourceMappingURL=lib.js.map
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"}
@@ -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
- }
@@ -1,2 +0,0 @@
1
- import { EffectFn } from './metadata.js';
2
- export declare function watch(value: new () => object, cb: EffectFn): void;
@@ -1,9 +0,0 @@
1
- import { observableMetadataStore } from './metadata.js';
2
- export function watch(value, cb) {
3
- const key = value[Symbol.metadata];
4
- if (key) {
5
- const meta = observableMetadataStore.read(key);
6
- meta.effects.add(cb);
7
- }
8
- }
9
- //# sourceMappingURL=watch.js.map
@@ -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 {};
@@ -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"}