|
1 | 1 | /** |
2 | 2 | * Determines the unit of a string and parses the value |
3 | 3 | * |
4 | | - * @param {string} value |
| 4 | + * @param {string} str |
| 5 | + * @param {object} out |
5 | 6 | * @return {object} The parsed value and the unit if any |
6 | 7 | */ |
7 | | -export default function parseValueAndUnit(value) { |
8 | | - const isBool = typeof value === 'boolean'; |
9 | | - const isObject = typeof value === 'object'; |
10 | | - const isString = typeof value === 'string'; |
11 | | - const isNumb = typeof value === 'number'; |
| 8 | +export default function parseValueAndUnit(str, out = { value: 0, unit: 'px' }) { |
| 9 | + const isValid = typeof str === 'number' || typeof str === 'string'; |
12 | 10 |
|
13 | | - if (isBool || isObject) { |
| 11 | + if (!isValid) { |
14 | 12 | throw new Error( |
15 | | - 'Ivalid value provided. Must provide a value as a string with % or px units.' |
| 13 | + 'Invalid value provided. Must provide a value as a string or number' |
16 | 14 | ); |
17 | 15 | } |
18 | 16 |
|
19 | | - if (isNumb) { |
20 | | - return { |
21 | | - value, |
22 | | - unit: '%', // defaults to percent if not unit is passed |
23 | | - }; |
24 | | - } else if (isString && value.slice(-1) === '%') { |
25 | | - // remove % then parse |
26 | | - value = parseInt(value.slice(0, -1), 10); |
| 17 | + str = String(str); |
| 18 | + out.value = parseFloat(str, 10); |
| 19 | + out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '%'; // default to percent |
27 | 20 |
|
28 | | - return { |
29 | | - value, |
30 | | - unit: '%', |
31 | | - }; |
32 | | - } else if (isString && value.slice(-2) === 'px') { |
33 | | - // remove px then parse |
34 | | - value = parseInt(value.slice(0, -2), 10); |
| 21 | + const validUnits = ['px', '%']; |
| 22 | + const isValidUnit = validUnits.find(unit => unit === out.unit); |
35 | 23 |
|
36 | | - return { |
37 | | - value, |
38 | | - unit: 'px', |
39 | | - }; |
| 24 | + if (!isValidUnit) { |
| 25 | + throw new Error( |
| 26 | + 'Invalid unit provided. Must provide a unit of px in or %' |
| 27 | + ); |
40 | 28 | } |
| 29 | + |
| 30 | + return out; |
41 | 31 | } |
0 commit comments