1
1
/* global document, window */
2
- /* eslint func-names: 0 */
3
- /* eslint no-var: 0 */
4
- /* eslint vars-on-top: 0 */
5
- /* eslint prefer-arrow-func: 0 */
6
- /* eslint prefer-rest-params: 0 */
7
- /* eslint prefer-arrow-callback: 0 */
8
- /* eslint prefer-template: 0 */
2
+ /*
3
+ eslint-disable
4
+ func-names,
5
+ no-var,
6
+ vars-on-top,
7
+ prefer-arrow-func,
8
+ prefer-rest-params,
9
+ prefer-arrow-callback,
10
+ prefer-template,
11
+ prefer-destructuring,
12
+ no-param-reassign,
13
+ no-console
14
+ */
9
15
10
16
var normalizeUrl = require ( 'normalize-url' ) ;
11
17
@@ -56,16 +62,21 @@ function getCurrentScriptUrl(moduleId) {
56
62
if ( ! src ) {
57
63
return null ;
58
64
}
65
+
59
66
var splitResult = src . split ( / ( [ ^ \\ / ] + ) \. j s $ / ) ;
60
67
var filename = splitResult && splitResult [ 1 ] ;
68
+
61
69
if ( ! filename ) {
62
70
return [ src . replace ( '.js' , '.css' ) ] ;
63
71
}
72
+
64
73
if ( ! fileMap ) {
65
74
return [ src . replace ( '.js' , '.css' ) ] ;
66
75
}
76
+
67
77
return fileMap . split ( ',' ) . map ( function ( mapRule ) {
68
78
var reg = new RegExp ( filename + '\\.js$' , 'g' ) ;
79
+
69
80
return normalizeUrl (
70
81
src . replace ( reg , mapRule . replace ( / { f i l e N a m e } / g, filename ) + '.css' ) ,
71
82
{ stripWWW : false }
@@ -78,14 +89,23 @@ function updateCss(el, url) {
78
89
if ( ! url ) {
79
90
url = el . href . split ( '?' ) [ 0 ] ;
80
91
}
92
+
93
+ if ( ! isUrlRequest ( url ) ) {
94
+ return ;
95
+ }
96
+
81
97
if ( el . isLoaded === false ) {
82
98
// We seem to be about to replace a css link that hasn't loaded yet.
83
99
// We're probably changing the same file more than once.
84
100
return ;
85
101
}
86
- if ( ! url || ! ( url . indexOf ( '.css' ) > - 1 ) ) return ;
102
+
103
+ if ( ! url || ! ( url . indexOf ( '.css' ) > - 1 ) ) {
104
+ return ;
105
+ }
87
106
88
107
el . visited = true ;
108
+
89
109
var newEl = el . cloneNode ( ) ; // eslint-disable-line vars-on-top
90
110
91
111
newEl . isLoaded = false ;
@@ -101,18 +121,22 @@ function updateCss(el, url) {
101
121
} ) ;
102
122
103
123
newEl . href = url + '?' + Date . now ( ) ;
124
+
104
125
el . parentNode . appendChild ( newEl ) ;
105
126
}
106
127
107
128
function getReloadUrl ( href , src ) {
108
129
var ret ;
130
+
109
131
href = normalizeUrl ( href , { stripWWW : false } ) ;
132
+
110
133
// eslint-disable-next-line array-callback-return
111
134
src . some ( function ( url ) {
112
135
if ( href . indexOf ( src ) > - 1 ) {
113
136
ret = url ;
114
137
}
115
138
} ) ;
139
+
116
140
return ret ;
117
141
}
118
142
@@ -123,7 +147,13 @@ function reloadStyle(src) {
123
147
forEach . call ( elements , function ( el ) {
124
148
var url = getReloadUrl ( el . href , src ) ;
125
149
126
- if ( el . visited === true ) return ;
150
+ if ( ! isUrlRequest ( url ) ) {
151
+ return ;
152
+ }
153
+
154
+ if ( el . visited === true ) {
155
+ return ;
156
+ }
127
157
128
158
if ( url ) {
129
159
updateCss ( el , url ) ;
@@ -136,12 +166,37 @@ function reloadStyle(src) {
136
166
137
167
function reloadAll ( ) {
138
168
var elements = document . querySelectorAll ( 'link' ) ;
169
+
139
170
forEach . call ( elements , function ( el ) {
140
- if ( el . visited === true ) return ;
171
+ if ( el . visited === true ) {
172
+ return ;
173
+ }
174
+
141
175
updateCss ( el ) ;
142
176
} ) ;
143
177
}
144
178
179
+ function isUrlRequest ( url ) {
180
+ // An URL is not an request if
181
+
182
+ // 1. It's an absolute url
183
+ if ( / ^ [ a - z ] [ a - z 0 - 9 + . - ] * : / i. test ( url ) ) {
184
+ return false ;
185
+ }
186
+
187
+ // 2. It's a protocol-relative
188
+ if ( / ^ \/ \/ / . test ( url ) ) {
189
+ return false ;
190
+ }
191
+
192
+ // 3. Its a `#` link
193
+ if ( / ^ # / . test ( url ) ) {
194
+ return false ;
195
+ }
196
+
197
+ return true ;
198
+ }
199
+
145
200
module . exports = function ( moduleId , options ) {
146
201
if ( noDocument ) {
147
202
console . log ( 'no window.document found, will not HMR CSS' ) ;
@@ -153,6 +208,7 @@ module.exports = function(moduleId, options) {
153
208
154
209
function update ( ) {
155
210
var src = getScriptSrc ( options . filename ) ;
211
+
156
212
var reloaded = reloadStyle ( src ) ;
157
213
158
214
if ( options . locals ) {
0 commit comments