react-obsidian 0.0.46 → 0.0.47

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.
Files changed (56) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/babel.config.js +1 -1
  3. package/dist/src/index.d.ts +3 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +6 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/model/Model.d.ts +4 -0
  8. package/dist/src/model/Model.d.ts.map +1 -0
  9. package/dist/src/model/Model.js +19 -0
  10. package/dist/src/model/Model.js.map +1 -0
  11. package/dist/src/observable/Observable.d.ts +1 -1
  12. package/dist/src/observable/Observable.d.ts.map +1 -1
  13. package/dist/src/observable/Observable.js +2 -1
  14. package/dist/src/observable/Observable.js.map +1 -1
  15. package/dist/src/observable/cold/ColdMediatorObservable.d.ts +18 -0
  16. package/dist/src/observable/cold/ColdMediatorObservable.d.ts.map +1 -0
  17. package/dist/src/observable/cold/ColdMediatorObservable.js +46 -0
  18. package/dist/src/observable/cold/ColdMediatorObservable.js.map +1 -0
  19. package/dist/src/observable/cold/useColdObservers.d.ts +3 -0
  20. package/dist/src/observable/cold/useColdObservers.d.ts.map +1 -0
  21. package/dist/src/observable/cold/useColdObservers.js +21 -0
  22. package/dist/src/observable/cold/useColdObservers.js.map +1 -0
  23. package/dist/src/observable/mapObservablesToValues.d.ts +3 -0
  24. package/dist/src/observable/mapObservablesToValues.d.ts.map +1 -0
  25. package/dist/src/observable/mapObservablesToValues.js +8 -0
  26. package/dist/src/observable/mapObservablesToValues.js.map +1 -0
  27. package/dist/src/observable/mediator/MediatorObservable.d.ts +6 -0
  28. package/dist/src/observable/mediator/MediatorObservable.d.ts.map +1 -0
  29. package/dist/src/observable/{MediatorObservable.js → mediator/MediatorObservable.js} +1 -1
  30. package/dist/src/observable/mediator/MediatorObservable.js.map +1 -0
  31. package/dist/src/observable/types.d.ts +3 -0
  32. package/dist/src/observable/types.d.ts.map +1 -1
  33. package/dist/src/observable/useObservers.d.ts +3 -0
  34. package/dist/src/observable/useObservers.d.ts.map +1 -0
  35. package/dist/src/observable/useObservers.js +21 -0
  36. package/dist/src/observable/useObservers.js.map +1 -0
  37. package/documentation/docs/documentation/installation.mdx +1 -1
  38. package/documentation/package-lock.json +7 -7
  39. package/documentation/package.json +1 -1
  40. package/global.d.ts +1 -0
  41. package/jest.config.js +2 -1
  42. package/package.json +10 -8
  43. package/src/index.ts +4 -1
  44. package/src/model/Model.ts +15 -0
  45. package/src/observable/Observable.ts +2 -1
  46. package/src/observable/cold/ColdMediatorObservable.ts +47 -0
  47. package/src/observable/cold/useColdObservers.ts +23 -0
  48. package/src/observable/mapObservablesToValues.ts +7 -0
  49. package/src/observable/mediator/MediatorObservable.ts +9 -0
  50. package/src/observable/types.ts +2 -0
  51. package/src/observable/useObservers.ts +21 -0
  52. package/tsconfig.base.json +2 -1
  53. package/dist/src/observable/MediatorObservable.d.ts +0 -6
  54. package/dist/src/observable/MediatorObservable.d.ts.map +0 -1
  55. package/dist/src/observable/MediatorObservable.js.map +0 -1
  56. package/src/observable/MediatorObservable.ts +0 -9
@@ -0,0 +1,5 @@
1
+ {
2
+ "cSpell.words": [
3
+ "unmagler"
4
+ ]
5
+ }
package/babel.config.js CHANGED
@@ -7,7 +7,7 @@ module.exports = {
7
7
  plugins: [
8
8
  `${__dirname}/dist/transformers/babel-plugin-obsidian`,
9
9
  ['@babel/plugin-proposal-decorators', { legacy: true }],
10
- '@babel/plugin-proposal-class-properties',
10
+ '@babel/plugin-transform-class-properties',
11
11
  'babel-plugin-parameter-decorator'
12
12
  ],
13
13
  };
@@ -15,8 +15,10 @@ export declare const Obsidian: _Obsidian;
15
15
  export { injectComponent } from './injectors/components/InjectComponent';
16
16
  export { injectHook, injectHookWithArguments } from './injectors/hooks/InjectHook';
17
17
  export { useObserver } from './observable/useObserver';
18
+ export { useObservers } from './observable/useObservers';
18
19
  export { Observable } from './observable/Observable';
19
- export { MediatorObservable } from './observable/MediatorObservable';
20
+ export { MediatorObservable } from './observable/mediator/MediatorObservable';
20
21
  export { OnNext, Unsubscribe } from './observable/types';
