Skip to content

Instantly share code, notes, and snippets.

@Z3d0X
Last active June 2, 2021 09:44
Show Gist options
  • Save Z3d0X/6e4260662b65e83e8c162cfa5c36c449 to your computer and use it in GitHub Desktop.
Save Z3d0X/6e4260662b65e83e8c162cfa5c36c449 to your computer and use it in GitHub Desktop.
Easy Local/Session Storage for JSON (w/ lodash)
import { get as lget, set as lset, unset } from "lodash";
export default function appStore(
init = null,
driver = "session",
appkey = "app"
) {
//set(appkey,init)
if (init) {
let store = {};
lset(store, appkey, init);
store = JSON.stringify(store);
if (driver === "session") {
sessionStorage.setItem(appkey, store);
} else {
localStorage.setItem(appkey, store);
}
}
function parseJson(data) {
return data ? JSON.parse(data) : {};
}
function set(key, value = null) {
if (driver === "session") {
let store = sessionStorage.getItem(appkey);
store = parseJson(store);
store = JSON.stringify(
value ? lset(store, [appkey, key], value) : lset(store, appkey, key)
);
sessionStorage.setItem(appkey, store);
} else {
let store = localStorage.getItem(appkey);
store = parseJson(store);
store = JSON.stringify(
value ? lset(store, [appkey, key], value) : lset(store, appkey, key)
);
localStorage.setItem(appkey, store);
}
}
function get(key = null, defaultValue = null) {
if (driver === "session") {
let store = sessionStorage.getItem(appkey);
store = parseJson(store);
return key ? lget(store, [appkey, key], defaultValue) : store[appkey];
} else {
let store = localStorage.getItem(appkey);
store = parseJson(store);
return key ? lget(store, [appkey, key], defaultValue) : store[appkey];
}
}
function del(key) {
if (driver === "session") {
let store = sessionStorage.getItem(appkey);
store = parseJson(store);
unset(store, [appkey, key]);
sessionStorage.removeItem(appkey);
sessionStorage.setItem(appkey, JSON.stringify(store));
} else {
let store = localStorage.getItem(appkey);
store = parseJson(store);
unset(store, [appkey, key]);
localStorage.removeItem(appkey);
localStorage.setItem(appkey, JSON.stringify(store));
}
}
return {
set,
get,
del,
parseJson,
};
}
import store from "./store";
beforeEach(() => {
sessionStorage.clear();
localStorage.clear();
});
//session storage
test("Store value in session storage on init", () => {
let Appstore = new store({
foo: "bar",
});
expect(sessionStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Store value in session storage using set", () => {
let Appstore = new store();
Appstore.set({ foo: "bar" });
expect(sessionStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Store key-value in session storage using set", () => {
let Appstore = new store();
Appstore.set("foo", "bar");
expect(sessionStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Get value stored in session storage", () => {
let Appstore = new store({
foo: "bar",
});
expect(Appstore.get()).toMatchObject({ foo: "bar" });
});
test("Get key-value stored in session storage", () => {
let Appstore = new store({
foo: "bar",
});
expect(Appstore.get("foo")).toBe("bar");
});
test("Delete value stored from session storage", () => {
let Appstore = new store({
foo: "bar",
});
Appstore.del("foo");
expect(sessionStorage.getItem("app")).toBe(JSON.stringify({ app: {} }));
});
//local storage
test("Store value in local storage on init", () => {
let Appstore = new store(
{
foo: "bar",
},
"local"
);
expect(localStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Store value in session storage using set", () => {
let Appstore = new store({}, "local");
Appstore.set({ foo: "bar" });
expect(localStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Store key-value in local storage using set", () => {
let Appstore = new store({}, "local");
Appstore.set("foo", "bar");
expect(localStorage.getItem("app")).toBe(
JSON.stringify({ app: { foo: "bar" } })
);
});
test("Get value stored in session storage", () => {
let Appstore = new store(
{
foo: "bar",
},
"local"
);
expect(Appstore.get()).toMatchObject({ foo: "bar" });
});
test("Get key-value stored in local storage", () => {
let Appstore = new store(
{
foo: "bar",
},
"local"
);
expect(Appstore.get("foo")).toBe("bar");
});
test("Delete value stored from local storage", () => {
let Appstore = new store(
{
foo: "bar",
},
"local"
);
Appstore.del("foo");
expect(localStorage.getItem("app")).toBe(JSON.stringify({ app: {} }));
});
test("Json parse function with empty data return empty object", () => {
let Appstore = new store();
expect(Appstore.parseJson()).toMatchObject({});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment