/
isMap.js
44 lines (35 loc) · 1.16 KB
/
isMap.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'use strict';
/** @typedef {import('postcss-value-parser').Node} ValueNode */
/**
* @param {ValueNode | undefined} valueNode
* @returns {boolean}
*/
module.exports = function (valueNode) {
if (!valueNode) {
return false;
}
if (valueNode.type !== 'function' || !valueNode.nodes || valueNode.value) {
return false;
}
// It's necessary to remove comments and spaces if they are present
const cleanNodes = valueNode.nodes.filter(
(node) => node.type !== 'comment' && node.type !== 'space',
);
// Map without comments and spaces will have the structure like $map (prop: value, prop2: value)
// ↑ ↑ ↑ ↑
// 0 1 2 3
if (cleanNodes[0] && cleanNodes[0].type !== 'word' && cleanNodes[0].type !== 'string') {
return false;
}
if (cleanNodes[1] && cleanNodes[1].value !== ':') {
return false;
}
// There is no need to check type or value of this node since it could be anything
if (!cleanNodes[2]) {
return false;
}
if (cleanNodes[3] && cleanNodes[3].value !== ',') {
return false;
}
return true;
};