/**
 * Takes a string and splits it into an array by whitespace, ignoring any
 * text that is wrapped in quotes. You must escape quotes within a quoted
 * string, otherwise it will just split on those.
 *
 * Derived from https://stackoverflow.com/a/46946420
 */
export default (str: string): string[] => {
    let quoted = false;
    const parts = [''] as string[];

    for (const char of str.trim().match(/\\?.|^$/g) || []) {
        if (char === '"') {
            quoted = !quoted;
        } else if (!quoted && char === ' ') {
            parts.push('');
        } else {
            parts[Math.max(parts.length - 1, 0)] += char.replace(/\\(.)/, '$1');
        }
    }

    if (parts.length === 1 && parts[0] === '') {
        return [];
    }

    return parts;
};