@fluid-app/storage-manager
Version:
Storage management utilities for Fluid Commerce applications
230 lines (223 loc) • 6.8 kB
JavaScript
;
var psl = require('psl');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var psl__namespace = /*#__PURE__*/_interopNamespace(psl);
// src/StorageKeys.ts
var STORAGE_KEYS = {
CART: "fs_cart",
EVENT_QUEUE: "fs_event_queue",
SERVER_SETTINGS: "fs_server_settings",
SETTINGS_OVERRIDE: "fs_settings_override",
ATTRIBUTION_CACHE: "fs_attribution_cache",
AUTHENTICATED_USER: "fs_authenticated_user"
};
var COOKIE_KEYS = {
LOCALE: "fluid_locale",
COUNTRY: "fluid_country",
LANGUAGE: "fluid_language",
JOURNEY: "fluid_journey",
JOURNEY_SYNCED: "fluid_journey_synced",
AFFILIATE: "fluid_affiliate",
SESSION: "fluid_session",
AUTHENTICATED_JWT: "fluid_authenticated_jwt",
AUTHENTICATED_AT: "fluid_authenticated_at"
};
// src/utils/environment.ts
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
var getCookie = (name) => {
if (!isBrowser) return null;
try {
const cookies = document.cookie.split(";");
for (const cookieStr of cookies) {
const cookie = cookieStr.trim();
if (cookie.startsWith(name + "=")) {
return cookie.substring(name.length + 1);
}
}
return null;
} catch (error) {
console.error("Error reading cookie:", error);
return null;
}
};
var getLocalStorage = () => {
return {
/**
* Get an item from localStorage
* @param key The key to retrieve
* @returns The value or null if not found or an error occurred
*/
get: (key) => {
if (!isBrowser) return null;
try {
return localStorage.getItem(key);
} catch (error) {
console.error("Error accessing localStorage:", error);
return null;
}
},
/**
* Set an item in localStorage
* @param key The key to set
* @param value The value to store
*/
set: (key, value) => {
if (!isBrowser) return;
try {
localStorage.setItem(key, value);
} catch (error) {
console.error("Error writing to localStorage:", error);
}
},
/**
* Remove an item from localStorage
* @param key The key to remove
*/
remove: (key) => {
if (!isBrowser) return;
try {
localStorage.removeItem(key);
} catch (error) {
console.error("Error removing from localStorage:", error);
}
}
};
};
// src/StorageManager.ts
var StorageManager = class {
localStorage = getLocalStorage();
// Type guards for key type
isCookieKey(key) {
return Object.values(COOKIE_KEYS).includes(key);
}
isStorageKey(key) {
return Object.values(STORAGE_KEYS).includes(key);
}
/**
* Set an item in storage (localStorage or cookie)
*/
setItem(arg) {
if (this.isCookieKey(arg.key)) {
this.setCookieOnApexAndSubdomains(arg.key, arg.value, {
path: "/",
secure: typeof window !== "undefined" ? window.location.protocol === "https:" : false,
sameSite: "Lax"
});
} else if (this.isStorageKey(arg.key)) {
this.localStorage.set(arg.key, arg.value);
} else {
throw new Error("Invalid key type for setItem");
}
}
/**
* Get an item from storage (localStorage or cookie)
*/
getItem(arg) {
if (this.isCookieKey(arg.key)) {
if (typeof document === "undefined") return null;
const regex = new RegExp("(^| )" + arg.key + "=([^;]+)");
const match = regex.exec(document.cookie);
return match?.[2] ? decodeURIComponent(match[2]) : null;
} else if (this.isStorageKey(arg.key)) {
try {
return this.localStorage.get(arg.key);
} catch {
return null;
}
} else {
throw new Error("Invalid key type for getItem");
}
}
/**
* Remove an item from storage (localStorage or cookie)
*/
removeItem(arg) {
if (this.isCookieKey(arg.key)) {
if (typeof document === "undefined") return;
document.cookie = `${arg.key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
} else if (this.isStorageKey(arg.key)) {
try {
this.localStorage.remove(arg.key);
} catch {
}
} else {
throw new Error("Invalid key type for removeItem");
}
}
/**
* Set an object in storage (localStorage or cookie)
*/
setObject(arg) {
const stringified = JSON.stringify(arg.value);
if (this.isCookieKey(arg.key)) {
this.setCookieOnApexAndSubdomains(arg.key, stringified, {
path: "/",
secure: typeof window !== "undefined" ? window.location.protocol === "https:" : false,
sameSite: "Lax"
});
} else if (this.isStorageKey(arg.key)) {
this.localStorage.set(arg.key, stringified);
} else {
throw new Error("Invalid key type for setObject");
}
}
/**
* Get an object from storage (localStorage or cookie)
*/
getObject(arg) {
const value = this.getItem({ key: arg.key });
if (!value) return null;
try {
return JSON.parse(value);
} catch {
return null;
}
}
/**
* Utility to set a cookie on both the current domain and apex domain (if different)
* @param name Cookie name
* @param value Cookie value
* @param options Optional cookie options (expires, path, secure, sameSite)
*/
setCookieOnApexAndSubdomains(name, value, options = {}) {
if (typeof document === "undefined" || typeof window === "undefined")
return;
const hostname = window.location.hostname;
const parsed = psl__namespace.parse(hostname);
const apexDomain = typeof parsed === "object" && "domain" in parsed && typeof parsed.domain === "string" && parsed.domain ? parsed.domain : hostname;
const cookieParts = [
`${encodeURIComponent(name)}=${encodeURIComponent(value)}`,
`path=${options.path ?? "/"}`,
options.expires ? `expires=${options.expires.toUTCString()}` : "",
options.secure !== false ? "Secure" : "",
options.sameSite ? `SameSite=${options.sameSite}` : "SameSite=Lax"
].filter(Boolean);
document.cookie = cookieParts.join("; ");
if (apexDomain && apexDomain !== hostname) {
document.cookie = cookieParts.concat([`domain=.${apexDomain}`]).join("; ");
}
}
};
exports.COOKIE_KEYS = COOKIE_KEYS;
exports.STORAGE_KEYS = STORAGE_KEYS;
exports.StorageManager = StorageManager;
exports.getCookie = getCookie;
exports.isBrowser = isBrowser;
//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map