browserslist 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintrc ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": {
3
+ "no-unused-expressions": [0],
4
+ "no-underscore-dangle": [0],
5
+ "no-reserved-keys": [2],
6
+ "no-multi-spaces": [0],
7
+ "no-extra-parens": [2],
8
+ "no-unused-vars": [2],
9
+ "no-loop-func": [0],
10
+ "key-spacing": [0],
11
+ "max-len": [2],
12
+ "strict": [0],
13
+ "indent": [2],
14
+ "quotes": [2, "single", "avoid-escape"],
15
+ "curly": [0]
16
+ },
17
+ "env": {
18
+ "mocha": true,
19
+ "node": true
20
+ }
21
+ }
package/ChangeLog.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.4
2
+ * Add `config` option and `BROWSERSLIST_CONFIG` environment variable support.
3
+ * Add symlink config support.
4
+
5
+ ## 0.3.3
6
+ * Fix DynJS compatibility (by Nick Howes).
7
+
8
+ ## 0.3.2
9
+ * Fix joined versions on versions query (by Vincent De Oliveira).
10
+
11
+ ## 0.3.1
12
+ * Fix global variable leak (by Peter Müller).
13
+
1
14
  ## 0.3
2
15
  * Takes criterias from `BROWSERSLIST` environment variable.
3
16
 
package/README.md CHANGED
@@ -11,8 +11,8 @@ with a usage of over 5% in global usage statistics:
11
11
 
12
12
  ```js
13
13
  browserslist('last 1 version, > 5%');
14
- //=> ['and_chr 40', 'chrome 40', 'chrome 39', 'firefox 35', 'firefox 34',
15
- // 'ie 11', 'ie_mob 11', 'ios_saf 8.1', 'opera 27', 'safari 8']
14
+ //=> ['and_chr 41', 'chrome 41', 'chrome 40', 'firefox 37', 'firefox 36',
15
+ // 'ie 11', 'ie_mob 11', 'ios_saf 8.1-8.3', 'opera 27', 'safari 8']
16
16
  ```
17
17
 
18
18
  Browserslist will use browsers criterias from:
@@ -31,7 +31,7 @@ Browserslist will use browsers criterias from:
31
31
 
32
32
  ## Queries
33
33
 
34
- You can specify the browsers by queries (case insensitive):
34
+ You can specify the versions by queries (case insensitive):
35
35
 
36
36
  * `last 2 versions`: the last 2 versions for each major browser.
37
37
  * `last 2 Chrome versions`: the last 2 versions of Chrome browser.
@@ -47,6 +47,9 @@ You can specify the browsers by queries (case insensitive):
47
47
  Blackberry and Android WebView will not be used in `last n versions`.
48
48
  You should add them by name.
49
49
 
50
+ Browserslist works with separated versions of browsers. To use all versions
51
+ of some browsers you can use `Firefox > 0`, but it is a very bad way.
52
+
50
53
  [two-letter country code]: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements
51
54
 
52
55
  ## Browsers
@@ -100,3 +103,5 @@ split by a new line. You can write a comment after `#`:
100
103
  Last 2 versions
101
104
  IE 8 # sorry
