.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / functionCommaSpaceChecker.js
1 "use strict";
2
3 const _ = require("lodash");
4 const declarationValueIndex = require("../utils/declarationValueIndex");
5 const isStandardSyntaxFunction = require("../utils/isStandardSyntaxFunction");
6 const report = require("../utils/report");
7 const styleSearch = require("style-search");
8 const valueParser = require("postcss-value-parser");
9
10 module.exports = function(opts) {
11   opts.root.walkDecls(decl => {
12     const declValue = _.get(decl, "raws.value.raw", decl.value);
13
14     valueParser(declValue).walk(valueNode => {
15       if (valueNode.type !== "function") {
16         return;
17       }
18
19       if (!isStandardSyntaxFunction(valueNode)) {
20         return;
21       }
22
23       // Ignore `url()` arguments, which may contain data URIs or other funky stuff
24       if (valueNode.value.toLowerCase() === "url") {
25         return;
26       }
27
28       const functionArguments = (() => {
29         let result = valueParser.stringify(valueNode);
30         // Remove function name and opening paren
31         result = result.slice(valueNode.value.length + 1);
32         // Remove closing paren
33         result = result.slice(0, result.length - 1);
34         // 1. Remove comments including preceeding whitespace (when only succeeded by whitespace)
35         // 2. Remove all other comments, but leave adjacent whitespace intact
36         result = result.replace(
37           /( *\/(\*.*\*\/(?!\S)|\/.*)|(\/(\*.*\*\/|\/.*)))/,
38           ""
39         );
40         return result;
41       })();
42
43       styleSearch(
44         {
45           source: functionArguments,
46           target: ",",
47           functionArguments: "skip"
48         },
49         match => {
50           opts.locationChecker({
51             source: functionArguments,
52             index: match.startIndex,
53             err: message => {
54               const index =
55                 declarationValueIndex(decl) +
56                 valueNode.value.length +
57                 1 +
58                 valueNode.sourceIndex +
59                 match.startIndex;
60               report({
61                 index,
62                 message,
63                 node: decl,
64                 result: opts.result,
65                 ruleName: opts.checkedRuleName
66               });
67             }
68           });
69         }
70       );
71     });
72   });
73 };