react-rx 3.0.0-0 → 3.0.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.
Files changed (79) hide show
  1. package/dist/cjs/__tests__/strictmode.test.js +22 -62
  2. package/dist/cjs/__tests__/useObservable.test.js +32 -33
  3. package/dist/cjs/index.d.ts +2 -7
  4. package/dist/cjs/index.js +16 -26
  5. package/dist/cjs/useObservable.d.ts +0 -3
  6. package/dist/cjs/useObservable.js +58 -20
  7. package/dist/cjs/{useObservableCallback.js → useObservableEvent.js} +1 -2
  8. package/dist/es2015/__tests__/strictmode.test.js +6 -42
  9. package/dist/es2015/__tests__/useObservable.test.js +2 -3
  10. package/dist/es2015/index.d.ts +2 -7
  11. package/dist/es2015/index.js +2 -9
  12. package/dist/es2015/useObservable.d.ts +0 -3
  13. package/dist/es2015/useObservable.js +58 -19
  14. package/dist/es2015/{useObservableCallback.js → useObservableEvent.js} +1 -2
  15. package/dist/esm/__tests__/strictmode.test.js +8 -48
  16. package/dist/esm/__tests__/useObservable.test.js +2 -3
  17. package/dist/esm/index.d.ts +2 -7
  18. package/dist/esm/index.js +2 -9
  19. package/dist/esm/useObservable.d.ts +0 -3
  20. package/dist/esm/useObservable.js +58 -19
  21. package/dist/esm/{useObservableCallback.js → useObservableEvent.js} +1 -2
  22. package/package.json +35 -28
  23. package/src/__tests__/strictmode.test.ts +7 -52
  24. package/src/__tests__/useObservable.test.tsx +3 -3
  25. package/src/index.ts +2 -15
  26. package/src/useObservable.ts +75 -33
  27. package/src/{useObservableCallback.ts → useObservableEvent.ts} +1 -2
  28. package/dist/cjs/WithObservable.d.ts +0 -12
  29. package/dist/cjs/WithObservable.js +0 -16
  30. package/dist/cjs/__tests__/useAsObservable.test.d.ts +0 -1
  31. package/dist/cjs/__tests__/useAsObservable.test.js +0 -78
  32. package/dist/cjs/displayName.d.ts +0 -1
  33. package/dist/cjs/displayName.js +0 -14
  34. package/dist/cjs/reactiveComponent.d.ts +0 -8
  35. package/dist/cjs/reactiveComponent.js +0 -35
  36. package/dist/cjs/useAsObservable.d.ts +0 -10
  37. package/dist/cjs/useAsObservable.js +0 -47
  38. package/dist/cjs/useWithObservable.d.ts +0 -9
  39. package/dist/cjs/useWithObservable.js +0 -11
  40. package/dist/cjs/utils.d.ts +0 -7
  41. package/dist/cjs/utils.js +0 -38
  42. package/dist/es2015/WithObservable.d.ts +0 -12
  43. package/dist/es2015/WithObservable.js +0 -9
  44. package/dist/es2015/__tests__/useAsObservable.test.d.ts +0 -1
  45. package/dist/es2015/__tests__/useAsObservable.test.js +0 -73
  46. package/dist/es2015/displayName.d.ts +0 -1
  47. package/dist/es2015/displayName.js +0 -8
  48. package/dist/es2015/reactiveComponent.d.ts +0 -8
  49. package/dist/es2015/reactiveComponent.js +0 -30
  50. package/dist/es2015/useAsObservable.d.ts +0 -10
  51. package/dist/es2015/useAsObservable.js +0 -43
  52. package/dist/es2015/useWithObservable.d.ts +0 -9
  53. package/dist/es2015/useWithObservable.js +0 -7
  54. package/dist/es2015/utils.d.ts +0 -7
  55. package/dist/es2015/utils.js +0 -31
  56. package/dist/esm/WithObservable.d.ts +0 -12
  57. package/dist/esm/WithObservable.js +0 -13
  58. package/dist/esm/__tests__/useAsObservable.test.d.ts +0 -1
  59. package/dist/esm/__tests__/useAsObservable.test.js +0 -73
  60. package/dist/esm/displayName.d.ts +0 -1
  61. package/dist/esm/displayName.js +0 -10
  62. package/dist/esm/reactiveComponent.d.ts +0 -8
  63. package/dist/esm/reactiveComponent.js +0 -30
  64. package/dist/esm/useAsObservable.d.ts +0 -10
  65. package/dist/esm/useAsObservable.js +0 -43
  66. package/dist/esm/useWithObservable.d.ts +0 -9
  67. package/dist/esm/useWithObservable.js +0 -7
  68. package/dist/esm/utils.d.ts +0 -7
  69. package/dist/esm/utils.js +0 -31
  70. package/src/WithObservable.tsx +0 -29
  71. package/src/__tests__/useAsObservable.test.tsx +0 -95
  72. package/src/displayName.ts +0 -11
  73. package/src/reactiveComponent.ts +0 -63
  74. package/src/useAsObservable.ts +0 -66
  75. package/src/useWithObservable.ts +0 -24
  76. package/src/utils.ts +0 -48
  77. /package/dist/cjs/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
  78. /package/dist/es2015/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
  79. /package/dist/esm/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ while (_) try {
18
18
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
19
  if (y = 0, t) op = [op[0] & 2, t.value];
20
20
  switch (op[0]) {
@@ -36,24 +36,22 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ var react_1 = require("@testing-library/react");
40
+ var react_2 = require("react");
39
41
  var rxjs_1 = require("rxjs");
40
42
  var useObservable_1 = require("../useObservable");
41
- var react_1 = require("react");
42
- var react_2 = require("@testing-library/react");
43
- var useAsObservable_1 = require("../useAsObservable");
44
- var vitest_1 = require("vitest");
45
43
  var wait = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
46
44
  // NOTE: Jest runs NODE_ENV=test by default, which enables development flags for React
47
- (0, vitest_1.test)('Strict mode should trigger double mount effects and re-renders', function () { return __awaiter(void 0, void 0, void 0, function () {
45
+ test('Strict mode should trigger double mount effects and re-renders', function () { return __awaiter(void 0, void 0, void 0, function () {
48
46
  function ObservableComponent() {
49
- var observedValue = (0, useObservable_1.useObservable)(observable, 0);
50
- (0, react_1.useEffect)(function () {
47
+ (0, react_2.useEffect)(function () {
51
48
  mountCount++;
52
49
  }, []);
50
+ var observedValue = (0, useObservable_1.useObservable)(observable);
53
51
  returnedValues.push(observedValue);
54
- return (0, react_1.createElement)(react_1.Fragment, null, observedValue);
52
+ return (0, react_2.createElement)(react_2.Fragment, null, observedValue);
55
53
  }
56
- var subject, observable, returnedValues, mountCount, rerender;
54
+ var subject, observable, returnedValues, mountCount;
57
55
  return __generator(this, function (_a) {
58
56
  switch (_a.label) {
59
57
  case 0:
@@ -61,22 +59,22 @@ var wait = function (ms) { return new Promise(function (resolve) { return setTim
61
59
  observable = subject.asObservable();
62
60
  returnedValues = [];
63
61
  mountCount = 0;
64
- rerender = (0, react_2.render)((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)(ObservableComponent))).rerender;
65
- (0, vitest_1.expect)(mountCount).toBe(2);
66
- (0, vitest_1.expect)(returnedValues).toEqual([0, 0]);
62
+ (0, react_1.render)((0, react_2.createElement)(react_2.StrictMode, null, (0, react_2.createElement)(ObservableComponent)));
63
+ expect(mountCount).toEqual(2);
64
+ expect(returnedValues).toEqual([0, 0]);
67
65
  return [4 /*yield*/, wait(10)];
68
66
  case 1:
69
67
  _a.sent();
70
- (0, react_2.act)(function () { return subject.next(1); });
71
- (0, vitest_1.expect)(returnedValues).toEqual([0, 0, 1, 1]);
72
- (0, react_2.act)(function () { return subject.next(2); });
73
- (0, vitest_1.expect)(returnedValues).toEqual([0, 0, 1, 1, 2, 2]);
74
- (0, vitest_1.expect)(mountCount).toEqual(2);
68
+ (0, react_1.act)(function () { return subject.next(1); });
69
+ expect(returnedValues).toEqual([0, 0, 1, 1]);
70
+ (0, react_1.act)(function () { return subject.next(2); });
71
+ expect(returnedValues).toEqual([0, 0, 1, 1, 2, 2]);
72
+ expect(mountCount).toEqual(2);
75
73
  return [2 /*return*/];
76
74
  }
77
75
  });
78
76
  }); });
79
- (0, vitest_1.test)('Strict mode should unsubscribe the source observable on unmount', function () {
77
+ test('Strict mode should unsubscribe the source observable on unmount', function () {
80
78
  var subscribed = [];
81
79
  var unsubscribed = [];
82
80
  var nextId = 0;
@@ -89,48 +87,10 @@ var wait = function (ms) { return new Promise(function (resolve) { return setTim
89
87
  });
90
88
  function ObservableComponent() {
91
89
  (0, useObservable_1.useObservable)(observable);
92
- return (0, react_1.createElement)(react_1.Fragment, null);
90
+ return (0, react_2.createElement)(react_2.Fragment, null);
93
91
  }
94
- var rerender = (0, react_2.render)((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)(ObservableComponent))).rerender;
95
- (0, vitest_1.expect)(subscribed).toEqual([0, 1]);
96
- rerender((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)('div')));
97
- (0, vitest_1.expect)(unsubscribed).toEqual([0, 1]);
92
+ var rerender = (0, react_1.render)((0, react_2.createElement)(react_2.StrictMode, null, (0, react_2.createElement)(ObservableComponent))).rerender;
93
+ expect(subscribed).toEqual([0, 1]);
94
+ rerender((0, react_2.createElement)(react_2.StrictMode, null, (0, react_2.createElement)('div')));
95
+ expect(unsubscribed).toEqual([0, 1]);
98
96
  });
99
- (0, vitest_1.test)('useMemoObservable should unsubscribe the source observable on unmount', function () {
100
- var subscribed = [];
101
- var unsubscribed = [];
102
- var nextId = 0;
103
- function ObservableComponent() {
104
- (0, useObservable_1.useMemoObservable)(function () {
105
- return new rxjs_1.Observable(function () {
106
- var id = nextId++;
107
- subscribed.push(id);
108
- return function () {
109
- unsubscribed.push(id);
110
- };
111
- });
112
- }, []);
113
- return (0, react_1.createElement)(react_1.Fragment, null);
114
- }
115
- var rerender = (0, react_2.render)((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)(ObservableComponent))).rerender;
116
- (0, vitest_1.expect)(subscribed).toEqual([0, 1]);
117
- rerender((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)('div')));
118
- (0, vitest_1.expect)(unsubscribed).toEqual([0, 1]);
119
- });
120
- (0, vitest_1.test)('useAsObservable should work in strict mode', function () { return __awaiter(void 0, void 0, void 0, function () {
121
- function ObservableComponent(props) {
122
- var count$ = (0, useAsObservable_1.useAsObservable)(props.count);
123
- var count = (0, useObservable_1.useObservable)(count$, props.count);
124
- returnedValues.push(count);
125
- return (0, react_1.createElement)(react_1.Fragment, null, 'ok');
126
- }
127
- var returnedValues, rerender;
128
- return __generator(this, function (_a) {
129
- returnedValues = [];
130
- rerender = (0, react_2.render)((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)(ObservableComponent, { count: 0 }))).rerender;
131
- (0, vitest_1.expect)(returnedValues).toEqual([0, 0]);
132
- rerender((0, react_1.createElement)(react_1.StrictMode, null, (0, react_1.createElement)(ObservableComponent, { count: 1 })));
133
- (0, vitest_1.expect)(returnedValues).toEqual([0, 0, 0, 0, 1, 1]);
134
- return [2 /*return*/];
135
- });
136
- }); });
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var react_1 = require("@testing-library/react");
4
- var useObservable_1 = require("../useObservable");
4
+ var react_2 = require("react");
5
5
  var rxjs_1 = require("rxjs");
6
6
  var operators_1 = require("rxjs/operators");
7
- var react_2 = require("react");
8
- var vitest_1 = require("vitest");
9
- (0, vitest_1.test)('should subscribe immediately on component mount and unsubscribe on component unmount', function () {
7
+ var useObservable_1 = require("../useObservable");
8
+ test('should subscribe immediately on component mount and unsubscribe on component unmount', function () {
10
9
  var subscribed = false;
11
10
  var observable = new rxjs_1.Observable(function () {
12
11
  subscribed = true;
@@ -14,27 +13,27 @@ var vitest_1 = require("vitest");
14
13
  subscribed = false;
15
14
  };
16
15
  });
17
- (0, vitest_1.expect)(subscribed).toBe(false);
16
+ expect(subscribed).toBe(false);
18
17
  var unmount = (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(observable); }).unmount;
19
- (0, vitest_1.expect)(subscribed).toBe(true);
18
+ expect(subscribed).toBe(true);
20
19
  unmount();
21
- (0, vitest_1.expect)(subscribed).toBe(false);
20
+ expect(subscribed).toBe(false);
22
21
  });
23
- (0, vitest_1.test)('should only subscribe once when given same observable on re-renders', function () {
22
+ test('should only subscribe once when given same observable on re-renders', function () {
24
23
  var subscriptionCount = 0;
25
24
  var observable = new rxjs_1.Observable(function () {
26
25
  subscriptionCount++;
27
26
  });
28
- (0, vitest_1.expect)(subscriptionCount).toBe(0);
27
+ expect(subscriptionCount).toBe(0);
29
28
  var _a = (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(observable); }), unmount = _a.unmount, rerender = _a.rerender;
30
- (0, vitest_1.expect)(subscriptionCount).toBe(1);
29
+ expect(subscriptionCount).toBe(1);
31
30
  rerender();
32
- (0, vitest_1.expect)(subscriptionCount).toBe(1);
31
+ expect(subscriptionCount).toBe(1);
33
32
  unmount();
34
33
  (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(observable); });
35
- (0, vitest_1.expect)(subscriptionCount).toBe(2);
34
+ expect(subscriptionCount).toBe(2);
36
35
  });
37
- (0, vitest_1.test)('should not return undefined during render if initial value is given', function () {
36
+ test('should not return undefined during render if initial value is given', function () {
38
37
  var observable = (0, rxjs_1.timer)(100).pipe((0, operators_1.mapTo)('emitted value'));
39
38
  var returnedValues = [];
40
39
  function ObservableComponent() {
@@ -43,9 +42,9 @@ var vitest_1 = require("vitest");
43
42
  return (0, react_2.createElement)(react_2.Fragment, null, observedValue);
44
43
  }
45
44
  (0, react_1.render)((0, react_2.createElement)(ObservableComponent));
46
- (0, vitest_1.expect)(returnedValues).toEqual(vitest_1.expect.arrayContaining(['initial value']));
45
+ expect(returnedValues).toEqual(expect.arrayContaining(['initial value']));
47
46
  });
48
- (0, vitest_1.test)('should not return undefined during render if observable is sync', function () {
47
+ test('should not return undefined during render if observable is sync', function () {
49
48
  var observable = (0, rxjs_1.of)('initial value');
50
49
  var returnedValues = [];
51
50
  function ObservableComponent() {
@@ -54,9 +53,9 @@ var vitest_1 = require("vitest");
54
53
  return (0, react_2.createElement)(react_2.Fragment, null, observedValue);
55
54
  }
56
55
  (0, react_1.render)((0, react_2.createElement)(ObservableComponent));
57
- (0, vitest_1.expect)(returnedValues).toEqual(vitest_1.expect.arrayContaining(['initial value']));
56
+ expect(returnedValues).toEqual(expect.arrayContaining(['initial value']));
58
57
  });
59
- (0, vitest_1.test)('should return undefined during first render if observable is async', function () {
58
+ test('should return undefined during first render if observable is async', function () {
60
59
  var observable = (0, rxjs_1.scheduled)('async value', rxjs_1.asyncScheduler);
61
60
  var returnedValues = [];
62
61
  function ObservableComponent() {
@@ -65,53 +64,53 @@ var vitest_1 = require("vitest");
65
64
  return (0, react_2.createElement)(react_2.Fragment, null, observedValue);
66
65
  }
67
66
  (0, react_1.render)((0, react_2.createElement)(ObservableComponent));
68
- (0, vitest_1.expect)(returnedValues).toEqual(vitest_1.expect.arrayContaining([undefined]));
67
+ expect(returnedValues).toEqual(expect.arrayContaining([undefined]));
69
68
  });
70
- (0, vitest_1.test)('should have sync values from an observable as initial value', function () {
69
+ test('should have sync values from an observable as initial value', function () {
71
70
  var observable = (0, rxjs_1.of)('something sync');
72
71
  var result = (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(observable); }).result;
73
- (0, vitest_1.expect)(result.current).toBe('something sync');
72
+ expect(result.current).toBe('something sync');
74
73
  });
75
- (0, vitest_1.test)('should have undefined as initial value from delayed observables', function () {
74
+ test('should have undefined as initial value from delayed observables', function () {
76
75
  var _a = (0, react_1.renderHook)(function () {
77
76
  return (0, useObservable_1.useObservable)((0, rxjs_1.scheduled)('something async', rxjs_1.asyncScheduler));
78
77
  }), result = _a.result, unmount = _a.unmount;
79
- (0, vitest_1.expect)(result.current).toBeUndefined();
78
+ expect(result.current).toBeUndefined();
80
79
  unmount();
81
80
  });
82
- (0, vitest_1.test)('should have passed initialValue as initial value from delayed observables', function () {
81
+ test('should have passed initialValue as initial value from delayed observables', function () {
83
82
  var _a = (0, react_1.renderHook)(function () {
84
83
  return (0, useObservable_1.useObservable)((0, rxjs_1.scheduled)('something async', rxjs_1.asyncScheduler), 'initial');
85
84
  }), result = _a.result, unmount = _a.unmount;
86
- (0, vitest_1.expect)(result.current).toBe('initial');
85
+ expect(result.current).toBe('initial');
87
86
  unmount();
88
87
  });
89
- (0, vitest_1.test)('should update with values from observables', function () {
88
+ test('should update with values from observables', function () {
90
89
  var values$ = new rxjs_1.Subject();
91
90
  var _a = (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(values$); }), result = _a.result, unmount = _a.unmount;
92
- (0, vitest_1.expect)(result.current).toBe(undefined);
91
+ expect(result.current).toBe(undefined);
93
92
  (0, react_1.act)(function () { return values$.next('something'); });
94
- (0, vitest_1.expect)(result.current).toBe('something');
93
+ expect(result.current).toBe('something');
95
94
  (0, react_1.act)(function () { return values$.next('otherthing'); });
96
- (0, vitest_1.expect)(result.current).toBe('otherthing');
95
+ expect(result.current).toBe('otherthing');
97
96
  unmount();
98
97
  });
99
- (0, vitest_1.test)('should re-subscribe when receiving a new observable', function () {
98
+ test('should re-subscribe when receiving a new observable', function () {
100
99
  var first$ = new rxjs_1.Subject();
101
100
  var second$ = new rxjs_1.Subject();
102
101
  var current$ = first$;
103
102
  var _a = (0, react_1.renderHook)(function () { return (0, useObservable_1.useObservable)(current$, '!!initial!!'); }), result = _a.result, rerender = _a.rerender, unmount = _a.unmount;
104
103
  (0, react_1.act)(function () { return first$.next('first 1'); });
105
- (0, vitest_1.expect)(result.current).toBe('first 1');
104
+ expect(result.current).toBe('first 1');
106
105
  current$ = second$;
107
106
  rerender();
108
107
  // since observable #2 hasn't emitted a value yet, we should use the initial value
109
- (0, vitest_1.expect)(result.current).toBe('!!initial!!');
108
+ expect(result.current).toBe('!!initial!!');
110
109
  // Now we should be subscribed to second$ and it's emission should be returned
111
110
  (0, react_1.act)(function () { return second$.next('second 1'); });
112
- (0, vitest_1.expect)(result.current).toBe('second 1');
111
+ expect(result.current).toBe('second 1');
113
112
  // we should no longer be subscribed to the first and ignore any emissions
114
113
  (0, react_1.act)(function () { return first$.next('first 2'); });
115
- (0, vitest_1.expect)(result.current).toBe('second 1');
114
+ expect(result.current).toBe('second 1');
116
115
  unmount();
117
116
  });
@@ -1,7 +1,2 @@
1
- export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
2
- export { observeState, observeCallback, observeContext, observeElement } from './utils';
3
- export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
4
- export { observableCallback } from 'observable-callback';
5
- export { useObservable, useMemoObservable } from './useObservable';
6
- export { useAsObservable } from './useAsObservable';
7
- export { useObservableCallback } from './useObservableCallback';
1
+ export * from './useObservable';
2
+ export * from './useObservableEvent';
package/dist/cjs/index.js CHANGED
@@ -1,28 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useObservableCallback = exports.useAsObservable = exports.useMemoObservable = exports.useObservable = exports.observableCallback = exports.elementRef = exports.context = exports.handler = exports.state = exports.observeElement = exports.observeContext = exports.observeCallback = exports.observeState = exports.forwardRef = exports.rxComponent = exports.reactiveComponent = void 0;
4
- // Main package exports
5
- var reactiveComponent_1 = require("./reactiveComponent");
6
- Object.defineProperty(exports, "reactiveComponent", { enumerable: true, get: function () { return reactiveComponent_1.reactiveComponent; } });
7
- Object.defineProperty(exports, "rxComponent", { enumerable: true, get: function () { return reactiveComponent_1.reactiveComponent; } });
8
- Object.defineProperty(exports, "forwardRef", { enumerable: true, get: function () { return reactiveComponent_1.forwardRef; } });
9
- var utils_1 = require("./utils");
10
- Object.defineProperty(exports, "observeState", { enumerable: true, get: function () { return utils_1.observeState; } });
11
- Object.defineProperty(exports, "observeCallback", { enumerable: true, get: function () { return utils_1.observeCallback; } });
12
- Object.defineProperty(exports, "observeContext", { enumerable: true, get: function () { return utils_1.observeContext; } });
13
- Object.defineProperty(exports, "observeElement", { enumerable: true, get: function () { return utils_1.observeElement; } });
14
- var utils_2 = require("./utils");
15
- Object.defineProperty(exports, "state", { enumerable: true, get: function () { return utils_2.observeState; } });
16
- Object.defineProperty(exports, "handler", { enumerable: true, get: function () { return utils_2.observeCallback; } });
17
- Object.defineProperty(exports, "context", { enumerable: true, get: function () { return utils_2.observeContext; } });
18
- Object.defineProperty(exports, "elementRef", { enumerable: true, get: function () { return utils_2.observeElement; } });
19
- var observable_callback_1 = require("observable-callback");
20
- Object.defineProperty(exports, "observableCallback", { enumerable: true, get: function () { return observable_callback_1.observableCallback; } });
21
- // hooks
22
- var useObservable_1 = require("./useObservable");
23
- Object.defineProperty(exports, "useObservable", { enumerable: true, get: function () { return useObservable_1.useObservable; } });
24
- Object.defineProperty(exports, "useMemoObservable", { enumerable: true, get: function () { return useObservable_1.useMemoObservable; } });
25
- var useAsObservable_1 = require("./useAsObservable");
26
- Object.defineProperty(exports, "useAsObservable", { enumerable: true, get: function () { return useAsObservable_1.useAsObservable; } });
27
- var useObservableCallback_1 = require("./useObservableCallback");
28
- Object.defineProperty(exports, "useObservableCallback", { enumerable: true, get: function () { return useObservableCallback_1.useObservableCallback; } });
17
+ __exportStar(require("./useObservable"), exports);
18
+ __exportStar(require("./useObservableEvent"), exports);
@@ -1,7 +1,4 @@
1
1
  import { Observable } from 'rxjs';
2
- import { DependencyList } from 'react';
3
2
  export declare function useObservable<T>(observable: Observable<T>): T | undefined;
4
3
  export declare function useObservable<T>(observable: Observable<T>, initialValue: T): T;
5
4
  export declare function useObservable<T>(observable: Observable<T>, initialValue: () => T): T;
6
- export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList): T | undefined;
7
- export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList, initialValue: T | (() => T)): T;
@@ -1,31 +1,69 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useMemoObservable = exports.useObservable = void 0;
3
+ exports.useObservable = void 0;
4
4
  var react_1 = require("react");
5
5
  var operators_1 = require("rxjs/operators");
6
6
  function getValue(value) {
7
7
  return typeof value === 'function' ? value() : value;
8
8
  }
9
+ var cache = new WeakMap();
10
+ function getOrCreateStore(inputObservable, initialValue) {
11
+ if (!cache.has(inputObservable)) {
12
+ var entry_1 = { currentValue: initialValue };
13
+ entry_1.observable = inputObservable.pipe((0, operators_1.shareReplay)({ refCount: true, bufferSize: 1 }), (0, operators_1.tap)(function (value) { return (entry_1.currentValue = value); }));
14
+ // Eagerly subscribe to sync set `entry.currentValue` to what the observable returns
15
+ entry_1.subscription = entry_1.observable.subscribe();
16
+ cache.set(inputObservable, entry_1);
17
+ }
18
+ return cache.get(inputObservable);
19
+ }
9
20
  function useObservable(observable, initialValue) {
10
- var _a = (0, react_1.useState)(function () { return getValue(initialValue); }), value = _a[0], setValue = _a[1];
11
- var initialValueRef = (0, react_1.useRef)(initialValue);
12
- initialValueRef.current = initialValue;
21
+ /**
22
+ * Store the initialValue in a ref, as we don't want a changed `initialValue` to trigger a re-subscription.
23
+ * But we also don't want the initialValue to be stale if the observable changes.
24
+ */
25
+ var initialValueRef = (0, react_1.useRef)(getValue(initialValue));
26
+ /**
27
+ * Ensures that the initialValue is always up-to-date in case the observable changes.
28
+ */
13
29
  (0, react_1.useEffect)(function () {
14
- setValue(getValue(initialValueRef.current));
15
- var subscription = observable.pipe((0, operators_1.tap)(function (next) { return setValue(next); })).subscribe();
16
- return function () { return subscription.unsubscribe(); };
17
- }, [initialValueRef, observable]);
18
- return value;
19
- }
20
- exports.useObservable = useObservable;
21
- function useMemoObservable(observableOrFactory, deps, initialValue) {
22
- var _a = (0, react_1.useState)(function () { return getValue(initialValue); }), value = _a[0], setValue = _a[1];
30
+ initialValueRef.current = getValue(initialValue);
31
+ }, [initialValue]);
32
+ var _a = (0, react_1.useMemo)(function () {
33
+ var store = getOrCreateStore(observable, initialValueRef.current);
34
+ if (store.subscription.closed) {
35
+ store.subscription = store.observable.subscribe();
36
+ }
37
+ return [
38
+ function getSnapshot() {
39
+ // @TODO: perf opt opportunity: we could do `store.subscription.unsubscribe()` here to clear up some memory, as this subscription is only needed to provide a sync initialValue.
40
+ return store.currentValue;
41
+ },
42
+ function subscribe(callback) {
43
+ // @TODO: perf opt opportunity: we could do `store.subscription.unsubscribe()` here as we only need 1 subscription active to keep the observer alive
44
+ var sub = store.observable.subscribe(callback);
45
+ return function () {
46
+ sub.unsubscribe();
47
+ };
48
+ },
49
+ ];
50
+ }, [observable]), getSnapshot = _a[0], subscribe = _a[1];
51
+ var shouldRestoreSubscriptionRef = (0, react_1.useRef)(false);
23
52
  (0, react_1.useEffect)(function () {
24
- var subscription = getValue(observableOrFactory)
25
- .pipe((0, operators_1.tap)(function (next) { return setValue(next); }))
26
- .subscribe();
27
- return function () { return subscription.unsubscribe(); };
28
- }, deps);
29
- return value;
53
+ var store = getOrCreateStore(observable, initialValueRef.current);
54
+ if (shouldRestoreSubscriptionRef.current) {
55
+ if (store.subscription.closed) {
56
+ store.subscription = store.observable.subscribe();
57
+ }
58
+ shouldRestoreSubscriptionRef.current = false;
59
+ }
60
+ return function () {
61
+ // React StrictMode will call effects as `setup + teardown + setup` thus we can't trust this callback as "react is about to unmount"
62
+ // Tracking this ref lets us set the subscription back up on the next `setup` call if needed, and if it really did unmounted then all is well
63
+ shouldRestoreSubscriptionRef.current = !store.subscription.closed;
64
+ store.subscription.unsubscribe();
65
+ };
66
+ }, [observable]);
67
+ return (0, react_1.useSyncExternalStore)(subscribe, getSnapshot);
30
68
  }
31
- exports.useMemoObservable = useMemoObservable;
69
+ exports.useObservable = useObservable;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useObservableCallback = void 0;
4
- var react_1 = require("react");
5
4
  var observable_callback_1 = require("observable-callback");
5
+ var react_1 = require("react");
6
6
  var EMPTY_DEPS = [];
7
7
  function useObservableCallback(fn, dependencies) {
8
8
  if (dependencies === void 0) { dependencies = EMPTY_DEPS; }
@@ -11,7 +11,6 @@ function useObservableCallback(fn, dependencies) {
11
11
  callbackRef.current = (0, observable_callback_1.observableCallback)();
12
12
  }
13
13
  var _a = callbackRef.current, calls$ = _a[0], call = _a[1];
14
- // eslint-disable-next-line react-hooks/exhaustive-deps
15
14
  var callback = (0, react_1.useCallback)(fn, dependencies);
16
15
  (0, react_1.useEffect)(function () {
17
16
  var subscription = calls$.pipe(callback).subscribe();
@@ -7,12 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { BehaviorSubject, Observable } from 'rxjs';
11
- import { useMemoObservable, useObservable } from '../useObservable';
12
- import { createElement, Fragment, StrictMode, useEffect } from 'react';
13
10
  import { act, render } from '@testing-library/react';
14
- import { useAsObservable } from '../useAsObservable';
15
- import { test, expect } from 'vitest';
11
+ import { createElement, Fragment, StrictMode, useEffect } from 'react';
12
+ import { BehaviorSubject, Observable } from 'rxjs';
13
+ import { useObservable } from '../useObservable';
16
14
  const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
17
15
  // NOTE: Jest runs NODE_ENV=test by default, which enables development flags for React
18
16
  test('Strict mode should trigger double mount effects and re-renders', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -21,15 +19,15 @@ test('Strict mode should trigger double mount effects and re-renders', () => __a
21
19
  const returnedValues = [];
22
20
  let mountCount = 0;
23
21
  function ObservableComponent() {
24
- const observedValue = useObservable(observable, 0);
25
22
  useEffect(() => {
26
23
  mountCount++;
27
24
  }, []);
25
+ const observedValue = useObservable(observable);
28
26
  returnedValues.push(observedValue);
29
27
  return createElement(Fragment, null, observedValue);
30
28
  }
31
- const { rerender } = render(createElement(StrictMode, null, createElement(ObservableComponent)));
32
- expect(mountCount).toBe(2);
29
+ render(createElement(StrictMode, null, createElement(ObservableComponent)));
30
+ expect(mountCount).toEqual(2);
33
31
  expect(returnedValues).toEqual([0, 0]);
34
32
  yield wait(10);
35
33
  act(() => subject.next(1));
@@ -58,37 +56,3 @@ test('Strict mode should unsubscribe the source observable on unmount', () => {
58
56
  rerender(createElement(StrictMode, null, createElement('div')));
59
57
  expect(unsubscribed).toEqual([0, 1]);
60
58
  });
61
- test('useMemoObservable should unsubscribe the source observable on unmount', () => {
62
- const subscribed = [];
63
- const unsubscribed = [];
64
- let nextId = 0;
65
- function ObservableComponent() {
66
- useMemoObservable(() => {
67
- return new Observable(() => {
68
- const id = nextId++;
69
- subscribed.push(id);
70
- return () => {
71
- unsubscribed.push(id);
72
- };
73
- });
74
- }, []);
75
- return createElement(Fragment, null);
76
- }
77
- const { rerender } = render(createElement(StrictMode, null, createElement(ObservableComponent)));
78
- expect(subscribed).toEqual([0, 1]);
79
- rerender(createElement(StrictMode, null, createElement('div')));
80
- expect(unsubscribed).toEqual([0, 1]);
81
- });
82
- test('useAsObservable should work in strict mode', () => __awaiter(void 0, void 0, void 0, function* () {
83
- const returnedValues = [];
84
- function ObservableComponent(props) {
85
- const count$ = useAsObservable(props.count);
86
- const count = useObservable(count$, props.count);
87
- returnedValues.push(count);
88
- return createElement(Fragment, null, 'ok');
89
- }
90
- const { rerender } = render(createElement(StrictMode, null, createElement(ObservableComponent, { count: 0 })));
91
- expect(returnedValues).toEqual([0, 0]);
92
- rerender(createElement(StrictMode, null, createElement(ObservableComponent, { count: 1 })));
93
- expect(returnedValues).toEqual([0, 0, 0, 0, 1, 1]);
94
- }));
@@ -1,9 +1,8 @@
1
1
  import { act, render, renderHook } from '@testing-library/react';
2
- import { useObservable } from '../useObservable';
2
+ import { createElement, Fragment } from 'react';
3
3
  import { asyncScheduler, Observable, of, scheduled, Subject, timer } from 'rxjs';
4
4
  import { mapTo } from 'rxjs/operators';
5
- import { createElement, Fragment } from 'react';
6
- import { test, expect } from 'vitest';
5
+ import { useObservable } from '../useObservable';
7
6
  test('should subscribe immediately on component mount and unsubscribe on component unmount', () => {
8
7
  let subscribed = false;
9
8
  const observable = new Observable(() => {
@@ -1,7 +1,2 @@
1
- export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
2
- export { observeState, observeCallback, observeContext, observeElement } from './utils';
3
- export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
4
- export { observableCallback } from 'observable-callback';
5
- export { useObservable, useMemoObservable } from './useObservable';
6
- export { useAsObservable } from './useAsObservable';
7
- export { useObservableCallback } from './useObservableCallback';
1
+ export * from './useObservable';
2
+ export * from './useObservableEvent';
@@ -1,9 +1,2 @@
1
- // Main package exports
2
- export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
3
- export { observeState, observeCallback, observeContext, observeElement } from './utils';
4
- export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
5
- export { observableCallback } from 'observable-callback';
6
- // hooks
7
- export { useObservable, useMemoObservable } from './useObservable';
8
- export { useAsObservable } from './useAsObservable';
9
- export { useObservableCallback } from './useObservableCallback';
1
+ export * from './useObservable';
2
+ export * from './useObservableEvent';
@@ -1,7 +1,4 @@
1
1
  import { Observable } from 'rxjs';
2
- import { DependencyList } from 'react';
3
2
  export declare function useObservable<T>(observable: Observable<T>): T | undefined;
4
3
  export declare function useObservable<T>(observable: Observable<T>, initialValue: T): T;
5
4
  export declare function useObservable<T>(observable: Observable<T>, initialValue: () => T): T;
6
- export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList): T | undefined;
7
- export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList, initialValue: T | (() => T)): T;