@veams/status-quo 0.0.2 → 0.1.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/.nvmrc CHANGED
@@ -1 +1 @@
1
- v20
1
+ v22
package/README.md CHANGED
@@ -26,7 +26,7 @@ _Please keep in mind that dependencies for the hook needs to be flattened and ca
26
26
  ## Example
27
27
 
28
28
  Let's start with a simple state example.
29
- You should start with the abstract class `BaseState`:
29
+ You should start with the abstract class `StateHandler`:
30
30
 
31
31
  ```ts
32
32
  import { useStateFactory, StateHandler } from '@veams/status-quo';
@@ -126,5 +126,51 @@ const GlobalCounterDisplay = () => {
126
126
  }
127
127
  ```
128
128
 
129
+ ### What about debugging?
129
130
 
131
+ You know redux-devtools? You like it? We covered you (at least a bit)!
132
+ You can enable the devtools in an easy way:
130
133
 
134
+ ```ts
135
+
136
+ class CounterStateHandler extends StateHandler<CounterState, CounterActions> {
137
+ constructor([startCount = 0]) {
138
+ super({
139
+ initialState: { count: startCount },
140
+ devTools: { enabled: true, namespace: 'Counter' },
141
+ });
142
+ }
143
+
144
+ getActions() {
145
+ return {
146
+ increase() {
147
+ this.setState(
148
+ {
149
+ count: this.getState() + 1,
150
+ },
151
+ 'increase'
152
+ );
153
+ },
154
+ decrease() {
155
+ const currentState = this.getState();
156
+
157
+ if (currentState.count > 0) {
158
+ this.setState(
159
+ {
160
+ count: currentState - 1,
161
+ },
162
+ 'decrease'
163
+ );
164
+ }
165
+ },
166
+ };
167
+ }
168
+ }
169
+
170
+ export function CounterStateFactory(...args) {
171
+ return new CounterStateHandler(...args);
172
+ }
173
+ ```
174
+
175
+ We just added the `devTools` option and also updated the `setState()` function by passing a second argument into it which is the actions name.
176
+ Now you can open up the the browser extension and you are able to take a look at your actions and state(s).
@@ -4,6 +4,6 @@ export function useStateFactory(stateFactoryFunction, params = []) {
4
4
  const stateHandler = useRef(stateFactoryFunction(...params));
5
5
  const actions = useRef(stateHandler.current.getActions());
6
6
  const state = useStateSubscription(stateHandler.current);
7
- return [state, actions];
7
+ return [state, actions.current];
8
8
  }
9
9
  //# sourceMappingURL=state-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-factory.js","sourceRoot":"","sources":["../../src/hooks/state-factory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,SAAY,EAAkB;IAE9B,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAW,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"state-factory.js","sourceRoot":"","sources":["../../src/hooks/state-factory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,SAAY,EAAkB;IAE9B,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAW,CAAC;AAC5C,CAAC"}
@@ -62,7 +62,7 @@ describe('State Handler', () => {
62
62
  stateHandler.destroy();
63
63
  customSubject.next(2);
64
64
  customSubject.next(3);
65
- expect(spy).toBeCalledTimes(1);
65
+ expect(spy).toHaveBeenCalledTimes(1);
66
66
  });
67
67
  it('should only call subscriber when object state has changed', async () => {
68
68
  const spy = jest.fn();
@@ -79,7 +79,7 @@ describe('State Handler', () => {
79
79
  stateHandler.setState({
80
80
  test: 'test2',
81
81
  });
82
- expect(spy).toBeCalledTimes(3); // 1. testValue (Initial value), 2. test (first setter), 3. test2 (second setter)
82
+ expect(spy).toHaveBeenCalledTimes(3); // 1. testValue (Initial value), 2. test (first setter), 3. test2 (second setter)
83
83
  });
84
84
  });
85
85
  //# sourceMappingURL=state-handler.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/state-handler.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/state-handler.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { useStateFactory } from './state-factory.js';
