@solidjs/signals 0.13.13 → 2.0.0-beta.11

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 (110) hide show
  1. package/README.md +8 -7
  2. package/dist/dev.js +1230 -598
  3. package/dist/node.cjs +2064 -1555
  4. package/dist/prod.js +1783 -1251
  5. package/dist/types/boundaries.d.ts +126 -5
  6. package/dist/types/core/action.d.ts +34 -0
  7. package/dist/types/core/constants.d.ts +26 -0
  8. package/dist/types/core/context.d.ts +10 -2
  9. package/dist/types/core/core.d.ts +129 -9
  10. package/dist/types/core/dev.d.ts +1 -1
  11. package/dist/types/core/effect.d.ts +4 -2
  12. package/dist/types/core/error.d.ts +24 -0
  13. package/dist/types/core/external.d.ts +19 -0
  14. package/dist/types/core/graph.d.ts +2 -0
  15. package/dist/types/core/index.d.ts +1 -1
  16. package/dist/types/core/owner.d.ts +93 -3
  17. package/dist/types/core/scheduler.d.ts +43 -2
  18. package/dist/types/core/types.d.ts +5 -6
  19. package/dist/types/index.d.ts +3 -3
  20. package/dist/types/map.d.ts +32 -3
  21. package/dist/types/signals.d.ts +362 -42
  22. package/dist/types/src/boundaries.d.ts +173 -0
  23. package/dist/types/src/core/action.d.ts +35 -0
  24. package/dist/types/src/core/async.d.ts +6 -0
  25. package/dist/types/src/core/constants.d.ts +51 -0
  26. package/dist/types/src/core/context.d.ts +36 -0
  27. package/dist/types/src/core/core.d.ts +174 -0
  28. package/dist/types/src/core/dev.d.ts +49 -0
  29. package/dist/types/src/core/effect.d.ts +32 -0
  30. package/dist/types/src/core/error.d.ts +38 -0
  31. package/dist/types/src/core/external.d.ts +45 -0
  32. package/dist/types/src/core/graph.d.ts +5 -0
  33. package/dist/types/src/core/heap.d.ts +14 -0
  34. package/dist/types/src/core/index.d.ts +12 -0
  35. package/dist/types/src/core/lanes.d.ts +54 -0
  36. package/dist/types/src/core/owner.d.ts +116 -0
  37. package/dist/types/src/core/scheduler.d.ts +122 -0
  38. package/dist/types/src/core/types.d.ts +85 -0
  39. package/dist/types/src/index.d.ts +9 -0
  40. package/dist/types/src/map.d.ts +53 -0
  41. package/dist/types/src/signals.d.ts +512 -0
  42. package/dist/types/src/store/index.d.ts +9 -0
  43. package/dist/types/src/store/optimistic.d.ts +45 -0
  44. package/dist/types/src/store/projection.d.ts +66 -0
  45. package/dist/types/src/store/reconcile.d.ts +23 -0
  46. package/dist/types/src/store/store.d.ts +125 -0
  47. package/dist/types/src/store/storePath.d.ts +58 -0
  48. package/dist/types/src/store/utils.d.ts +114 -0
  49. package/dist/types/store/optimistic.d.ts +38 -12
  50. package/dist/types/store/projection.d.ts +55 -15
  51. package/dist/types/store/reconcile.d.ts +22 -0
  52. package/dist/types/store/store.d.ts +72 -15
  53. package/dist/types/store/storePath.d.ts +28 -0
  54. package/dist/types/store/utils.d.ts +78 -7
  55. package/dist/types-cjs/boundaries.d.cts +173 -0
  56. package/dist/types-cjs/core/action.d.cts +35 -0
  57. package/dist/types-cjs/core/async.d.cts +6 -0
  58. package/dist/types-cjs/core/constants.d.cts +51 -0
  59. package/dist/types-cjs/core/context.d.cts +36 -0
  60. package/dist/types-cjs/core/core.d.cts +174 -0
  61. package/dist/types-cjs/core/dev.d.cts +49 -0
  62. package/dist/types-cjs/core/effect.d.cts +32 -0
  63. package/dist/types-cjs/core/error.d.cts +38 -0
  64. package/dist/types-cjs/core/external.d.cts +45 -0
  65. package/dist/types-cjs/core/graph.d.cts +5 -0
  66. package/dist/types-cjs/core/heap.d.cts +14 -0
  67. package/dist/types-cjs/core/index.d.cts +12 -0
  68. package/dist/types-cjs/core/lanes.d.cts +54 -0
  69. package/dist/types-cjs/core/owner.d.cts +116 -0
  70. package/dist/types-cjs/core/scheduler.d.cts +122 -0
  71. package/dist/types-cjs/core/types.d.cts +85 -0
  72. package/dist/types-cjs/index.d.cts +9 -0
  73. package/dist/types-cjs/map.d.cts +53 -0
  74. package/dist/types-cjs/package.json +3 -0
  75. package/dist/types-cjs/signals.d.cts +512 -0
  76. package/dist/types-cjs/src/boundaries.d.cts +173 -0
  77. package/dist/types-cjs/src/core/action.d.cts +35 -0
  78. package/dist/types-cjs/src/core/async.d.cts +6 -0
  79. package/dist/types-cjs/src/core/constants.d.cts +51 -0
  80. package/dist/types-cjs/src/core/context.d.cts +36 -0
  81. package/dist/types-cjs/src/core/core.d.cts +174 -0
  82. package/dist/types-cjs/src/core/dev.d.cts +49 -0
  83. package/dist/types-cjs/src/core/effect.d.cts +32 -0
  84. package/dist/types-cjs/src/core/error.d.cts +38 -0
  85. package/dist/types-cjs/src/core/external.d.cts +45 -0
  86. package/dist/types-cjs/src/core/graph.d.cts +5 -0
  87. package/dist/types-cjs/src/core/heap.d.cts +14 -0
  88. package/dist/types-cjs/src/core/index.d.cts +12 -0
  89. package/dist/types-cjs/src/core/lanes.d.cts +54 -0
  90. package/dist/types-cjs/src/core/owner.d.cts +116 -0
  91. package/dist/types-cjs/src/core/scheduler.d.cts +122 -0
  92. package/dist/types-cjs/src/core/types.d.cts +85 -0
  93. package/dist/types-cjs/src/index.d.cts +9 -0
  94. package/dist/types-cjs/src/map.d.cts +53 -0
  95. package/dist/types-cjs/src/signals.d.cts +512 -0
  96. package/dist/types-cjs/src/store/index.d.cts +9 -0
  97. package/dist/types-cjs/src/store/optimistic.d.cts +45 -0
  98. package/dist/types-cjs/src/store/projection.d.cts +66 -0
  99. package/dist/types-cjs/src/store/reconcile.d.cts +23 -0
  100. package/dist/types-cjs/src/store/store.d.cts +125 -0
  101. package/dist/types-cjs/src/store/storePath.d.cts +58 -0
  102. package/dist/types-cjs/src/store/utils.d.cts +114 -0
  103. package/dist/types-cjs/store/index.d.cts +9 -0
  104. package/dist/types-cjs/store/optimistic.d.cts +45 -0
  105. package/dist/types-cjs/store/projection.d.cts +66 -0
  106. package/dist/types-cjs/store/reconcile.d.cts +23 -0
  107. package/dist/types-cjs/store/store.d.cts +125 -0
  108. package/dist/types-cjs/store/storePath.d.cts +58 -0
  109. package/dist/types-cjs/store/utils.d.cts +114 -0
  110. package/package.json +35 -27
