synstate-preact-signals 0.2.2 → 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.
- package/dist/create-boolean-state.d.mts +1 -1
- package/dist/create-boolean-state.d.mts.map +1 -1
- package/dist/create-boolean-state.mjs +27 -41
- package/dist/create-boolean-state.mjs.map +1 -1
- package/dist/create-reducer.d.mts +1 -1
- package/dist/create-reducer.d.mts.map +1 -1
- package/dist/create-reducer.mjs +6 -34
- package/dist/create-reducer.mjs.map +1 -1
- package/dist/create-state.d.mts +1 -1
- package/dist/create-state.d.mts.map +1 -1
- package/dist/create-state.mjs +13 -48
- package/dist/create-state.mjs.map +1 -1
- package/dist/from-signal.d.mts.map +1 -1
- package/dist/from-signal.mjs +6 -44
- package/dist/from-signal.mjs.map +1 -1
- package/dist/to-signal.mjs +6 -7
- package/dist/to-signal.mjs.map +1 -1
- package/package.json +10 -11
- package/src/create-boolean-state.mts +1 -1
- package/src/create-reducer.mts +1 -1
- package/src/create-state.mts +1 -1
|
@@ -25,7 +25,7 @@ import { type InitializedObservable } from 'synstate';
|
|
|
25
25
|
* assert.strictEqual(isOpenSignal.value, true);
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
export declare const createBooleanState: (initialState: boolean) => readonly [signal: ReadonlySignal<boolean>, Readonly<{
|
|
28
|
+
export declare const createBooleanState: (initialState: boolean) => readonly [signal: ReadonlySignal<boolean>, utils: Readonly<{
|
|
29
29
|
state: InitializedObservable<boolean>;
|
|
30
30
|
setTrue: () => void;
|
|
31
31
|
setFalse: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-boolean-state.d.mts","sourceRoot":"","sources":["../src/create-boolean-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"create-boolean-state.d.mts","sourceRoot":"","sources":["../src/create-boolean-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,kBAAkB,iBACf,OAAO,KACpB,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,KAAK,EAAE,QAAQ,CAAC;IACd,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"}
|
|
@@ -1,48 +1,34 @@
|
|
|
1
1
|
import { createBooleanState as createBooleanState$1 } from 'synstate';
|
|
2
2
|
import { toSignal } from './to-signal.mjs';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Creates a synstate boolean state with a `ReadonlySignal` for reading the
|
|
6
|
-
* current value in Preact components.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```ts
|
|
10
|
-
* // eslint-disable-next-line @typescript-eslint/no-shadow
|
|
11
|
-
* const [isOpenSignal, { setTrue: open, setFalse: close, toggle }] =
|
|
12
|
-
* createBooleanState(false);
|
|
13
|
-
*
|
|
14
|
-
* assert.strictEqual(isOpenSignal.value, false);
|
|
15
|
-
*
|
|
16
|
-
* open();
|
|
17
|
-
*
|
|
18
|
-
* assert.strictEqual(isOpenSignal.value, true);
|
|
19
|
-
*
|
|
20
|
-
* close();
|
|
21
|
-
*
|
|
22
|
-
* assert.strictEqual(isOpenSignal.value, false);
|
|
23
|
-
*
|
|
24
|
-
* toggle();
|
|
25
|
-
*
|
|
26
|
-
* assert.strictEqual(isOpenSignal.value, true);
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
4
|
const createBooleanState = (initialState) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
5
|
+
const [
|
|
6
|
+
state,
|
|
7
|
+
{
|
|
8
|
+
setTrue,
|
|
9
|
+
setFalse,
|
|
10
|
+
setState,
|
|
11
|
+
toggle,
|
|
12
|
+
updateState,
|
|
13
|
+
resetState,
|
|
14
|
+
getSnapshot
|
|
15
|
+
}
|
|
16
|
+
] = createBooleanState$1(initialState);
|
|
17
|
+
const sig = toSignal(state);
|
|
18
|
+
return [
|
|
19
|
+
sig,
|
|
20
|
+
{
|
|
21
|
+
state,
|
|
22
|
+
setTrue,
|
|
23
|
+
setFalse,
|
|
24
|
+
setState,
|
|
25
|
+
toggle,
|
|
26
|
+
updateState,
|
|
27
|
+
resetState,
|
|
28
|
+
getSnapshot,
|
|
29
|
+
initialState
|
|
30
|
+
}
|
|
31
|
+
];
|
|
46
32
|
};
|
|
47
33
|
|
|
48
34
|
export { createBooleanState };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-boolean-state.mjs","sources":["../src/create-boolean-state.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"create-boolean-state.mjs","sources":["../src/create-boolean-state.mts"],"sourcesContent":["import { type ReadonlySignal } from '@preact/signals';\nimport {\n type InitializedObservable,\n createBooleanState as createBooleanStateBase,\n} from 'synstate';\nimport { toSignal } from './to-signal.mjs';\n\n/**\n * Creates a synstate boolean state with a `ReadonlySignal` for reading the\n * current value in Preact components.\n *\n * @example\n * ```ts\n * // eslint-disable-next-line @typescript-eslint/no-shadow\n * const [isOpenSignal, { setTrue: open, setFalse: close, toggle }] =\n * createBooleanState(false);\n *\n * assert.strictEqual(isOpenSignal.value, false);\n *\n * open();\n *\n * assert.strictEqual(isOpenSignal.value, true);\n *\n * close();\n *\n * assert.strictEqual(isOpenSignal.value, false);\n *\n * toggle();\n *\n * assert.strictEqual(isOpenSignal.value, true);\n * ```\n */\nexport const createBooleanState = (\n initialState: boolean,\n): readonly [\n signal: ReadonlySignal<boolean>,\n utils: Readonly<{\n state: InitializedObservable<boolean>;\n setTrue: () => void;\n setFalse: () => void;\n setState: (next: boolean) => boolean;\n toggle: () => boolean;\n updateState: (updateFn: (prev: boolean) => boolean) => boolean;\n resetState: () => boolean;\n getSnapshot: () => boolean;\n initialState: boolean;\n }>,\n] => {\n const [\n state,\n {\n setTrue,\n setFalse,\n setState,\n toggle,\n updateState,\n resetState,\n getSnapshot,\n },\n ] = createBooleanStateBase(initialState);\n\n const sig = toSignal(state);\n\n return [\n sig,\n {\n state,\n setTrue,\n setFalse,\n setState,\n toggle,\n updateState,\n resetState,\n getSnapshot,\n initialState,\n },\n ] as const;\n};\n"],"names":["createBooleanStateBase"],"mappings":";;;AAgCO,MAAM,kBAAA,GAAqB,CAChC,YAAA,KAcG;AACH,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA;AACF,GACF,GAAIA,qBAAuB,YAAY,CAAA;AAEvC,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA;AAAA,MACE,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
|
|
@@ -32,7 +32,7 @@ import { type Reducer } from 'ts-type-forge';
|
|
|
32
32
|
* assert.strictEqual(getSnapshot(), 1);
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
|
-
export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S) => readonly [signal: ReadonlySignal<S>, dispatch: (action: A) => S, Readonly<{
|
|
35
|
+
export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S) => readonly [signal: ReadonlySignal<S>, dispatch: (action: A) => S, utils: Readonly<{
|
|
36
36
|
state: InitializedObservable<S>;
|
|
37
37
|
getSnapshot: () => S;
|
|
38
38
|
initialState: S;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../src/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../src/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,WACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,gBACR,CAAC,KACd,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAUH,CAAC"}
|
package/dist/create-reducer.mjs
CHANGED
|
@@ -1,41 +1,13 @@
|
|
|
1
1
|
import { createReducer as createReducer$1 } from 'synstate';
|
|
2
2
|
import { toSignal } from './to-signal.mjs';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Creates a synstate reducer with a `ReadonlySignal` for reading the current
|
|
6
|
-
* value in Preact components.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```ts
|
|
10
|
-
* type Action = Readonly<{ type: 'increment' } | { type: 'decrement' }>;
|
|
11
|
-
*
|
|
12
|
-
* const [countSignal, dispatch, { getSnapshot }] = createReducer(
|
|
13
|
-
* (state: number, action: Action) =>
|
|
14
|
-
* action.type === 'increment' ? state + 1 : state - 1,
|
|
15
|
-
* 0,
|
|
16
|
-
* );
|
|
17
|
-
*
|
|
18
|
-
* assert.strictEqual(countSignal.value, 0);
|
|
19
|
-
*
|
|
20
|
-
* dispatch({ type: 'increment' });
|
|
21
|
-
*
|
|
22
|
-
* assert.strictEqual(countSignal.value, 1);
|
|
23
|
-
*
|
|
24
|
-
* dispatch({ type: 'increment' });
|
|
25
|
-
*
|
|
26
|
-
* assert.strictEqual(countSignal.value, 2);
|
|
27
|
-
*
|
|
28
|
-
* dispatch({ type: 'decrement' });
|
|
29
|
-
*
|
|
30
|
-
* assert.strictEqual(countSignal.value, 1);
|
|
31
|
-
*
|
|
32
|
-
* assert.strictEqual(getSnapshot(), 1);
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
4
|
const createReducer = (reducer, initialState) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
5
|
+
const [state, dispatch, { getSnapshot }] = createReducer$1(
|
|
6
|
+
reducer,
|
|
7
|
+
initialState
|
|
8
|
+
);
|
|
9
|
+
const sig = toSignal(state);
|
|
10
|
+
return [sig, dispatch, { state, getSnapshot, initialState }];
|
|
39
11
|
};
|
|
40
12
|
|
|
41
13
|
export { createReducer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-reducer.mjs","sources":["../src/create-reducer.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"create-reducer.mjs","sources":["../src/create-reducer.mts"],"sourcesContent":["import { type ReadonlySignal } from '@preact/signals';\nimport {\n createReducer as createReducerBase,\n type InitializedObservable,\n} from 'synstate';\nimport { type Reducer } from 'ts-type-forge';\nimport { toSignal } from './to-signal.mjs';\n\n/**\n * Creates a synstate reducer with a `ReadonlySignal` for reading the current\n * value in Preact components.\n *\n * @example\n * ```ts\n * type Action = Readonly<{ type: 'increment' } | { type: 'decrement' }>;\n *\n * const [countSignal, dispatch, { getSnapshot }] = createReducer(\n * (state: number, action: Action) =>\n * action.type === 'increment' ? state + 1 : state - 1,\n * 0,\n * );\n *\n * assert.strictEqual(countSignal.value, 0);\n *\n * dispatch({ type: 'increment' });\n *\n * assert.strictEqual(countSignal.value, 1);\n *\n * dispatch({ type: 'increment' });\n *\n * assert.strictEqual(countSignal.value, 2);\n *\n * dispatch({ type: 'decrement' });\n *\n * assert.strictEqual(countSignal.value, 1);\n *\n * assert.strictEqual(getSnapshot(), 1);\n * ```\n */\nexport const createReducer = <S, A>(\n reducer: Reducer<S, A>,\n initialState: S,\n): readonly [\n signal: ReadonlySignal<S>,\n dispatch: (action: A) => S,\n utils: Readonly<{\n state: InitializedObservable<S>;\n getSnapshot: () => S;\n initialState: S;\n }>,\n] => {\n const [state, dispatch, { getSnapshot }] = createReducerBase(\n reducer,\n initialState,\n );\n\n const sig = toSignal(state);\n\n return [sig, dispatch, { state, getSnapshot, initialState }];\n};\n"],"names":["createReducerBase"],"mappings":";;;AAuCO,MAAM,aAAA,GAAgB,CAC3B,OAAA,EACA,YAAA,KASG;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,GAAIA,eAAA;AAAA,IACzC,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAE1B,EAAA,OAAO,CAAC,GAAA,EAAK,QAAA,EAAU,EAAE,KAAA,EAAO,WAAA,EAAa,cAAc,CAAA;AAC7D;;;;"}
|
package/dist/create-state.d.mts
CHANGED
|
@@ -35,7 +35,7 @@ import { type InitializedObservable } from 'synstate';
|
|
|
35
35
|
* assert.strictEqual(getSnapshot(), 0);
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
38
|
-
export declare const createState: <S>(initialState: S) => readonly [signal: ReadonlySignal<S>, setState: (v: S) => S, Readonly<{
|
|
38
|
+
export declare const createState: <S>(initialState: S) => readonly [signal: ReadonlySignal<S>, setState: (v: S) => S, utils: Readonly<{
|
|
39
39
|
state: InitializedObservable<S>;
|
|
40
40
|
updateState: (updateFn: (prev: S) => S) => S;
|
|
41
41
|
resetState: () => S;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../src/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../src/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,gBACb,CAAC,KACd,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,QAAQ,CAAC;IACd,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"}
|
package/dist/create-state.mjs
CHANGED
|
@@ -1,55 +1,20 @@
|
|
|
1
1
|
import { createState as createState$1 } from 'synstate';
|
|
2
2
|
import { toSignal } from './to-signal.mjs';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Creates a synstate state with a `ReadonlySignal` for reading the current
|
|
6
|
-
* value in Preact components.
|
|
7
|
-
*
|
|
8
|
-
* Unlike `synstate-preact-hooks`' `createState` which returns a hook, this
|
|
9
|
-
* returns a `ReadonlySignal` that can be embedded directly in JSX without
|
|
10
|
-
* hooks, enabling fine-grained DOM updates.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```ts
|
|
14
|
-
* const [
|
|
15
|
-
* countSignal,
|
|
16
|
-
* setCount,
|
|
17
|
-
* { updateState, resetState, getSnapshot, initialState },
|
|
18
|
-
* ] = createState(0);
|
|
19
|
-
*
|
|
20
|
-
* assert.strictEqual(countSignal.value, 0);
|
|
21
|
-
*
|
|
22
|
-
* assert.strictEqual(initialState, 0);
|
|
23
|
-
*
|
|
24
|
-
* setCount(5);
|
|
25
|
-
*
|
|
26
|
-
* assert.strictEqual(countSignal.value, 5);
|
|
27
|
-
*
|
|
28
|
-
* updateState((prev) => prev + 1);
|
|
29
|
-
*
|
|
30
|
-
* assert.strictEqual(countSignal.value, 6);
|
|
31
|
-
*
|
|
32
|
-
* resetState();
|
|
33
|
-
*
|
|
34
|
-
* assert.strictEqual(countSignal.value, 0);
|
|
35
|
-
*
|
|
36
|
-
* assert.strictEqual(getSnapshot(), 0);
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
4
|
const createState = (initialState) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
5
|
+
const [state, setState, { updateState, resetState, getSnapshot }] = createState$1(initialState);
|
|
6
|
+
const sig = toSignal(state);
|
|
7
|
+
return [
|
|
8
|
+
sig,
|
|
9
|
+
setState,
|
|
10
|
+
{
|
|
11
|
+
state,
|
|
12
|
+
updateState,
|
|
13
|
+
resetState,
|
|
14
|
+
getSnapshot,
|
|
15
|
+
initialState
|
|
16
|
+
}
|
|
17
|
+
];
|
|
53
18
|
};
|
|
54
19
|
|
|
55
20
|
export { createState };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-state.mjs","sources":["../src/create-state.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"create-state.mjs","sources":["../src/create-state.mts"],"sourcesContent":["import { type ReadonlySignal } from '@preact/signals';\nimport {\n createState as createStateBase,\n type InitializedObservable,\n} from 'synstate';\nimport { toSignal } from './to-signal.mjs';\n\n/**\n * Creates a synstate state with a `ReadonlySignal` for reading the current\n * value in Preact components.\n *\n * Unlike `synstate-preact-hooks`' `createState` which returns a hook, this\n * returns a `ReadonlySignal` that can be embedded directly in JSX without\n * hooks, enabling fine-grained DOM updates.\n *\n * @example\n * ```ts\n * const [\n * countSignal,\n * setCount,\n * { updateState, resetState, getSnapshot, initialState },\n * ] = createState(0);\n *\n * assert.strictEqual(countSignal.value, 0);\n *\n * assert.strictEqual(initialState, 0);\n *\n * setCount(5);\n *\n * assert.strictEqual(countSignal.value, 5);\n *\n * updateState((prev) => prev + 1);\n *\n * assert.strictEqual(countSignal.value, 6);\n *\n * resetState();\n *\n * assert.strictEqual(countSignal.value, 0);\n *\n * assert.strictEqual(getSnapshot(), 0);\n * ```\n */\nexport const createState = <S,>(\n initialState: S,\n): readonly [\n signal: ReadonlySignal<S>,\n setState: (v: S) => S,\n utils: Readonly<{\n state: InitializedObservable<S>;\n updateState: (updateFn: (prev: S) => S) => S;\n resetState: () => S;\n getSnapshot: () => S;\n initialState: S;\n }>,\n] => {\n const [state, setState, { updateState, resetState, getSnapshot }] =\n createStateBase(initialState);\n\n const sig = toSignal(state);\n\n return [\n sig,\n setState,\n {\n state,\n updateState,\n resetState,\n getSnapshot,\n initialState,\n },\n ] as const;\n};\n"],"names":["createStateBase"],"mappings":";;;AA0CO,MAAM,WAAA,GAAc,CACzB,YAAA,KAWG;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,EAAE,WAAA,EAAa,YAAY,WAAA,EAAa,CAAA,GAC9DA,aAAA,CAAgB,YAAY,CAAA;AAE9B,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-signal.d.mts","sourceRoot":"","sources":["../src/from-signal.mts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAU,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"from-signal.d.mts","sourceRoot":"","sources":["../src/from-signal.mts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAU,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,OAErB,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KACjC,SAAS,CACV,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,IAAI,CASpB,CAAC"}
|
package/dist/from-signal.mjs
CHANGED
|
@@ -1,50 +1,12 @@
|
|
|
1
1
|
import { effect } from '@preact/signals';
|
|
2
2
|
import { source } from 'synstate';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
* The bridge uses `effect()` from `@preact/signals` to track signal changes
|
|
12
|
-
* and propagate them to the observable.
|
|
13
|
-
*
|
|
14
|
-
* @returns A tuple of `[observable, dispose]`.
|
|
15
|
-
* - `observable` — an `InitializedSourceObservable` that mirrors the signal.
|
|
16
|
-
* - `dispose` — a function to stop tracking the signal. Call this when the
|
|
17
|
-
* bridge is no longer needed to avoid memory leaks.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* const input = signal('hello');
|
|
22
|
-
*
|
|
23
|
-
* const [input$, dispose] = fromSignal(input);
|
|
24
|
-
*
|
|
25
|
-
* const mut_valueHistory: string[] = [];
|
|
26
|
-
*
|
|
27
|
-
* input$.subscribe((value) => {
|
|
28
|
-
* mut_valueHistory.push(value);
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* assert.deepStrictEqual(mut_valueHistory, ['hello']);
|
|
32
|
-
*
|
|
33
|
-
* input.value = 'world';
|
|
34
|
-
*
|
|
35
|
-
* assert.deepStrictEqual(mut_valueHistory, ['hello', 'world']);
|
|
36
|
-
*
|
|
37
|
-
* dispose(); // stop tracking the signal
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
const fromSignal = (
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
42
|
-
sig) => {
|
|
43
|
-
const src = source(sig.value);
|
|
44
|
-
const dispose = effect(() => {
|
|
45
|
-
src.next(sig.value);
|
|
46
|
-
});
|
|
47
|
-
return [src, dispose];
|
|
4
|
+
const fromSignal = (sig) => {
|
|
5
|
+
const src = source(sig.value);
|
|
6
|
+
const dispose = effect(() => {
|
|
7
|
+
src.next(sig.value);
|
|
8
|
+
});
|
|
9
|
+
return [src, dispose];
|
|
48
10
|
};
|
|
49
11
|
|
|
50
12
|
export { fromSignal };
|
package/dist/from-signal.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-signal.mjs","sources":["../src/from-signal.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"from-signal.mjs","sources":["../src/from-signal.mts"],"sourcesContent":["import { effect, type ReadonlySignal, type Signal } from '@preact/signals';\nimport { source, type InitializedSourceObservable } from 'synstate';\n\n/**\n * Converts a Preact `Signal` (or `ReadonlySignal`) into a synstate\n * `InitializedSourceObservable`.\n *\n * This allows applying synstate's rich operator chain (e.g. `map`, `filter`,\n * `debounce`, `switchMap`) to values originating from Preact Signals.\n *\n * The bridge uses `effect()` from `@preact/signals` to track signal changes\n * and propagate them to the observable.\n *\n * @returns A tuple of `[observable, dispose]`.\n * - `observable` — an `InitializedSourceObservable` that mirrors the signal.\n * - `dispose` — a function to stop tracking the signal. Call this when the\n * bridge is no longer needed to avoid memory leaks.\n *\n * @example\n * ```ts\n * const input = signal('hello');\n *\n * const [input$, dispose] = fromSignal(input);\n *\n * const mut_valueHistory: string[] = [];\n *\n * input$.subscribe((value) => {\n * mut_valueHistory.push(value);\n * });\n *\n * assert.deepStrictEqual(mut_valueHistory, ['hello']);\n *\n * input.value = 'world';\n *\n * assert.deepStrictEqual(mut_valueHistory, ['hello', 'world']);\n *\n * dispose(); // stop tracking the signal\n * ```\n */\nexport const fromSignal = <A,>(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n sig: ReadonlySignal<A> | Signal<A>,\n): readonly [\n observable: InitializedSourceObservable<A>,\n dispose: () => void,\n] => {\n const src = source<A>(sig.value);\n\n const dispose = effect(() => {\n src.next(sig.value);\n });\n\n return [src, dispose] as const;\n};\n"],"names":[],"mappings":";;;AAuCO,MAAM,UAAA,GAAa,CAExB,GAAA,KAIG;AACH,EAAA,MAAM,GAAA,GAAM,MAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,OAAO,MAAM;AAC3B,IAAA,GAAA,CAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,EACpB,CAAC,CAAA;AAED,EAAA,OAAO,CAAC,KAAK,OAAO,CAAA;AACtB;;;;"}
|
package/dist/to-signal.mjs
CHANGED
|
@@ -2,13 +2,12 @@ import { signal } from '@preact/signals';
|
|
|
2
2
|
import { Optional } from 'ts-data-forge';
|
|
3
3
|
|
|
4
4
|
function toSignal(observable$, fallback) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return sig;
|
|
5
|
+
const initialValue = Optional.unwrapOr(observable$.getSnapshot(), fallback);
|
|
6
|
+
const sig = signal(initialValue);
|
|
7
|
+
observable$.subscribe((value) => {
|
|
8
|
+
sig.value = value;
|
|
9
|
+
});
|
|
10
|
+
return sig;
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
export { toSignal };
|
package/dist/to-signal.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-signal.mjs","sources":["../src/to-signal.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"to-signal.mjs","sources":["../src/to-signal.mts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@preact/signals';\nimport { type InitializedObservable, type Observable } from 'synstate';\nimport { Optional } from 'ts-data-forge';\n\n/**\n * Converts a synstate `InitializedObservable` into a Preact `ReadonlySignal`.\n *\n * The signal automatically stays in sync with the observable. Since the\n * observable has an initial value, the returned signal is guaranteed to hold a\n * value of type `A`.\n *\n * The subscription lives for the lifetime of the observable (until it\n * completes).\n *\n * @example\n * ```ts\n * const count$ = source<number>(0);\n *\n * const countSignal = toSignal(count$);\n *\n * assert.strictEqual(countSignal.value, 0);\n *\n * count$.next(1);\n *\n * assert.strictEqual(countSignal.value, 1);\n *\n * count$.next(42);\n *\n * assert.strictEqual(countSignal.value, 42);\n * ```\n */\nexport function toSignal<A>(\n observable$: InitializedObservable<A>,\n): ReadonlySignal<A>;\n\n/**\n * Converts a synstate `Observable` (without guaranteed initial value) into a\n * Preact `ReadonlySignal`. The signal value may be `undefined` until the\n * observable emits.\n */\nexport function toSignal<A>(\n observable$: Observable<A>,\n): ReadonlySignal<A | undefined>;\n\n/**\n * Converts a synstate `Observable` into a Preact `ReadonlySignal` with a\n * fallback value used when the observable has not yet emitted.\n */\nexport function toSignal<A, B = A>(\n observable$: Observable<A>,\n fallback: B,\n): ReadonlySignal<A | B>;\n\nexport function toSignal<A, B = A>(\n observable$: Observable<A>,\n fallback?: B,\n): ReadonlySignal<A | B | undefined> {\n const initialValue = Optional.unwrapOr(observable$.getSnapshot(), fallback);\n\n const sig = signal<A | B | undefined>(initialValue);\n\n observable$.subscribe((value) => {\n // eslint-disable-next-line functional/immutable-data\n sig.value = value;\n });\n\n return sig;\n}\n"],"names":[],"mappings":";;;AAqDO,SAAS,QAAA,CACd,aACA,QAAA,EACmC;AACnC,EAAA,MAAM,eAAe,QAAA,CAAS,QAAA,CAAS,WAAA,CAAY,WAAA,IAAe,QAAQ,CAAA;AAE1E,EAAA,MAAM,GAAA,GAAM,OAA0B,YAAY,CAAA;AAElD,EAAA,WAAA,CAAY,SAAA,CAAU,CAAC,KAAA,KAAU;AAE/B,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "synstate-preact-signals",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Preact Signals integration for SynState - bridge between synstate observables and @preact/signals",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"LICENSE"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"ts-data-forge": "^
|
|
31
|
-
"ts-type-forge": "^
|
|
32
|
-
"synstate": "
|
|
30
|
+
"ts-data-forge": "^14.2.0",
|
|
31
|
+
"ts-type-forge": "^9.2.0",
|
|
32
|
+
"synstate": "2.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@preact/signals": "2.
|
|
35
|
+
"@preact/signals": "2.10.1",
|
|
36
36
|
"@types/argparse": "2.0.17",
|
|
37
|
-
"argparse": "
|
|
38
|
-
"preact": "10.29.
|
|
37
|
+
"argparse": "3.0.0",
|
|
38
|
+
"preact": "10.29.8"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"@preact/signals": ">=1.0.0",
|
|
@@ -65,10 +65,9 @@
|
|
|
65
65
|
"test:cov:ui": "vite preview --outDir ./coverage",
|
|
66
66
|
"test:ui": "pnpm run z:vitest:node --ui",
|
|
67
67
|
"testw": "pnpm run z:vitest:node watch",
|
|
68
|
-
"tsc": "tsc --noEmit",
|
|
69
|
-
"tscw": "tsc --noEmit --watch",
|
|
70
|
-
"type-check": "tsc --noEmit",
|
|
71
|
-
"update-packages": "pnpm update --latest",
|
|
68
|
+
"tsc": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
69
|
+
"tscw": "node ../../node_modules/typescript-native/bin/tsc --noEmit --watch",
|
|
70
|
+
"type-check": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
72
71
|
"z:prettier": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --ignore-path ../../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
|
|
73
72
|
"z:vitest": "vitest --config ./configs/vitest.config.mts",
|
|
74
73
|
"z:vitest:node": "pnpm run z:vitest --project='Node.js'"
|
package/src/create-reducer.mts
CHANGED
package/src/create-state.mts
CHANGED