22
+ export { Model } from './model/Model';
21
23
  export { testKit } from '../testkit';
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvF,eAAO,MAAM,QAAQ,WAAkB,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvF,eAAO,MAAM,QAAQ,WAAkB,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
package/dist/src/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.testKit = exports.MediatorObservable = exports.Observable = exports.useObserver = exports.injectHookWithArguments = exports.injectHook = exports.injectComponent = exports.Obsidian = exports.GraphMiddleware = exports.LifecycleBound = exports.LateInject = exports.Inject = exports.Injectable = exports.Provides = exports.ObjectGraph = exports.Singleton = exports.Graph = void 0;
20
+ exports.testKit = exports.Model = exports.MediatorObservable = exports.Observable = exports.useObservers = exports.useObserver = exports.injectHookWithArguments = exports.injectHook = exports.injectComponent = exports.Obsidian = exports.GraphMiddleware = exports.LifecycleBound = exports.LateInject = exports.Inject = exports.Injectable = exports.Provides = exports.ObjectGraph = exports.Singleton = exports.Graph = void 0;
21
21
  const Obsidian_1 = __importDefault(require("./Obsidian"));
22
22
  __exportStar(require("./types"), exports);
23
23
  var Graph_1 = require("./decorators/Graph");
@@ -46,10 +46,14 @@ Object.defineProperty(exports, "injectHook", { enumerable: true, get: function (
46
46
  Object.defineProperty(exports, "injectHookWithArguments", { enumerable: true, get: function () { return InjectHook_1.injectHookWithArguments; } });
47
47
  var useObserver_1 = require("./observable/useObserver");
48
48
  Object.defineProperty(exports, "useObserver", { enumerable: true, get: function () { return useObserver_1.useObserver; } });
49
+ var useObservers_1 = require("./observable/useObservers");
50
+ Object.defineProperty(exports, "useObservers", { enumerable: true, get: function () { return useObservers_1.useObservers; } });
49
51
  var Observable_1 = require("./observable/Observable");
50
52
  Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return Observable_1.Observable; } });
51
- var MediatorObservable_1 = require("./observable/MediatorObservable");
53
+ var MediatorObservable_1 = require("./observable/mediator/MediatorObservable");
52
54
  Object.defineProperty(exports, "MediatorObservable", { enumerable: true, get: function () { return MediatorObservable_1.MediatorObservable; } });
55
+ var Model_1 = require("./model/Model");
56
+ Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return Model_1.Model; } });
53
57
  var testkit_1 = require("../testkit");
54
58
  Object.defineProperty(exports, "testKit", { enumerable: true, get: function () { return testkit_1.testKit; } });
