UNPKG

@bschauer/webtools-mcp-server

Version:

MCP server providing web analysis tools including screenshot, debug, performance, security, accessibility, SEO, and asset optimization capabilities

130 lines (121 loc) 4.21 kB
/** * Device configuration for performance testing * Provides predefined device profiles and utilities for custom device configuration */ /** * Predefined device profiles for common devices * These can be used directly with Puppeteer's emulation */ export const PREDEFINED_DEVICES = { // Mobile devices "Pixel 7": { name: "Pixel 7", userAgent: "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36", width: 412, height: 915, deviceScaleFactor: 2.625, isMobile: true, hasTouch: true, isLandscape: false, }, "iPhone 14": { name: "iPhone 14", userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1", width: 390, height: 844, deviceScaleFactor: 3, isMobile: true, hasTouch: true, isLandscape: false, }, // Tablet devices "iPad Pro": { name: "iPad Pro", userAgent: "Mozilla/5.0 (iPad; CPU OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1", width: 1024, height: 1366, deviceScaleFactor: 2, isMobile: true, hasTouch: true, isLandscape: false, }, // Desktop devices "Desktop (1920x1080)": { name: "Desktop (1920x1080)", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", width: 1920, height: 1080, deviceScaleFactor: 1, isMobile: false, hasTouch: false, isLandscape: true, }, "Desktop (2560x1440)": { name: "Desktop (2560x1440)", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", width: 2560, height: 1440, deviceScaleFactor: 1, isMobile: false, hasTouch: false, isLandscape: true, }, }; /** * Get a device configuration by name * @param {string} deviceName - Name of the predefined device * @returns {Object|null} Device configuration or null if not found */ export function getDeviceByName(deviceName) { return PREDEFINED_DEVICES[deviceName] || null; } /** * Validate a device configuration * @param {Object} deviceConfig - Device configuration to validate * @returns {Object} Validated device configuration with defaults applied */ export function validateDeviceConfig(deviceConfig = {}) { // Apply defaults for missing properties return { name: deviceConfig.name || "Custom Device", userAgent: deviceConfig.userAgent || "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", width: deviceConfig.width || 1920, height: deviceConfig.height || 1080, deviceScaleFactor: deviceConfig.deviceScaleFactor || 1, isMobile: deviceConfig.isMobile !== undefined ? deviceConfig.isMobile : false, hasTouch: deviceConfig.hasTouch !== undefined ? deviceConfig.hasTouch : false, isLandscape: deviceConfig.isLandscape !== undefined ? deviceConfig.isLandscape : true, }; } /** * Create a custom device configuration * @param {Object} deviceConfig - Custom device configuration * @returns {Object} Complete device configuration */ export function createCustomDevice(deviceConfig = {}) { return validateDeviceConfig(deviceConfig); } /** * Get device configuration from tool arguments * @param {Object} args - Tool arguments * @returns {Object} Device configuration */ export function getDeviceConfig(args) { // If a predefined device name is provided, use that if (args.deviceName && PREDEFINED_DEVICES[args.deviceName]) { return PREDEFINED_DEVICES[args.deviceName]; } // If a custom device configuration is provided, use that if (args.deviceConfig) { return validateDeviceConfig(args.deviceConfig); } // Default to desktop first (better for performance analysis) return PREDEFINED_DEVICES["Desktop (1920x1080)"]; } /** * Get a list of available device names * @returns {Array<string>} List of predefined device names */ export function getAvailableDevices() { return Object.keys(PREDEFINED_DEVICES); }