@pyreon/storage 0.6.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/LICENSE +21 -0
- package/lib/analysis/index.js.html +5406 -0
- package/lib/index.js +552 -0
- package/lib/index.js.map +1 -0
- package/lib/types/index.d.ts +540 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index2.d.ts +220 -0
- package/lib/types/index2.d.ts.map +1 -0
- package/package.json +50 -0
- package/src/clear.ts +72 -0
- package/src/cookie.ts +165 -0
- package/src/custom.ts +128 -0
- package/src/index.ts +51 -0
- package/src/indexed-db.ts +205 -0
- package/src/local.ts +143 -0
- package/src/registry.ts +66 -0
- package/src/session.ts +58 -0
- package/src/tests/clear.test.ts +104 -0
- package/src/tests/cookie.test.ts +149 -0
- package/src/tests/custom.test.ts +207 -0
- package/src/tests/indexed-db.test.ts +74 -0
- package/src/tests/local.test.ts +215 -0
- package/src/tests/session.test.ts +67 -0
- package/src/types.ts +86 -0
- package/src/utils.ts +66 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { signal } from "@pyreon/reactivity";
|
|
2
|
+
|
|
3
|
+
//#region src/registry.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Build a composite key from backend type + storage key to avoid
|
|
7
|
+
* collisions between different backends using the same key name.
|
|
8
|
+
*/
|
|
9
|
+
function registryKey(backend, key) {
|
|
10
|
+
return `${backend}:${key}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get an existing signal from the registry.
|
|
14
|
+
*/
|
|
15
|
+
function getEntry(backend, key) {
|
|
16
|
+
return registry.get(registryKey(backend, key));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register a new signal in the registry.
|
|
20
|
+
*/
|
|
21
|
+
function setEntry(backend, key, signal, defaultValue) {
|
|
22
|
+
registry.set(registryKey(backend, key), {
|
|
23
|
+
signal,
|
|
24
|
+
defaultValue,
|
|
25
|
+
backend
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Remove an entry from the registry.
|
|
30
|
+
*/
|
|
31
|
+
function removeEntry(backend, key) {
|
|
32
|
+
registry.delete(registryKey(backend, key));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get all entries for a specific backend.
|
|
36
|
+
*/
|
|
37
|
+
function getEntriesByBackend(backend) {
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const entry of registry.values()) if (entry.backend === backend) entries.push(entry);
|
|
40
|
+
return entries;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Clear all entries from the registry. Used for testing.
|
|
44
|
+
*/
|
|
45
|
+
function _resetRegistry() {
|
|
46
|
+
registry.clear();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/utils.ts
|
|
51
|
+
/**
|
|
52
|
+
* Check if we're running in a browser environment.
|
|
53
|
+
*/
|
|
54
|
+
function isBrowser() {
|
|
55
|
+
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Serialize a value to a string for storage.
|
|
59
|
+
*/
|
|
60
|
+
function serialize(value, serializer) {
|
|
61
|
+
if (serializer) return serializer(value);
|
|
62
|
+
return JSON.stringify(value);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Deserialize a raw string from storage back to a typed value.
|
|
66
|
+
* Returns the default value if deserialization fails.
|
|
67
|
+
*/
|
|
68
|
+
function deserialize(raw, defaultValue, deserializer, onError) {
|
|
69
|
+
try {
|
|
70
|
+
if (deserializer) return deserializer(raw);
|
|
71
|
+
return JSON.parse(raw);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
if (onError) {
|
|
74
|
+
const result = onError(e);
|
|
75
|
+
return result !== void 0 ? result : defaultValue;
|
|
76
|
+
}
|
|
77
|
+
return defaultValue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Safely get a Web Storage instance (localStorage or sessionStorage).
|
|
82
|
+
* Returns null if not available (SSR, security restrictions, etc.).
|
|
83
|
+
*/
|
|
84
|
+
function getWebStorage(type) {
|
|
85
|
+
if (!isBrowser()) return null;
|
|
86
|
+
try {
|
|
87
|
+
const storage = type === "local" ? window.localStorage : window.sessionStorage;
|
|
88
|
+
const testKey = "__pyreon_storage_test__";
|
|
89
|
+
storage.setItem(testKey, "1");
|
|
90
|
+
storage.removeItem(testKey);
|
|
91
|
+
return storage;
|
|
92
|
+
} catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/cookie.ts
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Set the cookie source string for SSR. Call this once per request
|
|
102
|
+
* with the raw Cookie header value.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* // In your SSR request handler
|
|
107
|
+
* setCookieSource(request.headers.get('cookie') ?? '')
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
function setCookieSource(cookieHeader) {
|
|
111
|
+
serverCookieString = cookieHeader;
|
|
112
|
+
}
|
|
113
|
+
function parseCookies(cookieString) {
|
|
114
|
+
const cookies = /* @__PURE__ */new Map();
|
|
115
|
+
if (!cookieString) return cookies;
|
|
116
|
+
for (const pair of cookieString.split(";")) {
|
|
117
|
+
const eqIndex = pair.indexOf("=");
|
|
118
|
+
if (eqIndex === -1) continue;
|
|
119
|
+
const name = pair.slice(0, eqIndex).trim();
|
|
120
|
+
const value = pair.slice(eqIndex + 1).trim();
|
|
121
|
+
if (name) cookies.set(name, decodeURIComponent(value));
|
|
122
|
+
}
|
|
123
|
+
return cookies;
|
|
124
|
+
}
|
|
125
|
+
function getCookieString() {
|
|
126
|
+
if (isBrowser()) return document.cookie;
|
|
127
|
+
return serverCookieString;
|
|
128
|
+
}
|
|
129
|
+
function readCookie(key) {
|
|
130
|
+
return parseCookies(getCookieString()).get(key) ?? null;
|
|
131
|
+
}
|
|
132
|
+
function writeCookie(key, value, options) {
|
|
133
|
+
if (!isBrowser()) return;
|
|
134
|
+
const serialized = serialize(value, options.serializer);
|
|
135
|
+
let cookie = `${encodeURIComponent(key)}=${encodeURIComponent(serialized)}`;
|
|
136
|
+
if (options.maxAge !== void 0) cookie += `; max-age=${options.maxAge}`;
|
|
137
|
+
if (options.expires) cookie += `; expires=${options.expires.toUTCString()}`;
|
|
138
|
+
cookie += `; path=${options.path ?? "/"}`;
|
|
139
|
+
if (options.domain) cookie += `; domain=${options.domain}`;
|
|
140
|
+
if (options.secure) cookie += "; secure";
|
|
141
|
+
cookie += `; samesite=${options.sameSite ?? "lax"}`;
|
|
142
|
+
document.cookie = cookie;
|
|
143
|
+
}
|
|
144
|
+
function deleteCookie(key, options) {
|
|
145
|
+
if (!isBrowser()) return;
|
|
146
|
+
let cookie = `${encodeURIComponent(key)}=; max-age=0`;
|
|
147
|
+
cookie += `; path=${options.path ?? "/"}`;
|
|
148
|
+
if (options.domain) cookie += `; domain=${options.domain}`;
|
|
149
|
+
document.cookie = cookie;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Reactive signal backed by a browser cookie. SSR-compatible when
|
|
153
|
+
* used with setCookieSource().
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* const locale = useCookie('locale', 'en', {
|
|
158
|
+
* maxAge: 60 * 60 * 24 * 365, // 1 year
|
|
159
|
+
* path: '/',
|
|
160
|
+
* sameSite: 'lax',
|
|
161
|
+
* })
|
|
162
|
+
* locale() // 'en'
|
|
163
|
+
* locale.set('de') // sets cookie + updates signal
|
|
164
|
+
* locale.remove() // deletes cookie, resets to default
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
function useCookie(key, defaultValue, options = {}) {
|
|
168
|
+
const existing = getEntry("cookie", key);
|
|
169
|
+
if (existing) return existing.signal;
|
|
170
|
+
const raw = readCookie(key);
|
|
171
|
+
const sig = signal(raw !== null ? deserialize(raw, defaultValue, options.deserializer, options.onError) : defaultValue);
|
|
172
|
+
const storageSig = () => sig();
|
|
173
|
+
storageSig.peek = () => sig.peek();
|
|
174
|
+
storageSig.subscribe = listener => sig.subscribe(listener);
|
|
175
|
+
storageSig.direct = updater => sig.direct(updater);
|
|
176
|
+
storageSig.debug = () => sig.debug();
|
|
177
|
+
Object.defineProperty(storageSig, "label", {
|
|
178
|
+
get: () => sig.label,
|
|
179
|
+
set: v => {
|
|
180
|
+
sig.label = v;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
storageSig.set = value => {
|
|
184
|
+
sig.set(value);
|
|
185
|
+
writeCookie(key, value, options);
|
|
186
|
+
};
|
|
187
|
+
storageSig.update = fn => {
|
|
188
|
+
const newValue = fn(sig.peek());
|
|
189
|
+
storageSig.set(newValue);
|
|
190
|
+
};
|
|
191
|
+
storageSig.remove = () => {
|
|
192
|
+
sig.set(defaultValue);
|
|
193
|
+
deleteCookie(key, options);
|
|
194
|
+
removeEntry("cookie", key);
|
|
195
|
+
};
|
|
196
|
+
setEntry("cookie", key, storageSig, defaultValue);
|
|
197
|
+
return storageSig;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region src/custom.ts
|
|
202
|
+
/**
|
|
203
|
+
* Create a custom storage hook backed by any synchronous storage backend.
|
|
204
|
+
* Useful for encrypted storage, in-memory storage, or custom adapters.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* ```ts
|
|
208
|
+
* const useEncrypted = createStorage({
|
|
209
|
+
* get: (key) => decrypt(localStorage.getItem(key)),
|
|
210
|
+
* set: (key, value) => localStorage.setItem(key, encrypt(value)),
|
|
211
|
+
* remove: (key) => localStorage.removeItem(key),
|
|
212
|
+
* })
|
|
213
|
+
*
|
|
214
|
+
* const secret = useEncrypted('api-key', '')
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
function createStorage(backend, backendName) {
|
|
218
|
+
const name = backendName ?? "custom";
|
|
219
|
+
return function useCustomStorage(key, defaultValue, options) {
|
|
220
|
+
const existing = getEntry(name, key);
|
|
221
|
+
if (existing) return existing.signal;
|
|
222
|
+
let initialValue = defaultValue;
|
|
223
|
+
try {
|
|
224
|
+
const raw = backend.get(key);
|
|
225
|
+
if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
|
|
226
|
+
} catch {}
|
|
227
|
+
const sig = signal(initialValue);
|
|
228
|
+
const storageSig = () => sig();
|
|
229
|
+
storageSig.peek = () => sig.peek();
|
|
230
|
+
storageSig.subscribe = listener => sig.subscribe(listener);
|
|
231
|
+
storageSig.direct = updater => sig.direct(updater);
|
|
232
|
+
storageSig.debug = () => sig.debug();
|
|
233
|
+
Object.defineProperty(storageSig, "label", {
|
|
234
|
+
get: () => sig.label,
|
|
235
|
+
set: v => {
|
|
236
|
+
sig.label = v;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
storageSig.set = value => {
|
|
240
|
+
sig.set(value);
|
|
241
|
+
try {
|
|
242
|
+
backend.set(key, serialize(value, options?.serializer));
|
|
243
|
+
} catch {}
|
|
244
|
+
};
|
|
245
|
+
storageSig.update = fn => {
|
|
246
|
+
const newValue = fn(sig.peek());
|
|
247
|
+
storageSig.set(newValue);
|
|
248
|
+
};
|
|
249
|
+
storageSig.remove = () => {
|
|
250
|
+
sig.set(defaultValue);
|
|
251
|
+
try {
|
|
252
|
+
backend.remove(key);
|
|
253
|
+
} catch {}
|
|
254
|
+
removeEntry(name, key);
|
|
255
|
+
};
|
|
256
|
+
setEntry(name, key, storageSig, defaultValue);
|
|
257
|
+
return storageSig;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* In-memory storage backend. Useful for SSR, testing, or ephemeral state.
|
|
262
|
+
* Values are lost on page unload.
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```ts
|
|
266
|
+
* import { useMemoryStorage } from '@pyreon/storage'
|
|
267
|
+
*
|
|
268
|
+
* const temp = useMemoryStorage('key', 'default')
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
271
|
+
|
|
272
|
+
function openDB(dbName, storeName) {
|
|
273
|
+
const cacheKey = `${dbName}:${storeName}`;
|
|
274
|
+
const cached = dbCache.get(cacheKey);
|
|
275
|
+
if (cached) return cached;
|
|
276
|
+
const promise = new Promise((resolve, reject) => {
|
|
277
|
+
const request = indexedDB.open(dbName, 1);
|
|
278
|
+
request.onupgradeneeded = () => {
|
|
279
|
+
const db = request.result;
|
|
280
|
+
if (!db.objectStoreNames.contains(storeName)) db.createObjectStore(storeName);
|
|
281
|
+
};
|
|
282
|
+
request.onsuccess = () => resolve(request.result);
|
|
283
|
+
request.onerror = () => reject(request.error);
|
|
284
|
+
});
|
|
285
|
+
dbCache.set(cacheKey, promise);
|
|
286
|
+
return promise;
|
|
287
|
+
}
|
|
288
|
+
function idbGet(db, storeName, key) {
|
|
289
|
+
return new Promise((resolve, reject) => {
|
|
290
|
+
const request = db.transaction(storeName, "readonly").objectStore(storeName).get(key);
|
|
291
|
+
request.onsuccess = () => resolve(request.result !== void 0 ? request.result : null);
|
|
292
|
+
request.onerror = () => reject(request.error);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
function idbSet(db, storeName, key, value) {
|
|
296
|
+
return new Promise((resolve, reject) => {
|
|
297
|
+
const request = db.transaction(storeName, "readwrite").objectStore(storeName).put(value, key);
|
|
298
|
+
request.onsuccess = () => resolve();
|
|
299
|
+
request.onerror = () => reject(request.error);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function idbDelete(db, storeName, key) {
|
|
303
|
+
return new Promise((resolve, reject) => {
|
|
304
|
+
const request = db.transaction(storeName, "readwrite").objectStore(storeName).delete(key);
|
|
305
|
+
request.onsuccess = () => resolve();
|
|
306
|
+
request.onerror = () => reject(request.error);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Reactive signal backed by IndexedDB. Suitable for large or structured
|
|
311
|
+
* data that exceeds localStorage limits. Writes are debounced.
|
|
312
|
+
*
|
|
313
|
+
* The signal starts with `defaultValue` and updates asynchronously
|
|
314
|
+
* when the stored value is read from IndexedDB.
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```ts
|
|
318
|
+
* const draft = useIndexedDB('article-draft', { title: '', body: '' })
|
|
319
|
+
* draft() // { title: '', body: '' } initially, then stored value
|
|
320
|
+
* draft.set({ title: 'My Post', body: '...' }) // signal updates immediately, IDB write is debounced
|
|
321
|
+
* ```
|
|
322
|
+
*/
|
|
323
|
+
function useIndexedDB(key, defaultValue, options = {}) {
|
|
324
|
+
const existing = getEntry("indexeddb", key);
|
|
325
|
+
if (existing) return existing.signal;
|
|
326
|
+
const dbName = options.dbName ?? "pyreon-storage";
|
|
327
|
+
const storeName = options.storeName ?? "kv";
|
|
328
|
+
const debounceMs = options.debounceMs ?? 100;
|
|
329
|
+
const sig = signal(defaultValue);
|
|
330
|
+
if (isBrowser() && typeof indexedDB !== "undefined") openDB(dbName, storeName).then(db => idbGet(db, storeName, key)).then(raw => {
|
|
331
|
+
if (raw !== null) {
|
|
332
|
+
const value = deserialize(raw, defaultValue, options.deserializer, options.onError);
|
|
333
|
+
sig.set(value);
|
|
334
|
+
}
|
|
335
|
+
}).catch(() => {});
|
|
336
|
+
let writeTimer = null;
|
|
337
|
+
let pendingValue;
|
|
338
|
+
function flushWrite() {
|
|
339
|
+
if (pendingValue === void 0) return;
|
|
340
|
+
const value = pendingValue;
|
|
341
|
+
pendingValue = void 0;
|
|
342
|
+
if (!isBrowser() || typeof indexedDB === "undefined") return;
|
|
343
|
+
openDB(dbName, storeName).then(db => idbSet(db, storeName, key, serialize(value, options.serializer))).catch(() => {});
|
|
344
|
+
}
|
|
345
|
+
function scheduleWrite(value) {
|
|
346
|
+
pendingValue = value;
|
|
347
|
+
if (writeTimer !== null) clearTimeout(writeTimer);
|
|
348
|
+
writeTimer = setTimeout(flushWrite, debounceMs);
|
|
349
|
+
}
|
|
350
|
+
const storageSig = () => sig();
|
|
351
|
+
storageSig.peek = () => sig.peek();
|
|
352
|
+
storageSig.subscribe = listener => sig.subscribe(listener);
|
|
353
|
+
storageSig.direct = updater => sig.direct(updater);
|
|
354
|
+
storageSig.debug = () => sig.debug();
|
|
355
|
+
Object.defineProperty(storageSig, "label", {
|
|
356
|
+
get: () => sig.label,
|
|
357
|
+
set: v => {
|
|
358
|
+
sig.label = v;
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
storageSig.set = value => {
|
|
362
|
+
sig.set(value);
|
|
363
|
+
scheduleWrite(value);
|
|
364
|
+
};
|
|
365
|
+
storageSig.update = fn => {
|
|
366
|
+
const newValue = fn(sig.peek());
|
|
367
|
+
storageSig.set(newValue);
|
|
368
|
+
};
|
|
369
|
+
storageSig.remove = () => {
|
|
370
|
+
sig.set(defaultValue);
|
|
371
|
+
pendingValue = void 0;
|
|
372
|
+
if (writeTimer !== null) clearTimeout(writeTimer);
|
|
373
|
+
if (isBrowser() && typeof indexedDB !== "undefined") openDB(dbName, storeName).then(db => idbDelete(db, storeName, key)).catch(() => {});
|
|
374
|
+
removeEntry("indexeddb", key);
|
|
375
|
+
};
|
|
376
|
+
setEntry("indexeddb", key, storageSig, defaultValue);
|
|
377
|
+
return storageSig;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Reset the database cache. For testing only.
|
|
381
|
+
*/
|
|
382
|
+
function _resetDBCache() {
|
|
383
|
+
dbCache.clear();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
//#endregion
|
|
387
|
+
//#region src/local.ts
|
|
388
|
+
|
|
389
|
+
function attachStorageListener() {
|
|
390
|
+
if (listenerAttached || !isBrowser()) return;
|
|
391
|
+
listenerAttached = true;
|
|
392
|
+
window.addEventListener("storage", e => {
|
|
393
|
+
if (!e.key) return;
|
|
394
|
+
const entry = getEntry("local", e.key);
|
|
395
|
+
if (!entry) return;
|
|
396
|
+
const newValue = e.newValue !== null ? deserialize(e.newValue, entry.defaultValue) : entry.defaultValue;
|
|
397
|
+
entry.signal.set(newValue);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Reactive signal backed by localStorage. Automatically syncs across
|
|
402
|
+
* browser tabs via the native `storage` event.
|
|
403
|
+
*
|
|
404
|
+
* @example
|
|
405
|
+
* ```ts
|
|
406
|
+
* const theme = useStorage('theme', 'light')
|
|
407
|
+
* theme() // 'light' (or stored value)
|
|
408
|
+
* theme.set('dark') // updates signal + localStorage
|
|
409
|
+
* theme.remove() // clears storage, resets to default
|
|
410
|
+
* ```
|
|
411
|
+
*/
|
|
412
|
+
function useStorage(key, defaultValue, options) {
|
|
413
|
+
const existing = getEntry("local", key);
|
|
414
|
+
if (existing) return existing.signal;
|
|
415
|
+
const storage = getWebStorage("local");
|
|
416
|
+
let initialValue = defaultValue;
|
|
417
|
+
if (storage) {
|
|
418
|
+
const raw = storage.getItem(key);
|
|
419
|
+
if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
|
|
420
|
+
}
|
|
421
|
+
const storageSig = createStorageSignal(signal(initialValue), key, defaultValue, "local", options);
|
|
422
|
+
setEntry("local", key, storageSig, defaultValue);
|
|
423
|
+
attachStorageListener();
|
|
424
|
+
return storageSig;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Wraps a base signal with storage persistence behavior.
|
|
428
|
+
* Used by both useStorage and useSessionStorage.
|
|
429
|
+
*/
|
|
430
|
+
function createStorageSignal(sig, key, defaultValue, backend, options) {
|
|
431
|
+
const storage = getWebStorage(backend);
|
|
432
|
+
const storageSig = () => sig();
|
|
433
|
+
storageSig.peek = () => sig.peek();
|
|
434
|
+
storageSig.subscribe = listener => sig.subscribe(listener);
|
|
435
|
+
storageSig.direct = updater => sig.direct(updater);
|
|
436
|
+
storageSig.debug = () => sig.debug();
|
|
437
|
+
Object.defineProperty(storageSig, "label", {
|
|
438
|
+
get: () => sig.label,
|
|
439
|
+
set: v => {
|
|
440
|
+
sig.label = v;
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
storageSig.set = value => {
|
|
444
|
+
sig.set(value);
|
|
445
|
+
if (storage) try {
|
|
446
|
+
storage.setItem(key, serialize(value, options?.serializer));
|
|
447
|
+
} catch {}
|
|
448
|
+
};
|
|
449
|
+
storageSig.update = fn => {
|
|
450
|
+
const newValue = fn(sig.peek());
|
|
451
|
+
storageSig.set(newValue);
|
|
452
|
+
};
|
|
453
|
+
storageSig.remove = () => {
|
|
454
|
+
sig.set(defaultValue);
|
|
455
|
+
if (storage) storage.removeItem(key);
|
|
456
|
+
removeEntry(backend, key);
|
|
457
|
+
};
|
|
458
|
+
return storageSig;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
//#endregion
|
|
462
|
+
//#region src/session.ts
|
|
463
|
+
/**
|
|
464
|
+
* Reactive signal backed by sessionStorage. Scoped to the current
|
|
465
|
+
* browser tab — does not sync across tabs.
|
|
466
|
+
*
|
|
467
|
+
* @example
|
|
468
|
+
* ```ts
|
|
469
|
+
* const step = useSessionStorage('wizard-step', 0)
|
|
470
|
+
* step() // 0 (or stored value)
|
|
471
|
+
* step.set(3) // updates signal + sessionStorage
|
|
472
|
+
* step.remove() // clears storage, resets to default
|
|
473
|
+
* ```
|
|
474
|
+
*/
|
|
475
|
+
function useSessionStorage(key, defaultValue, options) {
|
|
476
|
+
const existing = getEntry("session", key);
|
|
477
|
+
if (existing) return existing.signal;
|
|
478
|
+
const storage = getWebStorage("session");
|
|
479
|
+
let initialValue = defaultValue;
|
|
480
|
+
if (storage) {
|
|
481
|
+
const raw = storage.getItem(key);
|
|
482
|
+
if (raw !== null) initialValue = deserialize(raw, defaultValue, options?.deserializer, options?.onError);
|
|
483
|
+
}
|
|
484
|
+
const storageSig = createStorageSignal(signal(initialValue), key, defaultValue, "session", options);
|
|
485
|
+
setEntry("session", key, storageSig, defaultValue);
|
|
486
|
+
return storageSig;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region src/clear.ts
|
|
491
|
+
/**
|
|
492
|
+
* Remove a specific key from storage and reset its signal to the default value.
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* ```ts
|
|
496
|
+
* removeStorage('theme') // from localStorage
|
|
497
|
+
* removeStorage('step', { type: 'session' }) // from sessionStorage
|
|
498
|
+
* removeStorage('locale', { type: 'cookie' }) // deletes cookie
|
|
499
|
+
* ```
|
|
500
|
+
*/
|
|
501
|
+
function removeStorage(key, options) {
|
|
502
|
+
const type = options?.type ?? "local";
|
|
503
|
+
const entry = getEntry(type, key);
|
|
504
|
+
if (entry) entry.signal.remove();else {
|
|
505
|
+
if (type === "local" || type === "session") {
|
|
506
|
+
const storage = getWebStorage(type);
|
|
507
|
+
if (storage) storage.removeItem(key);
|
|
508
|
+
} else if (type === "cookie" && isBrowser()) document.cookie = `${encodeURIComponent(key)}=; max-age=0; path=/`;
|
|
509
|
+
removeEntry(type, key);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Clear all managed storage entries for a specific backend, or all backends.
|
|
514
|
+
*
|
|
515
|
+
* @example
|
|
516
|
+
* ```ts
|
|
517
|
+
* clearStorage() // clear all localStorage entries managed by @pyreon/storage
|
|
518
|
+
* clearStorage('session') // clear all sessionStorage entries
|
|
519
|
+
* clearStorage('cookie') // clear all managed cookies
|
|
520
|
+
* clearStorage('all') // clear everything
|
|
521
|
+
* ```
|
|
522
|
+
*/
|
|
523
|
+
function clearStorage(type = "local") {
|
|
524
|
+
if (type === "all") {
|
|
525
|
+
clearBackend("local");
|
|
526
|
+
clearBackend("session");
|
|
527
|
+
clearBackend("cookie");
|
|
528
|
+
clearBackend("indexeddb");
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
clearBackend(type);
|
|
532
|
+
}
|
|
533
|
+
function clearBackend(type) {
|
|
534
|
+
const entries = getEntriesByBackend(type);
|
|
535
|
+
for (const entry of entries) entry.signal.remove();
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
//#endregion
|
|
539
|
+
export { _resetDBCache, _resetRegistry, clearStorage, createStorage, removeStorage, setCookieSource, useCookie, useIndexedDB, useMemoryStorage, useSessionStorage, useStorage };
|
|
540
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/registry.ts","../../src/utils.ts","../../src/cookie.ts","../../src/custom.ts","../../src/indexed-db.ts","../../src/local.ts","../../src/session.ts","../../src/clear.ts"],"mappings":"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"}
|