UNPKG

@fluid-app/storage-manager

Version:

Storage management utilities for Fluid Commerce applications

230 lines (223 loc) 6.8 kB
'use strict'; 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