synstate-react-hooks-compat 1.0.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.
Files changed (46) hide show
  1. package/README.md +112 -0
  2. package/dist/create-boolean-state.d.mts +13 -0
  3. package/dist/create-boolean-state.d.mts.map +1 -0
  4. package/dist/create-boolean-state.mjs +24 -0
  5. package/dist/create-boolean-state.mjs.map +1 -0
  6. package/dist/create-reducer.d.mts +7 -0
  7. package/dist/create-reducer.d.mts.map +1 -0
  8. package/dist/create-reducer.mjs +11 -0
  9. package/dist/create-reducer.mjs.map +1 -0
  10. package/dist/create-state.d.mts +9 -0
  11. package/dist/create-state.d.mts.map +1 -0
  12. package/dist/create-state.mjs +21 -0
  13. package/dist/create-state.mjs.map +1 -0
  14. package/dist/globals.d.mts +1 -0
  15. package/dist/index.d.mts +8 -0
  16. package/dist/index.d.mts.map +1 -0
  17. package/dist/index.mjs +8 -0
  18. package/dist/index.mjs.map +1 -0
  19. package/dist/synstate.d.mts +2 -0
  20. package/dist/synstate.d.mts.map +1 -0
  21. package/dist/synstate.mjs +2 -0
  22. package/dist/synstate.mjs.map +1 -0
  23. package/dist/tsconfig.json +1 -0
  24. package/dist/types.d.mts +2 -0
  25. package/dist/use-observable-effect.d.mts +3 -0
  26. package/dist/use-observable-effect.d.mts.map +1 -0
  27. package/dist/use-observable-effect.mjs +13 -0
  28. package/dist/use-observable-effect.mjs.map +1 -0
  29. package/dist/use-observable-value.d.mts +6 -0
  30. package/dist/use-observable-value.d.mts.map +1 -0
  31. package/dist/use-observable-value.mjs +16 -0
  32. package/dist/use-observable-value.mjs.map +1 -0
  33. package/dist/use-value-as-observable.d.mts +3 -0
  34. package/dist/use-value-as-observable.d.mts.map +1 -0
  35. package/dist/use-value-as-observable.mjs +21 -0
  36. package/dist/use-value-as-observable.mjs.map +1 -0
  37. package/package.json +73 -0
  38. package/src/create-boolean-state.mts +52 -0
  39. package/src/create-reducer.mts +27 -0
  40. package/src/create-state.mts +36 -0
  41. package/src/globals.d.mts +1 -0
  42. package/src/index.mts +7 -0
  43. package/src/synstate.mts +58 -0
  44. package/src/use-observable-effect.mts +15 -0
  45. package/src/use-observable-value.mts +38 -0
  46. package/src/use-value-as-observable.mts +35 -0
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # SynState React hooks
2
+
3
+ synstate-react-hooks re-exports all exports from synstate except for `createState`, `createReducer`, and `createBooleanState`, and exports modified versions of those creation functions.
4
+
5
+ The first element of the array returned by the `createState<T>` function provided by synstate-preact-hooks is changed from `InitializedObservable<T>` to a React hook `() => T`, and the `InitializedObservable<T>` has been moved to the `state` property in the object at index 2.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm add synstate-react-hooks-compat
11
+ ```
12
+
13
+ Or with other package managers:
14
+
15
+ ```bash
16
+ # Yarn
17
+ yarn add synstate-react-hooks-compat
18
+
19
+ # pnpm
20
+ pnpm add synstate-react-hooks-compat
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ### Simple State Management
26
+
27
+ ```tsx
28
+ import type * as React from 'react';
29
+ import { createState } from 'synstate-react-hooks-compat';
30
+
31
+ // Global state (outside component)
32
+ const [useUserState, setUserState] = createState({
33
+ name: '',
34
+ email: '',
35
+ });
36
+
37
+ const UserProfile = (): React.JSX.Element => {
38
+ const user = useUserState();
39
+
40
+ return (
41
+ <div>
42
+ <p>{`Name: ${user.name}`}</p>
43
+ <button
44
+ onClick={() => {
45
+ setUserState({
46
+ name: 'Alice',
47
+ email: 'alice@example.com',
48
+ });
49
+ }}
50
+ >
51
+ {'Set User'}
52
+ </button>
53
+ </div>
54
+ );
55
+ };
56
+ ```
57
+
58
+ With `resetState`, `updateState`, `state` APIs:
59
+
60
+ ```tsx
61
+ import type * as React from 'react';
62
+ import { createState } from 'synstate-react-hooks-compat';
63
+
64
+ // Global state (outside component)
65
+ const [
66
+ useUserState,
67
+ setUserState,
68
+ {
69
+ resetState: resetUserState,
70
+ updateState: updateUserState,
71
+ state: userState,
72
+ },
73
+ ] = createState({
74
+ name: '',
75
+ email: '',
76
+ });
77
+
78
+ userState.subscribe((u) => {
79
+ console.log('User is updated:', u);
80
+ });
81
+
82
+ const UserProfile = (): React.JSX.Element => {
83
+ const user = useUserState();
84
+
85
+ return (
86
+ <div>
87
+ <p>{`Name: ${user.name}`}</p>
88
+ <button
89
+ onClick={() => {
90
+ setUserState({
91
+ name: 'Alice',
92
+ email: 'alice@example.com',
93
+ });
94
+ }}
95
+ >
96
+ {'Set User'}
97
+ </button>
98
+ <button
99
+ onClick={() => {
100
+ updateUserState((prev) => ({
101
+ name: prev.name,
102
+ email: '',
103
+ }));
104
+ }}
105
+ >
106
+ {'Reset email'}
107
+ </button>
108
+ <button onClick={resetUserState}>{'Reset'}</button>
109
+ </div>
110
+ );
111
+ };
112
+ ```
@@ -0,0 +1,13 @@
1
+ import { type InitializedObservable } from 'synstate';
2
+ export declare const createBooleanState: (initialState: boolean) => readonly [useCurrentValue: () => boolean, Readonly<{
3
+ state: InitializedObservable<boolean>;
4
+ setTrue: () => void;
5
+ setFalse: () => void;
6
+ setState: (next: boolean) => boolean;
7
+ toggle: () => boolean;
8
+ updateState: (updateFn: (prev: boolean) => boolean) => boolean;
9
+ resetState: () => boolean;
10
+ getSnapshot: () => boolean;
11
+ initialState: boolean;
12
+ }>];
13
+ //# sourceMappingURL=create-boolean-state.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-boolean-state.d.mts","sourceRoot":"","sources":["../src/create-boolean-state.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,UAAU,CAAC;AAGlB,eAAO,MAAM,kBAAkB,GAC7B,cAAc,OAAO,KACpB,SAAS,CACV,eAAe,EAAE,MAAM,OAAO,EAC9B,QAAQ,CAAC;IACP,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,KAAK,OAAO,CAAC;IAC/D,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CA+BH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { createBooleanState as createBooleanState$1 } from 'synstate';
2
+ import { useObservableValue } from './use-observable-value.mjs';
3
+
4
+ const createBooleanState = (initialState) => {
5
+ const [state, { setTrue, setFalse, setState, toggle, updateState, resetState, getSnapshot, },] = createBooleanState$1(initialState);
6
+ const useCurrentValue = () => useObservableValue(state);
7
+ return [
8
+ useCurrentValue,
9
+ {
10
+ state,
11
+ setTrue,
12
+ setFalse,
13
+ setState,
14
+ toggle,
15
+ updateState,
16
+ resetState,
17
+ getSnapshot,
18
+ initialState,
19
+ },
20
+ ];
21
+ };
22
+
23
+ export { createBooleanState };
24
+ //# sourceMappingURL=create-boolean-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-boolean-state.mjs","sources":["../src/create-boolean-state.mts"],"sourcesContent":[null],"names":["createBooleanStateBase"],"mappings":";;;AAMO,MAAM,kBAAkB,GAAG,CAChC,YAAqB,KAcnB;IACF,MAAM,CACJ,KAAK,EACL,EACE,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,WAAW,EACX,UAAU,EACV,WAAW,GACZ,EACF,GAAGA,oBAAsB,CAAC,YAAY,CAAC;IAExC,MAAM,eAAe,GAAG,MAAe,kBAAkB,CAAC,KAAK,CAAC;IAEhE,OAAO;QACL,eAAe;AACf,QAAA;YACE,KAAK;YACL,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
@@ -0,0 +1,7 @@
1
+ import { type InitializedObservable } from 'synstate';
2
+ export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S) => readonly [useCurrentValue: () => S, dispatch: (action: A) => S, Readonly<{
3
+ state: InitializedObservable<S>;
4
+ getSnapshot: () => S;
5
+ initialState: S;
6
+ }>];
7
+ //# sourceMappingURL=create-reducer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../src/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAGlB,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,EAChC,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,cAAc,CAAC,KACd,SAAS,CACV,eAAe,EAAE,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,QAAQ,CAAC;IACP,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAUH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { createReducer as createReducer$1 } from 'synstate';
2
+ import { useObservableValue } from './use-observable-value.mjs';
3
+
4
+ const createReducer = (reducer, initialState) => {
5
+ const [state, dispatch, { getSnapshot }] = createReducer$1(reducer, initialState);
6
+ const useCurrentValue = () => useObservableValue(state);
7
+ return [useCurrentValue, dispatch, { state, getSnapshot, initialState }];
8
+ };
9
+
10
+ export { createReducer };
11
+ //# sourceMappingURL=create-reducer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-reducer.mjs","sources":["../src/create-reducer.mts"],"sourcesContent":[null],"names":["createReducerBase"],"mappings":";;;MAMa,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,KASb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,GAAGA,eAAiB,CAC1D,OAAO,EACP,YAAY,CACb;IAED,MAAM,eAAe,GAAG,MAAS,kBAAkB,CAAC,KAAK,CAAC;AAE1D,IAAA,OAAO,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAC1E;;;;"}
@@ -0,0 +1,9 @@
1
+ import { type InitializedObservable } from 'synstate';
2
+ export declare const createState: <S>(initialState: S) => readonly [useCurrentValue: () => S, setState: (v: S) => S, Readonly<{
3
+ state: InitializedObservable<S>;
4
+ updateState: (updateFn: (prev: S) => S) => S;
5
+ resetState: () => S;
6
+ getSnapshot: () => S;
7
+ initialState: S;
8
+ }>];
9
+ //# sourceMappingURL=create-state.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../src/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAGlB,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,cAAc,CAAC,KACd,SAAS,CACV,eAAe,EAAE,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,QAAQ,CAAC;IACP,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAChC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAkBH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { createState as createState$1 } from 'synstate';
2
+ import { useObservableValue } from './use-observable-value.mjs';
3
+
4
+ const createState = (initialState) => {
5
+ const [state, setState, { updateState, resetState, getSnapshot }] = createState$1(initialState);
6
+ const useCurrentValue = () => useObservableValue(state);
7
+ return [
8
+ useCurrentValue,
9
+ setState,
10
+ {
11
+ state,
12
+ updateState,
13
+ resetState,
14
+ getSnapshot,
15
+ initialState,
16
+ },
17
+ ];
18
+ };
19
+
20
+ export { createState };
21
+ //# sourceMappingURL=create-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-state.mjs","sources":["../src/create-state.mts"],"sourcesContent":[null],"names":["createStateBase"],"mappings":";;;AAMO,MAAM,WAAW,GAAG,CACzB,YAAe,KAWb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAC/DA,aAAe,CAAC,YAAY,CAAC;IAE/B,MAAM,eAAe,GAAG,MAAS,kBAAkB,CAAC,KAAK,CAAC;IAE1D,OAAO;QACL,eAAe;QACf,QAAQ;AACR,QAAA;YACE,KAAK;YACL,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
@@ -0,0 +1 @@
1
+ /// <reference types="ts-type-forge" />
@@ -0,0 +1,8 @@
1
+ export * from './create-boolean-state.mjs';
2
+ export * from './create-reducer.mjs';
3
+ export * from './create-state.mjs';
4
+ export * from './synstate.mjs';
5
+ export * from './use-observable-effect.mjs';
6
+ export * from './use-observable-value.mjs';
7
+ export * from './use-value-as-observable.mjs';
8
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC"}
package/dist/index.mjs ADDED
@@ -0,0 +1,8 @@
1
+ export { createBooleanState } from './create-boolean-state.mjs';
2
+ export { createReducer } from './create-reducer.mjs';
3
+ export { createState } from './create-state.mjs';
4
+ export { AsyncChildObservableClass, InitializedSyncChildObservableClass, ObservableBaseClass, RootObservableClass, SyncChildObservableClass, attachIndex, audit, collectToArray, combine, combineLatest, counter, createEventEmitter, createValueEmitter, debounce, distinctUntilChanged, filter, flatMap, fromAbortablePromise, fromPromise, fromSubscribable, getKey, isChildObservable, isManagerObservable, isRootObservable, just, map, mapOptional, mapResultErr, mapResultOk, mapTo, merge, mergeMap, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, switchMap, take, takeUntil, takeWhile, throttle, timer, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip } from 'synstate';
5
+ export { useObservableEffect } from './use-observable-effect.mjs';
6
+ export { useObservableValue } from './use-observable-value.mjs';
7
+ export { useValueAsObservable } from './use-value-as-observable.mjs';
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,2 @@
1
+ export { AsyncChildObservableClass, InitializedSyncChildObservableClass, ObservableBaseClass, RootObservableClass, SyncChildObservableClass, attachIndex, audit, collectToArray, combine, combineLatest, counter, createEventEmitter, createValueEmitter, debounce, distinctUntilChanged, filter, flatMap, fromAbortablePromise, fromPromise, fromSubscribable, getKey, isChildObservable, isManagerObservable, isRootObservable, just, map, mapOptional, mapResultErr, mapResultOk, mapTo, merge, mergeMap, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, switchMap, take, takeUntil, takeWhile, throttle, timer, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip, } from 'synstate';
2
+ //# sourceMappingURL=synstate.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synstate.d.mts","sourceRoot":"","sources":["../src/synstate.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,mCAAmC,EACnC,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,KAAK,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,oBAAoB,EACpB,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,IAAI,EACJ,GAAG,EACH,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,KAAK,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,GAAG,GACJ,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { AsyncChildObservableClass, InitializedSyncChildObservableClass, ObservableBaseClass, RootObservableClass, SyncChildObservableClass, attachIndex, audit, collectToArray, combine, combineLatest, counter, createEventEmitter, createValueEmitter, debounce, distinctUntilChanged, filter, flatMap, fromAbortablePromise, fromPromise, fromSubscribable, getKey, isChildObservable, isManagerObservable, isRootObservable, just, map, mapOptional, mapResultErr, mapResultOk, mapTo, merge, mergeMap, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, switchMap, take, takeUntil, takeWhile, throttle, timer, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip } from 'synstate';
2
+ //# sourceMappingURL=synstate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synstate.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"include":["."]}
@@ -0,0 +1,2 @@
1
+ import './globals.d.mts';
2
+ export * from './entry-point.mjs';
@@ -0,0 +1,3 @@
1
+ import { type Observable } from 'synstate';
2
+ export declare const useObservableEffect: <A>(observable$: Observable<A>, subscriptionFn: (v: A) => void) => void;
3
+ //# sourceMappingURL=use-observable-effect.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-observable-effect.d.mts","sourceRoot":"","sources":["../src/use-observable-effect.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,mBAAmB,GAAI,CAAC,EACnC,aAAa,UAAU,CAAC,CAAC,CAAC,EAC1B,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAC7B,IAQF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+
3
+ const useObservableEffect = (observable$, subscriptionFn) => {
4
+ React.useEffect(() => {
5
+ const s = observable$.subscribe(subscriptionFn);
6
+ return () => {
7
+ s.unsubscribe();
8
+ };
9
+ }, []);
10
+ };
11
+
12
+ export { useObservableEffect };
13
+ //# sourceMappingURL=use-observable-effect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-observable-effect.mjs","sources":["../src/use-observable-effect.mts"],"sourcesContent":[null],"names":[],"mappings":";;MAGa,mBAAmB,GAAG,CACjC,WAA0B,EAC1B,cAA8B,KACtB;AACR,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;QACnB,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,cAAc,CAAC;AAE/C,QAAA,OAAO,MAAK;YACV,CAAC,CAAC,WAAW,EAAE;AACjB,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;AACR;;;;"}
@@ -0,0 +1,6 @@
1
+ import { type InitializedObservable, type Observable } from 'synstate';
2
+ export declare function useObservableValue<A, B = A>(observable$: Observable<A>, initialValue: B): A | B;
3
+ export declare function useObservableValue<A>(observable$: InitializedObservable<A>): A;
4
+ export declare function useObservableValue<A>(observable$: Observable<A>): A | undefined;
5
+ export declare function useObservableValue<A, B = A>(observable$: Observable<A>, initialValue: B): A | B;
6
+ //# sourceMappingURL=use-observable-value.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-observable-value.d.mts","sourceRoot":"","sources":["../src/use-observable-value.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAGvE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EACzC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAC1B,YAAY,EAAE,CAAC,GACd,CAAC,GAAG,CAAC,CAAC;AAET,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEhF,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,GACzB,CAAC,GAAG,SAAS,CAAC;AAEjB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EACzC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAC1B,YAAY,EAAE,CAAC,GACd,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ import { Optional } from 'ts-data-forge';
3
+
4
+ function useObservableValue(observable$, initialValue) {
5
+ const [value, setValue] = React.useState(() => Optional.unwrapOr(observable$.getSnapshot(), initialValue));
6
+ React.useEffect(() => {
7
+ const { unsubscribe } = observable$.subscribe((v) => {
8
+ setValue(v);
9
+ });
10
+ return unsubscribe;
11
+ }, [observable$]);
12
+ return value;
13
+ }
14
+
15
+ export { useObservableValue };
16
+ //# sourceMappingURL=use-observable-value.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-observable-value.mjs","sources":["../src/use-observable-value.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAoBM,SAAU,kBAAkB,CAChC,WAA0B,EAC1B,YAAgB,EAAA;IAEhB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAoB,MAC1D,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAC3D;AAED,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;QACnB,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YAClD,QAAQ,CAAC,CAAC,CAAC;AACb,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,WAAW;AACpB,IAAA,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;AAEjB,IAAA,OAAO,KAAK;AACd;;;;"}
@@ -0,0 +1,3 @@
1
+ import { type Observable } from 'synstate';
2
+ export declare const useValueAsObservable: <A>(input: A) => Observable<A>;
3
+ //# sourceMappingURL=use-value-as-observable.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-value-as-observable.d.mts","sourceRoot":"","sources":["../src/use-value-as-observable.mts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAG,OAAO,CAAC,KAAG,UAAU,CAAC,CAAC,CA0B/D,CAAC"}
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import { source, withInitialValue } from 'synstate';
3
+
4
+ const useValueAsObservable = (input) => {
5
+ const sourceObservable = React.useMemo(source, []);
6
+ const state = React.useMemo(() => sourceObservable.pipe(withInitialValue(input)), []);
7
+ React.useEffect(() => () => {
8
+ state.complete();
9
+ }, []);
10
+ const setState = React.useCallback((nextState) => {
11
+ sourceObservable.next(nextState);
12
+ return nextState;
13
+ }, []);
14
+ React.useEffect(() => {
15
+ setState(input);
16
+ }, [input]);
17
+ return state;
18
+ };
19
+
20
+ export { useValueAsObservable };
21
+ //# sourceMappingURL=use-value-as-observable.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-value-as-observable.mjs","sources":["../src/use-value-as-observable.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAQO,MAAM,oBAAoB,GAAG,CAAK,KAAQ,KAAmB;IAClE,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAsB,MAAM,EAAE,EAAE,CAAC;IAEvE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CACzB,MAAM,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EACpD,EAAE,CACH;AAED,IAAA,KAAK,CAAC,SAAS,CACb,MAAM,MAAK;QACT,KAAK,CAAC,QAAQ,EAAE;IAClB,CAAC,EACD,EAAE,CACH;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,SAAY,KAAO;AACrD,QAAA,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;AAEhC,QAAA,OAAO,SAAS;IAClB,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;QACnB,QAAQ,CAAC,KAAK,CAAC;AACjB,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,OAAO,KAAK;AACd;;;;"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "synstate-react-hooks-compat",
3
+ "version": "1.0.0",
4
+ "description": "SynState React hooks for React 16.8–17 (without useSyncExternalStore)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/noshiro-pf/synstate.git"
8
+ },
9
+ "license": "Apache-2.0",
10
+ "author": "noshiro-pf <noshiro.pf@gmail.com>",
11
+ "sideEffects": false,
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "import": {
16
+ "types": "./dist/index.d.mts",
17
+ "default": "./dist/index.mjs"
18
+ }
19
+ }
20
+ },
21
+ "module": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "files": [
24
+ "src",
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsx ./scripts/cmd/build.mts",
31
+ "build:min": "tsx ./scripts/cmd/build.mts --skip-check",
32
+ "check:ext": "tsx ./scripts/cmd/check-ext.mts",
33
+ "check-all": "tsx ./scripts/cmd/check-all.mts",
34
+ "codemod": "convert-to-readonly '{src,samples,test}/**/*.{mts,tsx}'",
35
+ "doc": "run-s doc:embed doc:embed:jsdoc fmt",
36
+ "doc:embed": "tsx ./scripts/cmd/embed-examples.mts",
37
+ "doc:embed:jsdoc": "tsx ./scripts/cmd/embed-examples-in-jsdoc.mts",
38
+ "fmt": "format-uncommitted",
39
+ "fmt:full": "pnpm run z:prettier .",
40
+ "gen:re-export": "run-s gen:re-export:script fmt",
41
+ "gen:re-export:script": "tsx ./scripts/cmd/generate-re-export-script.mts",
42
+ "gi": "run-s gi:src fmt",
43
+ "gi:src": "gen-index-ts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts",
44
+ "lint": "eslint .",
45
+ "lint:fix": "eslint . --fix",
46
+ "test": "pnpm run z:vitest:node run",
47
+ "test:browser": "pnpm run z:vitest --project='Browser' run",
48
+ "test:cov": "pnpm run z:vitest:node run --coverage",
49
+ "test:cov:ui": "vite preview --outDir ./coverage",
50
+ "test:ui": "pnpm run z:vitest:node --ui",
51
+ "testw": "pnpm run z:vitest:node watch",
52
+ "tsc": "tsc --noEmit",
53
+ "tscw": "tsc --noEmit --watch",
54
+ "type-check": "tsc --noEmit",
55
+ "update-packages": "pnpm update --latest",
56
+ "z:prettier": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --ignore-path ../../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
57
+ "z:vitest": "vitest --config ./configs/vitest.config.mts",
58
+ "z:vitest:node": "pnpm run z:vitest --project='Node.js'"
59
+ },
60
+ "dependencies": {
61
+ "synstate": "workspace:*",
62
+ "ts-data-forge": "^6.8.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/argparse": "^2.0.17",
66
+ "@types/react": "^17.0.0",
67
+ "argparse": "^2.0.1",
68
+ "react": "^17.0.2"
69
+ },
70
+ "peerDependencies": {
71
+ "react": ">=16.8.0"
72
+ }
73
+ }
@@ -0,0 +1,52 @@
1
+ import {
2
+ type InitializedObservable,
3
+ createBooleanState as createBooleanStateBase,
4
+ } from 'synstate';
5
+ import { useObservableValue } from './use-observable-value.mjs';
6
+
7
+ export const createBooleanState = (
8
+ initialState: boolean,
9
+ ): readonly [
10
+ useCurrentValue: () => boolean,
11
+ Readonly<{
12
+ state: InitializedObservable<boolean>;
13
+ setTrue: () => void;
14
+ setFalse: () => void;
15
+ setState: (next: boolean) => boolean;
16
+ toggle: () => boolean;
17
+ updateState: (updateFn: (prev: boolean) => boolean) => boolean;
18
+ resetState: () => boolean;
19
+ getSnapshot: () => boolean;
20
+ initialState: boolean;
21
+ }>,
22
+ ] => {
23
+ const [
24
+ state,
25
+ {
26
+ setTrue,
27
+ setFalse,
28
+ setState,
29
+ toggle,
30
+ updateState,
31
+ resetState,
32
+ getSnapshot,
33
+ },
34
+ ] = createBooleanStateBase(initialState);
35
+
36
+ const useCurrentValue = (): boolean => useObservableValue(state);
37
+
38
+ return [
39
+ useCurrentValue,
40
+ {
41
+ state,
42
+ setTrue,
43
+ setFalse,
44
+ setState,
45
+ toggle,
46
+ updateState,
47
+ resetState,
48
+ getSnapshot,
49
+ initialState,
50
+ },
51
+ ] as const;
52
+ };
@@ -0,0 +1,27 @@
1
+ import {
2
+ createReducer as createReducerBase,
3
+ type InitializedObservable,
4
+ } from 'synstate';
5
+ import { useObservableValue } from './use-observable-value.mjs';
6
+
7
+ export const createReducer = <S, A>(
8
+ reducer: Reducer<S, A>,
9
+ initialState: S,
10
+ ): readonly [
11
+ useCurrentValue: () => S,
12
+ dispatch: (action: A) => S,
13
+ Readonly<{
14
+ state: InitializedObservable<S>;
15
+ getSnapshot: () => S;
16
+ initialState: S;
17
+ }>,
18
+ ] => {
19
+ const [state, dispatch, { getSnapshot }] = createReducerBase(
20
+ reducer,
21
+ initialState,
22
+ );
23
+
24
+ const useCurrentValue = (): S => useObservableValue(state);
25
+
26
+ return [useCurrentValue, dispatch, { state, getSnapshot, initialState }];
27
+ };
@@ -0,0 +1,36 @@
1
+ import {
2
+ createState as createStateBase,
3
+ type InitializedObservable,
4
+ } from 'synstate';
5
+ import { useObservableValue } from './use-observable-value.mjs';
6
+
7
+ export const createState = <S,>(
8
+ initialState: S,
9
+ ): readonly [
10
+ useCurrentValue: () => S,
11
+ setState: (v: S) => S,
12
+ Readonly<{
13
+ state: InitializedObservable<S>;
14
+ updateState: (updateFn: (prev: S) => S) => S;
15
+ resetState: () => S;
16
+ getSnapshot: () => S;
17
+ initialState: S;
18
+ }>,
19
+ ] => {
20
+ const [state, setState, { updateState, resetState, getSnapshot }] =
21
+ createStateBase(initialState);
22
+
23
+ const useCurrentValue = (): S => useObservableValue(state);
24
+
25
+ return [
26
+ useCurrentValue,
27
+ setState,
28
+ {
29
+ state,
30
+ updateState,
31
+ resetState,
32
+ getSnapshot,
33
+ initialState,
34
+ },
35
+ ] as const;
36
+ };
@@ -0,0 +1 @@
1
+ /// <reference types="ts-type-forge" />
package/src/index.mts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './create-boolean-state.mjs';
2
+ export * from './create-reducer.mjs';
3
+ export * from './create-state.mjs';
4
+ export * from './synstate.mjs';
5
+ export * from './use-observable-effect.mjs';
6
+ export * from './use-observable-value.mjs';
7
+ export * from './use-value-as-observable.mjs';
@@ -0,0 +1,58 @@
1
+ export {
2
+ AsyncChildObservableClass,
3
+ InitializedSyncChildObservableClass,
4
+ ObservableBaseClass,
5
+ RootObservableClass,
6
+ SyncChildObservableClass,
7
+ attachIndex,
8
+ audit,
9
+ collectToArray,
10
+ combine,
11
+ combineLatest,
12
+ counter,
13
+ createEventEmitter,
14
+ createValueEmitter,
15
+ debounce,
16
+ distinctUntilChanged,
17
+ filter,
18
+ flatMap,
19
+ fromAbortablePromise,
20
+ fromPromise,
21
+ fromSubscribable,
22
+ getKey,
23
+ isChildObservable,
24
+ isManagerObservable,
25
+ isRootObservable,
26
+ just,
27
+ map,
28
+ mapOptional,
29
+ mapResultErr,
30
+ mapResultOk,
31
+ mapTo,
32
+ merge,
33
+ mergeMap,
34
+ pairwise,
35
+ pluck,
36
+ scan,
37
+ skip,
38
+ skipIfNoChange,
39
+ skipUntil,
40
+ skipWhile,
41
+ source,
42
+ switchMap,
43
+ take,
44
+ takeUntil,
45
+ takeWhile,
46
+ throttle,
47
+ timer,
48
+ unwrapOptional,
49
+ unwrapResultErr,
50
+ unwrapResultOk,
51
+ withBuffered,
52
+ withBufferedFrom,
53
+ withCurrentValueFrom,
54
+ withIndex,
55
+ withInitialValue,
56
+ withLatestFrom,
57
+ zip,
58
+ } from 'synstate';
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { type Observable } from 'synstate';
3
+
4
+ export const useObservableEffect = <A,>(
5
+ observable$: Observable<A>,
6
+ subscriptionFn: (v: A) => void,
7
+ ): void => {
8
+ React.useEffect(() => {
9
+ const s = observable$.subscribe(subscriptionFn);
10
+
11
+ return () => {
12
+ s.unsubscribe();
13
+ };
14
+ }, []);
15
+ };
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+ import { type InitializedObservable, type Observable } from 'synstate';
3
+ import { Optional } from 'ts-data-forge';
4
+
5
+ export function useObservableValue<A, B = A>(
6
+ observable$: Observable<A>,
7
+ initialValue: B,
8
+ ): A | B;
9
+
10
+ export function useObservableValue<A>(observable$: InitializedObservable<A>): A;
11
+
12
+ export function useObservableValue<A>(
13
+ observable$: Observable<A>,
14
+ ): A | undefined;
15
+
16
+ export function useObservableValue<A, B = A>(
17
+ observable$: Observable<A>,
18
+ initialValue: B,
19
+ ): A | B;
20
+
21
+ export function useObservableValue<A, B = A>(
22
+ observable$: Observable<A>,
23
+ initialValue?: B,
24
+ ): A | B | undefined {
25
+ const [value, setValue] = React.useState<A | B | undefined>(() =>
26
+ Optional.unwrapOr(observable$.getSnapshot(), initialValue),
27
+ );
28
+
29
+ React.useEffect(() => {
30
+ const { unsubscribe } = observable$.subscribe((v) => {
31
+ setValue(v);
32
+ });
33
+
34
+ return unsubscribe;
35
+ }, [observable$]);
36
+
37
+ return value;
38
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+ import {
3
+ source,
4
+ withInitialValue,
5
+ type Observable,
6
+ type SourceObservable,
7
+ } from 'synstate';
8
+
9
+ export const useValueAsObservable = <A,>(input: A): Observable<A> => {
10
+ const sourceObservable = React.useMemo<SourceObservable<A>>(source, []);
11
+
12
+ const state = React.useMemo(
13
+ () => sourceObservable.pipe(withInitialValue(input)),
14
+ [],
15
+ );
16
+
17
+ React.useEffect(
18
+ () => () => {
19
+ state.complete();
20
+ },
21
+ [],
22
+ );
23
+
24
+ const setState = React.useCallback((nextState: A): A => {
25
+ sourceObservable.next(nextState);
26
+
27
+ return nextState;
28
+ }, []);
29
+
30
+ React.useEffect(() => {
31
+ setState(input);
32
+ }, [input]);
33
+
34
+ return state;
35
+ };