1 | const multimatch = require('multimatch');
|
2 |
|
3 | const missingSupport = require('./missing-support');
|
4 |
|
5 | const Detector = require('./detect-feature-use');
|
6 |
|
7 | function 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 |
|
93 | module.exports = doiuse; |
\ | No newline at end of file |