W ramach ćwiczenia tworzymy mechanizm parsowania argv przekazywanych do CLI. Do dzieła.

Najpierw musimy wiedzieć, czy argument jest nazwany czy nie:

function isNamedArg(arg){
    return arg.startsWith("--") && arg.includes("=");
}

Tak to wygląda:

const process = require('process'); 

var args = process.argv; 

console.log(`number of arguments is ${args.length - 2}`); 
  
args.forEach((val, index) => { 
    if(index >= 2){
        console.log(`${index-1}: ${val}`); 
        console.log(isNamedArg(val));
    }
        
}); 

function isNamedArg(arg){
    return arg.startsWith("--") && arg.includes("=");
}

// node .\argsy2.js "blabla bla" --named=namedArg
// number of arguments is 2
// 1: blabla bla
// false
// 2: --named=namedArg
// true

Niestety w pętli forEach nie można korzystać z continue/break (de facto to jest funkcja nie pętla) więc nasz kod nie będzie najpiękniejszy:

function getArgs(){

    let arguments = {
        named: [],
        simple: []
    };

    process.argv.forEach((val, index)=> {
        if(index>=2){
            if(!isNamedArg(val)){
                arguments.simple.push(val);
            }
            else{
                const [argName, argVal] = val.split("=")
                const namedArg = {
                    name: argName.slice(2),
                    value: argVal
                }
                arguments.named.push(namedArg);
               }
            }    
        });
        
    return arguments;
    }

Jeszcze ta nazwa arguments – wbudowaną zmienną przykrywa, ale ok, chodzi o przykład:

const process = require('process'); 

var args = process.argv; 

console.log(`number of arguments is ${args.length - 2}`); 

function isNamedArg(arg){
    return arg.startsWith("--") && arg.includes("=");
}

function getArgs(){

    let arguments = {
        named: [],
        simple: []
    };

    process.argv.forEach((val, index)=> {
        if(index>=2){
            if(!isNamedArg(val)){
                arguments.simple.push(val);
            }
            else{
                const [argName, argVal] = val.split("=")
                const namedArg = {
                    name: argName.slice(2),
                    value: argVal
                }
                arguments.named.push(namedArg);
               }
            }    
        });

    return arguments;
    }


let argsy = getArgs();
console.log(argsy);

// >node .\argsy2.js "blabla bla" --named=namedArg
// number of arguments is 2
// {
//   named: [ { name: 'named', value: 'namedArg' } ],
//   simple: [ 'blabla bla' ]
// }

Dalej już sobie raczej poradzimy, albo skorzystamy z gotowych bibliotek do pracy z CLI.