Skip to content

Commit a3c9065

Browse files
committed
Add local url support in accessibility
1 parent e799c7d commit a3c9065

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

src/lib/local.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ 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
);
@@ -86,6 +86,7 @@ export async function ensureLocalBinarySetup(): Promise<void> {
8686
{
8787
key: config.browserstackAccessKey,
8888
username: config.browserstackUsername,
89+
...(localIdentifier ? { localIdentifier } : {}),
8990
},
9091
(error?: Error) => {
9192
if (error) {

src/tools/accessiblity-utils/scanner.ts

Lines changed: 48 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,51 @@ 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 localHosts = new Set(["127.0.0.1", "localhost"]);
37+
38+
if (hasLocal) {
39+
await ensureLocalBinarySetup(localIdentifier);
40+
} else {
41+
await killExistingBrowserStackLocalProcesses();
42+
}
43+
44+
const transformedUrlList = urlList.map((url) => {
45+
try {
46+
const parsed = new URL(url);
47+
if (localHosts.has(parsed.hostname)) {
48+
parsed.hostname = "bs-local.com";
49+
return parsed.toString();
50+
}
51+
return url;
52+
} catch (e) {
53+
logger.warn(`[AccessibilityScan] Invalid URL skipped: ${url}`);
54+
return url;
55+
}
56+
});
57+
58+
const requestBody = {
59+
name,
60+
urlList: transformedUrlList,
61+
recurring: false,
62+
...(hasLocal
63+
? {
64+
local: true,
65+
localTestingInfo: {
66+
localIdentifier: localIdentifier,
67+
localEnabled: true,
68+
},
69+
}
70+
: {}),
71+
};
72+
2673
try {
2774
const { data } = await axios.post<AccessibilityScanResponse>(
2875
"https://api-accessibility.browserstack.com/api/website-scanner/v1/scans",
29-
{ name, urlList, recurring: false },
76+
requestBody,
3077
{ auth: this.auth },
3178
);
3279
if (!data.success)

0 commit comments

Comments
 (0)