@createstore/createstore 1.1.0 → 1.1.1

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.
@@ -1052,6 +1052,8 @@ function build(initialState, options, sharedDefinition) {
1052
1052
  }
1053
1053
  };
1054
1054
  let hydrated = !persistStorage;
1055
+ let warnedUnsavable = false;
1056
+ const earlyWrites = /* @__PURE__ */ new Set();
1055
1057
  let resolveHydrated;
1056
1058
  const whenHydrated = new Promise((r) => resolveHydrated = r);
1057
1059
  let storageIsAsync = false;
@@ -1078,7 +1080,26 @@ function build(initialState, options, sharedDefinition) {
1078
1080
  saveTimer = void 0;
1079
1081
  if (!persistStorage || !hydrated) return;
1080
1082
  const data = Object.fromEntries(persistedKeys.map((k) => [k, state[k]]));
1081
- const text = JSON.stringify(storageIsAsync ? { $version: persistVersion, $saved: Date.now(), state: data } : { $version: persistVersion, state: data });
1083
+ let text;
1084
+ try {
1085
+ text = JSON.stringify(storageIsAsync ? { $version: persistVersion, $saved: Date.now(), state: data } : { $version: persistVersion, state: data });
1086
+ } catch (error) {
1087
+ if (!warnedUnsavable) {
1088
+ warnedUnsavable = true;
1089
+ const bad = persistedKeys.find((k) => {
1090
+ try {
1091
+ JSON.stringify(state[k]);
1092
+ return false;
1093
+ } catch {
1094
+ return true;
1095
+ }
1096
+ });
1097
+ console.warn(
1098
+ `[${name}] couldn't save${bad ? ` "${bad}"` : ""}: ${error.message}. Saved state is JSON, so keep persisted keys to strings, numbers, booleans, null, arrays and plain objects, or leave this key out of saving with persist: { exclude: [...] }. Nothing is saved until it is fixed.`
1099
+ );
1100
+ }
1101
+ return;
1102
+ }
1082
1103
  lastSavedText = text;
1083
1104
  quietly(() => {
1084
1105
  const written = persistStorage.setItem(persistKey, text);
@@ -1183,9 +1204,12 @@ function build(initialState, options, sharedDefinition) {
1183
1204
  }
1184
1205
  if (rescued != null && isSavedState(rescued) && savedAt(rescued) > savedAt(stored)) text = rescued;
1185
1206
  const values = trusted(pick(readSaved(text)), "storage");
1207
+ for (const k of earlyWrites) delete values[k];
1208
+ const keptEarly = earlyWrites.size > 0;
1209
+ earlyWrites.clear();
1186
1210
  hydrated = true;
1187
1211
  if (!destroyed) apply(values, "storage", "loaded from storage", false);
1188
- if (!destroyed && text === rescued && rescued != null) saveNow();
1212
+ if (!destroyed && (keptEarly || text === rescued && rescued != null)) saveNow();
1189
1213
  finishHydration();
1190
1214
  },
1191
1215
  (error) => {
@@ -1383,6 +1407,7 @@ function build(initialState, options, sharedDefinition) {
1383
1407
  (k) => isStateKey(k) && !Object.is(state[k], values[k])
1384
1408
  );
1385
1409
  if (keys.length === 0) return;
1410
+ if (!hydrated && source === "local") for (const k of keys) earlyWrites.add(k);
1386
1411
  const prev = {};
1387
1412
  for (const k of keys) {
1388
1413
  prev[k] = state[k];
@@ -2119,11 +2144,15 @@ function build(initialState, options, sharedDefinition) {
2119
2144
  }
2120
2145
  const k = cacheKey(q, params);
2121
2146
  const prev = cache2.get(k)?.data;
2147
+ outdateRequest(k);
2122
2148
  setEntry(k, {
2123
2149
  data: typeof updater === "function" ? updater(prev) : updater,
2124
2150
  status: "success"
2125
2151
  });
2126
2152
  }
2153
+ function outdateRequest(k) {
2154
+ if (inflight.has(k)) versions.set(k, (versions.get(k) ?? 0) + 1);
2155
+ }
2127
2156
  function abort(q) {
2128
2157
  if (isQuery(q)) inlineAborts.get(q)?.abort();
2129
2158
  for (const [k, c] of [...namedAborts])
@@ -2657,6 +2686,7 @@ function build(initialState, options, sharedDefinition) {
2657
2686
  setter = (value, serverCall) => {
2658
2687
  const prev = cache2.get(k)?.data;
2659
2688
  const next = typeof value === "function" ? value(prev) : value;
2689
+ outdateRequest(k);
2660
2690
  setEntry(k, { data: next, status: "success" });
2661
2691
  if (!serverCall) return Promise.resolve();
2662
2692
  const done = Promise.resolve().then(serverCall).then(