UNPKG

@qodalis/angular-cli

Version:

A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.

71 lines 8.49 kB
/** * A utility class for parsing command strings into command names and arguments. */ export class CommandParser { /** * Parse a command string into a full command name and arguments. * @param command - The full command string. * @returns An object containing the full command name and arguments. */ parse(command) { try { // Match quoted strings, single-quoted strings, or unquoted words const regex = /(?:--?([a-zA-Z0-9-_]+)(?:=("[^"]*"|'[^']*'|[^\s]+))?)|(?:[^\s]+)/g; const matches = Array.from(command.matchAll(regex)); if (matches.length === 0) { throw new Error('Invalid command string'); } const commandParts = []; const args = []; // Process matches matches.forEach((match) => { if (match[1]) { // Handle arguments const key = match[1]; let value = match[2]; if (value) { // Remove surrounding quotes, if any value = value.replace(/^['"]|['"]$/g, ''); } else { // Flag without a value value = true; } args.push({ name: key, value: this.parseValue(value), }); } else if (!match[0].startsWith('--')) { // Command name commandParts.push(match[0]); } }); const commandName = commandParts.join(' '); return { commandName, args, }; } catch (e) { console.error('Unable to parse the command:', command, e); return { commandName: '', args: [], }; } } /** * Parse individual values to their appropriate type. * @param value - The value to parse. * @returns The parsed value. */ parseValue(value) { if (!isNaN(Number(value))) return Number(value); // Convert numeric strings to numbers if (value === 'true' || value === 'false') return value === 'true'; // Convert "true"/"false" to boolean return value; // Return as string otherwise } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGkvc3JjL2xpYi91dGlscy9jb21tYW5kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQTs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3RCOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBZTtRQUNqQixJQUFJO1lBQ0EsaUVBQWlFO1lBQ2pFLE1BQU0sS0FBSyxHQUNQLG1FQUFtRSxDQUFDO1lBRXhFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXBELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUM3QztZQUVELE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksR0FBZ0IsRUFBRSxDQUFDO1lBRTdCLGtCQUFrQjtZQUNsQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNWLG1CQUFtQjtvQkFDbkIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixJQUFJLEtBQUssR0FBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLElBQUksS0FBSyxFQUFFO3dCQUNQLG9DQUFvQzt3QkFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3FCQUM3Qzt5QkFBTTt3QkFDSCx1QkFBdUI7d0JBQ3ZCLEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2hCO29CQUNELElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQ04sSUFBSSxFQUFFLEdBQUc7d0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO3FCQUNoQyxDQUFDLENBQUM7aUJBQ047cUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ25DLGVBQWU7b0JBQ2YsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0I7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0MsT0FBTztnQkFDSCxXQUFXO2dCQUNYLElBQUk7YUFDUCxDQUFDO1NBQ0w7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRTFELE9BQU87Z0JBQ0gsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLEVBQUU7YUFDWCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFVBQVUsQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7UUFDdEYsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxPQUFPO1lBQUUsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsb0NBQW9DO1FBQ3hHLE9BQU8sS0FBSyxDQUFDLENBQUMsNkJBQTZCO0lBQy9DLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFBhcnNlZEFyZyA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbW1hbmRQYXJzZXJPdXRwdXQgPSB7XG4gICAgY29tbWFuZE5hbWU6IHN0cmluZztcbiAgICBhcmdzOiBQYXJzZWRBcmdbXTtcbn07XG5cbi8qKlxuICogQSB1dGlsaXR5IGNsYXNzIGZvciBwYXJzaW5nIGNvbW1hbmQgc3RyaW5ncyBpbnRvIGNvbW1hbmQgbmFtZXMgYW5kIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbW1hbmRQYXJzZXIge1xuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgY29tbWFuZCBzdHJpbmcgaW50byBhIGZ1bGwgY29tbWFuZCBuYW1lIGFuZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgZnVsbCBjb21tYW5kIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZnVsbCBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBwYXJzZShjb21tYW5kOiBzdHJpbmcpOiBDb21tYW5kUGFyc2VyT3V0cHV0IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIE1hdGNoIHF1b3RlZCBzdHJpbmdzLCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MsIG9yIHVucXVvdGVkIHdvcmRzXG4gICAgICAgICAgICBjb25zdCByZWdleCA9XG4gICAgICAgICAgICAgICAgLyg/Oi0tPyhbYS16QS1aMC05LV9dKykoPzo9KFwiW15cIl0qXCJ8J1teJ10qJ3xbXlxcc10rKSk/KXwoPzpbXlxcc10rKS9nO1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gQXJyYXkuZnJvbShjb21tYW5kLm1hdGNoQWxsKHJlZ2V4KSk7XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21tYW5kIHN0cmluZycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBhcmdzOiBQYXJzZWRBcmdbXSA9IFtdO1xuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIG1hdGNoZXNcbiAgICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzLCBpZiBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGFnIHdpdGhvdXQgYSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hbMF0uc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb21tYW5kIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZFBhcnRzLnB1c2gobWF0Y2hbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kTmFtZSA9IGNvbW1hbmRQYXJ0cy5qb2luKCcgJyk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZE5hbWUsXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSB0aGUgY29tbWFuZDonLCBjb21tYW5kLCBlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kTmFtZTogJycsXG4gICAgICAgICAgICAgICAgYXJnczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgaW5kaXZpZHVhbCB2YWx1ZXMgdG8gdGhlaXIgYXBwcm9wcmlhdGUgdHlwZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGFyc2UuXG4gICAgICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlVmFsdWUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHJldHVybiBOdW1iZXIodmFsdWUpOyAvLyBDb252ZXJ0IG51bWVyaWMgc3RyaW5ncyB0byBudW1iZXJzXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSByZXR1cm4gdmFsdWUgPT09ICd0cnVlJzsgLy8gQ29udmVydCBcInRydWVcIi9cImZhbHNlXCIgdG8gYm9vbGVhblxuICAgICAgICByZXR1cm4gdmFsdWU7IC8vIFJldHVybiBhcyBzdHJpbmcgb3RoZXJ3aXNlXG4gICAgfVxufVxuIl19