import * as axios from 'axios' import { Browser } from 'puppeteer' import { TransformerConfig } from '../types/config.types' import * as fs from 'fs' export const getPageHtmlContent = async ({ pageFile, pagePath, browser, server, config, }: { pagePath: string pageFile: string browser?: Browser server?: { hostname: string port: number basePath?: string } config: TransformerConfig }): Promise<{ html: string } | null> => { const serverUrl = server ? new URL( server.basePath || '/', `http://${server.hostname}:${server.port}`, ).toString() : '' let pageUrl = server ? new URL(pagePath, serverUrl).toString() : `file://${pageFile}` if (pageUrl.startsWith('file://') && pageUrl.endsWith('.js')) { pageUrl = pageUrl.slice(0, -2) + 'html' } if (browser) { const page = await browser.newPage() await page.setViewport({ width: 1920, height: 1080 }) await page.setRequestInterception(true) page.on('request', (req) => { if ( !req.url().startsWith(serverUrl) && !(config.browser?.resourceUrlWhitelist || []).some((url) => new RegExp(url).test(req.url()), ) ) { req.abort() } else req.continue() }) await page.goto(pageUrl) await page.waitForNetworkIdle({ concurrency: 100 }) const html = await page.content() await page.close() return { html, } } else { if (pageUrl.startsWith('file://')) { const data = await fs.promises.readFile(pageUrl.slice(7), { encoding: 'utf-8', }) return { html: data, } } const { data } = await new axios.Axios().get(pageUrl) return { html: data, } } }