1 | 'use strict';
|
2 |
|
3 | var _ = require('lodash');
|
4 | var missingSupport = require('./missing-support');
|
5 | var Detector = require('./detect-feature-use');
|
6 | var Multimatch = require('multimatch');
|
7 |
|
8 | function doiuse(options) {
|
9 | var browserQuery = options.browsers;
|
10 | var onFeatureUsage = options.onFeatureUsage;
|
11 | var ignoreOptions = options.ignore;
|
12 | var ignoreFiles = options.ignoreFiles;
|
13 |
|
14 | return {
|
15 | info: function info() {
|
16 | var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
17 |
|
18 | var _missingSupport = missingSupport(browserQuery, opts.from);
|
19 |
|
20 | var browsers = _missingSupport.browsers;
|
21 | var features = _missingSupport.features;
|
22 |
|
23 | return {
|
24 | browsers: browsers,
|
25 | features: features
|
26 | };
|
27 | },
|
28 |
|
29 | postcss: function postcss(css, result) {
|
30 | var from = undefined;
|
31 | if (css.source && css.source.input) {
|
32 | from = css.source.input.file;
|
33 | }
|
34 |
|
35 | var _missingSupport2 = missingSupport(browserQuery, from);
|
36 |
|
37 | var features = _missingSupport2.features;
|
38 |
|
39 | var detector = new Detector(_.keys(features));
|
40 | return detector.process(css, function (_ref) {
|
41 | var feature = _ref.feature;
|
42 | var usage = _ref.usage;
|
43 | var ignore = _ref.ignore;
|
44 |
|
45 | if (ignore && ignore.indexOf(feature) !== -1) {
|
46 | return;
|
47 | }
|
48 | if (ignoreOptions && ignoreOptions.indexOf(feature) !== -1) {
|
49 | return;
|
50 | }
|
51 |
|
52 | if (ignoreFiles && Multimatch(usage.source.input.from, ignoreFiles).length > 0) {
|
53 | return;
|
54 | }
|
55 |
|
56 | var messages = [];
|
57 | if (features[feature].missing) {
|
58 | messages.push('not supported by: ' + features[feature].missing);
|
59 | }
|
60 | if (features[feature].partial) {
|
61 | messages.push('only partially supported by: ' + features[feature].partial);
|
62 | }
|
63 |
|
64 | var message = features[feature].title + ' ' + messages.join(' and ') + ' (' + feature + ')';
|
65 |
|
66 | result.warn(message, { node: usage, plugin: 'doiuse' });
|
67 |
|
68 | if (onFeatureUsage) {
|
69 | var loc = usage.source;
|
70 | loc.original = css.source.input.map ? {
|
71 | start: css.source.input.map.consumer().originalPositionFor(loc.start),
|
72 | end: css.source.input.map.consumer().originalPositionFor(loc.end)
|
73 | } : {
|
74 | start: loc.start,
|
75 | end: loc.end
|
76 | };
|
77 |
|
78 | message = (loc.original.start.source || loc.input.file || loc.input.from) + ':' + loc.original.start.line + ':' + loc.original.start.column + ': ' + message;
|
79 |
|
80 | onFeatureUsage({
|
81 | feature: feature,
|
82 | featureData: features[feature],
|
83 | usage: usage,
|
84 | message: message
|
85 | });
|
86 | }
|
87 | });
|
88 | }
|
89 | };
|
90 | }
|
91 |
|
92 | module.exports = doiuse; |
\ | No newline at end of file |