55
59
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,0DAAmC;AAEnC,0CAAwB;AAExB,4CAA2C;AAAlC,8FAAA,KAAK,OAAA;AACd,oDAAmD;AAA1C,sGAAA,SAAS,OAAA;AAClB,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AAEpB,2DAA0D;AAAjD,oGAAA,QAAQ,OAAA;AACjB,6DAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,qDAAoD;AAA3C,gGAAA,MAAM,OAAA;AACf,6DAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,8DAA6D;AAApD,gHAAA,cAAc,OAAA;AACvB,oEAAmE;AAA1D,kHAAA,eAAe,OAAA;AAGX,QAAA,QAAQ,GAAG,IAAI,kBAAS,EAAE,CAAC;AAExC,0EAAyE;AAAhE,kHAAA,eAAe,OAAA;AACxB,2DAAmF;AAA1E,wGAAA,UAAU,OAAA;AAAE,qHAAA,uBAAuB,OAAA;AAE5C,wDAAuD;AAA9C,0GAAA,WAAW,OAAA;AACpB,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AACnB,sEAAqE;AAA5D,wHAAA,kBAAkB,OAAA;AAG3B,sCAAqC;AAA5B,kGAAA,OAAO,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,0DAAmC;AAEnC,0CAAwB;AAExB,4CAA2C;AAAlC,8FAAA,KAAK,OAAA;AACd,oDAAmD;AAA1C,sGAAA,SAAS,OAAA;AAClB,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AAEpB,2DAA0D;AAAjD,oGAAA,QAAQ,OAAA;AACjB,6DAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,qDAAoD;AAA3C,gGAAA,MAAM,OAAA;AACf,6DAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,8DAA6D;AAApD,gHAAA,cAAc,OAAA;AACvB,oEAAmE;AAA1D,kHAAA,eAAe,OAAA;AAGX,QAAA,QAAQ,GAAG,IAAI,kBAAS,EAAE,CAAC;AAExC,0EAAyE;AAAhE,kHAAA,eAAe,OAAA;AACxB,2DAAmF;AAA1E,wGAAA,UAAU,OAAA;AAAE,qHAAA,uBAAuB,OAAA;AAE5C,wDAAuD;AAA9C,0GAAA,WAAW,OAAA;AACpB,0DAAyD;AAAhD,4GAAA,YAAY,OAAA;AACrB,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AACnB,+EAA8E;AAArE,wHAAA,kBAAkB,OAAA;AAG3B,uCAAsC;AAA7B,8FAAA,KAAK,OAAA;AAEd,sCAAqC;AAA5B,kGAAA,OAAO,OAAA"}
@@ -0,0 +1,4 @@
1
+ export declare abstract class Model {
2
+ use<T extends Model>(this: T): import("../observable/types").ObservedValues<T>;
3
+ }
4
+ //# sourceMappingURL=Model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../../src/model/Model.ts"],"names":[],"mappings":"AAGA,8BAAsB,KAAK;IAClB,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC;CAUpC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Model = void 0;
4
+ const useColdObservers_1 = require("../observable/cold/useColdObservers");
5
+ const Observable_1 = require("../observable/Observable");
6
+ class Model {
7
+ use() {
8
+ const observables = {};
9
+ Object.getOwnPropertyNames(this).forEach((propertyName) => {
10
+ const property = this[propertyName];
11
+ if (property instanceof Observable_1.Observable) {
12
+ observables[propertyName] = property;
13
+ }
14
+ });
15
+ return (0, useColdObservers_1.useColdObservables)(observables);
16
+ }
17
+ }
18
+ exports.Model = Model;
19
+ //# sourceMappingURL=Model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Model.js","sourceRoot":"","sources":["../../../src/model/Model.ts"],"names":[],"mappings":";;;AAAA,0EAAyE;AACzE,yDAAsD;AAEtD,MAAsB,KAAK;IAClB,GAAG;QACR,MAAM,WAAW,GAAoC,EAAE,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,YAAoB,EAAE,EAAE;YAChE,MAAM,QAAQ,GAAI,IAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,QAAQ,YAAY,uBAAU,EAAE;gBAClC,WAAW,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;aACtC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAA,qCAAkB,EAAI,WAAkB,CAAC,CAAC;IACnD,CAAC;CACF;AAXD,sBAWC"}
@@ -5,7 +5,7 @@ export declare class Observable<T> implements IObservable<T> {
5
5
  constructor(initialValue?: T);
6
6
  get value(): T;
7
7
  set value(value: T);
8
- subscribe(onNext: OnNext<T>): Unsubscribe;
8
+ subscribe(onNext?: OnNext<T>): Unsubscribe;
9
9
  unsubscribe(onNext: OnNext<T>): void;
10
10
  }
11
11
  //# sourceMappingURL=Observable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,CAAC,EAAE,CAAC;IAI5B,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,CAAC,EAGxB;IAEM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW;IAQzC,WAAW,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC;CAMpC"}
