@jakobcooldown/react-csr-sdk
Version:
Mockery SDK for dynamic bundle loading in web applications
84 lines (83 loc) • 2.47 kB
JavaScript
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);
};
}