tiny-utm-keeper
Version:
Zero-dependency, TypeScript-first UTM parameter tracker for first-touch/last-touch attribution. SSR-friendly.
95 lines (94 loc) • 2.26 kB
JavaScript
/**
* Check if we're in a browser environment
*/
export const isBrowser = () => {
return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
};
/**
* Safely get item from localStorage
*/
export const getStorageItem = (key) => {
if (!isBrowser()) {
return null;
}
try {
return window.localStorage.getItem(key);
}
catch (error) {
console.warn('[tiny-utm-keeper] Failed to read from localStorage:', error);
return null;
}
};
/**
* Safely set item in localStorage
*/
export const setStorageItem = (key, value) => {
if (!isBrowser()) {
return false;
}
try {
window.localStorage.setItem(key, value);
return true;
}
catch (error) {
console.warn('[tiny-utm-keeper] Failed to write to localStorage:', error);
return false;
}
};
/**
* Safely remove item from localStorage
*/
export const removeStorageItem = (key) => {
if (!isBrowser()) {
return false;
}
try {
window.localStorage.removeItem(key);
return true;
}
catch (error) {
console.warn('[tiny-utm-keeper] Failed to remove from localStorage:', error);
return false;
}
};
/**
* Get stored UTM data
*/
export const getStoredUTMData = (storageKey) => {
const data = getStorageItem(storageKey);
if (!data) {
return null;
}
try {
const parsed = JSON.parse(data);
// Check if expired
if (parsed.expiresAt && Date.now() > parsed.expiresAt) {
removeStorageItem(storageKey);
return null;
}
return parsed;
}
catch (error) {
console.warn('[tiny-utm-keeper] Failed to parse stored UTM data:', error);
return null;
}
};
/**
* Save UTM data to storage
*/
export const saveUTMData = (storageKey, params, expirationDays) => {
const now = Date.now();
const expiresAt = now + expirationDays * 24 * 60 * 60 * 1000;
const data = {
params,
timestamp: now,
expiresAt,
};
return setStorageItem(storageKey, JSON.stringify(data));
};
/**
* Clear stored UTM data
*/
export const clearUTMData = (storageKey) => {
return removeStorageItem(storageKey);
};