1 | 'use strict';
|
2 |
|
3 | var features = require('../data/features');
|
4 | var BrowserSelection = require('./browsers');
|
5 | var _ = require('lodash');
|
6 | var formatBrowserName = require('./util').formatBrowserName;
|
7 |
|
8 | var caniuse = require('caniuse-lite');
|
9 |
|
10 | function filterStats(browsers, stats) {
|
11 | return _.reduce(stats, function (resultStats, versionData, browser) {
|
12 |
|
13 | var feature = _.reduce(versionData, function (result, support, ver) {
|
14 | var selected = browsers.test(browser, ver);
|
15 | if (selected) {
|
16 |
|
17 | if (!/(^|\s)y($|\s)/.test(support)) {
|
18 |
|
19 | var testprop = /(^|\s)a($|\s)/.test(support) ? 'partial' : 'missing';
|
20 | if (!result[testprop]) {
|
21 | result[testprop] = {};
|
22 | }
|
23 | result[testprop][selected[1]] = support;
|
24 | }
|
25 | }
|
26 | return result;
|
27 | }, { missing: {}, partial: {} });
|
28 |
|
29 | if (_.keys(feature.missing).length !== 0) {
|
30 | resultStats.missing[browser] = feature.missing;
|
31 | }
|
32 | if (_.keys(feature.partial).length !== 0) {
|
33 | resultStats.partial[browser] = feature.partial;
|
34 | }
|
35 | return resultStats;
|
36 | }, { missing: {}, partial: {} });
|
37 | }
|
38 | function lackingBrowsers(browserStats) {
|
39 | return _.reduce(browserStats, function (res, versions, browser) {
|
40 | res.push(formatBrowserName(browser, _.keys(versions)));
|
41 | return res;
|
42 | }, []).join(', ');
|
43 | }
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 | function missing(browserRequest) {
|
76 | var browsers = new BrowserSelection(browserRequest);
|
77 | var result = {};
|
78 |
|
79 | Object.keys(features).forEach(function (feature) {
|
80 | var featureData = caniuse.feature(caniuse.features[feature]);
|
81 | var lackData = filterStats(browsers, featureData.stats);
|
82 | var missingData = lackData.missing;
|
83 | var partialData = lackData.partial;
|
84 |
|
85 | var missing = lackingBrowsers(missingData);
|
86 | var partial = lackingBrowsers(partialData);
|
87 |
|
88 | if (missing.length > 0 || partial.length > 0) {
|
89 | result[feature] = {
|
90 | title: featureData.title,
|
91 | caniuseData: featureData
|
92 | };
|
93 | if (missing.length > 0) {
|
94 | result[feature].missingData = missingData;
|
95 | result[feature].missing = missing;
|
96 | }
|
97 | if (partial.length > 0) {
|
98 | result[feature].partialData = partialData;
|
99 | result[feature].partial = partial;
|
100 | }
|
101 | }
|
102 | });
|
103 |
|
104 | return {
|
105 | browsers: browsers.list(),
|
106 | features: result
|
107 | };
|
108 | }
|
109 |
|
110 | module.exports = missing; |
\ | No newline at end of file |