@@ -5,29 +5,75 @@ const isAbsoluteUrl = require('is-absolute-url');
5
5
6
6
function runOpen ( uri , options , logger ) {
7
7
// https://github.com/webpack/webpack-dev-server/issues/1990
8
- let openOptions = { wait : false } ;
9
- let openOptionValue = '' ;
10
-
11
- if ( typeof options . open === 'string' ) {
12
- openOptions = Object . assign ( { } , openOptions , { app : options . open } ) ;
13
- openOptionValue = `: "${ options . open } "` ;
14
- } else if ( typeof options . open === 'object' ) {
15
- openOptions = options . open ;
16
- openOptionValue = `: "${ JSON . stringify ( options . open ) } "` ;
17
- }
8
+ const defaultOpenOptions = { wait : false } ;
9
+ const openTasks = [ ] ;
10
+
11
+ const getOpenTask = ( item ) => {
12
+ if ( typeof item === 'boolean' ) {
13
+ return [ { target : uri , options : defaultOpenOptions } ] ;
14
+ }
15
+
16
+ if ( typeof item === 'string' ) {
17
+ return [ { target : item , options : defaultOpenOptions } ] ;
18
+ }
19
+
20
+ let targets ;
21
+
22
+ if ( item . target ) {
23
+ targets = Array . isArray ( item . target ) ? item . target : [ item . target ] ;
24
+ } else {
25
+ targets = [ uri ] ;
26
+ }
18
27
19
- const pages =
20
- typeof options . openPage === 'string'
21
- ? [ options . openPage ]
22
- : options . openPage || [ '' ] ;
28
+ return targets . map ( ( target ) => {
29
+ const openOptions = defaultOpenOptions ;
30
+
31
+ if ( item . app ) {
32
+ openOptions . app = item . app ;
33
+ }
34
+
35
+ return { target, options : openOptions } ;
36
+ } ) ;
37
+ } ;
38
+
39
+ if ( Array . isArray ( options ) ) {
40
+ options . forEach ( ( item ) => {
41
+ openTasks . push ( ...getOpenTask ( item ) ) ;
42
+ } ) ;
43
+ } else {
44
+ openTasks . push ( ...getOpenTask ( options ) ) ;
45
+ }
23
46
24
47
return Promise . all (
25
- pages . map ( ( page ) => {
26
- const pageUrl = page && isAbsoluteUrl ( page ) ? page : `${ uri } ${ page } ` ;
48
+ openTasks . map ( ( openTask ) => {
49
+ let openTarget ;
50
+
51
+ if ( openTask . target ) {
52
+ if ( typeof openTask . target === 'boolean' ) {
53
+ openTarget = uri ;
54
+ } else {
55
+ openTarget = isAbsoluteUrl ( openTask . target )
56
+ ? openTask . target
57
+ : new URL ( openTask . target , uri ) . toString ( ) ;
58
+ }
59
+ } else {
60
+ openTarget = uri ;
61
+ }
27
62
28
- return open ( pageUrl , openOptions ) . catch ( ( ) => {
63
+ return open ( openTarget , openTask . options ) . catch ( ( ) => {
29
64
logger . warn (
30
- `Unable to open "${ pageUrl } " in browser${ openOptionValue } . If you are running in a headless environment, please do not use the --open flag`
65
+ `Unable to open "${ openTarget } " page${
66
+ // eslint-disable-next-line no-nested-ternary
67
+ openTask . options . app
68
+ ? Array . isArray ( openTask . options . app )
69
+ ? ` in "${
70
+ openTask . options . app [ 0 ]
71
+ } " app with "${ openTask . options . app
72
+ . slice ( 1 )
73
+ . join ( ' ' ) } " arguments`
74
+ : ` in "${ openTask . options . app } " app`
75
+ : ''
76
+ } . If you are running in a headless environment, please do not use the "--open" flag or the "open" option.`
31
77
) ;
32
78
} ) ;
33
79
} )
0 commit comments