@solidjs/signals 0.13.12 → 0.13.13

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 (4) hide show
  1. package/dist/dev.js +98 -41
  2. package/dist/node.cjs +366 -330
  3. package/dist/prod.js +263 -227
  4. package/package.json +1 -1
package/dist/dev.js CHANGED
@@ -1081,6 +1081,7 @@ function handleAsync(el, result, setter) {
1081
1081
  if (el._inFlight !== result) return;
1082
1082
  if (el._flags & (REACTIVE_DIRTY | REACTIVE_OPTIMISTIC_DIRTY)) return;
1083
1083
  globalQueue.initTransition(resolveTransition(el));
1084
+ const wasUninitialized = !!(el._statusFlags & STATUS_UNINITIALIZED);
1084
1085
  clearStatus(el);
1085
1086
  const lane = resolveLane(el);
1086
1087
  if (lane) lane._pendingAsync.delete(el);
@@ -1094,9 +1095,10 @@ function handleAsync(el, result, setter) {
1094
1095
  }
1095
1096
  el._time = clock;
1096
1097
  } else if (lane) {
1098
+ const isEffect = el._type;
1097
1099
  const prevValue = el._value;
1098
1100
  const equals = el._equals;
1099
- if (!equals || !equals(value, prevValue)) {
1101
+ if ((!isEffect && wasUninitialized) || !equals || !equals(value, prevValue)) {
1100
1102
  el._value = value;
1101
1103
  el._time = clock;
1102
1104
  if (el._latestValueComputed) {
@@ -1359,6 +1361,7 @@ function recompute(el, create = false) {
1359
1361
  const isOptimisticDirty = !!(el._flags & REACTIVE_OPTIMISTIC_DIRTY);
1360
1362
  const hasOverride = el._overrideValue !== undefined && el._overrideValue !== NOT_PENDING;
1361
1363
  const wasPending = !!(el._statusFlags & STATUS_PENDING);
1364
+ const wasUninitialized = !!(el._statusFlags & STATUS_UNINITIALIZED);
1362
1365
  const oldcontext = context;
1363
1366
  context = el;
1364
1367
  el._depsTail = null;
@@ -1424,7 +1427,8 @@ function recompute(el, create = false) {
1424
1427
  : el._pendingValue === NOT_PENDING
1425
1428
  ? el._value
1426
1429
  : el._pendingValue;
1427
- const valueChanged = !el._equals || !el._equals(compareValue, value);
1430
+ const valueChanged =
1431
+ (!isEffect && wasUninitialized) || !el._equals || !el._equals(compareValue, value);
1428
1432
  if (valueChanged) {
1429
1433
  const prevVisible = hasOverride ? el._overrideValue : undefined;
1430
1434
  if (create || (isEffect && activeTransition !== el._transition) || isOptimisticDirty) {
@@ -2690,12 +2694,55 @@ function getKeys(source, override, enumerable = true) {
2690
2694
  return Array.from(keys);
2691
2695
  }
2692
2696
  function getPropertyDescriptor(source, override, property) {
2693
- let value = source;
2694
2697
  if (override && property in override) {
2695
- if (value[property] === $DELETED) return void 0;
2696
- if (!(property in value)) value = override;
2698
+ if (override[property] === $DELETED) return void 0;
2699
+ const overrideDesc = Reflect.getOwnPropertyDescriptor(override, property);
2700
+ if (overrideDesc?.get || overrideDesc?.set || !(property in source)) return overrideDesc;
2697
2701
  }
2698
- return Reflect.getOwnPropertyDescriptor(value, property);
2702
+ return Reflect.getOwnPropertyDescriptor(source, property);
2703
+ }
2704
+ function prepareStoreWrite(target, store, property) {
2705
+ if (target[STORE_OPTIMISTIC]) {
2706
+ const firewall = target[STORE_FIREWALL];
2707
+ if (firewall?._transition) {
2708
+ globalQueue.initTransition(firewall._transition);
2709
+ }
2710
+ }
2711
+ const state = target[STORE_VALUE];
2712
+ const base = state[property];
2713
+ if (
2714
+ snapshotCaptureActive &&
2715
+ typeof property !== "symbol" &&
2716
+ !((target[STORE_FIREWALL]?._statusFlags ?? 0) & STATUS_PENDING)
2717
+ ) {
2718
+ if (!target[STORE_SNAPSHOT_PROPS]) {
2719
+ target[STORE_SNAPSHOT_PROPS] = Object.create(null);
2720
+ snapshotSources?.add(target);
2721
+ }
2722
+ if (!(property in target[STORE_SNAPSHOT_PROPS])) {
2723
+ target[STORE_SNAPSHOT_PROPS][property] = base;
2724
+ }
2725
+ }
2726
+ const useOptimistic = target[STORE_OPTIMISTIC] && !projectionWriteActive;
2727
+ const overrideKey = useOptimistic ? STORE_OPTIMISTIC_OVERRIDE : STORE_OVERRIDE;
2728
+ if (useOptimistic) trackOptimisticStore(store);
2729
+ return { base: base, overrideKey: overrideKey, state: state };
2730
+ }
2731
+ function notifyStoreProperty(target, property, mode, value) {
2732
+ if (target[STORE_HAS]?.[property]) setSignal(target[STORE_HAS][property], mode !== "delete");
2733
+ const nodes = getNodes(target, STORE_NODE);
2734
+ if (mode === "set") {
2735
+ nodes[property] &&
2736
+ setSignal(nodes[property], () => (isWrappable(value) ? wrap(value, target) : value));
2737
+ } else if (mode === "invalidate") {
2738
+ if (nodes[property]) {
2739
+ setSignal(nodes[property], {});
2740
+ delete nodes[property];
2741
+ }
2742
+ } else {
2743
+ nodes[property] && setSignal(nodes[property], undefined);
2744
+ }
2745
+ nodes[$TRACK] && setSignal(nodes[$TRACK], undefined);
2699
2746
  }
2700
2747
  let Writing = null;
2701
2748
  const storeTraps = {
@@ -2808,31 +2855,12 @@ const storeTraps = {
2808
2855
  set(target, property, rawValue) {
2809
2856
  const store = target[$PROXY];
2810
2857
  if (writeOnly(store)) {
2811
- if (target[STORE_OPTIMISTIC]) {
2812
- const firewall = target[STORE_FIREWALL];
2813
- if (firewall?._transition) {
2814
- globalQueue.initTransition(firewall._transition);
2815
- }
2816
- }
2817
2858
  untrack(() => {
2818
- const state = target[STORE_VALUE];
2819
- const base = state[property];
2820
- if (
2821
- snapshotCaptureActive &&
2822
- typeof property !== "symbol" &&
2823
- !((target[STORE_FIREWALL]?._statusFlags ?? 0) & STATUS_PENDING)
2824
- ) {
2825
- if (!target[STORE_SNAPSHOT_PROPS]) {
2826
- target[STORE_SNAPSHOT_PROPS] = Object.create(null);
2827
- snapshotSources?.add(target);
2828
- }
2829
- if (!(property in target[STORE_SNAPSHOT_PROPS])) {
2830
- target[STORE_SNAPSHOT_PROPS][property] = base;
2831
- }
2832
- }
2833
- const useOptimistic = target[STORE_OPTIMISTIC] && !projectionWriteActive;
2834
- const overrideKey = useOptimistic ? STORE_OPTIMISTIC_OVERRIDE : STORE_OVERRIDE;
2835
- if (useOptimistic) trackOptimisticStore(store);
2859
+ const {
2860
+ base: base,
2861
+ overrideKey: overrideKey,
2862
+ state: state
2863
+ } = prepareStoreWrite(target, store, property);
2836
2864
  const prev =
2837
2865
  target[STORE_OPTIMISTIC_OVERRIDE] && property in target[STORE_OPTIMISTIC_OVERRIDE]
2838
2866
  ? target[STORE_OPTIMISTIC_OVERRIDE][property]
@@ -2858,21 +2886,46 @@ const storeTraps = {
2858
2886
  override[property] = value;
2859
2887
  if (nextLength !== undefined) override.length = nextLength;
2860
2888
  }
2861
- const wrappable = isWrappable(value);
2862
- target[STORE_HAS]?.[property] && setSignal(target[STORE_HAS][property], true);
2863
- const nodes = getNodes(target, STORE_NODE);
2864
- nodes[property] &&
2865
- setSignal(nodes[property], () => (wrappable ? wrap(value, target) : value));
2889
+ notifyStoreProperty(target, property, "set", value);
2866
2890
  if (Array.isArray(state)) {
2891
+ const nodes = getNodes(target, STORE_NODE);
2867
2892
  const lengthValue = property === "length" ? value : nextLength;
2868
2893
  lengthValue !== undefined && nodes.length && setSignal(nodes.length, lengthValue);
2869
2894
  }
2870
- nodes[$TRACK] && setSignal(nodes[$TRACK], undefined);
2871
2895
  if (true) DEV$1.hooks.onStoreNodeUpdate?.(target[$PROXY], property, value, prev);
2872
2896
  });
2873
2897
  }
2874
2898
  return true;
2875
2899
  },
2900
+ defineProperty(target, property, descriptor) {
2901
+ const store = target[$PROXY];
2902
+ if (writeOnly(store)) {
2903
+ untrack(() => {
2904
+ const { base: base, overrideKey: overrideKey } = prepareStoreWrite(target, store, property);
2905
+ const normalizedDescriptor =
2906
+ "value" in descriptor
2907
+ ? {
2908
+ ...descriptor,
2909
+ value: descriptor.value?.[$TARGET]?.[STORE_VALUE] ?? descriptor.value
2910
+ }
2911
+ : descriptor;
2912
+ Object.defineProperty(
2913
+ target[overrideKey] || (target[overrideKey] = Object.create(null)),
2914
+ property,
2915
+ normalizedDescriptor
2916
+ );
2917
+ notifyStoreProperty(target, property, "invalidate");
2918
+ if (true) {
2919
+ const next =
2920
+ "value" in normalizedDescriptor
2921
+ ? normalizedDescriptor.value
2922
+ : normalizedDescriptor.get?.call(store);
2923
+ DEV$1.hooks.onStoreNodeUpdate?.(target[$PROXY], property, next, base);
2924
+ }
2925
+ });
2926
+ }
2927
+ return true;
2928
+ },
2876
2929
  deleteProperty(target, property) {
2877
2930
  const optDeleted = target[STORE_OPTIMISTIC_OVERRIDE]?.[property] === $DELETED;
2878
2931
  const regDeleted = target[STORE_OVERRIDE]?.[property] === $DELETED;
@@ -2895,10 +2948,7 @@ const storeTraps = {
2895
2948
  } else if (target[overrideKey] && property in target[overrideKey]) {
2896
2949
  delete target[overrideKey][property];
2897
2950
  } else return true;
2898
- if (target[STORE_HAS]?.[property]) setSignal(target[STORE_HAS][property], false);
2899
- const nodes = getNodes(target, STORE_NODE);
2900
- nodes[property] && setSignal(nodes[property], undefined);
2901
- nodes[$TRACK] && setSignal(nodes[$TRACK], undefined);
2951
+ notifyStoreProperty(target, property, "delete");
2902
2952
  });
2903
2953
  }
2904
2954
  return true;
@@ -2920,6 +2970,8 @@ const storeTraps = {
2920
2970
  if (property === $PROXY) return { value: target[$PROXY], writable: true, configurable: true };
2921
2971
  if (target[STORE_OPTIMISTIC_OVERRIDE] && property in target[STORE_OPTIMISTIC_OVERRIDE]) {
2922
2972
  if (target[STORE_OPTIMISTIC_OVERRIDE][property] === $DELETED) return undefined;
2973
+ const optDesc = Reflect.getOwnPropertyDescriptor(target[STORE_OPTIMISTIC_OVERRIDE], property);
2974
+ if (optDesc?.get || optDesc?.set || !(property in target[STORE_VALUE])) return optDesc;
2923
2975
  const baseDesc = getPropertyDescriptor(target[STORE_VALUE], target[STORE_OVERRIDE], property);
2924
2976
  if (baseDesc) {
2925
2977
  return { ...baseDesc, value: target[STORE_OPTIMISTIC_OVERRIDE][property] };
@@ -3113,7 +3165,12 @@ function updatePath(current, args, i = 0) {
3113
3165
  ) {
3114
3166
  const target = part !== undefined ? current[part] : current;
3115
3167
  const keys = Object.keys(value);
3116
- for (let i = 0; i < keys.length; i++) target[keys[i]] = value[keys[i]];
3168
+ for (let i = 0; i < keys.length; i++) {
3169
+ const key = keys[i];
3170
+ const desc = Object.getOwnPropertyDescriptor(value, key);
3171
+ if (desc.get || desc.set) Object.defineProperty(target, key, desc);
3172
+ else target[key] = desc.value;
3173
+ }
3117
3174
  } else {
3118
3175
  current[part] = value;
3119
3176
  }