1
+ {"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGzE,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,CAAC,EAAE,CAAC;IAI5B,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,CAAC,EAGxB;IAEM,SAAS,CAAC,MAAM,GAAE,MAAM,CAAC,CAAC,CAAQ,GAAG,WAAW;IAQhD,WAAW,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC;CAMpC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Observable = void 0;
4
+ const NOOP = () => { };
4
5
  class Observable {
5
6
  constructor(initialValue) {
6
7
  this.subscribers = new Set();
@@ -13,7 +14,7 @@ class Observable {
13
14
  this.currentValue = value;
14
15
  this.subscribers.forEach((subscriber) => subscriber(value));
15
16
  }
16
- subscribe(onNext) {
17
+ subscribe(onNext = NOOP) {
17
18
  if (this.subscribers.has(onNext)) {
18
19
  throw new Error('Subscriber already subscribed');
19
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAIrB,YAAY,YAAgB;QAHpB,gBAAW,GAAmB,IAAI,GAAG,EAAE,CAAC;QAI9C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,YAAiB,CAAC;IAChC,CAAC;IAED,IAAW,KAAK,CAAC,KAAQ;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,SAAS,CAAC,MAAiB;QAChC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEM,WAAW,CAAC,MAAgB;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF;AA/BD,gCA+BC"}
1
+ {"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":";;;AAEA,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACtB,MAAa,UAAU;IAIrB,YAAY,YAAgB;QAHpB,gBAAW,GAAmB,IAAI,GAAG,EAAE,CAAC;QAI9C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,YAAiB,CAAC;IAChC,CAAC;IAED,IAAW,KAAK,CAAC,KAAQ;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,SAAS,CAAC,SAAoB,IAAI;QACvC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEM,WAAW,CAAC,MAAgB;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF;AA/BD,gCA+BC"}
@@ -0,0 +1,18 @@
1
+ import { MediatorObservable } from '../mediator/MediatorObservable';
2
+ export declare class ColdMediatorObservable<T extends object> extends MediatorObservable<T> {
3
+ private readonly handler;
4
+ constructor(obj: T, handler?: PropertyAccessTrackingProxy<T>);
5
+ set value(_: T);
6
+ get value(): T;
7
+ setValue(key: keyof T, value: any): void;
8
+ }
9
+ declare class PropertyAccessTrackingProxy<T extends object> implements ProxyHandler<T> {
10
+ private readonly accessedProperties;
11
+ private trackingSuspended;
12
+ get(target: T, p: string | symbol, receiver: any): (string extends infer T_1 ? T_1 extends string ? T_1 extends keyof T ? T[T_1] : any : never : never) | (symbol extends infer T_2 ? T_2 extends symbol ? T_2 extends keyof T ? T[T_2] : any : never : never);
13
+ hasAccessedProperty(key: keyof T): boolean;
14
+ suspendTracking(): void;
15
+ resumeTracking(): void;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=ColdMediatorObservable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColdMediatorObservable.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,qBAAa,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAhC,GAAG,EAAE,CAAC,EAAmB,OAAO,iCAAuC;IAInF,IAAa,KAAK,CAAC,CAAC,EAAE,CAAC,EAEtB;IAED,IAAa,KAAK,IAAI,CAAC,CAEtB;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG;CAOlC;AAED,cAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IACzD,OAAO,CAAC,iBAAiB,CAAS;IAElC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG;IAOhD,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC;IAIzB,eAAe;IAIf,cAAc;CAGtB"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ColdMediatorObservable = void 0;
4
+ const MediatorObservable_1 = require("../mediator/MediatorObservable");
5
+ class ColdMediatorObservable extends MediatorObservable_1.MediatorObservable {
6
+ constructor(obj, handler = new PropertyAccessTrackingProxy()) {
7
+ super(new Proxy(obj, handler));
8
+ this.handler = handler;
9
+ }
10
+ set value(_) {
11
+ throw new Error('Cannot set value of ColdMediatorObservable, use setValue(value, key) instead');
12
+ }
13
+ get value() {
14
+ return super.value;
15
+ }
16
+ setValue(key, value) {
17
+ if (this.handler.hasAccessedProperty(key)) {
18
+ this.handler.suspendTracking();
19
+ super.value = { ...this.value, [key]: value };
20
+ this.handler.resumeTracking();
21
+ }
22
+ }
23
+ }
24
+ exports.ColdMediatorObservable = ColdMediatorObservable;
25
+ class PropertyAccessTrackingProxy {
26
+ constructor() {
27
+ this.accessedProperties = new Set();
28
+ this.trackingSuspended = false;
29
+ }
30
+ get(target, p, receiver) {
31
+ if (!this.trackingSuspended) {
32
+ this.accessedProperties.add(p);
33
+ }
34
+ return Reflect.get(target, p, receiver);
35
+ }
36
+ hasAccessedProperty(key) {
37
+ return this.accessedProperties.has(key);
38
+ }
39
+ suspendTracking() {
40
+ this.trackingSuspended = true;
41
+ }
42
+ resumeTracking() {
43
+ this.trackingSuspended = false;
44
+ }
45
+ }
46
+ //# sourceMappingURL=ColdMediatorObservable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColdMediatorObservable.js","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAEpE,MAAa,sBAAyC,SAAQ,uCAAqB;IACjF,YAAY,GAAM,EAAmB,UAAU,IAAI,2BAA2B,EAAK;QACjF,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QADI,YAAO,GAAP,OAAO,CAAuC;IAEnF,CAAC;IAED,IAAa,KAAK,CAAC,CAAI;QACrB,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,IAAa,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,GAAY,EAAE,KAAU;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;SAC/B;IACH,CAAC;CACF;AApBD,wDAoBC;AAED,MAAM,2BAA2B;IAAjC;QACmB,uBAAkB,GAAG,IAAI,GAAG,EAAW,CAAC;QACjD,sBAAiB,GAAG,KAAK,CAAC;IAoBpC,CAAC;IAlBC,GAAG,CAAC,MAAS,EAAE,CAAkB,EAAE,QAAa;QAC9C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAY,CAAC,CAAC;SAC3C;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,mBAAmB,CAAC,GAAY;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import { ObservedValues } from '../types';
2
+ export declare function useColdObservables<T extends Record<string, any>>(observables: T): ObservedValues<T>;
3
+ //# sourceMappingURL=useColdObservers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColdObservers.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAiBnG"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useColdObservables = void 0;
4
+ const react_1 = require("react");
5
+ const ColdMediatorObservable_1 = require("./ColdMediatorObservable");
6
+ const mapObservablesToValues_1 = require("../mapObservablesToValues");
7
+ function useColdObservables(observables) {
8
+ const [mediator] = (0, react_1.useState)(() => new ColdMediatorObservable_1.ColdMediatorObservable((0, mapObservablesToValues_1.mapObservablesToValues)(observables)));
9
+ const [values, setValues] = (0, react_1.useState)(() => mediator.value);
10
+ (0, react_1.useEffect)(() => {
11
+ Object.keys(observables).forEach((key) => {
12
+ mediator.addSource(observables[key], (value) => {
13
+ mediator.setValue(key, value);
14
+ });
15
+ });
16
+ return mediator.subscribe(setValues);
17
+ }, []);
18
+ return values;
19
+ }
20
+ exports.useColdObservables = useColdObservables;
21
+ //# sourceMappingURL=useColdObservers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColdObservers.js","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":";;;AAAA,iCAA4C;AAC5C,qEAAkE;AAElE,sEAAmE;AAEnE,SAAgB,kBAAkB,CAAgC,WAAc;IAC9E,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EACzB,GAAG,EAAE,CAAC,IAAI,+CAAsB,CAAI,IAAA,+CAAsB,EAAC,WAAW,CAAM,CAAC,CAC9E,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAA0B,CAAC,CAAC;IAEhF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,CAAC,IAAI,CAAC,WAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7C,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7C,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC;AAjBD,gDAiBC"}
@@ -0,0 +1,3 @@
1
+ import { ObservedValues } from './types';
2
+ export declare function mapObservablesToValues<T extends Record<string, any>>(observables: T): ObservedValues<T>;
3
+ //# sourceMappingURL=mapObservablesToValues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapObservablesToValues.d.ts","sourceRoot":"","sources":["../../../src/observable/mapObservablesToValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAIvG"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapObservablesToValues = void 0;
4
+ function mapObservablesToValues(observables) {
5
+ return Object.fromEntries(Object.entries(observables).map(([key, observable]) => [key, observable.value]));
6
+ }
7
+ exports.mapObservablesToValues = mapObservablesToValues;
8
+ //# sourceMappingURL=mapObservablesToValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapObservablesToValues.js","sourceRoot":"","sources":["../../../src/observable/mapObservablesToValues.ts"],"names":[],"mappings":";;;AAEA,SAAgB,sBAAsB,CAAgC,WAAc;IAClF,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAC3D,CAAC;AACzB,CAAC;AAJD,wDAIC"}
@@ -0,0 +1,6 @@
1
+ import { Observable } from '../Observable';
2
+ import { OnNext } from '../types';
3
+ export declare class MediatorObservable<T> extends Observable<T> {
4
+ addSource<S>(source: Observable<S>, onNext: OnNext<S>): this;
5
+ }
6
+ //# sourceMappingURL=MediatorObservable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediatorObservable.d.ts","sourceRoot":"","sources":["../../../../src/observable/mediator/MediatorObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IACtD,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAItD"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MediatorObservable = void 0;
4
- const Observable_1 = require("./Observable");
4
+ const Observable_1 = require("../Observable");
5
5
  class MediatorObservable extends Observable_1.Observable {
6
6
  addSource(source, onNext) {
7
7
  source.subscribe(onNext);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediatorObservable.js","sourceRoot":"","sources":["../../../../src/observable/mediator/MediatorObservable.ts"],"names":[],"mappings":";;;AAAA,8CAA2C;AAG3C,MAAa,kBAAsB,SAAQ,uBAAa;IACtD,SAAS,CAAI,MAAqB,EAAE,MAAiB;QACnD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AALD,gDAKC"}
@@ -4,4 +4,7 @@ export interface Observable<T> {
4
4
  value: T;
5
5
  subscribe(onNext: OnNext<T>): Unsubscribe;
6
6
  }
7
+ export type ObservedValues<T> = {
8
+ [K in keyof T]: T[K] extends Observable<infer R> ? R : never;
9
+ };
7
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/observable/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAC3C,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;CAC3C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/observable/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAC3C,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ObservedValues } from './types';
2
+ export declare function useObservers<T extends Record<string, any>>(observables: T): ObservedValues<T>;
3
+ //# sourceMappingURL=useObservers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObservers.d.ts","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAe7F"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useObservers = void 0;
4
+ const react_1 = require("react");
5
+ const MediatorObservable_1 = require("./mediator/MediatorObservable");
6
+ const mapObservablesToValues_1 = require("./mapObservablesToValues");
7
+ function useObservers(observables) {
8
+ const [values, setValues] = (0, react_1.useState)(() => (0, mapObservablesToValues_1.mapObservablesToValues)(observables));
9
+ (0, react_1.useEffect)(() => {
10
+ const mediator = new MediatorObservable_1.MediatorObservable();
11
+ Object.keys(observables).forEach((key) => {
12
+ mediator.addSource(observables[key], (value) => {
13
+ setValues({ ...values, [key]: value });
14
+ });
15
+ });
16
+ return mediator.subscribe();
17
+ }, []);
18
+ return values;
19
+ }
20
+ exports.useObservers = useObservers;
21
+ //# sourceMappingURL=useObservers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObservers.js","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":";;;AAAA,iCAA4C;AAC5C,sEAAmE;AAEnE,qEAAkE;AAElE,SAAgB,YAAY,CAAgC,WAAc;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAA,+CAAsB,EAAC,WAAW,CAAC,CAAC,CAAC;IAEhF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,IAAI,uCAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7C,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7C,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC;AAfD,oCAeC"}
@@ -49,7 +49,7 @@ module.exports = {
49
49
  plugins: [
50
50
  + react-obsidian/dist/transformers/babel-plugin-obsidian,
51
51
  + ['@babel/plugin-proposal-decorators', {legacy: true}],
52
- + ['@babel/plugin-proposal-class-properties', { legacy: true }],
52
+ + '@babel/plugin-transform-class-properties',
53
53
  + 'babel-plugin-parameter-decorator'
54
54
  ]
55
55
  };
@@ -12,7 +12,7 @@
12
12
  "@docusaurus/preset-classic": "2.2.0",
13
13
  "@mdx-js/react": "^1.6.22",
14
14
  "clsx": "^1.2.1",
15
- "enhancedocs-search": "^1.0.2",
15
+ "enhancedocs-search": "^1.1.0",
16
16
  "prism-react-renderer": "^1.3.5",
17
17
  "react": "^17.0.2",
18
18
  "react-dom": "^17.0.2"
@@ -5601,9 +5601,9 @@
5601
5601
  }
5602
5602
  },
5603
5603
  "node_modules/enhancedocs-search": {
5604
- "version": "1.0.2",
5605
- "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-1.0.2.tgz",
5606
- "integrity": "sha512-zxGZ1SfdLywBeKd2Nbq/Q4HjWtydduZnYe1zhVFoUdIluj6rq9Iy3/Cc7pI9sG46CyltFOFDIYKJgTLe5ivwsA==",
5604
+ "version": "1.1.0",
5605
+ "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-1.1.0.tgz",
5606
+ "integrity": "sha512-LyQRwlvh1jI2izXS4mY3oUvIMAOUI1luWB9vLACmTY030CI9j9jXx7jCU07WR7oLf9dUo3ZXGTJwB2WNv+Hz2A==",
5607
5607
  "dependencies": {
5608
5608
  "mixpanel-browser": "^2.47.0",
5609
5609
  "react-markdown": "^8.0.6",
@@ -17512,9 +17512,9 @@
17512
17512
  }
17513
17513
  },
17514
17514
  "enhancedocs-search": {
17515
- "version": "1.0.2",
17516
- "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-1.0.2.tgz",
17517
- "integrity": "sha512-zxGZ1SfdLywBeKd2Nbq/Q4HjWtydduZnYe1zhVFoUdIluj6rq9Iy3/Cc7pI9sG46CyltFOFDIYKJgTLe5ivwsA==",
17515
+ "version": "1.1.0",
17516
+ "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-1.1.0.tgz",
17517
+ "integrity": "sha512-LyQRwlvh1jI2izXS4mY3oUvIMAOUI1luWB9vLACmTY030CI9j9jXx7jCU07WR7oLf9dUo3ZXGTJwB2WNv+Hz2A==",
17518
17518
  "requires": {
17519
17519
  "mixpanel-browser": "^2.47.0",
17520
17520
  "react-markdown": "^8.0.6",
@@ -19,7 +19,7 @@
19
19
  "@docusaurus/preset-classic": "2.2.0",
20
20
  "@mdx-js/react": "^1.6.22",
21
21
  "clsx": "^1.2.1",
22
- "enhancedocs-search": "^1.0.2",
22
+ "enhancedocs-search": "^1.1.0",
23
23
  "prism-react-renderer": "^1.3.5",
24
24
  "react": "^17.0.2",
25
25
  "react-dom": "^17.0.2"
package/global.d.ts ADDED
@@ -0,0 +1 @@
1
+ import 'jest-extended';
package/jest.config.js CHANGED
@@ -8,7 +8,8 @@ const config = {
8
8
  'test',
9
9
  ],
10
10
  setupFilesAfterEnv: [
11
- './jest.setup-after-env.js'
11
+ './jest.setup-after-env.js',
12
+ 'jest-extended/all'
12
13
  ],
13
14
  testEnvironment: 'jsdom'
14
15
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-obsidian",
3
- "version": "0.0.46",
3
+ "version": "0.0.47",
4
4
  "description": "Dependency injection framework for React and React Native applications",
5
5
  "scripts": {
6
6
  "prepack": "npm run lint && tsc --project tsconfig.prod.json",
@@ -20,12 +20,13 @@
20
20
  "react": "*"
21
21
  },
22
22
  "devDependencies": {
23
- "@babel/core": "7.20.x",
24
- "@babel/plugin-proposal-decorators": "7.18.x",
25
- "@babel/preset-env": "7.20.x",
26
- "@babel/preset-react": "7.18.x",
27
- "@babel/preset-typescript": "7.18.x",
28
- "@babel/types": "7.20.x",
23
+ "@babel/core": "7.22.x",
24
+ "@babel/plugin-proposal-decorators": "7.22.x",
25
+ "@babel/plugin-transform-class-properties": "7.22.x",
26
+ "@babel/preset-env": "7.22.x",
27
+ "@babel/preset-react": "7.22.x",
28
+ "@babel/preset-typescript": "7.22.x",
29
+ "@babel/types": "7.22.x",
29
30
  "@johanblumenberg/ts-mockito": "1.x.x",
30
31
  "@testing-library/react": "14.x.x",
31
32
  "@testing-library/react-hooks": "^7.0.2",
@@ -48,6 +49,7 @@
48
49
  "eslint-plugin-unused-imports": "2.x.x",
49
50
  "jest": "29.5.x",
50
51
  "jest-environment-jsdom": "^29.5.0",
52
+ "jest-extended": "^4.0.0",
51
53
  "lodash": "^4.17.21",
52
54
  "react": "18.2.x",
53
55
  "react-dom": "18.2.x",
@@ -79,4 +81,4 @@
79
81
  "url": "https://github.com/wix-incubator/react-obsidian/issues"
80
82
  },
81
83
  "homepage": "https://github.com/wix-incubator/react-obsidian#readme"
82
- }
84
+ }
package/src/index.ts CHANGED
@@ -20,8 +20,11 @@ export { injectComponent } from './injectors/components/InjectComponent';
20
20
  export { injectHook, injectHookWithArguments } from './injectors/hooks/InjectHook';
21
21
 
22
22
  export { useObserver } from './observable/useObserver';
23
+ export { useObservers } from './observable/useObservers';
23
24
  export { Observable } from './observable/Observable';
24
- export { MediatorObservable } from './observable/MediatorObservable';
25
+ export { MediatorObservable } from './observable/mediator/MediatorObservable';
25
26
  export { OnNext, Unsubscribe } from './observable/types';
26
27
 
28
+ export { Model } from './model/Model';
29
+
27
30
  export { testKit } from '../testkit';
@@ -0,0 +1,15 @@
1
+ import { useColdObservables } from '../observable/cold/useColdObservers';
2
+ import { Observable } from '../observable/Observable';
3
+
4
+ export abstract class Model {
5
+ public use<T extends Model>(this: T) {
6
+ const observables: Record<string, Observable<any>> = {};
7
+ Object.getOwnPropertyNames(this).forEach((propertyName: string) => {
8
+ const property = (this as any)[propertyName];
9
+ if (property instanceof Observable) {
10
+ observables[propertyName] = property;
11
+ }
12
+ });
13
+ return useColdObservables<T>(observables as any);
14
+ }
15
+ }
@@ -1,5 +1,6 @@
1
1
  import { Observable as IObservable, OnNext, Unsubscribe } from './types';
2
2
 
3
+ const NOOP = () => {};
3
4
  export class Observable<T> implements IObservable<T> {
4
5
  private subscribers: Set<OnNext<T>> = new Set();
5
6
  private currentValue: T | undefined;
@@ -17,7 +18,7 @@ export class Observable<T> implements IObservable<T> {
17
18
  this.subscribers.forEach((subscriber) => subscriber(value));
18
19
  }
19
20
 
20
- public subscribe(onNext: OnNext<T>): Unsubscribe {
21
+ public subscribe(onNext: OnNext<T> = NOOP): Unsubscribe {
21
22
  if (this.subscribers.has(onNext)) {
22
23
  throw new Error('Subscriber already subscribed');
23
24
  }
@@ -0,0 +1,47 @@
1
+ import { MediatorObservable } from '../mediator/MediatorObservable';
2
+
3
+ export class ColdMediatorObservable<T extends object> extends MediatorObservable<T> {
4
+ constructor(obj: T, private readonly handler = new PropertyAccessTrackingProxy<T>()) {
5
+ super(new Proxy(obj, handler));
6
+ }
7
+
8
+ override set value(_: T) {
9
+ throw new Error('Cannot set value of ColdMediatorObservable, use setValue(value, key) instead');
10
+ }
11
+
12
+ override get value(): T {
13
+ return super.value;
14
+ }
15
+
16
+ setValue(key: keyof T, value: any) {
17
+ if (this.handler.hasAccessedProperty(key)) {
18
+ this.handler.suspendTracking();
19
+ super.value = { ...this.value, [key]: value };
20
+ this.handler.resumeTracking();
21
+ }
22
+ }
23
+ }
24
+
25
+ class PropertyAccessTrackingProxy<T extends object> implements ProxyHandler<T> {
26
+ private readonly accessedProperties = new Set<keyof T>();
27
+ private trackingSuspended = false;
28
+
29
+ get(target: T, p: string | symbol, receiver: any) {
30
+ if (!this.trackingSuspended) {
31
+ this.accessedProperties.add(p as keyof T);
32
+ }
33
+ return Reflect.get(target, p, receiver);
34
+ }
35
+
36
+ hasAccessedProperty(key: keyof T) {
37
+ return this.accessedProperties.has(key);
38
+ }
39
+
40
+ public suspendTracking() {
41
+ this.trackingSuspended = true;
42
+ }
43
+
44
+ public resumeTracking() {
45
+ this.trackingSuspended = false;
46
+ }
47
+ }
@@ -0,0 +1,23 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { ColdMediatorObservable } from './ColdMediatorObservable';
3
+ import { ObservedValues } from '../types';
4
+ import { mapObservablesToValues } from '../mapObservablesToValues';
5
+
6
+ export function useColdObservables<T extends Record<string, any>>(observables: T): ObservedValues<T> {
7
+ const [mediator] = useState(
8
+ () => new ColdMediatorObservable<T>(mapObservablesToValues(observables) as T),
9
+ );
10
+ const [values, setValues] = useState(() => mediator.value as ObservedValues<T>);
11
+
12
+ useEffect(() => {
13
+ Object.keys(observables as {}).forEach((key) => {
14
+ mediator.addSource(observables[key], (value) => {
15
+ mediator.setValue(key, value);
16
+ });
17
+ });
18
+
19
+ return mediator.subscribe(setValues);
20
+ }, []);
21
+
22
+ return values;
23
+ }
@@ -0,0 +1,7 @@
1
+ import { ObservedValues } from './types';
2
+
3
+ export function mapObservablesToValues<T extends Record<string, any>>(observables: T): ObservedValues<T> {
4
+ return Object.fromEntries(
5
+ Object.entries(observables).map(([key, observable]) => [key, observable.value]),
6
+ ) as ObservedValues<T>;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { Observable } from '../Observable';
2
+ import { OnNext } from '../types';
3
+
4
+ export class MediatorObservable<T> extends Observable<T> {
5
+ addSource<S>(source: Observable<S>, onNext: OnNext<S>) {
6
+ source.subscribe(onNext);
7
+ return this;
8
+ }
9
+ }
@@ -5,3 +5,5 @@ export interface Observable<T> {
5
5
  value: T;
6
6
  subscribe(onNext: OnNext<T>): Unsubscribe;
7
7
  }
8
+
9
+ export type ObservedValues<T> = { [K in keyof T]: T[K] extends Observable<infer R> ? R : never };
@@ -0,0 +1,21 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { MediatorObservable } from './mediator/MediatorObservable';
3
+ import { ObservedValues } from './types';
4
+ import { mapObservablesToValues } from './mapObservablesToValues';
5
+
6
+ export function useObservers<T extends Record<string, any>>(observables: T): ObservedValues<T> {
7
+ const [values, setValues] = useState(() => mapObservablesToValues(observables));
8
+
9
+ useEffect(() => {
10
+ const mediator = new MediatorObservable();
11
+ Object.keys(observables as {}).forEach((key) => {
12
+ mediator.addSource(observables[key], (value) => {
13
+ setValues({ ...values, [key]: value });
14
+ });
15
+ });
16
+
17
+ return mediator.subscribe();
18
+ }, []);
19
+
20
+ return values;
21
+ }
@@ -3,7 +3,8 @@
3
3
  "src/**/*",
4
4
  "transformers/**/*",
5
5
  "test/**/*",
6
- "./clearGraphs.ts"
6
+ "./clearGraphs.ts",
7
+ "global.d.ts"
7
8
  ],
8
9
  "exclude": [
9
10
  "node_modules",
@@ -1,6 +0,0 @@
1
- import { Observable } from './Observable';
2
- import { OnNext } from './types';
3
- export declare class MediatorObservable<T> extends Observable<T> {
4
- addSource<S>(source: Observable<S>, onNext: OnNext<S>): MediatorObservable<T>;
5
- }
6
- //# sourceMappingURL=MediatorObservable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediatorObservable.d.ts","sourceRoot":"","sources":["../../../src/observable/MediatorObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IACtD,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;CAI9E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediatorObservable.js","sourceRoot":"","sources":["../../../src/observable/MediatorObservable.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAG1C,MAAa,kBAAsB,SAAQ,uBAAa;IACtD,SAAS,CAAI,MAAqB,EAAE,MAAiB;QACnD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AALD,gDAKC"}
@@ -1,9 +0,0 @@
1
- import { Observable } from './Observable';
2
- import { OnNext } from './types';
3
-
4
- export class MediatorObservable<T> extends Observable<T> {
5
- addSource<S>(source: Observable<S>, onNext: OnNext<S>): MediatorObservable<T> {
6
- source.subscribe(onNext);
7
- return this;
8
- }
9
- }