unity-builder/cli/core/parse-argv.ts

52 lines
1.6 KiB
TypeScript

import { CliOptions } from './cli-options.ts';
/**
* Parse command line arguments
*
* Usage:
* console.dir(parseArgv(Deno.args)); // Deno
* console.log(parseArgv(process.argv)); // Node
*
* Example:
* deno run my-script -test1=1 -test2 "2" -test3 -test4 false -test5 "one" -test6= -test7=9BX9
*
* Output:
* Map {
* "test1" => 1,
* "test2" => 2,
* "test3" => true,
* "test4" => false,
* "test5" => "one",
* "test6" => "",
* "test7" => "9BX9"
* }
*/
export const parseArgv = (argv: string[] = [], { verbose = false } = {}): CliOptions => {
const providedArguments = new Map<string, string | number | boolean>();
for (let current = 0, next = 1; current < argv.length; current += 1, next += 1) {
// Detect flag
if (!argv[current].startsWith('-')) continue;
let flag = argv[current].replace(/^-+/, '');
// Detect value
const hasNextArgument = next < argv.length && !argv[next].startsWith('-');
let value: string | number | boolean = hasNextArgument ? argv[next] : 'true';
// Split combinations
const isCombination = flag.includes('=');
if (isCombination) [flag, value] = flag.split('=');
// Parse types
if (['true', 'false'].includes(value)) value = value === 'true';
else if (!Number.isNaN(Number(value)) && !Number.isNaN(Number.parseInt(value))) value = Number.parseInt(value);
// Assign
// eslint-disable-next-line no-console
if (verbose) console.log(`Found flag "${flag}" with value "${value}" (${typeof value}).`);
providedArguments.set(flag, value);
}
return providedArguments;
};