@@ -6,11 +6,9 @@ import { isNode } from './common.js';
6
6
function throwResolveError ( relUrl , parentUrl ) {
7
7
throw new RangeError ( 'Unable to resolve "' + relUrl + '" to ' + parentUrl ) ;
8
8
}
9
- var protocolRegEx = / ^ [ ^ / ] + : / ;
10
9
export function resolveIfNotPlain ( relUrl , parentUrl ) {
11
10
relUrl = relUrl . trim ( ) ;
12
- if ( parentUrl )
13
- var parentProtocol = parentUrl . match ( protocolRegEx ) ;
11
+ var parentProtocol = parentUrl && parentUrl . substr ( 0 , parentUrl . indexOf ( ':' ) + 1 ) ;
14
12
15
13
var firstChar = relUrl [ 0 ] ;
16
14
var secondChar = relUrl [ 1 ] ;
@@ -19,12 +17,13 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
19
17
if ( firstChar === '/' && secondChar === '/' ) {
20
18
if ( ! parentProtocol )
21
19
throwResolveError ( relUrl , parentUrl ) ;
22
- return parentProtocol [ 0 ] + relUrl ;
20
+ return parentProtocol + relUrl ;
23
21
}
24
22
// relative-url
25
- else if ( firstChar === '.' && ( secondChar === '/' || secondChar === '.' && ( relUrl [ 2 ] === '/' || relUrl . length === 2 ) || relUrl . length === 1 )
26
- || firstChar === '/' ) {
27
- var parentIsPlain = ! parentProtocol || parentUrl [ parentProtocol [ 0 ] . length ] !== '/' ;
23
+ else if ( firstChar === '.' && ( secondChar === '/' || secondChar === '.' && ( relUrl [ 2 ] === '/' || relUrl . length === 2 && ( relUrl += '/' ) ) ||
24
+ relUrl . length === 1 && ( relUrl += '/' ) ) ||
25
+ firstChar === '/' ) {
26
+ var parentIsPlain = ! parentProtocol || parentUrl [ parentProtocol . length ] !== '/' ;
28
27
29
28
// read pathname from parent if a URL
30
29
// pathname taken to be part after leading "/"
@@ -35,10 +34,10 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
35
34
throwResolveError ( relUrl , parentUrl ) ;
36
35
pathname = parentUrl ;
37
36
}
38
- else if ( parentUrl [ parentProtocol [ 0 ] . length + 1 ] === '/' ) {
37
+ else if ( parentUrl [ parentProtocol . length + 1 ] === '/' ) {
39
38
// resolving to a :// so we need to read out the auth and host
40
- if ( parentProtocol [ 0 ] !== 'file:' ) {
41
- pathname = parentUrl . substr ( parentProtocol [ 0 ] . length + 2 ) ;
39
+ if ( parentProtocol !== 'file:' ) {
40
+ pathname = parentUrl . substr ( parentProtocol . length + 2 ) ;
42
41
pathname = pathname . substr ( pathname . indexOf ( '/' ) + 1 ) ;
43
42
}
44
43
else {
@@ -47,7 +46,7 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
47
46
}
48
47
else {
49
48
// resolving to :/ so pathname is the /... part
50
- pathname = parentUrl . substr ( parentProtocol [ 0 ] . length + 1 ) ;
49
+ pathname = parentUrl . substr ( parentProtocol . length + 1 ) ;
51
50
}
52
51
53
52
if ( firstChar === '/' ) {
@@ -63,27 +62,27 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
63
62
var segmented = pathname . substr ( 0 , pathname . lastIndexOf ( '/' ) + 1 ) + relUrl ;
64
63
65
64
var output = [ ] ;
66
- var segmentIndex = undefined ;
65
+ var segmentIndex = - 1 ;
67
66
68
67
for ( var i = 0 ; i < segmented . length ; i ++ ) {
69
68
// busy reading a segment - only terminate on '/'
70
- if ( segmentIndex !== undefined ) {
69
+ if ( segmentIndex !== - 1 ) {
71
70
if ( segmented [ i ] === '/' ) {
72
- output . push ( segmented . substr ( segmentIndex , i - segmentIndex + 1 ) ) ;
73
- segmentIndex = undefined ;
71
+ output . push ( segmented . substring ( segmentIndex , i + 1 ) ) ;
72
+ segmentIndex = - 1 ;
74
73
}
75
74
continue ;
76
75
}
77
76
78
77
// new segment - check if it is relative
79
78
if ( segmented [ i ] === '.' ) {
80
79
// ../ segment
81
- if ( segmented [ i + 1 ] === '.' && ( segmented [ i + 2 ] === '/' || i === segmented . length - 2 ) ) {
80
+ if ( segmented [ i + 1 ] === '.' && segmented [ i + 2 ] === '/' ) {
82
81
output . pop ( ) ;
83
82
i += 2 ;
84
83
}
85
84
// ./ segment
86
- else if ( segmented [ i + 1 ] === '/' || i === segmented . length - 1 ) {
85
+ else if ( segmented [ i + 1 ] === '/' ) {
87
86
i += 1 ;
88
87
}
89
88
else {
@@ -106,8 +105,8 @@ export function resolveIfNotPlain (relUrl, parentUrl) {
106
105
segmentIndex = i ;
107
106
}
108
107
// finish reading out the last segment
109
- if ( segmentIndex !== undefined )
110
- output . push ( segmented . substr ( segmentIndex , segmented . length - segmentIndex ) ) ;
108
+ if ( segmentIndex !== - 1 )
109
+ output . push ( segmented . substr ( segmentIndex ) ) ;
111
110
112
111
return parentUrl . substr ( 0 , parentUrl . length - pathname . length ) + output . join ( '' ) ;
113
112
}
0 commit comments