preact-sigma 3.1.0 → 4.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/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- npm install preact-sigma
10
+ npm install preact-sigma @preact/signals immer preact
11
11
  ```
12
12
 
13
13
  ## Quick Example
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { ReadonlySignal, action, batch, computed, effect, untracked } from "@preact/signals";
2
- import { Immutable, Patch, freeze, immerable } from "immer";
1
+ import { ReadonlySignal } from "@preact/signals";
2
+ import { Patch } from "immer";
3
3
 
4
4
  //#region src/internal/symbols.d.ts
5
5
  declare const signalPrefix = "#";
@@ -83,7 +83,7 @@ type Draft<T> = T extends PrimitiveType ? T : T extends AtomicObject ? T : HasSi
83
83
  *
84
84
  * Use this instead of `immer.Immutable`
85
85
  */
86
- type Immutable$1<T> = T extends PrimitiveType ? T : T extends AtomicObject ? T : HasSigmaRefBrand<T> extends true ? T : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<Immutable$1<K>, Immutable$1<V>> : T extends ReadonlySet<infer V> ? ReadonlySet<Immutable$1<V>> : T extends WeakReferences ? T : T extends object ? { readonly [K in keyof T]: Immutable$1<T[K]> } : T;
86
+ type Immutable<T> = T extends PrimitiveType ? T : T extends AtomicObject ? T : HasSigmaRefBrand<T> extends true ? T : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<Immutable<K>, Immutable<V>> : T extends ReadonlySet<infer V> ? ReadonlySet<Immutable<V>> : T extends WeakReferences ? T : T extends object ? { readonly [K in keyof T]: Immutable<T[K]> } : T;
87
87
  //#endregion
88
88
  //#region src/internal/types.d.ts
89
89
  type Def = typeof sigmaTypeBrand;
@@ -110,13 +110,13 @@ type AnyState = Record<string, unknown>;
110
110
  type AnyDefaultState<TState extends object> = { [K in keyof TState]?: DefaultStateValue<TState[K]> };
111
111
  /** A cleanup resource supported by `.setup(...)`, including function, `dispose()`, and `Symbol.dispose` cleanup. */
112
112
  type AnyResource = Cleanup | Disposable | DisposableLike | AbortController;
113
- type ComputedValues<TComputeds> = { readonly [K in keyof TComputeds]: TComputeds[K] extends AnyFunction ? Immutable$1<ReturnType<TComputeds[K]>> : never };
113
+ type ComputedValues<TComputeds> = { readonly [K in keyof TComputeds]: TComputeds[K] extends AnyFunction ? Immutable<ReturnType<TComputeds[K]>> : never };
114
114
  type QueryMethods<TQueries> = { [K in keyof TQueries]: TQueries[K] extends AnyFunction ? (...args: Parameters<TQueries[K]>) => ReturnType<TQueries[K]> : never };
115
115
  type ActionMethods<TActions> = { [K in keyof TActions]: TActions[K] extends AnyFunction ? (...args: Parameters<TActions[K]>) => ReturnType<TActions[K]> : never };
116
116
  type MergeObjects<TLeft, TRight, TConstraint extends object = object> = TRight extends TConstraint ? TLeft extends TConstraint ? Simplify<Omit<TLeft, keyof TRight> & TRight> : TRight : TLeft extends TConstraint ? TLeft : {};
117
117
  type Simplify<T> = {} & { [K in keyof T]: T[K] };
118
- type ComputedContext<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = Simplify<Immutable$1<MergeObjects<T[Def]["state"], TOverrides["state"]>> & ComputedValues<MergeObjects<T[Def]["computeds"], TOverrides["computeds"]>>>;
119
- type ReadonlyContext<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = Simplify<Immutable$1<MergeObjects<T[Def]["state"], TOverrides["state"]>> & ComputedValues<MergeObjects<T[Def]["computeds"], TOverrides["computeds"]>> & QueryMethods<MergeObjects<T[Def]["queries"], TOverrides["queries"]>>>;
118
+ type ComputedContext<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = Simplify<Immutable<MergeObjects<T[Def]["state"], TOverrides["state"]>> & ComputedValues<MergeObjects<T[Def]["computeds"], TOverrides["computeds"]>>>;
119
+ type ReadonlyContext<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = Simplify<Immutable<MergeObjects<T[Def]["state"], TOverrides["state"]>> & ComputedValues<MergeObjects<T[Def]["computeds"], TOverrides["computeds"]>> & QueryMethods<MergeObjects<T[Def]["queries"], TOverrides["queries"]>>>;
120
120
  type Emit<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = MergeObjects<T[Def]["events"], TOverrides["events"], AnyEvents> extends infer TEvents ? [TEvents] extends [AnyEvents] ? <TEvent extends string & keyof TEvents>(name: TEvent, ...[detail]: EventParameters<TEvents[TEvent]>) => void : never : never;
121
121
  type ActionContext<T extends AnySigmaType, TOverrides extends Partial<SigmaDefinition> = {}> = Simplify<Draft<MergeObjects<T[Def]["state"], TOverrides["state"]>> & ComputedValues<MergeObjects<T[Def]["computeds"], TOverrides["computeds"]>> & QueryMethods<MergeObjects<T[Def]["queries"], TOverrides["queries"]>> & ActionMethods<MergeObjects<T[Def]["actions"], TOverrides["actions"]>> & {
122
122
  /** Publishes the current action draft immediately so later boundaries use committed state. */commit(): void; /** Emits a typed event from the current action. */
@@ -150,8 +150,8 @@ type SigmaObserveOptions = {
150
150
  };
151
151
  /** The change object delivered to `.observe(...)` listeners. */
152
152
  type SigmaObserveChange<TState extends AnyState, TWithPatches extends boolean = false> = {
153
- readonly newState: Immutable$1<TState>;
154
- readonly oldState: Immutable$1<TState>;
153
+ readonly newState: Immutable<TState>;
154
+ readonly oldState: Immutable<TState>;
155
155
  } & (TWithPatches extends true ? {
156
156
  readonly inversePatches: readonly Patch[];
157
157
  readonly patches: readonly Patch[];
@@ -175,7 +175,7 @@ type EventMethods<TEvents extends AnyEvents | undefined> = [undefined] extends [
175
175
  type SetupMethods<TSetupArgs extends any[] | undefined> = [TSetupArgs] extends [undefined] ? never : {
176
176
  /** Runs every registered setup handler and returns one cleanup function for the active setup. */setup(...args: Extract<TSetupArgs, any[]>): Cleanup;
177
177
  };
178
- type MapSigmaDefinition<T extends SigmaDefinition> = keyof T extends infer K ? K extends "state" ? Immutable$1<T[K]> & SignalAccessors<Immutable$1<T[K]>> : K extends "computeds" ? ComputedValues<T[K]> & SignalAccessors<ComputedValues<T[K]>> : K extends "queries" ? QueryMethods<T[K]> : K extends "actions" ? ActionMethods<T[K]> : K extends "events" ? EventMethods<T[K]> : K extends "setupArgs" ? SetupMethods<T[K]> : never : never;
178
+ type MapSigmaDefinition<T extends SigmaDefinition> = keyof T extends infer K ? K extends "state" ? Immutable<T[K]> & SignalAccessors<Immutable<T[K]>> : K extends "computeds" ? ComputedValues<T[K]> & SignalAccessors<ComputedValues<T[K]>> : K extends "queries" ? QueryMethods<T[K]> : K extends "actions" ? ActionMethods<T[K]> : K extends "events" ? EventMethods<T[K]> : K extends "setupArgs" ? SetupMethods<T[K]> : never : never;
179
179
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
180
180
  /** The public instance shape produced by a configured sigma type, including signal access inferred from the definition. */
181
181
  type SigmaState<T extends SigmaDefinition = SigmaDefinition> = AnySigmaState & Simplify<UnionToIntersection<MapSigmaDefinition<T>>>;
@@ -203,7 +203,7 @@ declare function setAutoFreeze(autoFreeze: boolean): void;
203
203
  * referenced values. Its type is inferred from the instance's sigma-state
204
204
  * definition.
205
205
  */
206
- declare function snapshot<T extends AnySigmaState>(publicInstance: T): T extends SigmaState<infer TDefinition> ? Immutable$1<TDefinition["state"]> : never;
206
+ declare function snapshot<T extends AnySigmaState>(publicInstance: T): T extends SigmaState<infer TDefinition> ? Immutable<TDefinition["state"]> : never;
207
207
  /**
208
208
  * Replaces an instance's committed public state from a snapshot object.
209
209
  *
@@ -212,7 +212,7 @@ declare function snapshot<T extends AnySigmaState>(publicInstance: T): T extends
212
212
  * notifies observers when the committed state changes. Its type is inferred
213
213
  * from the instance's sigma-state definition.
214
214
  */
215
- declare function replaceState<T extends AnySigmaState>(publicInstance: T, nextState: T extends SigmaState<infer TDefinition> ? Immutable$1<TDefinition["state"]> : never): void;
215
+ declare function replaceState<T extends AnySigmaState>(publicInstance: T, nextState: T extends SigmaState<infer TDefinition> ? Immutable<TDefinition["state"]> : never): void;
216
216
  //#endregion
217
217
  //#region src/framework.d.ts
218
218
  /** Checks whether a value is an instance created by a configured sigma type. */
@@ -342,4 +342,4 @@ declare function useSigma<T extends AnySigmaState>(create: () => T, setupArgs?:
342
342
  */
343
343
  declare function useListener<TTarget extends EventTarget | AnySigmaState, TEvent extends InferEventType<TTarget>>(target: TTarget | null, name: TEvent, listener: InferListener<TTarget, TEvent>): void;
344
344
  //#endregion
345
- export { type AnyDefaultState, type AnyEvents, type AnyResource, type AnySigmaState, type AnySigmaStateWithEvents, type AnyState, EventParameters, type Immutable, InferEventType, InferListener, type InferSetupArgs, type SigmaObserveChange, type SigmaObserveOptions, type SigmaRef, type SigmaState, SigmaTarget, SigmaType, action, batch, computed, effect, freeze, immerable, isSigmaState, listen, query, replaceState, reservedKeys, setAutoFreeze, sigmaEventsBrand, sigmaRefBrand, sigmaStateBrand, sigmaTypeBrand, signalPrefix, snapshot, untracked, useListener, useSigma };
345
+ export { type AnyDefaultState, type AnyEvents, type AnyResource, type AnySigmaState, type AnySigmaStateWithEvents, type AnyState, EventParameters, InferEventType, InferListener, type InferSetupArgs, type SigmaObserveChange, type SigmaObserveOptions, type SigmaRef, type SigmaState, SigmaTarget, SigmaType, isSigmaState, listen, query, replaceState, reservedKeys, setAutoFreeze, sigmaEventsBrand, sigmaRefBrand, sigmaStateBrand, sigmaTypeBrand, signalPrefix, snapshot, useListener, useSigma };
package/dist/index.mjs CHANGED
@@ -1,6 +1,5 @@
1
- import { action, batch, batch as batch$1, computed, computed as computed$1, effect, signal, untracked, untracked as untracked$1 } from "@preact/signals";
1
+ import { batch, computed, signal, untracked } from "@preact/signals";
2
2
  import * as immer from "immer";
3
- import { freeze, immerable } from "immer";
4
3
  import { useEffect, useRef, useState } from "preact/hooks";
5
4
  //#region src/internal/context.ts
6
5
  const disabledContextOptions = {
@@ -232,7 +231,7 @@ function initializeSigmaInstance(publicInstance, type, initialState) {
232
231
  enumerable: true
233
232
  });
234
233
  }
235
- for (const key in type._computeFunctions) Object.defineProperty(publicInstance, "#" + key, { value: computed$1(() => type._computeFunctions[key].call(getContext(instance, "computedReadonly"))) });
234
+ for (const key in type._computeFunctions) Object.defineProperty(publicInstance, "#" + key, { value: computed(() => type._computeFunctions[key].call(getContext(instance, "computedReadonly"))) });
236
235
  registerSigmaInternals(publicInstance, instance);
237
236
  }
238
237
  function buildQueryMethod(queryFunction) {
@@ -240,7 +239,7 @@ function buildQueryMethod(queryFunction) {
240
239
  const instance = getSigmaInternals(this);
241
240
  const owner = getContextOwner(this);
242
241
  if (owner) return queryFunction.apply(getContext(owner, "queryDraftAware"), args);
243
- return computed$1(() => queryFunction.apply(getContext(instance, "queryCommitted"), args)).value;
242
+ return computed(() => queryFunction.apply(getContext(instance, "queryCommitted"), args)).value;
244
243
  };
245
244
  }
246
245
  function buildActionMethod(actionName, actionFn) {
@@ -311,7 +310,7 @@ function runActionInvocation(context, actionName, actionFn, args) {
311
310
  const isAdHocAction = actionName === "act()";
312
311
  const actionIsAsync = isAsyncFunction(actionFn);
313
312
  if (actionIsAsync && isAdHocAction) throw new Error("[preact-sigma] act() callbacks must stay synchronous");
314
- return untracked$1(() => {
313
+ return untracked(() => {
315
314
  let owner;
316
315
  const callerOwner = getContextOwner(context);
317
316
  if (callerOwner && callerOwner.instance === instance && !actionIsAsync) owner = callerOwner;
@@ -432,7 +431,7 @@ function isPromiseLike(value) {
432
431
  return value != null && typeof value.then === "function";
433
432
  }
434
433
  function publishState(instance, finalized) {
435
- batch$1(() => {
434
+ batch(() => {
436
435
  for (const key of instance.stateKeys) {
437
436
  const nextValue = finalized.newState[key];
438
437
  if (isAutoFreeze()) immer.freeze(nextValue, true);
@@ -548,7 +547,7 @@ function isSigmaState(value) {
548
547
  * that do not need to live on the sigma-state instance.
549
548
  */
550
549
  function query(fn) {
551
- return ((...args) => computed$1(() => fn(...args)).value);
550
+ return ((...args) => computed(() => fn(...args)).value);
552
551
  }
553
552
  /**
554
553
  * Builds sigma-state constructors by accumulating default state, computeds,
@@ -738,4 +737,4 @@ function useListener(target, name, listener) {
738
737
  }, [target, name]);
739
738
  }
740
739
  //#endregion
741
- export { SigmaTarget, SigmaType, action, batch, computed, effect, freeze, immerable, isSigmaState, listen, query, replaceState, setAutoFreeze, snapshot, untracked, useListener, useSigma };
740
+ export { SigmaTarget, SigmaType, isSigmaState, listen, query, replaceState, setAutoFreeze, snapshot, useListener, useSigma };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "preact-sigma",
3
- "version": "3.1.0",
3
+ "version": "4.0.0",
4
4
  "keywords": [],
5
5
  "license": "MIT",
6
6
  "author": "Alec Larson",
@@ -20,11 +20,6 @@
20
20
  "import": "./dist/index.mjs"
21
21
  }
22
22
  },
23
- "dependencies": {
24
- "@preact/signals": "^2.8.2",
25
- "immer": "^11.1.4",
26
- "preact": "11.0.0-beta.1"
27
- },
28
23
  "devDependencies": {
29
24
  "@preact/preset-vite": "^2.10.5",
30
25
  "@types/node": "^25.5.0",
@@ -38,6 +33,11 @@
38
33
  "vite": "^8.0.2",
39
34
  "vitest": "^4.1.1"
40
35
  },
36
+ "peerDependencies": {
37
+ "@preact/signals": ">=2",
38
+ "immer": ">=11",
39
+ "preact": ">=10"
40
+ },
41
41
  "scripts": {
42
42
  "build": "tsdown",
43
43
  "test": "vitest run",