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
JavaScript
/**
* 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