diff --git a/src/config.ts b/src/config.ts index 706c79ff..a4a18a30 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,8 +1,41 @@ +// List of supported BrowserStack Local option names (as per SDK) +const BROWSERSTACK_LOCAL_OPTION_KEYS = [ + "proxyHost", + "proxyPort", + "proxyUser", + "proxyPass", + "useCaCertificate", + "localProxyHost", + "localProxyPort", + "localProxyUser", + "localProxyPass", + "pacFile", + "force", + "forceLocal", + "onlyAutomate", + "verbose", + "logFile", + "binarypath", + "f", + "excludeHosts", +]; + +// Build browserstackLocalOptions from individual env vars +const browserstackLocalOptions: Record = {}; +for (const key of BROWSERSTACK_LOCAL_OPTION_KEYS) { + // Env var name: BROWSERSTACK_LOCAL_OPTION_ + const envVar = process.env[`BROWSERSTACK_LOCAL_OPTION_${key.toUpperCase()}`]; + if (envVar !== undefined) { + browserstackLocalOptions[key] = envVar; + } +} + export class Config { constructor( public readonly browserstackUsername: string, public readonly browserstackAccessKey: string, public readonly DEV_MODE: boolean, + public readonly browserstackLocalOptions: Record, ) {} } @@ -10,6 +43,7 @@ const config = new Config( process.env.BROWSERSTACK_USERNAME!, process.env.BROWSERSTACK_ACCESS_KEY!, process.env.DEV_MODE === "true", + browserstackLocalOptions, ); export default config; diff --git a/src/lib/local.ts b/src/lib/local.ts index 2472bb26..4a99bad1 100644 --- a/src/lib/local.ts +++ b/src/lib/local.ts @@ -83,21 +83,19 @@ export async function ensureLocalBinarySetup( const localBinary = new Local(); await killExistingBrowserStackLocalProcesses(); - const requestBody: { - key: string; - username: string; - localIdentifier?: string; - } = { + // Use a single options object from config and extend with required fields + const bsLocalArgs: Record = { + ...(config.browserstackLocalOptions || {}), key: config.browserstackAccessKey, username: config.browserstackUsername, }; if (localIdentifier) { - requestBody.localIdentifier = localIdentifier; + bsLocalArgs.localIdentifier = localIdentifier; } return await new Promise((resolve, reject) => { - localBinary.start(requestBody, (error?: Error) => { + localBinary.start(bsLocalArgs, (error?: Error) => { if (error) { logger.error( `Unable to start BrowserStack Local... please check your credentials and try again. Error: ${error}`,