@@ -49,6 +49,18 @@ class Server {
49
49
} ;
50
50
}
51
51
52
+ // eslint-disable-next-line class-methods-use-this
53
+ static isAbsoluteURL ( URL ) {
54
+ // Don't match Windows paths `c:\`
55
+ if ( / ^ [ a - z A - Z ] : \\ / . test ( URL ) ) {
56
+ return false ;
57
+ }
58
+
59
+ // Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
60
+ // Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
61
+ return / ^ [ a - z A - Z ] [ a - z A - Z \d + \- . ] * : / . test ( URL ) ;
62
+ }
63
+
52
64
static async getHostname ( hostname ) {
53
65
if ( hostname === "local-ip" ) {
54
66
return ( await internalIp . v4 ( ) ) || ( await internalIp . v6 ( ) ) || "0.0.0.0" ;
@@ -523,10 +535,8 @@ class Server {
523
535
}
524
536
525
537
if ( options . static ) {
526
- const isAbsoluteUrl = require ( "is-absolute-url" ) ;
527
-
528
538
options . static . forEach ( ( staticOption ) => {
529
- if ( isAbsoluteUrl ( staticOption . directory ) ) {
539
+ if ( Server . isAbsoluteURL ( staticOption . directory ) ) {
530
540
throw new Error ( "Using a URL as static.directory is not supported" ) ;
531
541
}
532
542
@@ -1193,7 +1203,6 @@ class Server {
1193
1203
}
1194
1204
1195
1205
openBrowser ( defaultOpenTarget ) {
1196
- const isAbsoluteUrl = require ( "is-absolute-url" ) ;
1197
1206
const open = require ( "open" ) ;
1198
1207
1199
1208
Promise . all (
@@ -1203,7 +1212,7 @@ class Server {
1203
1212
if ( item . target === "<url>" ) {
1204
1213
openTarget = defaultOpenTarget ;
1205
1214
} else {
1206
- openTarget = isAbsoluteUrl ( item . target )
1215
+ openTarget = Server . isAbsoluteURL ( item . target )
1207
1216
? item . target
1208
1217
: new URL ( item . target , defaultOpenTarget ) . toString ( ) ;
1209
1218
}
0 commit comments