@danielsogl/lighthouse-mcp
Version:
A comprehensive Model Context Protocol (MCP) server that provides web performance auditing, accessibility testing, SEO analysis, security assessment, and Core Web Vitals monitoring using Google Lighthouse. Enables LLMs and AI agents to perform detailed we
83 lines (82 loc) • 2.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.setChromeLaunchConfig = setChromeLaunchConfig;
exports.getChromeLaunchConfig = getChromeLaunchConfig;
exports.buildChromeFlags = buildChromeFlags;
exports.buildChromeLaunchOptions = buildChromeLaunchOptions;
exports.getChromeLaunchOptions = getChromeLaunchOptions;
exports.isProfileConfig = isProfileConfig;
const node_fs_1 = require("node:fs");
const lighthouse_constants_1 = require("./lighthouse-constants");
const DEFAULT_CONFIG = {
headless: true,
extraChromeFlags: [],
};
let runtimeConfig = { ...DEFAULT_CONFIG };
function setChromeLaunchConfig(config) {
runtimeConfig = {
...DEFAULT_CONFIG,
...config,
extraChromeFlags: config.extraChromeFlags ?? DEFAULT_CONFIG.extraChromeFlags,
};
}
function getChromeLaunchConfig() {
return {
...runtimeConfig,
extraChromeFlags: [...(runtimeConfig.extraChromeFlags ?? [])],
};
}
function buildChromeFlags(config) {
const headless = config.headless ?? DEFAULT_CONFIG.headless;
const extraFlags = config.extraChromeFlags ?? [];
const hasHeadlessOverride = extraFlags.some((flag) => flag.startsWith("--headless"));
const allowHeadlessFlags = headless || hasHeadlessOverride;
const baseFlags = hasHeadlessOverride ? lighthouse_constants_1.CHROME_FLAGS.filter((flag) => !flag.startsWith("--headless")) : lighthouse_constants_1.CHROME_FLAGS;
const combined = [];
for (const flag of baseFlags) {
if (allowHeadlessFlags || !flag.startsWith("--headless")) {
combined.push(flag);
}
}
if (config.profileDirectory) {
combined.push(`--profile-directory=${config.profileDirectory}`);
}
for (const flag of extraFlags) {
if (allowHeadlessFlags || !flag.startsWith("--headless")) {
combined.push(flag);
}
}
return dedupeFlags(combined);
}
function buildChromeLaunchOptions(config) {
const launchOptions = {
chromeFlags: buildChromeFlags(config),
};
if (config.userDataDir) {
launchOptions.userDataDir = config.userDataDir;
}
return launchOptions;
}
function getChromeLaunchOptions() {
const config = getChromeLaunchConfig();
if (config.userDataDir) {
ensureDirectory(config.userDataDir);
}
return buildChromeLaunchOptions(config);
}
function isProfileConfig(config) {
if (config.userDataDir || config.profileDirectory) {
return true;
}
const extraFlags = config.extraChromeFlags ?? [];
return extraFlags.some((flag) => flag.startsWith("--user-data-dir") || flag.startsWith("--profile-directory"));
}
function dedupeFlags(flags) {
return [...new Set(flags)];
}
function ensureDirectory(path) {
if ((0, node_fs_1.existsSync)(path)) {
return;
}
(0, node_fs_1.mkdirSync)(path, { recursive: true });
}