@@ -1,35 +1,119 @@
1
- import type { Disposable } from "./core/index.js";
1
+ import type { Disposable, Refreshable } from "./core/index.js";
2
+ /**
3
+ * Low-level reactive-cleanup primitive. Registers a callback that runs when
4
+ * the surrounding owner is disposed.
5
+ *
6
+ * **In 2.0 user code this is rare.** The two cases where you might reach for
7
+ * it have better-shaped tools:
8
+ *
9
+ * - **Component lifecycle (mount/unmount, listeners, intervals):** use
10
+ * {@link onSettled} and **return** a cleanup function. Setup and teardown
11
+ * stay paired in one block. This replaces the 1.x `onMount` + `onCleanup`
12
+ * pairing.
13
+ * - **Cleanup tied to an effect run:** `onCleanup` does not belong in
14
+ * `createEffect`'s apply phase. If a compute phase genuinely needs per-run
15
+ * teardown, that's usually a sign the work should be a memo/projection
16
+ * instead, or moved to `onSettled` if it's lifecycle-shaped.
17
+ *
18
+ * Where `onCleanup` is the right tool is **library / custom-primitive
19
+ * internals** — coordinating disposal inside a `createRoot` body, or wiring
20
+ * cleanup to a captured owner via `runWithOwner` from a custom factory.
21
+ * Application code rarely needs to write any of those shapes directly.
22
+ *
23
+ * Must be called inside an owner. Calling outside an owner is a no-op (with a
24
+ * dev-mode warning).
25
+ *
26
+ * Cannot be used inside `createTrackedEffect` or `onSettled` — return a
27
+ * cleanup function from the callback body instead.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * // Library shape: thread a resource's disposal into a *captured* owner
32
+ * // from a factory that has no settle-phase setup of its own. `onSettled`
33
+ * // would queue a callback we don't need; `onCleanup` is the leaner
34
+ * // primitive when the only job is "register disposal on this owner".
35
+ * function bindToOwner<T extends { dispose(): void }>(owner: Owner, resource: T): T {
36
+ * runWithOwner(owner, () => onCleanup(() => resource.dispose()));
37
+ * return resource;
38
+ * }
39
+ * ```
40
+ */
2
41
  export declare function onCleanup(fn: Disposable): Disposable;
