import { lazy, type ComponentType, type LazyExoticComponent } from 'react'; export interface AdminPageEntry { file: string; exportName: string; devImport: () => Promise>; } function readPluginUrlFromGlobals(): string { const w = window; return ( w.llmagnetDashboardData?.pluginUrl || w.llmagnetPagesData?.pluginUrl || w.llmagnetBotAnalyticsData?.pluginUrl || w.llmagnetProductsData?.pluginUrl || w.llmagnetReportsData?.pluginUrl || w.llmagnetContentSettingsData?.pluginUrl || w.llmagnetSchemaData?.pluginUrl || w.llmagnetAgentReadyData?.pluginUrl || w.llmagnetUcpData?.pluginUrl || w.llmagnetConnectionsData?.pluginUrl || w.llmagnetMcpData?.pluginUrl || w.llmagnetSystemInfoData?.pluginUrl || '' ); } /** * Resolve the direct plugin URL base for lazy-loaded page bundles. * * Elementor Cloud serves enqueued scripts via index.php?dynamic_asset=… which * makes import.meta.url point at /wp-admin/ and breaks Vite relative imports. */ export function resolveAssetsBaseUrl(): string { const shell = window.llmagnetAdminShell; if (shell?.assetsBaseUrl) { return shell.assetsBaseUrl; } const script = document.getElementById('llmagnet-admin-shell-js') as HTMLScriptElement | null; if (script?.src) { const dynamic = script.src.match(/[?&]dynamic_asset=([^&]+)/); if (dynamic) { const asset_path = decodeURIComponent(dynamic[1]).replace(/^\/+/, ''); const js_marker = 'assets/react-build/js/'; const marker_at = asset_path.indexOf(js_marker); if (marker_at !== -1) { const prefix = asset_path.slice(0, marker_at + js_marker.length); try { return new URL(prefix, script.src).href; } catch { // fall through } } } const from_script = script.src.replace(/admin-shell\.js(?:\?.*)?$/, ''); if (from_script !== script.src) { return from_script; } } const plugin_url = readPluginUrlFromGlobals(); if (plugin_url) { return `${plugin_url.replace(/\/?$/, '/')}assets/react-build/js/`; } throw new Error('[LLMagnet] Missing assetsBaseUrl — cannot lazy-load admin page bundle.'); } function versionQuery(): string { const ver = window.llmagnetAdminShell?.version ?? ''; return ver ? `?ver=${encodeURIComponent(ver)}` : ''; } /** * Build the URL for a lazy-loaded admin page entry bundle. */ function adminPageModuleUrl(slug: string, entry: AdminPageEntry): string { if (import.meta.env.DEV) { return new URL(`./${entry.file}.js`, import.meta.url).href; } const shell = window.llmagnetAdminShell; const from_map = shell?.pageScripts?.[slug]; if (from_map) { return from_map; } return `${resolveAssetsBaseUrl()}${entry.file}.js${versionQuery()}`; } async function loadAdminPageModule( slug: string, entry: AdminPageEntry, ): Promise<{ default: ComponentType }> { if (import.meta.env.DEV) { const mod = await entry.devImport(); return { default: mod[entry.exportName] as ComponentType }; } const url = adminPageModuleUrl(slug, entry); const mod = await import(/* @vite-ignore */ url); return { default: mod[entry.exportName] as ComponentType }; } export function lazyAdminPage( slug: string, entry: AdminPageEntry, ): LazyExoticComponent { return lazy(() => loadAdminPageModule(slug, entry)); } export function preloadAdminPage(slug: string, entry: AdminPageEntry): Promise { return loadAdminPageModule(slug, entry); } /** Direct URL for shared chunks (stable names from vite.config.ts). */ export function sharedChunkUrl(filename: string): string { const name = filename.endsWith('.js') ? filename : `${filename}.js`; const shell = window.llmagnetAdminShell; const from_map = shell?.sharedChunks?.[name.replace(/\.js$/, '')]; if (from_map) { return from_map; } return `${resolveAssetsBaseUrl()}${name}${versionQuery()}`; }