simplify-storage
Version:
A library for working with different types of storage (localStorage, sessionStorage, cookieStorage)
190 lines (165 loc) • 4.74 kB
text/typescript
class CookieStorage {
get length(): number {
return document.cookie ? document.cookie.split("; ").length : 0;
}
setItem(key: string, value: string): void {
document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(
value
)}; path=/`;
}
getItem(key: string): string | null {
const matches = document.cookie.match(
new RegExp(
`(?:^|; )${encodeURIComponent(key).replace(
/([.$?*|{}()[\]\\\/+^])/g,
"\\$1"
)}=([^;]*)`
)
);
return matches ? decodeURIComponent(matches[1]) : null;
}
removeItem(key: string): void {
document.cookie = `${encodeURIComponent(key)}=; max-age=-1; path=/`;
}
clear(): void {
const items = this.getAllItems();
items.forEach((item) => this.removeItem(item.key));
}
key(index: number): string | null {
const items = this.getAllItems();
return items.length > index ? items[index].key : null;
}
getAllItems(): { key: string; value: string }[] {
return document.cookie.split("; ").map((cookie) => {
const [key, value] = cookie.split("=");
return { key: decodeURIComponent(key), value: decodeURIComponent(value) };
});
}
hasItem(key: string): boolean {
return this.getItem(key) !== null;
}
}
function setStorageByType(type: string) {
switch (type.toLowerCase()) {
case "l":
case "local":
return localStorage;
case "s":
case "session":
return sessionStorage;
case "c":
case "cookie":
return new CookieStorage();
default:
throw new Error("Incorrect type of storage (session, local, cookie)");
}
}
function setInStorage(key: string, data: any, type: string = "local"): void {
if (!key) {
throw new Error("Not acceptable value of key in storage");
}
if (data == null) {
console.warn("Data is null or undefined, it may be dangerous");
}
const storage = setStorageByType(type);
const dataType = Array.isArray(data) ? "array" : typeof data;
switch (dataType) {
case "object":
case "array":
storage.setItem(key, `${dataType}_prfx_${JSON.stringify(data)}`);
break;
default:
storage.setItem(key, `${dataType}_prfx_${String(data)}`);
break;
}
}
function changeStringStorageDataType(type: string, dataString: string) {
let data: any;
try {
switch (type.toLowerCase()) {
case "array":
data = JSON.parse(dataString);
if (!Array.isArray(data)) {
throw new Error("Parsed data is not an array");
}
break;
case "object":
data = JSON.parse(dataString);
if (typeof data !== "object" || data === null || Array.isArray(data)) {
throw new Error("Parsed data is not an object");
}
break;
case "number":
data = Number(dataString);
if (isNaN(data)) {
throw new Error("Data is not a valid number");
}
break;
case "string":
data = dataString;
break;
case "boolean":
data = dataString.toLowerCase() === "true";
break;
default:
throw new Error("Unsupported type");
}
} catch (error) {
console.error("Error parsing data: ", error);
return null; // Return null on error
}
return data;
}
function getFromStorage(key: string, type: string): any {
if (!key) {
throw new Error("Impossible key");
}
const storage = setStorageByType(type);
const dataStorage: string | null = storage.getItem(key);
if (!dataStorage) {
return null;
}
const [dataType, dataString] = dataStorage.split("_prfx_");
return changeStringStorageDataType(dataType, dataString);
}
function removeFromStorage(key: string, type: string = "local"): void {
if (!key) {
throw new Error("Impossible key");
}
const storage = setStorageByType(type);
storage.removeItem(key);
}
function clearStorage(type: string = "local"): void {
const storage = setStorageByType(type);
storage.clear();
}
function getAllStorageItems(
type: string = "local"
): { key: string; value: any }[] {
const storage = setStorageByType(type);
const items: { key: string; value: any }[] = [];
for (let i = 0; i < storage.length; i++) {
const key = storage.key(i);
if (key) {
const value = getFromStorage(key, type);
items.push({ key, value });
}
}
return items;
}
function hasItemInStorage(key: string, type: string = "local"): boolean {
if (!key) {
throw new Error("Impossible key");
}
const storage = setStorageByType(type);
return storage.getItem(key) !== null;
}
export {
setInStorage,
getFromStorage,
removeFromStorage,
clearStorage,
getAllStorageItems,
hasItemInStorage,
CookieStorage,
};