@veams/status-quo 1.5.1 → 1.7.0
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/.turbo/turbo-build.log +12 -0
- package/.turbo/turbo-check$colon$types.log +4 -0
- package/.turbo/turbo-docs$colon$build.log +14 -0
- package/.turbo/turbo-lint.log +8 -0
- package/.turbo/turbo-test.log +15 -0
- package/CHANGELOG.md +24 -3
- package/README.md +217 -41
- package/dist/config/status-quo-config.d.ts +13 -0
- package/dist/config/status-quo-config.js +14 -0
- package/dist/config/status-quo-config.js.map +1 -1
- package/dist/hooks/__tests__/state-provider.spec.d.ts +4 -0
- package/dist/hooks/__tests__/state-provider.spec.js +179 -0
- package/dist/hooks/__tests__/state-provider.spec.js.map +1 -0
- package/dist/hooks/__tests__/state-selector.spec.js +11 -12
- package/dist/hooks/__tests__/state-selector.spec.js.map +1 -1
- package/dist/hooks/__tests__/state-singleton.spec.js +10 -11
- package/dist/hooks/__tests__/state-singleton.spec.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/state-factory.js.map +1 -1
- package/dist/hooks/state-provider.d.ts +14 -0
- package/dist/hooks/state-provider.js +24 -0
- package/dist/hooks/state-provider.js.map +1 -0
- package/dist/hooks/state-subscription-selector.js +6 -2
- package/dist/hooks/state-subscription-selector.js.map +1 -1
- package/dist/hooks/state-subscription.js +1 -1
- package/dist/hooks/state-subscription.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/react/hooks/__tests__/state-provider.spec.d.ts +4 -0
- package/dist/react/hooks/__tests__/state-provider.spec.js +179 -0
- package/dist/react/hooks/__tests__/state-provider.spec.js.map +1 -0
- package/dist/react/hooks/__tests__/state-selector.spec.d.ts +4 -0
- package/dist/react/hooks/__tests__/state-selector.spec.js +547 -0
- package/dist/react/hooks/__tests__/state-selector.spec.js.map +1 -0
- package/dist/react/hooks/__tests__/state-singleton.spec.d.ts +4 -0
- package/dist/react/hooks/__tests__/state-singleton.spec.js +96 -0
- package/dist/react/hooks/__tests__/state-singleton.spec.js.map +1 -0
- package/{src/hooks/index.ts → dist/react/hooks/index.d.ts} +1 -0
- package/dist/react/hooks/index.js +7 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/state-actions.d.ts +2 -0
- package/dist/react/hooks/state-actions.js +5 -0
- package/dist/react/hooks/state-actions.js.map +1 -0
- package/dist/react/hooks/state-factory.d.ts +7 -0
- package/dist/react/hooks/state-factory.js +13 -0
- package/dist/react/hooks/state-factory.js.map +1 -0
- package/dist/react/hooks/state-handler.d.ts +2 -0
- package/dist/react/hooks/state-handler.js +9 -0
- package/dist/react/hooks/state-handler.js.map +1 -0
- package/dist/react/hooks/state-provider.d.ts +14 -0
- package/dist/react/hooks/state-provider.js +24 -0
- package/dist/react/hooks/state-provider.js.map +1 -0
- package/dist/react/hooks/state-singleton.d.ts +6 -0
- package/dist/react/hooks/state-singleton.js +7 -0
- package/dist/react/hooks/state-singleton.js.map +1 -0
- package/dist/react/hooks/state-subscription-selector.d.ts +3 -0
- package/dist/react/hooks/state-subscription-selector.js +114 -0
- package/dist/react/hooks/state-subscription-selector.js.map +1 -0
- package/dist/react/hooks/state-subscription.d.ts +9 -0
- package/dist/react/hooks/state-subscription.js +53 -0
- package/dist/react/hooks/state-subscription.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -0
- package/dist/store/__tests__/observable-state-handler.spec.js +66 -11
- package/dist/store/__tests__/observable-state-handler.spec.js.map +1 -1
- package/dist/store/__tests__/signal-state-handler.spec.js.map +1 -1
- package/dist/store/base-state-handler.d.ts +3 -5
- package/dist/store/base-state-handler.js +10 -9
- package/dist/store/base-state-handler.js.map +1 -1
- package/dist/store/dev-tools.js +0 -3
- package/dist/store/dev-tools.js.map +1 -1
- package/dist/store/observable-state-handler.d.ts +4 -10
- package/dist/store/observable-state-handler.js +4 -11
- package/dist/store/observable-state-handler.js.map +1 -1
- package/dist/store/signal-state-handler.d.ts +2 -5
- package/dist/store/signal-state-handler.js +3 -2
- package/dist/store/signal-state-handler.js.map +1 -1
- package/dist/store/state-singleton.js +1 -1
- package/dist/store/state-singleton.js.map +1 -1
- package/eslint.config.mjs +75 -0
- package/package.json +18 -18
- package/src/config/status-quo-config.ts +31 -1
- package/src/index.ts +11 -15
- package/src/react/hooks/__tests__/state-provider.spec.tsx +286 -0
- package/src/{hooks → react/hooks}/__tests__/state-selector.spec.tsx +118 -44
- package/src/{hooks → react/hooks}/__tests__/state-singleton.spec.tsx +21 -20
- package/src/react/hooks/index.ts +11 -0
- package/src/{hooks → react/hooks}/state-actions.tsx +1 -1
- package/src/{hooks → react/hooks}/state-factory.tsx +2 -2
- package/src/{hooks → react/hooks}/state-handler.tsx +1 -1
- package/src/react/hooks/state-provider.tsx +56 -0
- package/src/{hooks → react/hooks}/state-singleton.tsx +1 -1
- package/src/react/hooks/state-subscription-selector.tsx +190 -0
- package/src/{hooks → react/hooks}/state-subscription.tsx +5 -9
- package/src/react/index.ts +1 -0
- package/src/store/__tests__/observable-state-handler.spec.ts +92 -13
- package/src/store/__tests__/signal-state-handler.spec.ts +5 -1
- package/src/store/base-state-handler.ts +17 -22
- package/src/store/dev-tools.ts +3 -3
- package/src/store/observable-state-handler.ts +12 -22
- package/src/store/signal-state-handler.ts +11 -8
- package/src/store/state-singleton.ts +1 -1
- package/tsconfig.json +2 -3
- package/.eslintrc.cjs +0 -132
- package/.github/workflows/pages.yml +0 -46
- package/.github/workflows/release.yml +0 -33
- package/.nvmrc +0 -1
- package/.prettierrc +0 -7
- package/docs/assets/index-BBmpszOW.css +0 -1
- package/docs/assets/index-Cf8El_RO.js +0 -194
- package/docs/assets/statusquo-logo-8GVRbxpc.png +0 -0
- package/docs/index.html +0 -13
- package/playground/index.html +0 -12
- package/playground/src/App.tsx +0 -699
- package/playground/src/assets/philosophy-agnostic.svg +0 -18
- package/playground/src/assets/philosophy-separation.svg +0 -13
- package/playground/src/assets/philosophy-swap.svg +0 -17
- package/playground/src/assets/statusquo-logo.png +0 -0
- package/playground/src/main.tsx +0 -19
- package/playground/src/styles.css +0 -534
- package/playground/tsconfig.json +0 -12
- package/playground/vite.config.ts +0 -18
- package/src/hooks/state-subscription-selector.tsx +0 -111
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React, { act } from 'react';
|
|
2
|
+
import { createRoot } from 'react-dom/client';
|
|
3
|
+
import { makeStateSingleton } from '../../../store';
|
|
4
|
+
import { useStateSingleton } from '../state-singleton.js';
|
|
5
|
+
const createStateHandler = (value) => {
|
|
6
|
+
const snapshot = { value };
|
|
7
|
+
const actions = { noop: jest.fn() };
|
|
8
|
+
return {
|
|
9
|
+
subscribe: (_listener) => () => undefined,
|
|
10
|
+
getSnapshot: () => snapshot,
|
|
11
|
+
getInitialState: () => snapshot,
|
|
12
|
+
getActions: () => actions,
|
|
13
|
+
destroy: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const SingletonConsumer = ({ singleton, }) => {
|
|
17
|
+
useStateSingleton(singleton);
|
|
18
|
+
return null;
|
|
19
|
+
};
|
|
20
|
+
describe('useStateSingleton', () => {
|
|
21
|
+
let container;
|
|
22
|
+
let root;
|
|
23
|
+
beforeAll(() => {
|
|
24
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
25
|
+
});
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
container = document.createElement('div');
|
|
28
|
+
document.body.appendChild(container);
|
|
29
|
+
root = createRoot(container);
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
act(() => {
|
|
33
|
+
root.unmount();
|
|
34
|
+
});
|
|
35
|
+
container.remove();
|
|
36
|
+
});
|
|
37
|
+
afterAll(() => {
|
|
38
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = false;
|
|
39
|
+
});
|
|
40
|
+
it('should keep singleton alive while at least one consumer is mounted', () => {
|
|
41
|
+
const firstHandler = createStateHandler(1);
|
|
42
|
+
const singleton = makeStateSingleton(() => firstHandler);
|
|
43
|
+
act(() => {
|
|
44
|
+
root.render(React.createElement(React.Fragment, null,
|
|
45
|
+
React.createElement(SingletonConsumer, { singleton: singleton }),
|
|
46
|
+
React.createElement(SingletonConsumer, { singleton: singleton })));
|
|
47
|
+
});
|
|
48
|
+
act(() => {
|
|
49
|
+
root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
|
|
50
|
+
});
|
|
51
|
+
expect(firstHandler.destroy).not.toHaveBeenCalled();
|
|
52
|
+
act(() => {
|
|
53
|
+
root.render(React.createElement(React.Fragment, null));
|
|
54
|
+
});
|
|
55
|
+
expect(firstHandler.destroy).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
it('should create a new singleton instance after all consumers unmount when destroyOnNoConsumers is true', () => {
|
|
58
|
+
const firstHandler = createStateHandler(1);
|
|
59
|
+
const secondHandler = createStateHandler(2);
|
|
60
|
+
const factory = jest.fn(() => firstHandler);
|
|
61
|
+
factory.mockReturnValueOnce(firstHandler).mockReturnValueOnce(secondHandler);
|
|
62
|
+
const singleton = makeStateSingleton(factory, {
|
|
63
|
+
destroyOnNoConsumers: true,
|
|
64
|
+
});
|
|
65
|
+
act(() => {
|
|
66
|
+
root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
|
|
67
|
+
});
|
|
68
|
+
act(() => {
|
|
69
|
+
root.render(React.createElement(React.Fragment, null));
|
|
70
|
+
});
|
|
71
|
+
expect(firstHandler.destroy).toHaveBeenCalledTimes(1);
|
|
72
|
+
act(() => {
|
|
73
|
+
root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
|
|
74
|
+
});
|
|
75
|
+
expect(factory).toHaveBeenCalledTimes(2);
|
|
76
|
+
expect(singleton.getInstance().getSnapshot()).toStrictEqual({ value: 2 });
|
|
77
|
+
});
|
|
78
|
+
it('should keep singleton instance alive by default', () => {
|
|
79
|
+
const firstHandler = createStateHandler(1);
|
|
80
|
+
const factory = jest.fn(() => firstHandler);
|
|
81
|
+
const singleton = makeStateSingleton(factory);
|
|
82
|
+
act(() => {
|
|
83
|
+
root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
|
|
84
|
+
});
|
|
85
|
+
act(() => {
|
|
86
|
+
root.render(React.createElement(React.Fragment, null));
|
|
87
|
+
});
|
|
88
|
+
expect(firstHandler.destroy).not.toHaveBeenCalled();
|
|
89
|
+
act(() => {
|
|
90
|
+
root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
|
|
91
|
+
});
|
|
92
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(singleton.getInstance().getSnapshot()).toStrictEqual({ value: 1 });
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=state-singleton.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-singleton.spec.js","sourceRoot":"","sources":["../../../../src/react/hooks/__tests__/state-singleton.spec.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAsB1D,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAe,EAAE;IACxD,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE,CAAC,SAAsD,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS;QACtF,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;QACzB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,EACzB,SAAS,GAGV,EAAE,EAAE;IACH,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAE7B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,SAAyB,CAAC;IAC9B,IAAI,IAAmC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,UAAU,CAAC,wBAAwB,GAAG,KAAK,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAEzD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,KAAK,CAAC,QAAQ;gBACb,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI;gBAC3C,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAC5B,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,KAAK,CAAC,QAAQ,OAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sGAAsG,EAAE,GAAG,EAAE;QAC9G,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAgE,CAAC,CAAC;QAEhG,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,kBAAkB,CAAyB,OAAO,EAAE;YACpE,oBAAoB,EAAE,IAAI;SAC3B,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,KAAK,CAAC,QAAQ,OAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAgE,CAAC,CAAC;QAChG,MAAM,SAAS,GAAG,kBAAkB,CAAyB,OAAO,CAAC,CAAC;QAEtE,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,KAAK,CAAC,QAAQ,OAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { useStateActions } from './state-actions.js';
|
|
2
2
|
export { useStateFactory } from './state-factory.js';
|
|
3
3
|
export { useStateHandler } from './state-handler.js';
|
|
4
|
+
export { StateProvider, useProvidedStateActions, useProvidedStateHandler, useProvidedStateSubscription, } from './state-provider.js';
|
|
4
5
|
export { useStateSingleton } from './state-singleton.js';
|
|
5
6
|
export { useStateSubscription } from './state-subscription.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { useStateActions } from './state-actions.js';
|
|
2
|
+
export { useStateFactory } from './state-factory.js';
|
|
3
|
+
export { useStateHandler } from './state-handler.js';
|
|
4
|
+
export { StateProvider, useProvidedStateActions, useProvidedStateHandler, useProvidedStateSubscription, } from './state-provider.js';
|
|
5
|
+
export { useStateSingleton } from './state-singleton.js';
|
|
6
|
+
export { useStateSubscription } from './state-subscription.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-actions.js","sourceRoot":"","sources":["../../../src/react/hooks/state-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,MAAM,UAAU,eAAe,CAAO,wBAAwD;IAC5F,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StateSubscriptionHandler } from '../../types/types.js';
|
|
2
|
+
type StateSelector<State, SelectedState> = (state: State) => SelectedState;
|
|
3
|
+
type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
|
|
4
|
+
export declare function useStateFactory<V, A, P extends unknown[]>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, params?: P): [V, A];
|
|
5
|
+
export declare function useStateFactory<V, A, P extends unknown[], Sel>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, selector: StateSelector<V, Sel>, params?: P): [Sel, A];
|
|
6
|
+
export declare function useStateFactory<V, A, P extends unknown[], Sel>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>, params?: P): [Sel, A];
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useStateHandler } from './state-handler.js';
|
|
2
|
+
import { useStateSubscription } from './state-subscription.js';
|
|
3
|
+
const identitySelector = (state) => state;
|
|
4
|
+
export function useStateFactory(stateFactoryFunction, selectorOrParams = [], isEqualOrParams = Object.is, params = []) {
|
|
5
|
+
const hasSelector = typeof selectorOrParams === 'function';
|
|
6
|
+
const selector = (hasSelector ? selectorOrParams : identitySelector);
|
|
7
|
+
const hasCustomEquality = hasSelector && typeof isEqualOrParams === 'function';
|
|
8
|
+
const isEqual = (hasCustomEquality ? isEqualOrParams : Object.is);
|
|
9
|
+
const stateFactoryParams = (hasSelector ? (hasCustomEquality ? params : isEqualOrParams) : selectorOrParams);
|
|
10
|
+
const stateHandler = useStateHandler(stateFactoryFunction, stateFactoryParams);
|
|
11
|
+
return useStateSubscription(stateHandler, selector, isEqual);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=state-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-factory.js","sourceRoot":"","sources":["../../../src/react/hooks/state-factory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAO/D,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAiBzD,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,mBAA8C,EAAkB,EAChE,kBAAuC,MAAM,CAAC,EAAqB,EACnE,SAAY,EAAkB;IAE9B,MAAM,WAAW,GAAG,OAAO,gBAAgB,KAAK,UAAU,CAAC;IAC3D,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAA0B,CAAC;IAC9F,MAAM,iBAAiB,GAAG,WAAW,IAAI,OAAO,eAAe,KAAK,UAAU,CAAC;IAC/E,MAAM,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,CACzB,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAC3E,CAAC;IACP,MAAM,YAAY,GAAG,eAAe,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;IAE/E,OAAO,oBAAoB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
export function useStateHandler(stateFactoryFunction, params = []) {
|
|
3
|
+
const stateHandlerRef = useRef(null);
|
|
4
|
+
if (!stateHandlerRef.current) {
|
|
5
|
+
stateHandlerRef.current = stateFactoryFunction(...params);
|
|
6
|
+
}
|
|
7
|
+
return stateHandlerRef.current;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=state-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-handler.js","sourceRoot":"","sources":["../../../src/react/hooks/state-handler.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAI/B,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,SAAY,EAAkB;IAE9B,MAAM,eAAe,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IAE5E,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7B,eAAe,CAAC,OAAO,GAAG,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PropsWithChildren } from 'react';
|
|
3
|
+
import type { StateSubscriptionHandler } from '../../types/types.js';
|
|
4
|
+
type StateSelector<State, SelectedState> = (state: State) => SelectedState;
|
|
5
|
+
type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
|
|
6
|
+
export type StateProviderProps<V, A> = PropsWithChildren<{
|
|
7
|
+
instance: StateSubscriptionHandler<V, A>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function useProvidedStateHandler<V, A>(): StateSubscriptionHandler<V, A>;
|
|
10
|
+
export declare function StateProvider<V, A>({ children, instance }: StateProviderProps<V, A>): React.JSX.Element;
|
|
11
|
+
export declare function useProvidedStateActions<V, A>(): A;
|
|
12
|
+
export declare function useProvidedStateSubscription<V, A>(): [V, A];
|
|
13
|
+
export declare function useProvidedStateSubscription<V, A, Sel>(selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>): [Sel, A];
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react';
|
|
2
|
+
import { useStateActions } from './state-actions.js';
|
|
3
|
+
import { useStateSubscription } from './state-subscription.js';
|
|
4
|
+
const StateProviderContext = createContext(null);
|
|
5
|
+
const identitySelector = (state) => state;
|
|
6
|
+
export function useProvidedStateHandler() {
|
|
7
|
+
const stateHandler = useContext(StateProviderContext);
|
|
8
|
+
if (!stateHandler) {
|
|
9
|
+
throw new Error('No StateProvider instance found in the current React tree.');
|
|
10
|
+
}
|
|
11
|
+
return stateHandler;
|
|
12
|
+
}
|
|
13
|
+
export function StateProvider({ children, instance }) {
|
|
14
|
+
return (React.createElement(StateProviderContext.Provider, { value: instance }, children));
|
|
15
|
+
}
|
|
16
|
+
export function useProvidedStateActions() {
|
|
17
|
+
const stateHandler = useProvidedStateHandler();
|
|
18
|
+
return useStateActions(stateHandler);
|
|
19
|
+
}
|
|
20
|
+
export function useProvidedStateSubscription(selector = identitySelector, isEqual = Object.is) {
|
|
21
|
+
const stateHandler = useProvidedStateHandler();
|
|
22
|
+
return useStateSubscription(stateHandler, selector, isEqual);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=state-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-provider.js","sourceRoot":"","sources":["../../../src/react/hooks/state-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAS/D,MAAM,oBAAoB,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAC5E,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAMzD,MAAM,UAAU,uBAAuB;IACrC,MAAM,YAAY,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,YAA8C,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAO,EAAE,QAAQ,EAAE,QAAQ,EAA4B;IAClF,OAAO,CACL,oBAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAA8B,IACjE,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,YAAY,GAAG,uBAAuB,EAAQ,CAAC;IAErD,OAAO,eAAe,CAAC,YAAY,CAAC,CAAC;AACvC,CAAC;AAOD,MAAM,UAAU,4BAA4B,CAC1C,WAAkC,gBAAyC,EAC3E,UAA2B,MAAM,CAAC,EAAE;IAEpC,MAAM,YAAY,GAAG,uBAAuB,EAAQ,CAAC;IAErD,OAAO,oBAAoB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { StateSingleton } from '../../store/state-singleton.js';
|
|
2
|
+
type StateSelector<State, SelectedState> = (state: State) => SelectedState;
|
|
3
|
+
type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
|
|
4
|
+
export declare function useStateSingleton<V, A>(stateSingleton: StateSingleton<V, A>): [V, A];
|
|
5
|
+
export declare function useStateSingleton<V, A, Sel>(stateSingleton: StateSingleton<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>): [Sel, A];
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useStateSubscription } from './state-subscription.js';
|
|
2
|
+
const identitySelector = (state) => state;
|
|
3
|
+
export function useStateSingleton(stateSingleton, selector = identitySelector, isEqual = Object.is) {
|
|
4
|
+
const [state, actions] = useStateSubscription(stateSingleton, selector, isEqual);
|
|
5
|
+
return [state, actions];
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=state-singleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-singleton.js","sourceRoot":"","sources":["../../../src/react/hooks/state-singleton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAO/D,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAQzD,MAAM,UAAU,iBAAiB,CAC/B,cAAoC,EACpC,WAAkC,gBAAyC,EAC3E,UAA2B,MAAM,CAAC,EAAE;IAEpC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEjF,OAAO,CAAC,KAAK,EAAE,OAAO,CAAa,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { StateSubscriptionHandler } from '../../types/types.js';
|
|
2
|
+
import type { EqualityFn, Selector } from '../../utils/selector-cache.js';
|
|
3
|
+
export declare function useStateSubscriptionSelector<V, A, Sel>(stateSubscriptionHandler: StateSubscriptionHandler<V, A>, selector: Selector<V, Sel>, isEqual?: EqualityFn<Sel>, destroyOnCleanup?: boolean): Sel;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
2
|
+
import { createSelectorCache, selectWithCache } from '../../utils/selector-cache.js';
|
|
3
|
+
const deferredDestroyMap = new WeakMap();
|
|
4
|
+
function getDeferredDestroyState(stateSubscriptionHandler) {
|
|
5
|
+
const existingState = deferredDestroyMap.get(stateSubscriptionHandler);
|
|
6
|
+
if (existingState) {
|
|
7
|
+
return existingState;
|
|
8
|
+
}
|
|
9
|
+
const nextState = {
|
|
10
|
+
refCount: 0,
|
|
11
|
+
timeoutId: null,
|
|
12
|
+
};
|
|
13
|
+
deferredDestroyMap.set(stateSubscriptionHandler, nextState);
|
|
14
|
+
return nextState;
|
|
15
|
+
}
|
|
16
|
+
export function useStateSubscriptionSelector(stateSubscriptionHandler, selector, isEqual = Object.is, destroyOnCleanup = true) {
|
|
17
|
+
const selectorCacheRef = useRef(null);
|
|
18
|
+
// Tracks store notifications so getSnapshot can reuse the same selected value
|
|
19
|
+
// within one store version. This keeps useSyncExternalStore reads referentially stable.
|
|
20
|
+
const snapshotVersionRef = useRef(0);
|
|
21
|
+
// Client-side cache for selected snapshots per source snapshot/version pair.
|
|
22
|
+
const snapshotCacheRef = useRef(null);
|
|
23
|
+
// Separate cache for the server snapshot function used by SSR/hydration paths.
|
|
24
|
+
const serverSnapshotCacheRef = useRef(null);
|
|
25
|
+
if (!selectorCacheRef.current) {
|
|
26
|
+
selectorCacheRef.current = createSelectorCache();
|
|
27
|
+
}
|
|
28
|
+
const selectorCache = selectorCacheRef.current;
|
|
29
|
+
const subscribe = useCallback((listener) => {
|
|
30
|
+
const sharedStateSubscriptionHandler = stateSubscriptionHandler;
|
|
31
|
+
const deferredDestroyState = getDeferredDestroyState(sharedStateSubscriptionHandler);
|
|
32
|
+
deferredDestroyState.refCount += 1;
|
|
33
|
+
if (deferredDestroyState.timeoutId) {
|
|
34
|
+
clearTimeout(deferredDestroyState.timeoutId);
|
|
35
|
+
deferredDestroyState.timeoutId = null;
|
|
36
|
+
}
|
|
37
|
+
const unsubscribe = stateSubscriptionHandler.subscribe(() => {
|
|
38
|
+
// Invalidate the selected snapshot cache before notifying React.
|
|
39
|
+
// Any next getSnapshot call should recompute from the new store state.
|
|
40
|
+
snapshotVersionRef.current += 1;
|
|
41
|
+
snapshotCacheRef.current = null;
|
|
42
|
+
listener();
|
|
43
|
+
});
|
|
44
|
+
return () => {
|
|
45
|
+
unsubscribe();
|
|
46
|
+
if (!destroyOnCleanup) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const activeDeferredDestroyState = deferredDestroyMap.get(sharedStateSubscriptionHandler);
|
|
50
|
+
if (!activeDeferredDestroyState) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
activeDeferredDestroyState.refCount -= 1;
|
|
54
|
+
if (activeDeferredDestroyState.refCount > 0) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
activeDeferredDestroyState.refCount = 0;
|
|
58
|
+
activeDeferredDestroyState.timeoutId = setTimeout(() => {
|
|
59
|
+
const pendingDeferredDestroyState = deferredDestroyMap.get(sharedStateSubscriptionHandler);
|
|
60
|
+
if (!pendingDeferredDestroyState || pendingDeferredDestroyState.refCount > 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
pendingDeferredDestroyState.timeoutId = null;
|
|
64
|
+
stateSubscriptionHandler.destroy();
|
|
65
|
+
deferredDestroyMap.delete(sharedStateSubscriptionHandler);
|
|
66
|
+
}, 0);
|
|
67
|
+
};
|
|
68
|
+
}, [destroyOnCleanup, stateSubscriptionHandler]);
|
|
69
|
+
const selectSnapshot = useCallback((snapshot) => {
|
|
70
|
+
return selectWithCache(selectorCache, snapshot, selector, isEqual).value;
|
|
71
|
+
}, [isEqual, selector, selectorCache]);
|
|
72
|
+
const selectorCacheControlRef = useRef(selectSnapshot);
|
|
73
|
+
if (selectorCacheControlRef.current !== selectSnapshot) {
|
|
74
|
+
// Selector/equality changes define a new selection strategy, so clear all caches.
|
|
75
|
+
selectorCacheControlRef.current = selectSnapshot;
|
|
76
|
+
snapshotVersionRef.current = 0;
|
|
77
|
+
snapshotCacheRef.current = null;
|
|
78
|
+
serverSnapshotCacheRef.current = null;
|
|
79
|
+
}
|
|
80
|
+
const getSnapshot = useCallback(() => {
|
|
81
|
+
const sourceSnapshot = stateSubscriptionHandler.getSnapshot();
|
|
82
|
+
const version = snapshotVersionRef.current;
|
|
83
|
+
const cachedSnapshot = snapshotCacheRef.current;
|
|
84
|
+
if (cachedSnapshot &&
|
|
85
|
+
cachedSnapshot.version === version &&
|
|
86
|
+
Object.is(cachedSnapshot.sourceSnapshot, sourceSnapshot)) {
|
|
87
|
+
// Same source snapshot in the same store version: return the exact same selected reference.
|
|
88
|
+
return cachedSnapshot.selectedSnapshot;
|
|
89
|
+
}
|
|
90
|
+
const selectedSnapshot = selectSnapshot(sourceSnapshot);
|
|
91
|
+
snapshotCacheRef.current = {
|
|
92
|
+
selectedSnapshot,
|
|
93
|
+
sourceSnapshot,
|
|
94
|
+
version,
|
|
95
|
+
};
|
|
96
|
+
return selectedSnapshot;
|
|
97
|
+
}, [selectSnapshot, stateSubscriptionHandler]);
|
|
98
|
+
const getServerSnapshot = useCallback(() => {
|
|
99
|
+
const sourceSnapshot = stateSubscriptionHandler.getInitialState();
|
|
100
|
+
const cachedSnapshot = serverSnapshotCacheRef.current;
|
|
101
|
+
if (cachedSnapshot && Object.is(cachedSnapshot.sourceSnapshot, sourceSnapshot)) {
|
|
102
|
+
// Keep server snapshot reads stable for hydration by reusing cached selection.
|
|
103
|
+
return cachedSnapshot.selectedSnapshot;
|
|
104
|
+
}
|
|
105
|
+
const selectedSnapshot = selectSnapshot(sourceSnapshot);
|
|
106
|
+
serverSnapshotCacheRef.current = {
|
|
107
|
+
selectedSnapshot,
|
|
108
|
+
sourceSnapshot,
|
|
109
|
+
};
|
|
110
|
+
return selectedSnapshot;
|
|
111
|
+
}, [selectSnapshot, stateSubscriptionHandler]);
|
|
112
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=state-subscription-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-subscription-selector.js","sourceRoot":"","sources":["../../../src/react/hooks/state-subscription-selector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StateSingleton } from '../../store/state-singleton.js';
|
|
2
|
+
import type { StateSubscriptionHandler } from '../../types/types.js';
|
|
3
|
+
type StateSelector<State, SelectedState> = (state: State) => SelectedState;
|
|
4
|
+
type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
|
|
5
|
+
export declare function useStateSubscription<V, A>(source: StateSubscriptionHandler<V, A>): [V, A];
|
|
6
|
+
export declare function useStateSubscription<V, A, Sel>(source: StateSubscriptionHandler<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>): [Sel, A];
|
|
7
|
+
export declare function useStateSubscription<V, A>(source: StateSingleton<V, A>): [V, A];
|
|
8
|
+
export declare function useStateSubscription<V, A, Sel>(source: StateSingleton<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>): [Sel, A];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
import { useStateActions } from './state-actions.js';
|
|
3
|
+
import { useStateSubscriptionSelector } from './state-subscription-selector.js';
|
|
4
|
+
const singletonReferences = new WeakMap();
|
|
5
|
+
const identitySelector = (state) => state;
|
|
6
|
+
function isStateSingleton(source) {
|
|
7
|
+
return 'getInstance' in source;
|
|
8
|
+
}
|
|
9
|
+
export function useStateSubscription(source, selector = identitySelector, isEqual = Object.is) {
|
|
10
|
+
const singletonSource = isStateSingleton(source) ? source : null;
|
|
11
|
+
const stateSubscriptionHandler = useMemo(() => {
|
|
12
|
+
if (singletonSource) {
|
|
13
|
+
return singletonSource.getInstance();
|
|
14
|
+
}
|
|
15
|
+
return source;
|
|
16
|
+
}, [singletonSource, source]);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (!singletonSource) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const singleton = singletonSource;
|
|
22
|
+
const sharedStateHandler = stateSubscriptionHandler;
|
|
23
|
+
const singletonReference = singletonReferences.get(singleton);
|
|
24
|
+
if (!singletonReference || singletonReference.stateHandler !== sharedStateHandler) {
|
|
25
|
+
singletonReferences.set(singleton, { count: 1, stateHandler: sharedStateHandler });
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
singletonReference.count += 1;
|
|
29
|
+
}
|
|
30
|
+
return () => {
|
|
31
|
+
const activeReference = singletonReferences.get(singleton);
|
|
32
|
+
if (!activeReference || activeReference.stateHandler !== sharedStateHandler) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
activeReference.count -= 1;
|
|
36
|
+
if (activeReference.count <= 0) {
|
|
37
|
+
singletonReferences.delete(singleton);
|
|
38
|
+
if (singleton.destroyOnNoConsumers !== true) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (singleton.destroyInstance) {
|
|
42
|
+
singleton.destroyInstance();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
stateSubscriptionHandler.destroy();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}, [singletonSource, stateSubscriptionHandler]);
|
|
49
|
+
const state = useStateSubscriptionSelector(stateSubscriptionHandler, selector, isEqual, !singletonSource);
|
|
50
|
+
const actions = useStateActions(stateSubscriptionHandler);
|
|
51
|
+
return [state, actions];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=state-subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-subscription.js","sourceRoot":"","sources":["../../../src/react/hooks/state-subscription.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAahF,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAGpC,CAAC;AAEJ,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAEzD,SAAS,gBAAgB,CACvB,MAA6D;IAE7D,OAAO,aAAa,IAAI,MAAM,CAAC;AACjC,CAAC;AAcD,MAAM,UAAU,oBAAoB,CAClC,MAA6D,EAC7D,WAAkC,gBAAyC,EAC3E,UAA2B,MAAM,CAAC,EAAE;IAEpC,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,wBAAwB,GAAG,OAAO,CAAiC,GAAG,EAAE;QAC5E,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAED,OAAO,MAAwC,CAAC;IAClD,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,eAAmC,CAAC;QACtD,MAAM,kBAAkB,GAAG,wBAA8C,CAAC;QAC1E,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE9D,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,YAAY,KAAK,kBAAkB,EAAE,CAAC;YAClF,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,EAAE;YACV,MAAM,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE3D,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,YAAY,KAAK,kBAAkB,EAAE,CAAC;gBAC5E,OAAO;YACT,CAAC;YAED,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC;YAE3B,IAAI,eAAe,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/B,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,SAAS,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC9B,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBAED,wBAAwB,CAAC,OAAO,EAAE,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,4BAA4B,CACxC,wBAAwB,EACxB,QAAQ,EACR,OAAO,EACP,CAAC,eAAe,CACjB,CAAC;IACF,MAAM,OAAO,GAAG,eAAe,CAAC,wBAAwB,CAAC,CAAC;IAE1D,OAAO,CAAC,KAAK,EAAE,OAAO,CAAa,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './hooks/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -2,19 +2,14 @@ import { lastValueFrom, Subject, take } from 'rxjs';
|
|
|
2
2
|
import { resetStatusQuoForTests, setupStatusQuo } from '../../config/status-quo-config.js';
|
|
3
3
|
import { ObservableStateHandler } from '../observable-state-handler.js';
|
|
4
4
|
class TestObservableStateHandler extends ObservableStateHandler {
|
|
5
|
-
constructor({
|
|
5
|
+
constructor({ devTools, distinct, useDistinctUntilChanged, } = {}) {
|
|
6
6
|
super({
|
|
7
7
|
initialState: {
|
|
8
8
|
test: 'testValue',
|
|
9
9
|
test2: 'testValue2',
|
|
10
10
|
},
|
|
11
11
|
options: {
|
|
12
|
-
...(
|
|
13
|
-
devTools: {
|
|
14
|
-
enabled: true,
|
|
15
|
-
namespace: 'TestObservableStateHandler',
|
|
16
|
-
},
|
|
17
|
-
}),
|
|
12
|
+
...(devTools && { devTools }),
|
|
18
13
|
...(distinct && {
|
|
19
14
|
distinct,
|
|
20
15
|
}),
|
|
@@ -34,11 +29,22 @@ class TestObservableStateHandler extends ObservableStateHandler {
|
|
|
34
29
|
}
|
|
35
30
|
describe('Observable State Handler', () => {
|
|
36
31
|
let stateHandler;
|
|
32
|
+
function mockDevToolsExtension() {
|
|
33
|
+
const devTools = {
|
|
34
|
+
init: jest.fn(),
|
|
35
|
+
send: jest.fn(),
|
|
36
|
+
subscribe: jest.fn(),
|
|
37
|
+
};
|
|
38
|
+
const connect = jest.fn(() => devTools);
|
|
39
|
+
window.__REDUX_DEVTOOLS_EXTENSION__ = { connect };
|
|
40
|
+
return { connect, devTools };
|
|
41
|
+
}
|
|
37
42
|
beforeEach(() => {
|
|
38
43
|
resetStatusQuoForTests();
|
|
39
44
|
stateHandler = new TestObservableStateHandler();
|
|
40
45
|
});
|
|
41
46
|
afterEach(() => {
|
|
47
|
+
delete window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
42
48
|
resetStatusQuoForTests();
|
|
43
49
|
});
|
|
44
50
|
it('should provide initial state', () => {
|
|
@@ -59,7 +65,7 @@ describe('Observable State Handler', () => {
|
|
|
59
65
|
test2: 'testValue2',
|
|
60
66
|
};
|
|
61
67
|
stateHandler.setState(expected);
|
|
62
|
-
const state = await lastValueFrom(stateHandler.
|
|
68
|
+
const state = await lastValueFrom(stateHandler.getObservable().pipe(take(1)));
|
|
63
69
|
expect(state).toStrictEqual(expected);
|
|
64
70
|
expect(stateHandler.getState()).toStrictEqual(expected);
|
|
65
71
|
});
|
|
@@ -74,11 +80,11 @@ describe('Observable State Handler', () => {
|
|
|
74
80
|
customSubject.next(3);
|
|
75
81
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
76
82
|
});
|
|
77
|
-
it('should expose state item observable via
|
|
78
|
-
const observableValue = await lastValueFrom(stateHandler.
|
|
83
|
+
it('should expose state item observable via getObservableItem', async () => {
|
|
84
|
+
const observableValue = await lastValueFrom(stateHandler.getObservableItem('test').pipe(take(1)));
|
|
79
85
|
expect(observableValue).toBe('testValue');
|
|
80
86
|
});
|
|
81
|
-
it('should only call subscriber when object state has changed',
|
|
87
|
+
it('should only call subscriber when object state has changed', () => {
|
|
82
88
|
const spy = jest.fn();
|
|
83
89
|
const unsubscribe = stateHandler.subscribe(spy);
|
|
84
90
|
stateHandler.setState({
|
|
@@ -144,5 +150,54 @@ describe('Observable State Handler', () => {
|
|
|
144
150
|
unsubscribe();
|
|
145
151
|
expect(spy).toHaveBeenCalledTimes(2);
|
|
146
152
|
});
|
|
153
|
+
it('should enable devtools from global setup and fall back to the class name as namespace', () => {
|
|
154
|
+
const { connect, devTools } = mockDevToolsExtension();
|
|
155
|
+
setupStatusQuo({
|
|
156
|
+
devTools: {
|
|
157
|
+
enabled: true,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
new TestObservableStateHandler();
|
|
161
|
+
expect(connect).toHaveBeenCalledWith(expect.objectContaining({
|
|
162
|
+
instanceId: 'testobservablestatehandler',
|
|
163
|
+
name: 'TestObservableStateHandler',
|
|
164
|
+
}));
|
|
165
|
+
expect(devTools.init).toHaveBeenCalledWith({
|
|
166
|
+
test: 'testValue',
|
|
167
|
+
test2: 'testValue2',
|
|
168
|
+
});
|
|
169
|
+
expect(devTools.subscribe).toHaveBeenCalledTimes(1);
|
|
170
|
+
});
|
|
171
|
+
it('should prefer per-handler devtools options over global setup', () => {
|
|
172
|
+
const { connect } = mockDevToolsExtension();
|
|
173
|
+
setupStatusQuo({
|
|
174
|
+
devTools: {
|
|
175
|
+
enabled: true,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
new TestObservableStateHandler({
|
|
179
|
+
devTools: {
|
|
180
|
+
namespace: 'LocalHandler',
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
expect(connect).toHaveBeenCalledWith(expect.objectContaining({
|
|
184
|
+
instanceId: 'localhandler',
|
|
185
|
+
name: 'LocalHandler',
|
|
186
|
+
}));
|
|
187
|
+
});
|
|
188
|
+
it('should allow per-handler devtools settings to disable a global devtools setup', () => {
|
|
189
|
+
const { connect } = mockDevToolsExtension();
|
|
190
|
+
setupStatusQuo({
|
|
191
|
+
devTools: {
|
|
192
|
+
enabled: true,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
new TestObservableStateHandler({
|
|
196
|
+
devTools: {
|
|
197
|
+
enabled: false,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
expect(connect).not.toHaveBeenCalled();
|
|
201
|
+
});
|
|
147
202
|
});
|
|
148
203
|
//# sourceMappingURL=observable-state-handler.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/observable-state-handler.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"observable-state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/observable-state-handler.spec.ts"],"names":[],"mappings":"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"}
|