42
+ /**
43
+ * A zero-arg getter for a reactive value. Calling it inside a tracking scope
44
+ * (memo, effect compute, JSX expression) subscribes the scope to changes.
45
+ *
46
+ * Reading outside any tracking scope simply returns the current value without
47
+ * creating a subscription.
48
+ */
3
49
  export type Accessor<T> = () => T;
4
- export declare function accessor<T>(node: any): Accessor<T>;
50
+ export type SourceAccessor<T> = Refreshable<Accessor<T>>;
51
+ export declare function accessor<T>(node: any): SourceAccessor<T>;
52
+ /**
53
+ * A signal setter. Accepts either a new value or an updater `(prev) => next`.
54
+ *
55
+ * If the type permits `undefined`, `setState()` (no args) clears to `undefined`.
56
+ *
57
+ * To store a function as the value itself (rather than as an updater), wrap it
58
+ * with an updater: `setHandler(() => myHandler)`.
59
+ */
5
60
  export type Setter<in out T> = {
6
61
  <U extends T>(...args: undefined extends T ? [] : [value: Exclude<U, Function> | ((prev: T) => U)]): undefined extends T ? undefined : U;
7
62
  <U extends T>(value: (prev: T) => U): U;
8
63
  <U extends T>(value: Exclude<U, Function>): U;
9
64
  <U extends T>(value: Exclude<U, Function> | ((prev: T) => U)): U;
10
65
  };
11
- export type Signal<T> = [get: Accessor<T>, set: Setter<T>];
66
+ /** A `[get, set]` pair returned from `createSignal` / `createOptimistic`. */
67
+ export type Signal<T> = [get: SourceAccessor<T>, set: Setter<T>];
12
68
  export type ComputeFunction<Prev, Next extends Prev = Prev> = (v: Prev) => PromiseLike<Next> | AsyncIterable<Next> | Next;
13
69
  export type EffectFunction<Prev, Next extends Prev = Prev> = (v: Next, p?: Prev) => (() => void) | void;
14
70
  export type EffectBundle<Prev, Next extends Prev = Prev> = {
15
71
  effect: EffectFunction<Prev, Next>;
16
72
  error: (err: unknown, cleanup: () => void) => void;
17
73
  };
