@solidjs/signals 0.10.8 → 0.11.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/prod.js CHANGED
@@ -701,9 +701,9 @@ function unlinkSubs(e) {
701
701
  const t = e.V;
702
702
  const n = e.D;
703
703
  const i = e.p;
704
- const r = e.ge;
705
- if (i !== null) i.ge = r;
706
- else t.Pe = r;
704
+ const r = e.Pe;
705
+ if (i !== null) i.Pe = r;
706
+ else t.ge = r;
707
707
  if (r !== null) r.p = i;
708
708
  else {
709
709
  t.I = i;
@@ -735,9 +735,9 @@ function link(e, t) {
735
735
  return;
736
736
  }
737
737
  }
738
- const s = e.Pe;
738
+ const s = e.ge;
739
739
  if (s !== null && s.h === t && (!r || isValidLink(s, t))) return;
740
- const o = (t.ye = e.Pe = { V: e, h: t, D: i, ge: s, p: null });
740
+ const o = (t.ye = e.ge = { V: e, h: t, D: i, Pe: s, p: null });
741
741
  if (n !== null) n.D = o;
742
742
  else t.C = o;
743
743
  if (s !== null) s.p = o;
@@ -780,7 +780,7 @@ function dispose(e) {
780
780
  function disposeChildren(e, t = false, n) {
781
781
  if (e.O & REACTIVE_DISPOSED) return;
782
782
  if (t) e.O = REACTIVE_DISPOSED;
783
- let i = n ? e.we : e.De;
783
+ let i = n ? e.be : e.De;
784
784
  while (i) {
785
785
  const e = i.ve;
786
786
  if (i.C) {
@@ -797,16 +797,16 @@ function disposeChildren(e, t = false, n) {
797
797
  i = e;
798
798
  }
799
799
  if (n) {
800
- e.we = null;
800
+ e.be = null;
801
801
  } else {
802
802
  e.De = null;
803
803
  e.ve = null;
804
- e.Ve = 0;
804
+ e.we = 0;
805
805
  }
806
806
  runDisposal(e, n);
807
807
  }
808
808
  function runDisposal(e, t) {
809
- let n = t ? e.be : e.me;
809
+ let n = t ? e.Ve : e.me;
810
810
  if (!n) return;
811
811
  if (Array.isArray(n)) {
812
812
  for (let e = 0; e < n.length; e++) {
@@ -816,12 +816,12 @@ function runDisposal(e, t) {
816
816
  } else {
817
817
  n.call(n);
818
818
  }
819
- t ? (e.be = null) : (e.me = null);
819
+ t ? (e.Ve = null) : (e.me = null);
820
820
  }
821
821
  function childId(e, t) {
822
822
  let n = e;
823
823
  while (n.Le && n.i) n = n.i;
824
- if (n.id != null) return formatId(n.id, t ? n.Ve++ : n.Ve);
824
+ if (n.id != null) return formatId(n.id, t ? n.we++ : n.we);
825
825
  throw new Error("Cannot get child id from owner without an id");
826
826
  }
827
827
  function getNextChildId(e) {
@@ -836,7 +836,7 @@ function formatId(e, t) {
836
836
  return e + (i ? String.fromCharCode(64 + i) : "") + n;
837
837
  }
838
838
  function getObserver() {
839
- if (pendingCheckActive || pendingReadActive) return PENDING_OWNER;
839
+ if (pendingCheckActive || latestReadActive) return PENDING_OWNER;
840
840
  return tracking ? context : null;
841
841
  }
842
842
  function getOwner() {
@@ -865,9 +865,9 @@ function createOwner(e) {
865
865
  me: null,
866
866
  ce: t?.ce ?? globalQueue,
867
867
  ke: t?.ke || defaultContext,
868
- Ve: 0,
868
+ we: 0,
869
+ Ve: null,
869
870
  be: null,
870
- we: null,
871
871
  i: t,
872
872
  dispose(e = true) {
873
873
  disposeChildren(i, e);
@@ -959,7 +959,7 @@ function trackedEffect(e, t) {
959
959
  }
960
960
  },
961
961
  undefined,
962
- { ...t, lazy: true, pureWrite: true }
962
+ { ...t, lazy: true }
963
963
  );
964
964
  n.xe = undefined;
965
965
  n.ue = true;
@@ -975,7 +975,7 @@ let stale = false;
975
975
  let refreshing = false;
976
976
  let pendingCheckActive = false;
977
977
  let foundPending = false;
978
- let pendingReadActive = false;
978
+ let latestReadActive = false;
979
979
  let context = null;
980
980
  let currentOptimisticLane = null;
981
981
  let snapshotCaptureActive = false;
@@ -1039,11 +1039,11 @@ function recompute(e, t = false) {
1039
1039
  if (e.ne || n === EFFECT_TRACKED) disposeChildren(e);
1040
1040
  else {
1041
1041
  markDisposal(e);
1042
- e.be = e.me;
1043
- e.we = e.De;
1042
+ e.Ve = e.me;
1043
+ e.be = e.De;
1044
1044
  e.me = null;
1045
1045
  e.De = null;
1046
- e.Ve = 0;
1046
+ e.we = 0;
1047
1047
  }
1048
1048
  }
1049
1049
  const i = !!(e.O & REACTIVE_OPTIMISTIC_DIRTY);
@@ -1157,7 +1157,7 @@ function computed(e, t, n) {
1157
1157
  me: null,
1158
1158
  ce: context?.ce ?? globalQueue,
1159
1159
  ke: context?.ke ?? defaultContext,
1160
- Ve: 0,
1160
+ we: 0,
1161
1161
  L: e,
1162
1162
  fe: t,
1163
1163
  o: 0,
@@ -1167,7 +1167,7 @@ function computed(e, t, n) {
1167
1167
  C: null,
1168
1168
  ye: null,
1169
1169
  I: null,
1170
- Pe: null,
1170
+ ge: null,
1171
1171
  i: context,
1172
1172
  ve: null,
1173
1173
  De: null,
@@ -1175,8 +1175,8 @@ function computed(e, t, n) {
1175
1175
  Ee: STATUS_UNINITIALIZED,
1176
1176
  J: clock,
1177
1177
  ae: NOT_PENDING,
1178
+ Ve: null,
1178
1179
  be: null,
1179
- we: null,
1180
1180
  Ie: null,
1181
1181
  ne: null
1182
1182
  };
@@ -1209,7 +1209,7 @@ function signal(e, t, n = null) {
1209
1209
  Ne: t?.unobserved,
1210
1210
  fe: e,
1211
1211
  I: null,
1212
- Pe: null,
1212
+ ge: null,
1213
1213
  J: clock,
1214
1214
  m: n,
1215
1215
  P: n?.A || null,
@@ -1251,10 +1251,10 @@ function untrack(e) {
1251
1251
  }
1252
1252
  }
1253
1253
  function read(e) {
1254
- if (pendingReadActive) {
1255
- const t = getPendingValueComputed(e);
1256
- const n = pendingReadActive;
1257
- pendingReadActive = false;
1254
+ if (latestReadActive) {
1255
+ const t = getLatestValueComputed(e);
1256
+ const n = latestReadActive;
1257
+ latestReadActive = false;
1258
1258
  let i;
1259
1259
  try {
1260
1260
  i = read(t);
@@ -1262,7 +1262,7 @@ function read(e) {
1262
1262
  if (!context && t instanceof NotReadyError) return e.fe;
1263
1263
  throw t;
1264
1264
  } finally {
1265
- pendingReadActive = n;
1265
+ latestReadActive = n;
1266
1266
  }
1267
1267
  if (t.Ee & STATUS_PENDING) return e.fe;
1268
1268
  if (stale && currentOptimisticLane && t.ie) {
@@ -1439,10 +1439,10 @@ function updatePendingSignal(e) {
1439
1439
  }
1440
1440
  }
1441
1441
  }
1442
- function getPendingValueComputed(e) {
1442
+ function getLatestValueComputed(e) {
1443
1443
  if (!e.he) {
1444
- const t = pendingReadActive;
1445
- pendingReadActive = false;
1444
+ const t = latestReadActive;
1445
+ latestReadActive = false;
1446
1446
  const n = pendingCheckActive;
1447
1447
  pendingCheckActive = false;
1448
1448
  const i = context;
@@ -1451,7 +1451,7 @@ function getPendingValueComputed(e) {
1451
1451
  e.he.de = e;
1452
1452
  context = i;
1453
1453
  pendingCheckActive = n;
1454
- pendingReadActive = t;
1454
+ latestReadActive = t;
1455
1455
  }
1456
1456
  return e.he;
1457
1457
  }
@@ -1464,13 +1464,13 @@ function staleValues(e, t = true) {
1464
1464
  stale = n;
1465
1465
  }
1466
1466
  }
1467
- function pending(e) {
1468
- const t = pendingReadActive;
1469
- pendingReadActive = true;
1467
+ function latest(e) {
1468
+ const t = latestReadActive;
1469
+ latestReadActive = true;
1470
1470
  try {
1471
1471
  return e();
1472
1472
  } finally {
1473
- pendingReadActive = t;
1473
+ latestReadActive = t;
1474
1474
  }
1475
1475
  }
1476
1476
  function isPending(e) {
@@ -2298,6 +2298,68 @@ function createOptimisticProjectionInternal(e, t = {}, n) {
2298
2298
  }
2299
2299
  return { store: s, node: i };
2300
2300
  }
2301
+ const DELETE = Symbol(0);
2302
+ function updatePath(e, t, n = 0) {
2303
+ let i,
2304
+ r = e;
2305
+ if (n < t.length - 1) {
2306
+ i = t[n];
2307
+ const s = typeof i;
2308
+ const o = Array.isArray(e);
2309
+ if (Array.isArray(i)) {
2310
+ for (let r = 0; r < i.length; r++) {
2311
+ t[n] = i[r];
2312
+ updatePath(e, t, n);
2313
+ }
2314
+ t[n] = i;
2315
+ return;
2316
+ } else if (o && s === "function") {
2317
+ for (let r = 0; r < e.length; r++) {
2318
+ if (i(e[r], r)) {
2319
+ t[n] = r;
2320
+ updatePath(e, t, n);
2321
+ }
2322
+ }
2323
+ t[n] = i;
2324
+ return;
2325
+ } else if (o && s === "object") {
2326
+ const { from: r = 0, to: s = e.length - 1, by: o = 1 } = i;
2327
+ for (let i = r; i <= s; i += o) {
2328
+ t[n] = i;
2329
+ updatePath(e, t, n);
2330
+ }
2331
+ t[n] = i;
2332
+ return;
2333
+ } else if (n < t.length - 2) {
2334
+ updatePath(e[i], t, n + 1);
2335
+ return;
2336
+ }
2337
+ r = e[i];
2338
+ }
2339
+ let s = t[t.length - 1];
2340
+ if (typeof s === "function") {
2341
+ s = s(r);
2342
+ if (s === r) return;
2343
+ }
2344
+ if (i === undefined && s == undefined) return;
2345
+ if (s === DELETE) {
2346
+ delete e[i];
2347
+ } else if (i === undefined || (isWrappable(r) && isWrappable(s) && !Array.isArray(s))) {
2348
+ const t = i !== undefined ? e[i] : e;
2349
+ const n = Object.keys(s);
2350
+ for (let e = 0; e < n.length; e++) t[n[e]] = s[n[e]];
2351
+ } else {
2352
+ e[i] = s;
2353
+ }
2354
+ }
2355
+ const storePath = Object.assign(
2356
+ function storePath(...e) {
2357
+ return t => {
2358
+ updatePath(t, e);
2359
+ };
2360
+ },
2361
+ { DELETE: DELETE }
2362
+ );
2301
2363
  function snapshot(e, t, n) {
2302
2364
  let i, r, s, o, u, c;
2303
2365
  if (!isWrappable(e)) return e;
@@ -2851,6 +2913,7 @@ export {
2851
2913
  isPending,
2852
2914
  isRefreshing,
2853
2915
  isWrappable,
2916
+ latest,
2854
2917
  mapArray,
2855
2918
  markSnapshotScope,
2856
2919
  merge,
@@ -2858,7 +2921,6 @@ export {
2858
2921
  onCleanup,
2859
2922
  onSettled,
2860
2923
  peekNextChildId,
2861
- pending,
2862
2924
  reconcile,
2863
2925
  refresh,
2864
2926
  releaseSnapshotScope,
@@ -2869,5 +2931,6 @@ export {
2869
2931
  setSnapshotCapture,
2870
2932
  setStrictRead,
2871
2933
  snapshot,
2934
+ storePath,
2872
2935
  untrack
2873
2936
  };
@@ -6,7 +6,7 @@ export declare let stale: boolean;
6
6
  export declare let refreshing: boolean;
7
7
  export declare let pendingCheckActive: boolean;
8
8
  export declare let foundPending: boolean;
9
- export declare let pendingReadActive: boolean;
9
+ export declare let latestReadActive: boolean;
10
10
  export declare let context: Owner | null;
11
11
  export declare let currentOptimisticLane: OptimisticLane | null;
12
12
  export declare let snapshotCaptureActive: boolean;
@@ -40,7 +40,7 @@ export declare function runWithOwner<T>(owner: Owner | null, fn: () => T): T;
40
40
  */
41
41
  export declare function updatePendingSignal(el: Signal<any> | Computed<any>): void;
42
42
  export declare function staleValues<T>(fn: () => T, set?: boolean): T;
43
- export declare function pending<T>(fn: () => T): T;
43
+ export declare function latest<T>(fn: () => T): T;
44
44
  export declare function isPending(fn: () => any): boolean;
45
45
  export declare function refresh<T>(fn: (() => T) | (T & {
46
46
  [$REFRESH]: any;
@@ -1,5 +1,5 @@
1
1
  export { ContextNotFoundError, NoOwnerError, NotReadyError } from "./error.js";
2
- export { isEqual, untrack, runWithOwner, computed, signal, read, setSignal, optimisticSignal, optimisticComputed, isPending, pending, refresh, isRefreshing, staleValues, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots, setStrictRead } from "./core.js";
2
+ export { isEqual, untrack, runWithOwner, computed, signal, read, setSignal, optimisticSignal, optimisticComputed, isPending, latest, refresh, isRefreshing, staleValues, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots, setStrictRead } from "./core.js";
3
3
  export { createOwner, createRoot, dispose, getNextChildId, getObserver, getOwner, isDisposed, onCleanup, peekNextChildId } from "./owner.js";
4
4
  export { createContext, getContext, setContext, type Context, type ContextRecord } from "./context.js";
5
5
  export { handleAsync } from "./async.js";
@@ -35,7 +35,7 @@ export interface RawSignal<T> {
35
35
  _optimistic?: boolean;
36
36
  _optimisticLane?: OptimisticLane;
37
37
  _pendingSignal?: Signal<boolean>;
38
- _pendingValueComputed?: Computed<T>;
38
+ _latestValueComputed?: Computed<T>;
39
39
  _parentSource?: Signal<any> | Computed<any>;
40
40
  }
41
41
  export interface FirewallSignal<T> extends RawSignal<T> {
@@ -1,4 +1,4 @@
1
- export { ContextNotFoundError, NoOwnerError, NotReadyError, action, createContext, createOwner, createRoot, runWithOwner, flush, getNextChildId, peekNextChildId, getContext, setContext, getOwner, onCleanup, isDisposed, getObserver, isEqual, untrack, isPending, pending, isRefreshing, refresh, SUPPORTS_PROXY, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots, setStrictRead } from "./core/index.js";
1
+ export { ContextNotFoundError, NoOwnerError, NotReadyError, action, createContext, createOwner, createRoot, runWithOwner, flush, getNextChildId, peekNextChildId, getContext, setContext, getOwner, onCleanup, isDisposed, getObserver, isEqual, untrack, isPending, latest, isRefreshing, refresh, SUPPORTS_PROXY, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots, setStrictRead } from "./core/index.js";
2
2
  export type { Owner, Context, ContextRecord, IQueue } from "./core/index.js";
3
3
  export * from "./signals.js";
4
4
  export { mapArray, repeat, type Maybe } from "./map.js";
@@ -4,4 +4,6 @@ export { isWrappable, createStore, deep, $TRACK, $PROXY, $TARGET } from "./store
4
4
  export { createProjection } from "./projection.js";
5
5
  export { createOptimisticStore } from "./optimistic.js";
6
6
  export { reconcile } from "./reconcile.js";
7
+ export { storePath } from "./storePath.js";
8
+ export type { PathSetter, Part, StorePathRange, ArrayFilterFn, CustomPartial } from "./storePath.js";
7
9
  export { snapshot, merge, omit } from "./utils.js";
@@ -0,0 +1,30 @@
1
+ import { type NotWrappable } from "./store.js";
2
+ type W<T> = Exclude<T, NotWrappable>;
3
+ type KeyOf<T> = number extends keyof T ? 0 extends 1 & T ? keyof T : [T] extends [never] ? never : [T] extends [readonly unknown[]] ? number : keyof T : keyof T;
4
+ export type CustomPartial<T> = T extends readonly unknown[] ? "0" extends keyof T ? {
5
+ [K in Extract<keyof T, `${number}`>]?: T[K];
6
+ } : {
7
+ [x: number]: T[number];
8
+ } : Partial<T>;
9
+ export type StorePathRange = {
10
+ from?: number;
11
+ to?: number;
12
+ by?: number;
13
+ };
14
+ export type ArrayFilterFn<T> = (item: T, index: number) => boolean;
15
+ export type PathSetter<T> = T | CustomPartial<T> | ((prev: T) => T | CustomPartial<T>) | typeof DELETE;
16
+ export type Part<T, K extends KeyOf<T> = KeyOf<T>> = K | ([K] extends [never] ? never : readonly K[]) | ([T] extends [readonly unknown[]] ? ArrayFilterFn<T[number]> | StorePathRange : never);
17
+ declare const DELETE: unique symbol;
18
+ export interface storePath {
19
+ DELETE: typeof DELETE;
20
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>, K3 extends KeyOf<W<W<W<T>[K1]>[K2]>>, K4 extends KeyOf<W<W<W<W<T>[K1]>[K2]>[K3]>>, K5 extends KeyOf<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>>, K6 extends KeyOf<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>>, K7 extends KeyOf<W<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, k3: Part<W<W<W<T>[K1]>[K2]>, K3>, k4: Part<W<W<W<W<T>[K1]>[K2]>[K3]>, K4>, k5: Part<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>, K5>, k6: Part<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, k7: Part<W<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, setter: PathSetter<W<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7]>): (state: T) => void;
21
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>, K3 extends KeyOf<W<W<W<T>[K1]>[K2]>>, K4 extends KeyOf<W<W<W<W<T>[K1]>[K2]>[K3]>>, K5 extends KeyOf<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>>, K6 extends KeyOf<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, k3: Part<W<W<W<T>[K1]>[K2]>, K3>, k4: Part<W<W<W<W<T>[K1]>[K2]>[K3]>, K4>, k5: Part<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>, K5>, k6: Part<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, setter: PathSetter<W<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>): (state: T) => void;
22
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>, K3 extends KeyOf<W<W<W<T>[K1]>[K2]>>, K4 extends KeyOf<W<W<W<W<T>[K1]>[K2]>[K3]>>, K5 extends KeyOf<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, k3: Part<W<W<W<T>[K1]>[K2]>, K3>, k4: Part<W<W<W<W<T>[K1]>[K2]>[K3]>, K4>, k5: Part<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>, K5>, setter: PathSetter<W<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>[K5]>): (state: T) => void;
23
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>, K3 extends KeyOf<W<W<W<T>[K1]>[K2]>>, K4 extends KeyOf<W<W<W<W<T>[K1]>[K2]>[K3]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, k3: Part<W<W<W<T>[K1]>[K2]>, K3>, k4: Part<W<W<W<W<T>[K1]>[K2]>[K3]>, K4>, setter: PathSetter<W<W<W<W<T>[K1]>[K2]>[K3]>[K4]>): (state: T) => void;
24
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>, K3 extends KeyOf<W<W<W<T>[K1]>[K2]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, k3: Part<W<W<W<T>[K1]>[K2]>, K3>, setter: PathSetter<W<W<W<T>[K1]>[K2]>[K3]>): (state: T) => void;
25
+ <T, K1 extends KeyOf<W<T>>, K2 extends KeyOf<W<W<T>[K1]>>>(k1: Part<W<T>, K1>, k2: Part<W<W<T>[K1]>, K2>, setter: PathSetter<W<W<T>[K1]>[K2]>): (state: T) => void;
26
+ <T, K1 extends KeyOf<W<T>>>(k1: Part<W<T>, K1>, setter: PathSetter<W<T>[K1]>): (state: T) => void;
27
+ <T>(setter: PathSetter<T>): (state: T) => void;
28
+ }
29
+ export declare const storePath: storePath;
30
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidjs/signals",
3
- "version": "0.10.8",
3
+ "version": "0.11.0",
4
4
  "description": "SolidJS' standalone reactivity implementation",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",