-
-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathisValid.js
91 lines (84 loc) · 2.06 KB
/
isValid.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* eslint-disable curly */
import { parseFunction } from "./parse.js";
import KEYWORDS from "./keywords.js";
/**
* Verify string can be parsed into a color object
* @param {String} str
* @returns boolean
*/
export default function isValid (str) {
if (!str) return false;
if (isColorHex(str)) return true;
if (isTransparent(str)) return true;
return validateParsedValue(str, parseFunction(str));
}
/**
* Return if parsed is valid and not a rgb function with angles
* @param {String} str
* @param {any} parsed
* @returns boolean
*/
const validateParsedValue = (str, parsed) => {
return !isParsedValid(parsed, str) || isParsedRGBWithAngles(parsed) ? false : true;
};
/**
* Return if string is "transparent"
* @param {String} str
* @returns boolean
*/
const isTransparent = str => {
return str === "transparent";
};
/**
* Return if parsed is valid
* @param {any} parsed
* @param {String} str
* @returns boolean
*/
const isParsedValid = (parsed, str) => {
if (
!parsed ||
!parsed.name ||
parsed.argMeta.filter(item => isTypeNumberPercentageOrAngle(item.type)).length < 3 ||
parsed.argMeta.filter(item => isTypeNumberPercentageOrAngle(item.type)).length > 4
) {
if (!KEYWORDS[str.toLowerCase()]) return false;
}
return true;
};
/**
* Return if parsed is a rgb function with angles
* @param {any} parsed
* @returns boolean
*/
const isParsedRGBWithAngles = parsed => {
if (
parsed &&
parsed.name === "rgb" &&
parsed.argMeta.filter(item => item.type === "<angle>").length
) {
return true;
}
return false;
};
/**
* Return if string is a number, percentage or angle
* @param {String} type
* @returns boolean
*/
const isTypeNumberPercentageOrAngle = type => {
return type === "<number>" || type === "<percentage>" || type === "<angle>" || !type;
};
/**
* Verify string is valid hex
* @param {String} str
* @returns boolean
*/
function isColorHex (str) {
const isString = color => color && typeof color === "string";
if (isString(str)) {
const regex = /^#([\da-f]{3}){1,2}$|^#([\da-f]{4}){1,2}$/i;
return str && regex.test(str);
}
return false;
}