import * as babel from '@babel/core'; import puppeteer from 'puppeteer'; export async function measurePerformance(code: string) { const babelOptions = { configFile: false, babelrc: false, presets: [ '@babel/preset-typescript', '@babel/preset-env', '@babel/preset-react', ], }; // Parse the code to AST const parsed = await babel.parseAsync(code, babelOptions); if (!parsed) { throw new Error('Failed to parse code'); } // Transform AST to browser-compatible JavaScript const transformResult = await babel.transformFromAstAsync(parsed, undefined, { ...babelOptions, filename: 'file.jsx', plugins: [ () => ({ visitor: { ImportDeclaration( path: babel.NodePath, ) { const value = path.node.source.value; if (value === 'react' || value === 'react-dom') { path.remove(); } }, }, }), ], }); const transpiled = transformResult?.code || undefined; if (!transpiled) { throw new Error('Failed to transpile code'); } const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setViewport({width: 1280, height: 720}); const html = buildHtml(transpiled); await page.setContent(html, {waitUntil: 'networkidle0'}); await page.waitForFunction( 'window.__RESULT__ !== undefined && (window.__RESULT__.renderTime !== null || window.__RESULT__.error !== null)', ); const result = await page.evaluate(() => { return (window as any).__RESULT__; }); await browser.close(); return result; } function buildHtml(transpiled: string) { const html = ` React Performance Test
`; return html; }