@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.
package/dist/esm/createStore.js
CHANGED
|
@@ -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
|
-
|
|
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(
|