import path from 'node:path'; import { pathToFileURL } from 'node:url'; let playwrightPromise; // Resolve project dependencies normally; an external installation is optional. export async function loadPlaywright() { playwrightPromise ??= (async () => { const modulePath = process.env.ORGCHART_PLAYWRIGHT_MODULE?.trim(); try { const runtime = await import(modulePath ? pathToFileURL(path.resolve(modulePath)).href : 'playwright'); if (typeof runtime.chromium?.launch !== 'function') throw new Error('Module does not export chromium.launch'); return runtime; } catch (cause) { throw new Error( `OrgChart browser verification cannot load Playwright (${modulePath || 'project module: playwright'}). ` + 'Use an existing project Playwright installation, or set ORGCHART_PLAYWRIGHT_MODULE to an existing Playwright entry file.', { cause }, ); } })(); return playwrightPromise; } export async function launchChromium(options = {}) { const { chromium } = await loadPlaywright(); const executablePath = process.env.ORGCHART_CHROME?.trim(); try { return await chromium.launch({ ...options, ...(executablePath ? { executablePath: path.resolve(executablePath) } : {}) }); } catch (cause) { throw new Error( `OrgChart browser verification cannot launch Chromium (${executablePath || 'Playwright-managed browser'}). ` + 'Ensure this Playwright installation has its Chromium browser, or set ORGCHART_CHROME to an existing browser executable.', { cause }, ); } }