Skip to content

Commit 37bdd22

Browse files
authored
Feature: Add Local URL Support in Accessibility (#48)
* Add local url support in accessibility * Suggested fixes around readability
1 parent a237b3d commit 37bdd22

File tree

2 files changed

+66
-6
lines changed

2 files changed

+66
-6
lines changed

src/lib/local.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,30 @@ export async function killExistingBrowserStackLocalProcesses() {
7373
}
7474
}
7575

76-
export async function ensureLocalBinarySetup(): Promise<void> {
76+
export async function ensureLocalBinarySetup(localIdentifier?: string): Promise<void> {
7777
logger.info(
7878
"Ensuring local binary setup as it is required for private URLs...",
7979
);
8080

8181
const localBinary = new Local();
8282
await killExistingBrowserStackLocalProcesses();
8383

84+
const requestBody: {
85+
key: string;
86+
username: string;
87+
localIdentifier?: string;
88+
} = {
89+
key: config.browserstackAccessKey,
90+
username: config.browserstackUsername
91+
};
92+
93+
if (localIdentifier) {
94+
requestBody.localIdentifier = localIdentifier;
95+
}
96+
8497
return await new Promise((resolve, reject) => {
8598
localBinary.start(
86-
{
87-
key: config.browserstackAccessKey,
88-
username: config.browserstackUsername,
89-
},
99+
requestBody,
90100
(error?: Error) => {
91101
if (error) {
92102
logger.error(

src/tools/accessiblity-utils/scanner.ts

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import axios from "axios";
22
import config from "../../config.js";
3+
import logger from "../../logger.js";
4+
import {
5+
isLocalURL,
6+
ensureLocalBinarySetup,
7+
killExistingBrowserStackLocalProcesses,
8+
} from "../../lib/local.js";
39

410
export interface AccessibilityScanResponse {
511
success: boolean;
@@ -23,10 +29,54 @@ export class AccessibilityScanner {
2329
name: string,
2430
urlList: string[],
2531
): Promise<AccessibilityScanResponse> {
32+
33+
// Check if any URL is local
34+
const hasLocal = urlList.some(isLocalURL);
35+
const localIdentifier = crypto.randomUUID();
36+
const LOCAL_IP = "127.0.0.1";
37+
const BS_LOCAL_DOMAIN = "bs-local.com";
38+
39+
if (hasLocal) {
40+
await ensureLocalBinarySetup(localIdentifier);
41+
} else {
42+
await killExistingBrowserStackLocalProcesses();
43+
}
44+
45+
const transformedUrlList = urlList.map((url) => {
46+
try {
47+
const parsed = new URL(url);
48+
if (parsed.hostname === LOCAL_IP) {
49+
parsed.hostname = BS_LOCAL_DOMAIN;
50+
return parsed.toString();
51+
}
52+
return url;
53+
} catch (e) {
54+
logger.warn(`[AccessibilityScan] Invalid URL skipped: ${url}`);
55+
return url;
56+
}
57+
});
58+
59+
const baseRequestBody = {
60+
name,
61+
urlList: transformedUrlList,
62+
recurring: false,
63+
};
64+
65+
let requestBody = baseRequestBody;
66+
if (hasLocal) {
67+
const localConfig = {
68+
localTestingInfo: {
69+
localIdentifier,
70+
localEnabled: true,
71+
}
72+
};
73+
requestBody = { ...baseRequestBody, ...localConfig };
74+
}
75+
2676
try {
2777
const { data } = await axios.post<AccessibilityScanResponse>(
2878
"https://api-accessibility.browserstack.com/api/website-scanner/v1/scans",
29-
{ name, urlList, recurring: false },
79+
requestBody,
3080
{ auth: this.auth },
3181
);
3282
if (!data.success)

0 commit comments

Comments
 (0)