UNPKG

2.76 kBJavaScriptView Raw
1'use strict';
2
3var _ = require('lodash');
4var missingSupport = require('./missing-support');
5var Detector = require('./detect-feature-use');
6var Multimatch = require('multimatch');
7
8function 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
92module.exports = doiuse;
\No newline at end of file