102
105
  ```
106
+
107
+ You can specify direct path to config by `config` option.
package/index.js CHANGED
@@ -5,30 +5,28 @@ var fs = require('fs');
5
5
  var uniq = function (array) {
6
6
  var filtered = [];
7
7
  for ( var i = 0; i < array.length; i++ ) {
8
- if ( filtered.indexOf(array[i]) == -1 ) filtered.push(array[i]);
8
+ if ( filtered.indexOf(array[i]) === -1 ) filtered.push(array[i]);
9
9
  }
10
10
  return filtered;
11
11
  };
12
12
 
13
- normalizeVersion = function (data, version) {
14
- if ( data.versions.indexOf(version) != -1 ) {
15
- return version;
16
- } else {
17
- var alias = browserslist.versionAliases[data.name][version];
18
- if ( alias ) return alias;
19
- }
20
- };
21
-
22
13
  // Return array of browsers by selection queries:
23
14
  //
24
15
  // browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8']
25
16
  var browserslist = function (selections, opts) {
26
- if ( typeof(opts) == 'undefined' ) opts = { };
17
+ if ( typeof opts === 'undefined' ) opts = { };
27
18
 
28
- if ( typeof(selections) == 'undefined' || selections === null ) {
19
+ if ( typeof selections === 'undefined' || selections === null ) {
29
20
 
30
21
  if ( process.env.BROWSERSLIST ) {
31
22
  selections = process.env.BROWSERSLIST;
23
+ } else if ( opts.config || process.env.BROWSERSLIST_CONFIG ) {
24
+ var file = opts.config || process.env.BROWSERSLIST_CONFIG;
25
+ if ( fs.existsSync(file) && fs.statSync(file).isFile() ) {
26
+ selections = browserslist.parseConfig( fs.readFileSync(file) );
27
+ } else {
28
+ throw 'Can\'t read ' + file + ' config';
29
+ }
32
30
  } else {
33
31
  var config = browserslist.readConfig(opts.path);
34
32
  if ( config !== false ) {
@@ -39,7 +37,7 @@ var browserslist = function (selections, opts) {
39
37
  }
40
38
  }
41
39
 
42
- if ( typeof(selections) == 'string' ) {
40
+ if ( typeof selections === 'string' ) {
43
41
  selections = selections.split(/,\s*/);
44
42
  }
45
43
 
@@ -69,14 +67,44 @@ var browserslist = function (selections, opts) {
69
67
  return uniq(result).sort(function (name1, name2) {
70
68
  name1 = name1.split(' ');
71
69
  name2 = name2.split(' ');
72
- if ( name1[0] == name2[0] ) {
73
- return parseFloat(name2[1]) - parseFloat(name1[1]);
70
+ if ( name1[0] === name2[0] ) {
71
+ var d = parseFloat(name2[1]) - parseFloat(name1[1]);
72
+ if ( d > 0 ) {
73
+ return 1;
74
+ } else if ( d < 0 ) {
75
+ return -1;
76
+ } else {
77
+ return 0;
78
+ }
74
79
  } else {
75
80
  return name1[0].localeCompare(name2[0]);
76
81
  }
77
82
  });
78
83
  };
79
84
 
85
+ // Helpers
86
+
87
+ var normalizeVersion = function (data, version) {
88
+ if ( data.versions.indexOf(version) !== -1 ) {
89
+ return version;
90
+ } else {
91
+ var alias = browserslist.versionAliases[data.name][version];
92
+ if ( alias ) return alias;
93
+ }
94
+ };
95
+
96
+ var normalize = function (versions) {
97
+ return versions.filter(function (version) {
98
+ return typeof version === 'string';
99
+ });
100
+ };
101
+
102
+ var fillUsage = function (result, name, data) {
103
+ for ( var i in data ) {
104
+ result[name + ' ' + i] = data[i];
105
+ }
106
+ };
107
+
80
108
  // Will be filled by Can I Use data below
81
109
  browserslist.data = { };
82
110
  browserslist.usage = {
@@ -116,8 +144,13 @@ browserslist.versionAliases = { };
116
144
  browserslist.byName = function (name) {
117
145
  name = name.toLowerCase();
118
146
  name = browserslist.aliases[name] || name;
147
+ return browserslist.data[name];
148
+ };
119
149
 
120
- var data = browserslist.data[name];
150
+ // Get browser data by alias or case insensitive name and throw error
151
+ // on unknown browser
152
+ browserslist.checkName = function (name) {
153
+ var data = browserslist.byName(name);
121
154
  if ( !data ) throw 'Unknown browser ' + name;
122
155
  return data;
123
156
  };
@@ -126,14 +159,14 @@ browserslist.byName = function (name) {
126
159
  browserslist.readConfig = function (from) {
127
160
  if ( from === false ) return false;
128
161
  if ( !fs.readFileSync ) return false;
129
- if ( typeof(from) == 'undefined' ) from = '.';
162
+ if ( typeof from === 'undefined' ) from = '.';
130
163
 
131
164
  var dirs = path.resolve(from).split(path.sep);
132
- var config, stat;
165
+ var config;
133
166
  while ( dirs.length ) {
134
167
  config = dirs.concat(['browserslist']).join(path.sep);
135
168
 
136
- if ( fs.existsSync(config) && fs.lstatSync(config).isFile() ) {
169
+ if ( fs.existsSync(config) && fs.statSync(config).isFile() ) {
137
170
  return browserslist.parseConfig( fs.readFileSync(config) );
138
171
  }
139
172
 
@@ -149,10 +182,10 @@ browserslist.parseConfig = function (string) {
149
182
  .replace(/#[^\n]*/g, '')
150
183
  .split(/\n/)
151
184
  .map(function (i) {
152
- return i.trim();
185
+ return i.trim();
153
186
  })
154
187
  .filter(function (i) {
155
- return i !== '';
188
+ return i !== '';
156
189
  });
157
190
  };
158
191
 
@@ -164,6 +197,7 @@ browserslist.queries = {
164
197
  var selected = [];
165
198
  browserslist.major.forEach(function (name) {
166
199
  var data = browserslist.byName(name);
200
+ if ( !data ) return;
167
201
  var array = data.released.slice(-versions);
168
202
 
169
203
  array = array.map(function (v) {
@@ -178,7 +212,7 @@ browserslist.queries = {
178
212
  lastByBrowser: {
179
213
  regexp: /^last (\d+) (\w+) versions?$/i,
180
214
  select: function (versions, name) {
181
- var data = browserslist.byName(name);
215
+ var data = browserslist.checkName(name);
182
216
  return data.released.slice(-versions).map(function (v) {
183
217
  return data.name + ' ' + v;
184
218
  });
@@ -231,28 +265,31 @@ browserslist.queries = {
231
265
  versions: {
232
266
  regexp: /^(\w+) (>=?|<=?)\s*([\d\.]+)/,
233
267
  select: function (name, sign, version) {
234
- var data = browserslist.byName(name);
235
- version = parseFloat(version);
268
+ var data = browserslist.checkName(name);
269
+ var alias = normalizeVersion(data, version);
270
+ if ( alias ) {
271
+ version = alias;
272
+ }
273
+ version = parseFloat(version);
236
274
 
237
275
  var filter;
238
- if ( sign == '>' ) {
276
+ if ( sign === '>' ) {
239
277
  filter = function (v) {
240
278
  return parseFloat(v) > version;
241
279
  };
242
- } else if ( sign == '>=' ) {
280
+ } else if ( sign === '>=' ) {
243
281
  filter = function (v) {
244
282
  return parseFloat(v) >= version;
245
283
  };
246
- } else if ( sign == '<' ) {
284
+ } else if ( sign === '<' ) {
247
285
  filter = function (v) {
248
286
  return parseFloat(v) < version;
249
287
  };
250
- } else if ( sign == '<=' ) {
288
+ } else if ( sign === '<=' ) {
251
289
  filter = function (v) {
252
290
  return parseFloat(v) <= version;
253
291
  };
254
292
  }
255
-
256
293
  return data.released.filter(filter).map(function (v) {
257
294
  return data.name + ' ' + v;
258
295
  });
@@ -261,7 +298,7 @@ browserslist.queries = {
261
298
 
262
299
  esr: {
263
300
  regexp: /^(firefox|ff|fx) esr$/i,
264
- select: function (versions) {
301
+ select: function () {
265
302
  return ['firefox 31'];
266
303
  }
267
304
  },
@@ -269,12 +306,12 @@ browserslist.queries = {
269
306
  direct: {
270
307
  regexp: /^(\w+) ([\d\.]+)$/,
271
308
  select: function (name, version) {
272
- var data = browserslist.byName(name);
309
+ var data = browserslist.checkName(name);
273
310
  var alias = normalizeVersion(data, version);
274
311
  if ( alias ) {
275
312
  version = alias;
276
313
  } else {
277
- if ( version.indexOf('.') == -1 ) {
314
+ if ( version.indexOf('.') === -1 ) {
278
315
  alias = version + '.0';
279
316
  } else if ( /\.0$/.test(version) ) {
280
317
  alias = version.replace(/\.0$/, '');
@@ -286,7 +323,6 @@ browserslist.queries = {
286
323
  throw 'Unknown version ' + version + ' of ' + name;
287
324
  }
288
325
  }
289
-
290
326
  return [data.name + ' ' + version];
291
327
  }
292
328
  }
@@ -295,38 +331,28 @@ browserslist.queries = {
295
331
 
296
332
  // Get and convert Can I Use data
297
333
 
298
- var normalize = function (versions) {
299
- return versions.filter(function (version) {
300
- return typeof(version) == 'string';
301
- });
302
- };
303
-
304
- var fillUsage = function (result, name, data) {
305
- for ( var i in data ) {
306
- result[name + ' ' + i] = data[i];
307
- }
308
- };
309
-
310
- for ( var name in caniuse ) {
311
- browserslist.data[name] = {
312
- name: name,
313
- versions: normalize(caniuse[name].versions),
314
- released: normalize(caniuse[name].versions.slice(0, -3))
315
- };
316
- fillUsage(browserslist.usage.global, name, caniuse[name].usage_global);
317
-
318
- browserslist.versionAliases[name] = { };
319
- for ( var i = 0; i < caniuse[name].versions.length; i++ ) {
320
- if ( !caniuse[name].versions[i] ) continue;
321
- var full = caniuse[name].versions[i];
322
-
323
- if ( full.indexOf('-') != -1 ) {
324
- var interval = full.split('-');
325
- for ( var j = 0; j < interval.length; j++ ) {
326
- browserslist.versionAliases[name][ interval[j] ] = full;
334
+ (function () {
335
+ for ( var name in caniuse ) {
336
+ browserslist.data[name] = {
337
+ name: name,
338
+ versions: normalize(caniuse[name].versions),
339
+ released: normalize(caniuse[name].versions.slice(0, -3))
340
+ };
341
+ fillUsage(browserslist.usage.global, name, caniuse[name].usage_global);
342
+
343
+ browserslist.versionAliases[name] = { };
344
+ for ( var i = 0; i < caniuse[name].versions.length; i++ ) {
345
+ if ( !caniuse[name].versions[i] ) continue;
346
+ var full = caniuse[name].versions[i];
347
+
348
+ if ( full.indexOf('-') !== -1 ) {
349
+ var interval = full.split('-');
350
+ for ( var j = 0; j < interval.length; j++ ) {
351
+ browserslist.versionAliases[name][ interval[j] ] = full;
352
+ }
327
353
  }
328
354
  }
329
355
  }
330
- }
356
+ })();
331
357
 
332
358
  module.exports = browserslist;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Get browsers versions that matches given criterias like in Autoprefixer",
5
5
  "keywords": ["caniuse", "browsers"],
6
6
  "author": "Andrey Sitnik <andrey@sitnik.ru>",
@@ -10,15 +10,14 @@
10
10
  "url": "https://github.com/ai/browserslist.git"
11
11
  },
12
12
  "dependencies": {
13
- "caniuse-db": "^1.0.30000078"
13
+ "caniuse-db": "^1.0.30000153"
14
14
  },
15
15
  "devDependencies": {
16
- "jshint-stylish": "1.0.0",
17
- "gulp-jshint": "1.9.2",
18
- "gulp-mocha": "2.0.0",
19
- "mocha": "2.1.0",
20
- "chai": "2.0.0",
21
- "gulp": "3.8.11"
16
+ "gulp-eslint": "0.11.1",
17
+ "gulp-mocha": "2.0.1",
18
+ "mocha": "2.2.4",
19
+ "chai": "2.3.0",
20
+ "gulp": "3.8.11"
22
21
  },
23
22
  "scripts": {
24
23
  "test": "gulp"