UNPKG

@jakobcooldown/react-csr-sdk

Version:

Mockery SDK for dynamic bundle loading in web applications

84 lines (83 loc) 2.47 kB
const BUNDLE_URL_KEY = 'mockery_bundle_url'; /** * Storage utilities for persisting bundle URLs */ export const storage = { setBundleUrl(bundleUrl, storageKey = BUNDLE_URL_KEY) { try { if (bundleUrl === undefined) { localStorage.removeItem(storageKey); } else { localStorage.setItem(storageKey, bundleUrl); } } catch (error) { console.warn('Failed to store bundle URL:', error); } }, getBundleUrl(storageKey = BUNDLE_URL_KEY) { try { return localStorage.getItem(storageKey) || undefined; } catch (error) { console.warn('Failed to retrieve bundle URL:', error); return undefined; } }, clear(storageKey = BUNDLE_URL_KEY) { try { localStorage.removeItem(storageKey); } catch (error) { console.warn('Failed to clear bundle storage:', error); } } }; /** * Loads a bundle by dynamically adding script tags */ export function loadBundle(bundleUrl, debug = false) { return new Promise((resolve, reject) => { if (debug) { console.log('Loading bundle:', bundleUrl); } // Remove existing Mockery bundle scripts const existingScripts = document.querySelectorAll('script[data-mockery-bundle]'); existingScripts.forEach(script => script.remove()); // Create new script element const script = document.createElement('script'); script.src = bundleUrl; script.setAttribute('data-mockery-bundle', 'true'); script.async = true; script.onload = () => { if (debug) { console.log('Bundle loaded successfully:', bundleUrl); } resolve(); }; script.onerror = (error) => { if (debug) { console.error('Bundle loading failed:', error); } reject(new Error(`Failed to load bundle: ${bundleUrl}`)); }; document.head.appendChild(script); }); } /** * Reloads the current page */ export function reloadPage() { window.location.reload(); } /** * Debounce function to prevent rapid successive calls */ export function debounce(func, wait) { let timeout; return (...args) => { clearTimeout(timeout); timeout = setTimeout(() => func(...args), wait); }; }