1/**
2 * @license
3 * Copyright (c) 2016, Contributors
4 * SPDX-License-Identifier: ISC
5 */
6export function camelCase(str) {
7    // Handle the case where an argument is provided as camel case, e.g., fooBar.
8    // by ensuring that the string isn't already mixed case:
9    const isCamelCase = str !== str.toLowerCase() && str !== str.toUpperCase();
10    if (!isCamelCase) {
11        str = str.toLowerCase();
12    }
13    if (str.indexOf('-') === -1 && str.indexOf('_') === -1) {
14        return str;
15    }
16    else {
17        let camelcase = '';
18        let nextChrUpper = false;
19        const leadingHyphens = str.match(/^-+/);
20        for (let i = leadingHyphens ? leadingHyphens[0].length : 0; i < str.length; i++) {
21            let chr = str.charAt(i);
22            if (nextChrUpper) {
23                nextChrUpper = false;
24                chr = chr.toUpperCase();
25            }
26            if (i !== 0 && (chr === '-' || chr === '_')) {
27                nextChrUpper = true;
28            }
29            else if (chr !== '-' && chr !== '_') {
30                camelcase += chr;
31            }
32        }
33        return camelcase;
34    }
35}
36export function decamelize(str, joinString) {
37    const lowercase = str.toLowerCase();
38    joinString = joinString || '-';
39    let notCamelcase = '';
40    for (let i = 0; i < str.length; i++) {
41        const chrLower = lowercase.charAt(i);
42        const chrString = str.charAt(i);
43        if (chrLower !== chrString && i > 0) {
44            notCamelcase += `${joinString}${lowercase.charAt(i)}`;
45        }
46        else {
47            notCamelcase += chrString;
48        }
49    }
50    return notCamelcase;
51}
52export function looksLikeNumber(x) {
53    if (x === null || x === undefined)
54        return false;
55    // if loaded from config, may already be a number.
56    if (typeof x === 'number')
57        return true;
58    // hexadecimal.
59    if (/^0x[0-9a-f]+$/i.test(x))
60        return true;
61    // don't treat 0123 as a number; as it drops the leading '0'.
62    if (/^0[^.]/.test(x))
63        return false;
64    return /^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
65}
66