1
1
import axios from "axios" ;
2
2
import config from "../../config.js" ;
3
+ import logger from "../../logger.js" ;
4
+ import {
5
+ isLocalURL ,
6
+ ensureLocalBinarySetup ,
7
+ killExistingBrowserStackLocalProcesses ,
8
+ } from "../../lib/local.js" ;
3
9
4
10
export interface AccessibilityScanResponse {
5
11
success : boolean ;
@@ -23,10 +29,51 @@ export class AccessibilityScanner {
23
29
name : string ,
24
30
urlList : string [ ] ,
25
31
) : 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
+
26
73
try {
27
74
const { data } = await axios . post < AccessibilityScanResponse > (
28
75
"https://api-accessibility.browserstack.com/api/website-scanner/v1/scans" ,
29
- { name , urlList , recurring : false } ,
76
+ requestBody ,
30
77
{ auth : this . auth } ,
31
78
) ;
32
79
if ( ! data . success )
0 commit comments