UNPKG

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