2
+ export { useStateSingleton } from './state-singleton.js';
@@ -0,0 +1,2 @@
1
+ import type { StateSubscriptionHandler } from '../types/types.js';
2
+ export declare function useStateFactory<V, A, P extends unknown[]>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, params?: P): [V, A];
@@ -0,0 +1,2 @@
1
+ import type { StateSingleton } from '../store/state-singleton.js';
2
+ export declare function useStateSingleton<V, A>(stateSingleton: StateSingleton<V, A>): [V, A];
@@ -0,0 +1,3 @@
1
+ import type { StateSubscriptionHandler } from '../types/types.js';
2
+ import type { SetStateAction } from 'react';
3
+ export declare function useStateSubscription<V, A>(stateSubscriptionHandler: StateSubscriptionHandler<V, A>): SetStateAction<V>;
@@ -0,0 +1,6 @@
1
+ import { useStateFactory, useStateSingleton } from './hooks/index.js';
2
+ import { makeStateSingleton, StateHandler } from './store/index.js';
3
+ import type { StateSingleton } from './store/index.js';
4
+ import type { StateSubscriptionHandler } from './types/types.js';
5
+ export { makeStateSingleton, StateHandler, useStateFactory, useStateSingleton };
6
+ export type { StateSingleton, StateSubscriptionHandler };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ declare global {
2
+ interface Window {
3
+ __REDUX_DEVTOOLS_EXTENSION__?: {
4
+ connect: (opts: Record<string, unknown>) => DevTools;
5
+ };
6
+ }
7
+ }
8
+ export type MessagePayload = {
9
+ type: string;
10
+ payload: {
11
+ type: string;
12
+ actionId: number;
13
+ };
14
+ state: string;
15
+ id: string;
16
+ source: '@devtools-extension';
17
+ };
18
+ export type DevTools = {
19
+ init: (state: unknown) => void;
20
+ send: (action: string, state: unknown) => void;
21
+ subscribe: (cb: (message: MessagePayload) => void) => void;
22
+ };
23
+ export declare function withDevTools<S>(initialState: S, options?: {}): DevTools | null;
@@ -0,0 +1,3 @@
1
+ export { StateHandler } from './state-handler.js';
2
+ export type { StateSingleton } from './state-singleton.js';
3
+ export { makeStateSingleton } from './state-singleton.js';
@@ -0,0 +1,36 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import type { StateSubscriptionHandler } from '../types/types.js';
3
+ import type { Observable, Subscription } from 'rxjs';
4
+ type Subscriptions = Subscription[];
5
+ type StateHandlerProps<S> = {
6
+ initialState: S;
7
+ options?: {
8
+ devTools: {
9
+ enabled?: boolean;
10
+ namespace: string;
11
+ };
12
+ };
13
+ };
14
+ type StateObservableOptions = {
15
+ useDistinctUntilChanged?: boolean;
16
+ };
17
+ export declare abstract class StateHandler<S, A> implements StateSubscriptionHandler<S, A> {
18
+ private readonly updates$;
19
+ private readonly state$;
20
+ private readonly initialState;
21
+ private devTools;
22
+ subscriptions: Subscriptions;
23
+ protected constructor({ initialState, options }: StateHandlerProps<S>);
24
+ getInitialState(): S;
25
+ getState(): S;
26
+ setState(newState: Partial<S>, actionName?: string): void;
27
+ destroy(): void;
28
+ getStateItemAsObservable(key: keyof S): Observable<S[keyof S]>;
29
+ getStateAsObservable(options?: StateObservableOptions): BehaviorSubject<S>;
30
+ getObservableItem(key: keyof S): Observable<S[keyof S]>;
31
+ private bindUpdatesAndEvents;
32
+ private handleDevToolsEvents;
33
+ getObservable(): Observable<S>;
34
+ abstract getActions(): A;
35
+ }
36
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { StateSubscriptionHandler } from '../types/types.js';
2
+ export interface StateSingleton<V, A> {
3
+ getInstance: () => StateSubscriptionHandler<V, A>;
4
+ }
5
+ export declare function makeStateSingleton<S, A>(stateHandlerFactory: () => StateSubscriptionHandler<S, A>): StateSingleton<S, A>;
@@ -0,0 +1,7 @@
1
+ import type { Observable } from 'rxjs';
2
+ export interface StateSubscriptionHandler<V, A> {
3
+ getObservable: () => Observable<V>;
4
+ destroy: () => void;
5
+ getInitialState: () => V;
6
+ getActions: () => A;
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veams/status-quo",
3
- "version": "0.0.2",
3
+ "version": "0.1.0",
4
4
  "description": "The manager to rule states in frontend.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -40,33 +40,33 @@
40
40
  "lint": "pnpm run lint:ts",
41
41
  "lint:ts": "eslint --fix \"src/**/*.{tsx,ts}\" --config ./.eslintrc.cjs",
42
42
  "start": "npm-run-all --parallel watch:**",
43
- "watch:bundle:ts": "npm run bundle:ts -w",
44
- "watch:generate:types": "npm run generate:types --watch",
43
+ "watch:bundle:ts": "npm run bundle:ts -- -w",
44
+ "watch:generate:types": "npm run generate:types -- --watch",
45
45
  "test": "cross-env NODE_ENV=test jest --config jest.config.cjs",
46
46
  "test:ci": "cross-env NODE_ENV=test jest --ci --silent --no-cache --config jest.config.ci.cjs",
47
47
  "release": "npm run build && release-it"
48
48
  },
