syncflow-react-hooks 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.
Files changed (46) hide show
  1. package/README.md +0 -0
  2. package/dist/create-boolean-state.d.mts +12 -0
  3. package/dist/create-boolean-state.d.mts.map +1 -0
  4. package/dist/create-boolean-state.mjs +23 -0
  5. package/dist/create-boolean-state.mjs.map +1 -0
  6. package/dist/create-reducer.d.mts +6 -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 +8 -0
  11. package/dist/create-state.d.mts.map +1 -0
  12. package/dist/create-state.mjs +20 -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/syncflow.d.mts +2 -0
  20. package/dist/syncflow.d.mts.map +1 -0
  21. package/dist/syncflow.mjs +2 -0
  22. package/dist/syncflow.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 +13 -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 +75 -0
  38. package/src/create-boolean-state.mts +50 -0
  39. package/src/create-reducer.mts +26 -0
  40. package/src/create-state.mts +34 -0
  41. package/src/globals.d.mts +1 -0
  42. package/src/index.mts +7 -0
  43. package/src/syncflow.mts +66 -0
  44. package/src/use-observable-effect.mts +15 -0
  45. package/src/use-observable-value.mts +35 -0
  46. package/src/use-value-as-observable.mts +35 -0
package/README.md ADDED
File without changes
@@ -0,0 +1,12 @@
1
+ import { type InitializedObservable } from 'syncflow';
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
+ }>];
12
+ //# 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;CAC5B,CAAC,CA8BH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { createBooleanState as createBooleanState$1 } from 'syncflow';
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
+ },
19
+ ];
20
+ };
21
+
22
+ export { createBooleanState };
23
+ //# 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,KAanB;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;AACZ,SAAA;KACO;AACZ;;;;"}
@@ -0,0 +1,6 @@
1
+ import { type InitializedObservable } from 'syncflow';
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
+ }>];
6
+ //# 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;CACtB,CAAC,CAUH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { createReducer as createReducer$1 } from 'syncflow';
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 }];
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,KAQb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAGA,eAAiB,CACtD,OAAO,EACP,YAAY,CACb;IAED,MAAM,eAAe,GAAG,MAAS,kBAAkB,CAAC,KAAK,CAAC;IAE1D,OAAO,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC5D;;;;"}
@@ -0,0 +1,8 @@
1
+ import { type InitializedObservable } from 'syncflow';
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
+ }>];
8
+ //# 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;CACtB,CAAC,CAiBH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { createState as createState$1 } from 'syncflow';
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
+ },
16
+ ];
17
+ };
18
+
19
+ export { createState };
20
+ //# 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,KAUb;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;AACZ,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 './syncflow.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, auditTime, binarySearch, combine, combineLatest, createEventEmitter, createValueEmitter, debounceTime, distinctUntilChanged, filter, flatMap, fromArray, fromPromise, fromSubscribable, getKey, halfInt, interval, isChildObservable, isManagerObservable, isRootObservable, issueObservableId, issueSubscriberId, issueUpdaterSymbol, map, mapOptional, mapResultErr, mapResultOk, mapTo, mapWithIndex, maxDepth, merge, mergeMap, of, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, subject, switchMap, take, takeUntil, takeWhile, throttleTime, timer, toSubscriber, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip } from 'syncflow';
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, auditTime, binarySearch, combine, combineLatest, createEventEmitter, createValueEmitter, debounceTime, distinctUntilChanged, filter, flatMap, fromArray, fromPromise, fromSubscribable, getKey, halfInt, interval, isChildObservable, isManagerObservable, isRootObservable, issueObservableId, issueSubscriberId, issueUpdaterSymbol, map, mapOptional, mapResultErr, mapResultOk, mapTo, mapWithIndex, maxDepth, merge, mergeMap, of, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, subject, switchMap, take, takeUntil, takeWhile, throttleTime, timer, toSubscriber, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip, } from 'syncflow';
2
+ //# sourceMappingURL=syncflow.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncflow.d.mts","sourceRoot":"","sources":["../src/syncflow.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,mCAAmC,EACnC,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,GAAG,EACH,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,EAAE,EACF,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,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, auditTime, binarySearch, combine, combineLatest, createEventEmitter, createValueEmitter, debounceTime, distinctUntilChanged, filter, flatMap, fromArray, fromPromise, fromSubscribable, getKey, halfInt, interval, isChildObservable, isManagerObservable, isRootObservable, issueObservableId, issueSubscriberId, issueUpdaterSymbol, map, mapOptional, mapResultErr, mapResultOk, mapTo, mapWithIndex, maxDepth, merge, mergeMap, of, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, subject, switchMap, take, takeUntil, takeWhile, throttleTime, timer, toSubscriber, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip } from 'syncflow';
2
+ //# sourceMappingURL=syncflow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncflow.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 'syncflow';
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 'syncflow';
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,13 @@
1
+ import * as React from 'react';
2
+ import { Optional } from 'ts-data-forge';
3
+
4
+ function useObservableValue(observable$, initialValue) {
5
+ const value = React.useSyncExternalStore((onStoreChange) => {
6
+ const { unsubscribe } = observable$.subscribe(onStoreChange);
7
+ return unsubscribe;
8
+ }, () => observable$.getSnapshot());
9
+ return Optional.unwrapOr(value, initialValue);
10
+ }
11
+
12
+ export { useObservableValue };
13
+ //# 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,KAAK,GAAG,KAAK,CAAC,oBAAoB,CACtC,CAAC,aAAyB,KAAI;QAC5B,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC;AAE5D,QAAA,OAAO,WAAW;IACpB,CAAC,EACD,MAAM,WAAW,CAAC,WAAW,EAAE,CAChC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;AAC/C;;;;"}
@@ -0,0 +1,3 @@
1
+ import { type Observable } from 'syncflow';
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 'syncflow';
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,75 @@
1
+ {
2
+ "name": "syncflow-react-hooks",
3
+ "version": "0.1.0",
4
+ "description": "Reactive Programming Library for TypeScript/JavaScript",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/noshiro-pf/syncflow.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": "tsx ./scripts/cmd/gen-docs.mts",
36
+ "doc:embed": "tsx ./scripts/cmd/embed-examples.mts",
37
+ "doc:embed:jsdoc": "tsx ./scripts/cmd/embed-examples-in-jsdoc.mts",
38
+ "doc:preview": "vite preview --config ./configs/vite.doc.config.ts",
39
+ "doc:watch": "typedoc --options ./configs/typedoc.config.mjs --watch",
40
+ "fmt": "pnpm run z:prettier .",
41
+ "gen:re-export": "run-s gen:re-export:script fmt",
42
+ "gen:re-export:script": "tsx ./scripts/cmd/generate-re-export-script.mts",
43
+ "gi": "run-s gi:src fmt",
44
+ "gi:src": "gen-index-ts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts",
45
+ "lint": "eslint .",
46
+ "lint:fix": "eslint . --fix",
47
+ "test": "pnpm run z:vitest:node run",
48
+ "test:all": "run-p test",
49
+ "test:browser": "pnpm run z:vitest --project='Browser' run",
50
+ "test:cov": "pnpm run z:vitest:node run --coverage",
51
+ "test:cov:ui": "vite preview --outDir ./coverage",
52
+ "test:ui": "pnpm run z:vitest:node --ui",
53
+ "testw": "pnpm run z:vitest:node watch",
54
+ "tsc": "tsc --noEmit",
55
+ "tscw": "tsc --noEmit --watch",
56
+ "type-check": "tsc --noEmit",
57
+ "update-packages": "pnpm update --latest",
58
+ "z:prettier": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --ignore-path ../../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
59
+ "z:vitest": "vitest --config ./configs/vitest.config.mts",
60
+ "z:vitest:node": "pnpm run z:vitest --project='Node.js'"
61
+ },
62
+ "dependencies": {
63
+ "syncflow": "workspace:*",
64
+ "ts-data-forge": "^6.5.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/argparse": "^2.0.17",
68
+ "@types/react": "^19.2.14",
69
+ "argparse": "^2.0.1",
70
+ "react": "^19.2.4"
71
+ },
72
+ "peerDependencies": {
73
+ "react": ">=18.0.0"
74
+ }
75
+ }
@@ -0,0 +1,50 @@
1
+ import {
2
+ type InitializedObservable,
3
+ createBooleanState as createBooleanStateBase,
4
+ } from 'syncflow';
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
+ }>,
21
+ ] => {
22
+ const [
23
+ state,
24
+ {
25
+ setTrue,
26
+ setFalse,
27
+ setState,
28
+ toggle,
29
+ updateState,
30
+ resetState,
31
+ getSnapshot,
32
+ },
33
+ ] = createBooleanStateBase(initialState);
34
+
35
+ const useCurrentValue = (): boolean => useObservableValue(state);
36
+
37
+ return [
38
+ useCurrentValue,
39
+ {
40
+ state,
41
+ setTrue,
42
+ setFalse,
43
+ setState,
44
+ toggle,
45
+ updateState,
46
+ resetState,
47
+ getSnapshot,
48
+ },
49
+ ] as const;
50
+ };
@@ -0,0 +1,26 @@
1
+ import {
2
+ createReducer as createReducerBase,
3
+ type InitializedObservable,
4
+ } from 'syncflow';
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
+ }>,
17
+ ] => {
18
+ const [state, dispatch, getSnapshot] = createReducerBase(
19
+ reducer,
20
+ initialState,
21
+ );
22
+
23
+ const useCurrentValue = (): S => useObservableValue(state);
24
+
25
+ return [useCurrentValue, dispatch, { state, getSnapshot }];
26
+ };
@@ -0,0 +1,34 @@
1
+ import {
2
+ createState as createStateBase,
3
+ type InitializedObservable,
4
+ } from 'syncflow';
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
+ }>,
18
+ ] => {
19
+ const [state, setState, { updateState, resetState, getSnapshot }] =
20
+ createStateBase(initialState);
21
+
22
+ const useCurrentValue = (): S => useObservableValue(state);
23
+
24
+ return [
25
+ useCurrentValue,
26
+ setState,
27
+ {
28
+ state,
29
+ updateState,
30
+ resetState,
31
+ getSnapshot,
32
+ },
33
+ ] as const;
34
+ };
@@ -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 './syncflow.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,66 @@
1
+ export {
2
+ AsyncChildObservableClass,
3
+ InitializedSyncChildObservableClass,
4
+ ObservableBaseClass,
5
+ RootObservableClass,
6
+ SyncChildObservableClass,
7
+ attachIndex,
8
+ auditTime,
9
+ binarySearch,
10
+ combine,
11
+ combineLatest,
12
+ createEventEmitter,
13
+ createValueEmitter,
14
+ debounceTime,
15
+ distinctUntilChanged,
16
+ filter,
17
+ flatMap,
18
+ fromArray,
19
+ fromPromise,
20
+ fromSubscribable,
21
+ getKey,
22
+ halfInt,
23
+ interval,
24
+ isChildObservable,
25
+ isManagerObservable,
26
+ isRootObservable,
27
+ issueObservableId,
28
+ issueSubscriberId,
29
+ issueUpdaterSymbol,
30
+ map,
31
+ mapOptional,
32
+ mapResultErr,
33
+ mapResultOk,
34
+ mapTo,
35
+ mapWithIndex,
36
+ maxDepth,
37
+ merge,
38
+ mergeMap,
39
+ of,
40
+ pairwise,
41
+ pluck,
42
+ scan,
43
+ skip,
44
+ skipIfNoChange,
45
+ skipUntil,
46
+ skipWhile,
47
+ source,
48
+ subject,
49
+ switchMap,
50
+ take,
51
+ takeUntil,
52
+ takeWhile,
53
+ throttleTime,
54
+ timer,
55
+ toSubscriber,
56
+ unwrapOptional,
57
+ unwrapResultErr,
58
+ unwrapResultOk,
59
+ withBuffered,
60
+ withBufferedFrom,
61
+ withCurrentValueFrom,
62
+ withIndex,
63
+ withInitialValue,
64
+ withLatestFrom,
65
+ zip,
66
+ } from 'syncflow';
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { type Observable } from 'syncflow';
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,35 @@
1
+ import * as React from 'react';
2
+ import { type InitializedObservable, type Observable } from 'syncflow';
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 = React.useSyncExternalStore(
26
+ (onStoreChange: () => void) => {
27
+ const { unsubscribe } = observable$.subscribe(onStoreChange);
28
+
29
+ return unsubscribe;
30
+ },
31
+ () => observable$.getSnapshot(),
32
+ );
33
+
34
+ return Optional.unwrapOr(value, initialValue);
35
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+ import {
3
+ source,
4
+ withInitialValue,
5
+ type Observable,
6
+ type SourceObservable,
7
+ } from 'syncflow';
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
+ };