core/lexers/shell.lexer.ts

core/lexers/shell.lexer.ts is a file in GovLab Docs. 45 lines of code and 11 definitions.

const QUOTES: ReadonlySet<string> = new Set(['"', "'"]);
const WHITESPACE: ReadonlySet<string> = new Set([" ", "\t", "\n", "\r"]);

class Tokenizer {
    private readonly words: string[] = [];
    private current = "";
    private quote = "";

    public tokenize(command: string): string[] {
        for (const char of command) {
            this.feed(char);
        }
        this.flush();
        return this.words;
    }

    private feed(char: string): void {
        if (this.quote !== "") {
            this.inQuote(char);
            return;
        }
        if (QUOTES.has(char)) {
            this.quote = char;
            return;
        }
        if (WHITESPACE.has(char)) {
            this.flush();
            return;
        }
        this.current += char;
    }

    private inQuote(char: string): void {
        if (char === this.quote) {
            this.quote = "";
            return;
        }
        this.current += char;
    }

    private flush(): void {
        if (this.current !== "") {
            this.words.push(this.current);
            this.current = "";
        }
    }
}

export const tokenizeCommand = function tokenizeCommand(command: string): string[] {
    return new Tokenizer().tokenize(command);
};