49
49
  "peerDependencies": {
50
- "react": "^18.0.0",
51
- "rxjs": "^7.5.4"
50
+ "react": ">=18.0.0",
51
+ "rxjs": ">=7.5.4"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/jest": "29.5.10",
55
- "@types/node": "20.10.3",
56
- "@types/react": "18.2.41",
54
+ "@types/jest": "30.0.0",
55
+ "@types/node": "24.0.13",
56
+ "@types/react": "19.1.8",
57
57
  "cross-env": "7.0.3",
58
58
  "eslint": "8.55.0",
59
- "jest": "29.7.0",
60
- "jest-environment-jsdom": "29.7.0",
59
+ "jest": "30.0.4",
60
+ "jest-environment-jsdom": "30.0.4",
61
61
  "npm-run-all": "4.1.5",
62
- "prettier": "3.1.0",
63
- "react": "18.2.0",
64
- "rxjs": "7.8.1",
65
- "tslib": "2.6.2",
66
- "typescript": "5.3.2",
67
- "@swc/jest": "0.2.29",
68
- "@swc/core": "1.3.100",
69
- "release-it": "17.0.0"
62
+ "prettier": "3.6.2",
63
+ "react": "19.1.0",
64
+ "rxjs": "7.8.2",
65
+ "tslib": "2.8.1",
66
+ "typescript": "5.8.3",
67
+ "@swc/jest": "0.2.39",
68
+ "@swc/core": "1.12.11",
69
+ "release-it": "19.0.3"
70
70
  },
71
71
  "keywords": [
72
72
  "State Management"
@@ -12,5 +12,5 @@ export function useStateFactory<V, A, P extends unknown[]>(
12
12
  const actions = useRef(stateHandler.current.getActions());
13
13
  const state = useStateSubscription(stateHandler.current);
14
14
 
15
- return [state, actions] as [V, A];
15
+ return [state, actions.current] as [V, A];
16
16
  }
@@ -83,7 +83,7 @@ describe('State Handler', () => {
83
83
  customSubject.next(2);
84
84
  customSubject.next(3);
85
85
 
86
- expect(spy).toBeCalledTimes(1);
86
+ expect(spy).toHaveBeenCalledTimes(1);
87
87
  });
88
88
 
89
89
  it('should only call subscriber when object state has changed', async () => {
@@ -103,6 +103,6 @@ describe('State Handler', () => {
103
103
  test: 'test2',
104
104
  });
105
105
 
106
- expect(spy).toBeCalledTimes(3); // 1. testValue (Initial value), 2. test (first setter), 3. test2 (second setter)
106
+ expect(spy).toHaveBeenCalledTimes(3); // 1. testValue (Initial value), 2. test (first setter), 3. test2 (second setter)
107
107
  });
108
108
  });