18
- /** Options for effect primitives (`createEffect`, `createRenderEffect`, `createTrackedEffect`, `createReaction`). */
19
- export interface EffectOptions {
74
+ /** Options shared by every effect primitive. */
75
+ interface BaseEffectOptions {
20
76
  /** Debug name (dev mode only) */
21
77
  name?: string;
78
+ }
79
+ /** Options for effect primitives that support deferring/scheduling their initial run (`createEffect`, `createRenderEffect`, `createReaction`). */
80
+ export interface EffectOptions extends BaseEffectOptions {
22
81
  /** When true, defers the initial effect execution until the next change */
23
82
  defer?: boolean;
83
+ /**
84
+ * When true, enqueues the initial effect callback through the effect queue instead of running
85
+ * it synchronously at creation. Lets the initial run participate in transitions -- if any
86
+ * source throws `NotReadyError` during the compute phase, the callback is held until the
87
+ * transition settles.
88
+ *
89
+ * Primarily for render effects that need transition-aware initial mounts (e.g. the root
90
+ * `insert()` in `render()`).
91
+ */
92
+ schedule?: boolean;
93
+ /**
94
+ * Advanced. When true, asserts the compute function returns synchronous
95
+ * values only (never `PromiseLike` / `AsyncIterable`). Skips the
96
+ * async-shape probe in `recompute` for a small fixed-cost win per run.
97
+ * Intended for compiler emissions (`_$effect`) and library code that
98
+ * provably returns sync values. Returning a Promise or async iterable
99
+ * from a `sync: true` effect is undefined behavior — the value will be
100
+ * stored as-is and never awaited.
101
+ */
102
+ sync?: boolean;
24
103
  }
25
104
  /** Options for plain signals created with `createSignal(value)` or `createOptimistic(value)`. */
26
105
  export interface SignalOptions<T> {
27
106
  /** Debug name (dev mode only) */
28
107
  name?: string;
29
- /** Custom equality function, or `false` to always notify subscribers */
108
+ /**
109
+ * Custom equality function, or `false` to always notify subscribers.
110
+ * Defaults to reference equality (`isEqual`). Pass a comparator (e.g.
111
+ * `(a, b) => a.id === b.id`) for value-based equality, or `false` to
112
+ * notify on every write regardless of equality.
113
+ */
30
114
  equals?: false | ((prev: T, next: T) => boolean);
31
115
  /** Suppress dev-mode warnings when writing inside an owned scope */
32
- pureWrite?: boolean;
116
+ ownedWrite?: boolean;
33
117
  /** Callback invoked when the signal loses all subscribers */
34
118
  unobserved?: () => void;
35
119
  }
@@ -45,18 +129,40 @@ export interface MemoOptions<T> {
45
129
  name?: string;
46
130
  /** When true, the owner is invisible to the ID scheme -- inherits parent ID and doesn't consume a childCount slot */
47
131
  transparent?: boolean;
48
- /** Custom equality function, or `false` to always notify subscribers */
132
+ /**
133
+ * Custom equality function, or `false` to always notify subscribers.
134
+ * Defaults to reference equality (`isEqual`). Pass a comparator (e.g.
135
+ * `(a, b) => a.id === b.id`) for value-based equality, or `false` to
136
+ * notify on every recompute regardless of equality.
137
+ */
49
138
  equals?: false | ((prev: T, next: T) => boolean);
50
139
  /** Callback invoked when the computed loses all subscribers */
51
140
  unobserved?: () => void;
52
- /** When true, defers the initial computation until the value is first read */
141
+ /**
142
+ * When true, defers the initial computation until the value is first read,
143
+ * **and** opts the memo into autodisposal — once it has no remaining
144
+ * subscribers it is torn down and recomputed from scratch on the next read.
145
+ * Use it for compute-on-demand values that should not retain state across
146
+ * idle periods. Non-lazy owned memos live for their owner's lifetime and
147
+ * never autodispose.
148
+ */
53
149
  lazy?: boolean;
150
+ /**
151
+ * Advanced. When true, asserts the compute function returns synchronous
152
+ * values only (never `PromiseLike` / `AsyncIterable`). Skips the
153
+ * async-shape probe in `recompute` for a small fixed-cost win per run.
154
+ * Intended for compiler emissions (`_$memo`) and library code that
155
+ * provably returns sync values. Returning a Promise or async iterable
156
+ * from a `sync: true` memo is undefined behavior — the value will be
157
+ * stored as-is and never awaited.
158
+ */
159
+ sync?: boolean;
54
160
  }
55
161
  export type NoInfer<T extends any> = [T][T extends any ? 0 : never];
56
162
  /**
57
163
  * Creates a simple reactive state with a getter and setter.
58
164
  *
59
- * When called with a plain value, creates a signal with `SignalOptions` (name, equals, pureWrite, unobserved).
165
+ * When called with a plain value, creates a signal with `SignalOptions` (name, equals, ownedWrite, unobserved).
60
166
  * When called with a function, creates a writable memo with `SignalOptions & MemoOptions` (adds id, lazy).
61
167
  *
62
168
  * ```typescript
@@ -70,56 +176,152 @@ export type NoInfer<T extends any> = [T][T extends any ? 0 : never];
70
176
  *
71
177
  * @returns `[state: Accessor<T>, setState: Setter<T>]`
72
178
  *
179
+ * @example
180
+ * ```ts
181
+ * const [count, setCount] = createSignal(0);
182
+ *
183
+ * count(); // 0
184
+ * setCount(1); // explicit value
185
+ * setCount(c => c + 1); // updater
186
+ * ```
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * // Writable memo: starts as `fn()`, can be locally overwritten by setter.
191
+ * const [user, setUser] = createSignal(() => fetchUser(userId()));
192
+ *
193
+ * setUser({ ...user(), name: "Alice" }); // optimistic local edit
194
+ * ```
195
+ *
73
196
  * @description https://docs.solidjs.com/reference/basic-reactivity/create-signal
74
197
  */
75
198
  export declare function createSignal<T>(): Signal<T | undefined>;
76
199
  export declare function createSignal<T>(value: Exclude<T, Function>, options?: SignalOptions<T>): Signal<T>;
77
- export declare function createSignal<T>(fn: ComputeFunction<T>, initialValue?: T, options?: SignalOptions<T> & MemoOptions<T>): Signal<T>;
200
+ export declare function createSignal<T>(fn: ComputeFunction<T>, options?: SignalOptions<T> & MemoOptions<T>): Signal<T>;
78
201
  /**
79
202
  * Creates a readonly derived reactive memoized signal.
80
203
  *
81
204
  * ```typescript
82
- * const value = createMemo<T>(compute, initialValue?, options?: MemoOptions<T>);
205
+ * const value = createMemo<T>(compute, options?: MemoOptions<T>);
83
206
  * ```
84
- * @param compute a function that receives its previous or the initial value, if set, and returns a new value used to react on a computation
85
- * @param value an optional initial value for the computation; if set, fn will never receive undefined as first argument
207
+ * @param compute a function that receives its previous value and returns a new value used to react on a computation
86
208
  * @param options `MemoOptions` -- id, name, equals, unobserved, lazy
87
209
  *
210
+ * @example
211
+ * ```ts
212
+ * const [first, setFirst] = createSignal("Ada");
213
+ * const [last, setLast] = createSignal("Lovelace");
214
+ *
215
+ * const fullName = createMemo(() => `${first()} ${last()}`);
216
+ *
217
+ * fullName(); // "Ada Lovelace"
218
+ * ```
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * // Async memo — reads surface as pending inside <Loading>
223
+ * const user = createMemo(async () => {
224
+ * const res = await fetch(`/users/${id()}`);
225
+ * return res.json();
226
+ * });
227
+ * ```
228
+ *
88
229
  * @description https://docs.solidjs.com/reference/basic-reactivity/create-memo
89
230
  */
90
- export declare function createMemo<Next extends Prev, Prev = Next>(compute: ComputeFunction<undefined | NoInfer<Prev>, Next>): Accessor<Next>;
91
- export declare function createMemo<Next extends Prev, Init = Next, Prev = Next>(compute: ComputeFunction<Init | Prev, Next>, value: Init, options?: MemoOptions<Next>): Accessor<Next>;
231
+ export declare function createMemo<T>(compute: ComputeFunction<undefined | NoInfer<T>, T>, options?: MemoOptions<T>): SourceAccessor<T>;
92
232
  /**
93
- * Creates a reactive effect that runs after the render phase.
233
+ * Creates a reactive effect with **separate compute and effect phases**.
234
+ *
235
+ * - `compute(prev)` runs reactively — *put all reactive reads here*. The
236
+ * returned value is passed to `effect` and is also the new "previous" value
237
+ * for the next run.
238
+ * - `effect(next, prev?)` runs imperatively (untracked) after the queue
239
+ * flushes. *Put DOM writes / fetch / logging / subscriptions here.* It may
240
+ * return a cleanup function which runs before the next effect or on
241
+ * disposal.
242
+ *
243
+ * Reactive reads inside `effect` will *not* re-trigger this effect — that's
244
+ * intentional. If you need a single-phase tracked effect, use
245
+ * `createTrackedEffect` (with the tradeoffs noted there).
246
+ *
247
+ * Pass an `EffectBundle` (`{ effect, error }`) instead of a plain function to
248
+ * intercept errors thrown from the compute or effect phases.
94
249
  *
95
250
  * ```typescript
96
- * createEffect<T>(compute, effectFn | { effect, error }, initialValue?, options?: EffectOptions);
251
+ * createEffect<T>(compute, effectFn | { effect, error }, options?: EffectOptions);
97
252
  * ```
98
- * @param compute a function that receives its previous or the initial value, if set, and returns a new value used to react on a computation
253
+ * @param compute a function that receives its previous value and returns a new value used to react on a computation
99
254
  * @param effectFn a function that receives the new value and is used to perform side effects (return a cleanup function), or an `EffectBundle` with `effect` and `error` handlers
100
- * @param value an optional initial value for the computation; if set, fn will never receive undefined as first argument
101
- * @param options `EffectOptions` -- name, defer
255
+ * @param options `EffectOptions` -- name, defer, schedule
256
+ *
257
+ * @example
258
+ * ```ts
259
+ * const [count, setCount] = createSignal(0);
260
+ *
261
+ * createEffect(
262
+ * () => count(), // compute: tracks `count`
263
+ * value => console.log(value) // effect: side effect
264
+ * );
265
+ *
266
+ * setCount(1); // logs 1 after the next flush
267
+ * ```
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * createEffect(
272
+ * () => userId(),
273
+ * id => {
274
+ * const ctrl = new AbortController();
275
+ * fetch(`/users/${id}`, { signal: ctrl.signal });
276
+ * return () => ctrl.abort(); // cleanup before next run / disposal
277
+ * }
278
+ * );
279
+ * ```
102
280
  *
103
281
  * @description https://docs.solidjs.com/reference/basic-reactivity/create-effect
104
282
  */
105
- export declare function createEffect<Next>(compute: ComputeFunction<undefined | NoInfer<Next>, Next>, effectFn: EffectFunction<NoInfer<Next>, Next> | EffectBundle<NoInfer<Next>, Next>): void;
106
- export declare function createEffect<Next, Init = Next>(compute: ComputeFunction<Init | Next, Next>, effect: EffectFunction<Next, Next> | EffectBundle<Next, Next>, value: Init, options?: EffectOptions): void;
283
+ export declare function createEffect<T>(compute: ComputeFunction<undefined | NoInfer<T>, T>, effectFn: EffectFunction<NoInfer<T>, T> | EffectBundle<NoInfer<T>, T>, options?: EffectOptions): void;
284
+ /**
285
+ * @deprecated `createEffect(compute)` (single argument) is no longer supported.
286
+ * Pass a separate effect function as the second argument:
287
+ * `createEffect(compute, effect)`. See [MISSING_EFFECT_FN].
288
+ *
289
+ * - For a side effect that reacts to changes, split the work:
290
+ * `createEffect(() => signal(), value => doWork(value))`.
291
+ * - For a derived value, use `createMemo(() => signal())`.
292
+ * - For a one-shot side effect at construction time, just call the function.
293
+ */
294
+ export declare function createEffect<T>(compute: ComputeFunction<undefined | NoInfer<T>, T>): never;
107
295
  /**
108
296
  * Creates a reactive computation that runs during the render phase as DOM elements
109
297
  * are created and updated but not necessarily connected.
110
298
  *
299
+ * Same compute / effect split as `createEffect`, but scheduled inside the render
300
+ * queue rather than after it. Reach for this only when authoring renderer
301
+ * plumbing (custom DOM bindings, JSX-generated `insert()` / `spread()` calls).
302
+ * App code should use `createEffect`.
303
+ *
111
304
  * ```typescript
112
- * createRenderEffect<T>(compute, effectFn, initialValue?, options?: EffectOptions);
305
+ * createRenderEffect<T>(compute, effectFn, options?: EffectOptions);
113
306
  * ```
114
- * @param compute a function that receives its previous or the initial value, if set, and returns a new value used to react on a computation
307
+ * @param compute a function that receives its previous value and returns a new value used to react on a computation
115
308
  * @param effectFn a function that receives the new value and is used to perform side effects
116
- * @param value an optional initial value for the computation; if set, fn will never receive undefined as first argument
117
- * @param options `EffectOptions` -- name, defer
309
+ * @param options `EffectOptions` -- name, defer, schedule
310
+ *
311
+ * @example
312
+ * ```ts
313
+ * // Custom directive: bind an element's textContent to a reactive source.
314
+ * function bindText(el: HTMLElement, source: () => string) {
315
+ * createRenderEffect(
316
+ * () => source(),
317
+ * value => { el.textContent = value; }
318
+ * );
319
+ * }
320
+ * ```
118
321
  *
119
322
  * @description https://docs.solidjs.com/reference/secondary-primitives/create-render-effect
120
323
  */
121
- export declare function createRenderEffect<Next>(compute: ComputeFunction<undefined | NoInfer<Next>, Next>, effectFn: EffectFunction<NoInfer<Next>, Next>): void;
122
- export declare function createRenderEffect<Next, Init = Next>(compute: ComputeFunction<Init | Next, Next>, effectFn: EffectFunction<Next, Next>, value: Init, options?: EffectOptions): void;
324
+ export declare function createRenderEffect<T>(compute: ComputeFunction<undefined | NoInfer<T>, T>, effectFn: EffectFunction<NoInfer<T>, T>, options?: EffectOptions): void;
123
325
  /**
124
326
  * Creates a tracked reactive effect where dependency tracking and side effects happen
125
327
  * in the same scope.
@@ -129,14 +331,27 @@ export declare function createRenderEffect<Next, Init = Next>(compute: ComputeFu
129
331
  * state). Use only when dynamic subscription patterns require same-scope tracking.
130
332
  *
131
333
  * ```typescript
132
- * createTrackedEffect(compute, options?: EffectOptions);
334
+ * createTrackedEffect(compute, options?: { name?: string });
133
335
  * ```
134
336
  * @param compute a function that contains reactive reads to track and returns an optional cleanup function to run on disposal or before next execution
135
- * @param options `EffectOptions` -- name, defer
337
+ * @param options -- name
338
+ *
339
+ * @example
340
+ * ```ts
341
+ * createTrackedEffect(() => {
342
+ * const target = focusedNode();
343
+ * if (!target) return;
344
+ *
345
+ * const handler = () => log(target.value());
346
+ * target.on("change", handler);
347
+ *
348
+ * return () => target.off("change", handler);
349
+ * });
350
+ * ```
136
351
  *
137
352
  * @description https://docs.solidjs.com/reference/secondary-primitives/create-tracked-effect
138
353
  */
139
- export declare function createTrackedEffect(compute: () => void | (() => void), options?: EffectOptions): void;
354
+ export declare function createTrackedEffect(compute: () => void | (() => void), options?: BaseEffectOptions): void;
140
355
  /**
141
356
  * Creates a reactive computation that runs after the render phase with flexible tracking.
142
357
  *
@@ -147,11 +362,40 @@ export declare function createTrackedEffect(compute: () => void | (() => void),
147
362
  * @param effectFn a function (or `EffectBundle`) that is called when tracked function is invalidated
148
363
  * @param options `EffectOptions` -- name, defer
149
364
  *
365
+ * @example
366
+ * ```ts
367
+ * const [count, setCount] = createSignal(0);
368
+ *
369
+ * const track = createReaction(() => {
370
+ * console.log("count changed once, re-arm to listen again");
371
+ * track(() => count()); // re-arm
372
+ * });
373
+ *
374
+ * track(() => count()); // initial arm
375
+ *
376
+ * setCount(1); // logs once, reaction re-armed for next change
377
+ * ```
378
+ *
150
379
  * @description https://docs.solidjs.com/reference/secondary-primitives/create-reaction
151
380
  */
152
381
  export declare function createReaction(effectFn: EffectFunction<undefined> | EffectBundle<undefined>, options?: EffectOptions): (tracking: () => void) => void;
153
382
  /**
154
- * Returns a promise of the resolved value of a reactive expression
383
+ * Awaits a reactive expression and returns its first fully-settled value as a
384
+ * `Promise`. Pending async reads (`createMemo` returning a promise, etc.) are
385
+ * waited on; once the expression returns synchronously without `NotReadyError`
386
+ * the promise resolves with that value.
387
+ *
388
+ * Must be called *outside* a tracking scope — it doesn't subscribe, it just
389
+ * resolves the current value once.
390
+ *
391
+ * @example
392
+ * ```ts
393
+ * const user = createMemo(() => fetch(`/users/${id()}`).then(r => r.json()));
394
+ *
395
+ * // outside any reactive scope
396
+ * const initial = await resolve(() => user());
397
+ * ```
398
+ *
155
399
  * @param fn a reactive expression to resolve
156
400
  */
157
401
  export declare function resolve<T>(fn: () => T): Promise<T>;
@@ -159,34 +403,110 @@ export declare function resolve<T>(fn: () => T): Promise<T>;
159
403
  * Creates an optimistic signal that can be used to optimistically update a value
160
404
  * and then revert it back to the previous value at end of transition.
161
405
  *
162
- * When called with a plain value, creates an optimistic signal with `SignalOptions` (name, equals, pureWrite, unobserved).
406
+ * When called with a plain value, creates an optimistic signal with `SignalOptions` (name, equals, ownedWrite, unobserved).
163
407
  * When called with a function, creates a writable optimistic memo with `SignalOptions & MemoOptions` (adds id, lazy).
164
408
  *
165
409
  * ```typescript
166
410
  * // Plain optimistic signal
167
411
  * const [state, setState] = createOptimistic<T>(value, options?: SignalOptions<T>);
168
412
  * // Writable optimistic memo (function overload)
169
- * const [state, setState] = createOptimistic<T>(fn, initialValue?, options?: SignalOptions<T> & MemoOptions<T>);
413
+ * const [state, setState] = createOptimistic<T>(fn, options?: SignalOptions<T> & MemoOptions<T>);
170
414
  * ```
171
415
  * @param value initial value of the signal; if empty, the signal's type will automatically extended with undefined
172
416
  * @param options optional object with a name for debugging purposes and equals, a comparator function for the previous and next value to allow fine-grained control over the reactivity
173
417
  *
174
418
  * @returns `[state: Accessor<T>, setState: Setter<T>]`
175
419
  *
420
+ * @example
421
+ * ```ts
422
+ * const [todos, setTodos] = createOptimistic(initialTodos);
423
+ *
424
+ * const addTodo = action(function* (text: string) {
425
+ * const tempId = crypto.randomUUID();
426
+ * setTodos(t => [...t, { id: tempId, text, pending: true }]); // optimistic
427
+ * const saved = yield api.createTodo(text);
428
+ * setTodos(t => t.map(x => (x.id === tempId ? saved : x))); // reconcile
429
+ * });
430
+ * ```
431
+ *
176
432
  * @description https://docs.solidjs.com/reference/basic-reactivity/create-optimistic-signal
177
433
  */
178
434
  export declare function createOptimistic<T>(): Signal<T | undefined>;
179
435
  export declare function createOptimistic<T>(value: Exclude<T, Function>, options?: SignalOptions<T>): Signal<T>;
180
- export declare function createOptimistic<T>(fn: ComputeFunction<T>, initialValue?: T, options?: SignalOptions<T> & MemoOptions<T>): Signal<T>;
436
+ export declare function createOptimistic<T>(fn: ComputeFunction<T>, options?: SignalOptions<T> & MemoOptions<T>): Signal<T>;
181
437
  /**
182
- * Runs a callback after the current flush cycle completes.
438
+ * Schedules `callback` to run **once** after the reactive graph has fully
439
+ * settled — i.e. once every pending async read inside the current owner has
440
+ * resolved and the queue has flushed. Each call registers a single fire; it
441
+ * does not create an ongoing subscription.
442
+ *
443
+ * The canonical lifecycle primitive in 2.0. Three main usages:
444
+ *
445
+ * - **Component-level setup-and-teardown** *(the most common shape)*: run
446
+ * setup after the component's first stable render and **return a cleanup
447
+ * function** to dispose it on owner disposal. This is the replacement for
448
+ * the 1.x `onMount` + `onCleanup` pairing — setup and teardown live in one
449
+ * block, and `onCleanup` is no longer the right tool for component
450
+ * bodies. (`onMount` no longer exists in 2.0.)
451
+ * - **Post-settle "ready" hook:** run once after a component's first stable
452
+ * render — analytics ping, focus, scroll-into-view, etc. No cleanup needed.
453
+ * - **Inside an event handler:** schedule work to run after the action /
454
+ * transition triggered by the event has completed.
455
+ *
456
+ * Reactive reads inside the callback are *not* tracked — to react to
457
+ * subsequent settles, register a new `onSettled` each time.
183
458
  *
184
- * When called within a reactive context (owner), uses a tracked effect with untracked
185
- * reads - this means normal signal reads won't create subscriptions, but uninitialized
186
- * async values will throw NotReadyError, causing the callback to re-run when they settle.
459
+ * `onCleanup` is **not** allowed inside the callback return a cleanup
460
+ * function instead. The returned cleanup runs on owner disposal.
187
461
  *
188
- * When called without an owner, runs once and immediately calls any returned cleanup.
462
+ * @example
463
+ * ```tsx
464
+ * // Component-level setup + teardown — replaces onMount + onCleanup.
465
+ * // Subscribe to an external source on mount, unsubscribe on dispose.
466
+ * function useViewportWidth() {
467
+ * const [width, setWidth] = createSignal(window.innerWidth);
468
+ * onSettled(() => {
469
+ * const onResize = () => setWidth(window.innerWidth);
470
+ * window.addEventListener("resize", onResize);
471
+ * return () => window.removeEventListener("resize", onResize);
472
+ * });
473
+ * return width;
474
+ * }
475
+ * ```
476
+ *
477
+ * @example
478
+ * ```tsx
479
+ * // Post-settle "ready" hook — no cleanup needed.
480
+ * function Dashboard() {
481
+ * const data = createMemo(async () => fetchData());
482
+ *
483
+ * onSettled(() => {
484
+ * analytics.track("dashboard.ready");
485
+ * });
486
+ *
487
+ * return <Loading fallback={<Spinner />}><pre>{data()}</pre></Loading>;
488
+ * }
489
+ * ```
490
+ *
491
+ * @example
492
+ * ```tsx
493
+ * // Event-handler — runs after the action settles.
494
+ * function SaveButton() {
495
+ * const save = action(function* () {
496
+ * yield api.save();
497
+ * });
498
+ *
499
+ * const handleClick = () => {
500
+ * save();
501
+ * onSettled(() => toast("Saved!"));
502
+ * };
503
+ *
504
+ * return <button onClick={handleClick}>Save</button>;
505
+ * }
506
+ * ```
189
507
  *
190
- * @param callback Function to run, may return a cleanup function
508
+ * @param callback Function to run; may return a cleanup function that fires
509
+ * on owner disposal
191
510
  */
192
511
  export declare function onSettled(callback: () => void | (() => void)): void;
512
+ export {};