66 lines
1.3 KiB
TypeScript
66 lines
1.3 KiB
TypeScript
export type JsonStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
|
|
|
export function isRecord(value: unknown): value is Record<string, unknown> {
|
|
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
}
|
|
|
|
export function getJsonStorage(storage?: JsonStorage | null) {
|
|
if (storage !== undefined) {
|
|
return storage;
|
|
}
|
|
|
|
if (typeof window === 'undefined') {
|
|
return null;
|
|
}
|
|
|
|
return window.localStorage;
|
|
}
|
|
|
|
export function readStoredJson<T>({
|
|
key,
|
|
parse,
|
|
storage,
|
|
}: {
|
|
key: string;
|
|
parse: (value: unknown) => T | null;
|
|
storage?: JsonStorage | null;
|
|
}) {
|
|
const resolvedStorage = getJsonStorage(storage);
|
|
if (!resolvedStorage) {
|
|
return null;
|
|
}
|
|
|
|
const raw = resolvedStorage.getItem(key);
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
return parse(JSON.parse(raw));
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function writeStoredJson({
|
|
key,
|
|
value,
|
|
storage,
|
|
}: {
|
|
key: string;
|
|
value: unknown;
|
|
storage?: JsonStorage | null;
|
|
}) {
|
|
const resolvedStorage = getJsonStorage(storage);
|
|
if (!resolvedStorage) {
|
|
return false;
|
|
}
|
|
|
|
resolvedStorage.setItem(key, JSON.stringify(value));
|
|
return true;
|
|
}
|
|
|
|
export function removeStoredJson(key: string, storage?: JsonStorage | null) {
|
|
getJsonStorage(storage)?.removeItem(key);
|
|
}
|