From a3c90655c94d1f314dd9bb6b028150d0300baf88 Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Tue, 20 May 2025 17:22:26 +0530 Subject: [PATCH 1/2] Add local url support in accessibility --- src/lib/local.ts | 3 +- src/tools/accessiblity-utils/scanner.ts | 49 ++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/lib/local.ts b/src/lib/local.ts index 1da31ae..c9078c3 100644 --- a/src/lib/local.ts +++ b/src/lib/local.ts @@ -73,7 +73,7 @@ export async function killExistingBrowserStackLocalProcesses() { } } -export async function ensureLocalBinarySetup(): Promise { +export async function ensureLocalBinarySetup(localIdentifier?: string): Promise { logger.info( "Ensuring local binary setup as it is required for private URLs...", ); @@ -86,6 +86,7 @@ export async function ensureLocalBinarySetup(): Promise { { key: config.browserstackAccessKey, username: config.browserstackUsername, + ...(localIdentifier ? { localIdentifier } : {}), }, (error?: Error) => { if (error) { diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 8a02016..6575aa2 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -1,5 +1,11 @@ import axios from "axios"; import config from "../../config.js"; +import logger from "../../logger.js"; +import { + isLocalURL, + ensureLocalBinarySetup, + killExistingBrowserStackLocalProcesses, +} from "../../lib/local.js"; export interface AccessibilityScanResponse { success: boolean; @@ -23,10 +29,51 @@ export class AccessibilityScanner { name: string, urlList: string[], ): Promise { + + // Check if any URL is local + const hasLocal = urlList.some(isLocalURL); + const localIdentifier = crypto.randomUUID(); + const localHosts = new Set(["127.0.0.1", "localhost"]); + + if (hasLocal) { + await ensureLocalBinarySetup(localIdentifier); + } else { + await killExistingBrowserStackLocalProcesses(); + } + + const transformedUrlList = urlList.map((url) => { + try { + const parsed = new URL(url); + if (localHosts.has(parsed.hostname)) { + parsed.hostname = "bs-local.com"; + return parsed.toString(); + } + return url; + } catch (e) { + logger.warn(`[AccessibilityScan] Invalid URL skipped: ${url}`); + return url; + } + }); + + const requestBody = { + name, + urlList: transformedUrlList, + recurring: false, + ...(hasLocal + ? { + local: true, + localTestingInfo: { + localIdentifier: localIdentifier, + localEnabled: true, + }, + } + : {}), + }; + try { const { data } = await axios.post( "https://api-accessibility.browserstack.com/api/website-scanner/v1/scans", - { name, urlList, recurring: false }, + requestBody, { auth: this.auth }, ); if (!data.success) From 74d7d08da5afad56d67eaf91850bc3914d3b5a7f Mon Sep 17 00:00:00 2001 From: tech-sushant Date: Wed, 21 May 2025 13:57:21 +0530 Subject: [PATCH 2/2] Suggested fixes around readability --- src/lib/local.ts | 19 +++++++++++----- src/tools/accessiblity-utils/scanner.ts | 29 ++++++++++++++----------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/lib/local.ts b/src/lib/local.ts index c9078c3..a0faa0d 100644 --- a/src/lib/local.ts +++ b/src/lib/local.ts @@ -81,13 +81,22 @@ export async function ensureLocalBinarySetup(localIdentifier?: string): Promise< const localBinary = new Local(); await killExistingBrowserStackLocalProcesses(); + const requestBody: { + key: string; + username: string; + localIdentifier?: string; + } = { + key: config.browserstackAccessKey, + username: config.browserstackUsername + }; + + if (localIdentifier) { + requestBody.localIdentifier = localIdentifier; + } + return await new Promise((resolve, reject) => { localBinary.start( - { - key: config.browserstackAccessKey, - username: config.browserstackUsername, - ...(localIdentifier ? { localIdentifier } : {}), - }, + requestBody, (error?: Error) => { if (error) { logger.error( diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 6575aa2..6da16bc 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -33,7 +33,8 @@ export class AccessibilityScanner { // Check if any URL is local const hasLocal = urlList.some(isLocalURL); const localIdentifier = crypto.randomUUID(); - const localHosts = new Set(["127.0.0.1", "localhost"]); + const LOCAL_IP = "127.0.0.1"; + const BS_LOCAL_DOMAIN = "bs-local.com"; if (hasLocal) { await ensureLocalBinarySetup(localIdentifier); @@ -44,8 +45,8 @@ export class AccessibilityScanner { const transformedUrlList = urlList.map((url) => { try { const parsed = new URL(url); - if (localHosts.has(parsed.hostname)) { - parsed.hostname = "bs-local.com"; + if (parsed.hostname === LOCAL_IP) { + parsed.hostname = BS_LOCAL_DOMAIN; return parsed.toString(); } return url; @@ -55,21 +56,23 @@ export class AccessibilityScanner { } }); - const requestBody = { + const baseRequestBody = { name, urlList: transformedUrlList, recurring: false, - ...(hasLocal - ? { - local: true, - localTestingInfo: { - localIdentifier: localIdentifier, - localEnabled: true, - }, - } - : {}), }; + let requestBody = baseRequestBody; + if (hasLocal) { + const localConfig = { + localTestingInfo: { + localIdentifier, + localEnabled: true, + } + }; + requestBody = { ...baseRequestBody, ...localConfig }; + } + try { const { data } = await axios.post( "https://api-accessibility.browserstack.com/api/website-scanner/v1/scans",