@@ -130,6 +130,28 @@ const semverify = (version) => {
130130 return split . join ( '.' )
131131}
132132
133+ function flatten ( arr ) {
134+ return arr . reduce ( function ( flat , toFlatten ) {
135+ return flat . concat ( Array . isArray ( toFlatten ) ? flatten ( toFlatten ) : toFlatten ) ;
136+ } , [ ] ) ;
137+ }
138+
139+ // 10.0-10.2 -> 10.0, 10.1, 10.2
140+ function generateSemversInRange ( versionRange ) {
141+ const [ start , end ] = versionRange . split ( '-' )
142+ const startSemver = semverify ( start )
143+ const endSemver = semverify ( end )
144+ const versionsInRange = [ ] ;
145+ let curVersion = startSemver ;
146+
147+ while ( semver . gte ( endSemver , curVersion ) ) {
148+ versionsInRange . push ( curVersion )
149+ curVersion = semver . inc ( curVersion , 'minor' )
150+ }
151+
152+ return versionsInRange ;
153+ }
154+
133155function normalizeQuery ( query ) {
134156 let normalizedQuery = query
135157 const regex = `(${ Object . keys ( browserNameMap ) . join ( '|' ) } )`
@@ -143,7 +165,7 @@ function normalizeQuery(query) {
143165}
144166
145167const parseBrowsersList = ( browsersList ) => {
146- return browsersList . map ( browser => {
168+ const browsers = browsersList . map ( browser => {
147169 const [ browserName , browserVersion ] = browser . split ( ' ' )
148170
149171 let normalizedName = browserName
@@ -153,17 +175,22 @@ const parseBrowsersList = (browsersList) => {
153175 normalizedName = browserNameMap [ browserName ]
154176 }
155177
156- try {
157- // Browser version can return as "10.0-10.2"
158- normalizedVersion = browserVersion . split ( '-' ) [ 0 ]
159- } catch ( e ) {
160- }
161-
162- return {
163- family : normalizedName ,
164- version : normalizedVersion ,
178+ // browserslist might return ranges (9.0-9.2), unwrap them
179+ // see https://github.com/browserslist/browserslist-useragent/issues/41
180+ if ( browserVersion . indexOf ( '-' ) > 0 ) {
181+ return generateSemversInRange ( browserVersion ) . map ( version => ( {
182+ family : normalizedName ,
183+ version,
184+ } ) )
185+ } else {
186+ return {
187+ family : normalizedName ,
188+ version : normalizedVersion ,
189+ }
165190 }
166191 } )
192+
193+ return flatten ( browsers ) ;
167194}
168195
169196const compareBrowserSemvers = ( versionA , versionB , options ) => {
@@ -196,6 +223,7 @@ const matchesUA = (uaString, opts = {}) => {
196223 path : process . cwd ( )
197224 } )
198225 const parsedBrowsers = parseBrowsersList ( browsers )
226+
199227 const resolvedUserAgent = resolveUserAgent ( uaString )
200228
201229 const options = {
0 commit comments