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.
@@ -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,GAC7B,cAAc,OAAO,KACpB,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,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"}
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
- const [state, { setTrue, setFalse, setState, toggle, updateState, resetState, getSnapshot, },] = createBooleanState$1(initialState);
31
- const sig = toSignal(state);
32
- return [
33
- sig,
34
- {
35
- state,
36
- setTrue,
37
- setFalse,
38
- setState,
39
- toggle,
40
- updateState,
41
- resetState,
42
- getSnapshot,
43
- initialState,
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":[null],"names":["createBooleanStateBase"],"mappings":";;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACI,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;AAExC,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE3B,OAAO;QACL,GAAG;AACH,QAAA;YACE,KAAK;YACL,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
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,EAChC,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,cAAc,CAAC,KACd,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,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"}
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"}
@@ -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
- const [state, dispatch, { getSnapshot }] = createReducer$1(reducer, initialState);
37
- const sig = toSignal(state);
38
- return [sig, dispatch, { state, getSnapshot, initialState }];
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":[null],"names":["createReducerBase"],"mappings":";;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MACU,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;AAED,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;AAE3B,IAAA,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAC9D;;;;"}
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;;;;"}
@@ -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,EAC3B,cAAc,CAAC,KACd,SAAS,CACV,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,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"}
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"}
@@ -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
- const [state, setState, { updateState, resetState, getSnapshot }] = createState$1(initialState);
41
- const sig = toSignal(state);
42
- return [
43
- sig,
44
- setState,
45
- {
46
- state,
47
- updateState,
48
- resetState,
49
- getSnapshot,
50
- initialState,
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":[null],"names":["createStateBase"],"mappings":";;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;AACI,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;AAE/B,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE3B,OAAO;QACL,GAAG;QACH,QAAQ;AACR,QAAA;YACE,KAAK;YACL,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
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,EAE1B,KAAK,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"}
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"}
@@ -1,50 +1,12 @@
1
1
  import { effect } from '@preact/signals';
2
2
  import { source } from 'synstate';
3
3
 
4
- /**
5
- * Converts a Preact `Signal` (or `ReadonlySignal`) into a synstate
6
- * `InitializedSourceObservable`.
7
- *
8
- * This allows applying synstate's rich operator chain (e.g. `map`, `filter`,
9
- * `debounce`, `switchMap`) to values originating from Preact Signals.
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"from-signal.mjs","sources":["../src/from-signal.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;AACI,MAAM,UAAU,GAAG;AACxB;AACA,GAAkC,KAIhC;IACF,MAAM,GAAG,GAAG,MAAM,CAAI,GAAG,CAAC,KAAK,CAAC;AAEhC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAK;AAC1B,QAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,EAAE,OAAO,CAAU;AAChC;;;;"}
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;;;;"}
@@ -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
- const initialValue = Optional.unwrapOr(observable$.getSnapshot(), fallback);
6
- const sig = signal(initialValue);
7
- observable$.subscribe((value) => {
8
- // eslint-disable-next-line functional/immutable-data
9
- sig.value = value;
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"to-signal.mjs","sources":["../src/to-signal.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAqDM,SAAU,QAAQ,CACtB,WAA0B,EAC1B,QAAY,EAAA;AAEZ,IAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC;AAE3E,IAAA,MAAM,GAAG,GAAG,MAAM,CAAoB,YAAY,CAAC;AAEnD,IAAA,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;AAE9B,QAAA,GAAG,CAAC,KAAK,GAAG,KAAK;AACnB,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,GAAG;AACZ;;;;"}
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.2.2",
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": "^6.9.6",
31
- "ts-type-forge": "^3.1.0",
32
- "synstate": "1.0.2"
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.9.0",
35
+ "@preact/signals": "2.10.1",
36
36
  "@types/argparse": "2.0.17",
37
- "argparse": "2.0.1",
38
- "preact": "10.29.1"
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'"
@@ -34,7 +34,7 @@ export const createBooleanState = (
34
34
  initialState: boolean,
35
35
  ): readonly [
36
36
  signal: ReadonlySignal<boolean>,
37
- Readonly<{
37
+ utils: Readonly<{
38
38
  state: InitializedObservable<boolean>;
39
39
  setTrue: () => void;
40
40
  setFalse: () => void;
@@ -43,7 +43,7 @@ export const createReducer = <S, A>(
43
43
  ): readonly [
44
44
  signal: ReadonlySignal<S>,
45
45
  dispatch: (action: A) => S,
46
- Readonly<{
46
+ utils: Readonly<{
47
47
  state: InitializedObservable<S>;
48
48
  getSnapshot: () => S;
49
49
  initialState: S;
@@ -45,7 +45,7 @@ export const createState = <S,>(
45
45
  ): readonly [
46
46
  signal: ReadonlySignal<S>,
47
47
  setState: (v: S) => S,
48
- Readonly<{
48
+ utils: Readonly<{
49
49
  state: InitializedObservable<S>;
50
50
  updateState: (updateFn: (prev: S) => S) => S;
51
51
  resetState: () => S;