import { ApplicationRef, enableProdMode } from '@angular/core'; import { bootstrapApplication } from '@angular/platform-browser'; import { environment } from './environments/environment'; import initWmProjectProperties from './app/wm-project-properties'; import { WMAppProperties } from './app/wmProperties'; import * as fontConfig from './font.config'; import { appConfig } from './app/app.config'; import { AppComponent } from '@wm/runtime/base'; // Format Accept-Language header const formatAcceptHeader = (languages: string[]): string => { const result: string[] = []; const addedLanguages = new Set(); // To track already added languages let qValue = 1.0; languages.forEach((lang: string) => { if (!addedLanguages.has(lang)) { // Add the full language (e.g., en-US or en) if not already added result.push(`${lang}${qValue === 1.0 ? '' : `;q=${qValue.toFixed(1)}`}`); addedLanguages.add(lang); // Decrease qValue for the next language qValue = Math.max(0.1, qValue - 0.1); // Decrease qValue, minimum is 0.1 } // If language has a region code (e.g., en-US), also add the base language (e.g., en) if (lang.includes('-')) { const baseLang = lang.split('-')[0]; if (!addedLanguages.has(baseLang)) { result.push(`${baseLang};q=${qValue.toFixed(1)}`); addedLanguages.add(baseLang); // Decrease qValue for the next language qValue = Math.max(0.1, qValue - 0.1); } } }); return result.join(','); }; // Initialize WMAppProperties WMAppProperties['preferredLanguage'] = formatAcceptHeader((navigator as any).languages); WMAppProperties['fontConfig'] = fontConfig; (window as any)._WM_APP_PROPERTIES = WMAppProperties; initWmProjectProperties(); if (environment.production) { enableProdMode(); } // MEMORY LEAK FIX: Store event listener references for cleanup (though these are one-time bootstrap events) const boundDOMContentLoadedHandler = () => { new Promise(resolve => { resolve(); }).then(() => bootstrapApplication(AppComponent, appConfig)) .then((appRef: ApplicationRef) => { // MEMORY LEAK FIX: Store unload handler reference const boundUnloadHandler = () => { appRef.components.map(c => c?.destroy()); // MEMORY LEAK FIX: Remove unload listener after cleanup (though unload is typically final) window.removeEventListener('unload', boundUnloadHandler); }; window.addEventListener('unload', boundUnloadHandler); }) .catch(err => console.error('Error bootstrapping app:', err)); // MEMORY LEAK FIX: Remove DOMContentLoaded listener after execution (one-time event) document.removeEventListener('DOMContentLoaded', boundDOMContentLoadedHandler); }; document.addEventListener('DOMContentLoaded', boundDOMContentLoadedHandler);