UNPKG

ai-debug-local-mcp

Version:

🎯 ENHANCED AI GUIDANCE v4.1.2: Dramatically improved tool descriptions help AI users choose the right tools instead of 'close enough' options. Ultra-fast keyboard automation (10x speed), universal recording, multi-ecosystem debugging support, and compreh

223 lines • 8.38 kB
/** * Framework Monitoring Module * Handles injection of monitoring scripts for different meta-frameworks */ export class MetaFrameworkMonitoring { hmrListeners = new Map(); viteHMREvents = []; /** * Inject framework-specific monitoring based on detected framework */ async injectFrameworkMonitoring(page, framework) { switch (framework) { case 'remix': await this.injectRemixMonitoring(page); break; case 'astro': await this.injectAstroMonitoring(page); break; case 'nuxt': await this.injectNuxtMonitoring(page); break; case 'qwik': await this.injectQwikMonitoring(page); break; case 'solidjs': await this.injectSolidJSMonitoring(page); break; case 'sveltekit': await this.injectSvelteKitMonitoring(page); break; } } /** * Inject Remix-specific monitoring */ async injectRemixMonitoring(page) { await page.addInitScript(() => { // Monitor Remix loader performance if (window.__remixContext) { const originalFetch = window.fetch; const remixLoaderData = []; window.fetch = async function (...args) { const startTime = performance.now(); const response = await originalFetch.apply(this, args); const endTime = performance.now(); const url = args[0]; if (url.includes('_data') || url.includes('loader')) { remixLoaderData.push({ route: url, loader: 'fetch', duration: endTime - startTime, size: response.headers.get('content-length') || 0, cached: response.headers.get('cache-control')?.includes('max-age') || false, timestamp: Date.now() }); } // Store data globally for access window.__remixLoaderData = remixLoaderData; return response; }; } }); } /** * Inject Astro-specific monitoring */ async injectAstroMonitoring(page) { await page.addInitScript(() => { // Monitor Astro islands const astroIslands = []; // Observer for astro-island elements const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node instanceof Element && node.tagName === 'ASTRO-ISLAND') { const componentName = node.getAttribute('component-name') || 'Unknown'; const props = node.getAttribute('props') ? JSON.parse(node.getAttribute('props')) : {}; const hydrationDirective = node.getAttribute('client') || 'load'; astroIslands.push({ component: componentName, props, hydrationDirective, loading: node.getAttribute('loading') || 'eager' }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); // Store islands globally window.__astroIslands = astroIslands; }); } /** * Inject Nuxt-specific monitoring */ async injectNuxtMonitoring(page) { await page.addInitScript(() => { // Monitor Nuxt payload and navigation if (window.__NUXT__ || window.$nuxt) { const nuxtData = { payload: window.__NUXT__, routes: [], navigationTimes: [] }; // Monitor route changes if (window.$nuxt?.$router) { const router = window.$nuxt.$router; router.afterEach((to, from) => { nuxtData.navigationTimes.push({ from: from.path, to: to.path, timestamp: Date.now() }); }); } window.__nuxtMonitorData = nuxtData; } }); } /** * Inject Qwik-specific monitoring */ async injectQwikMonitoring(page) { await page.addInitScript(() => { // Monitor Qwik resumability if (window.__qwik) { const qwikData = { serializedState: document.querySelectorAll('[q\\:obj]').length, qrlCount: document.querySelectorAll('[q\\:func]').length, symbolsLoaded: 0, resumeTime: 0 }; // Monitor symbol loading const originalQwik = window.__qwik; if (originalQwik?.symbol) { const originalSymbol = originalQwik.symbol; originalQwik.symbol = function (...args) { qwikData.symbolsLoaded++; return originalSymbol.apply(this, args); }; } window.__qwikMonitorData = qwikData; } }); } /** * Inject SolidJS-specific monitoring */ async injectSolidJSMonitoring(page) { await page.addInitScript(() => { // Monitor SolidJS signals and stores if (window.Solid) { const solidData = { signals: 0, stores: 0, computations: 0 }; window.__solidMonitorData = solidData; } }); } /** * Inject SvelteKit-specific monitoring */ async injectSvelteKitMonitoring(page) { await page.addInitScript(() => { // Monitor SvelteKit navigation and stores if (window.__sveltekit) { const svelteKitData = { navigations: [], stores: [] }; window.__svelteKitMonitorData = svelteKitData; } }); } /** * Setup Vite HMR monitoring for frameworks using Vite */ async setupViteHMRMonitoring(page) { await page.addInitScript(() => { if (window.__vite_plugin_react || window.__vite__) { // Monitor HMR events const hmrEvents = []; // Listen for Vite HMR events if (window.__vite__?.createHotContext) { const originalCreateHotContext = window.__vite__.createHotContext; window.__vite__.createHotContext = function (ownerPath) { const hot = originalCreateHotContext(ownerPath); // Override hot.accept to track updates const originalAccept = hot.accept; hot.accept = function (...args) { hmrEvents.push({ type: 'update', timestamp: new Date(), files: [ownerPath] }); return originalAccept.apply(this, args); }; return hot; }; } // Store events globally window.__viteHMREvents = hmrEvents; } }); } /** * Get collected Vite HMR events */ getViteHMREvents() { return [...this.viteHMREvents]; } /** * Clear collected monitoring data */ clearMonitoringData() { this.viteHMREvents = []; this.hmrListeners.clear(); } } //# sourceMappingURL=meta-framework-monitoring.js.map