import minimist from 'minimist';
import type { CliConfig } from './cli';
import { LogLevel, OptionsError } from '../system';
import { getInstallerOptions, InstallerOptions } from "../options";
import { getGlobalTsDir } from "../utils";
/* ****************************************************************************************************************** */
// region: Types
/* ****************************************************************************************************************** */
export interface CliOptions {
silent: boolean;
global: boolean;
verbose: boolean;
dir: string;
color: boolean;
}
// endregion
/* ****************************************************************************************************************** */
// region: Config
/* ****************************************************************************************************************** */
/** @internal */
export const cliOptionsConfig: CliConfig = {
silent: { short: 's', caption: 'Run silently' },
global: { short: 'g', caption: 'Target global TypeScript installation' },
verbose: { short: 'v', caption: 'Chat it up' },
cache: { inverse: true, caption: 'Skip cache' },
dir: {
short: 'd',
paramCaption: '
',
caption: 'TypeScript directory or directory to resolve typescript package from'
},
color: { inverse: true, caption: 'Strip ansi colours from output' }
};
// endregion
/* ****************************************************************************************************************** */
// region: Utils
/* ****************************************************************************************************************** */
export function getCliOptions(args: minimist.ParsedArgs) {
let res: CliOptions = {};
for (const [ key, { short } ] of Object.entries(cliOptionsConfig)) {
if (args.hasOwnProperty(key) || (short && args.hasOwnProperty(short))) {
(res)[key] = args.hasOwnProperty(key) ? args[key] : args[short!];
}
}
return res;
}
export function getInstallerOptionsFromCliOptions(cliOptions: CliOptions): InstallerOptions {
let partialOptions: Partial = {};
/* Dir option */
if (cliOptions.global && cliOptions.dir) throw new OptionsError(`Cannot specify both --global and --dir`);
if ('dir' in cliOptions) partialOptions.dir = cliOptions.dir;
if ('global' in cliOptions) partialOptions.dir = getGlobalTsDir();
/* LogLevel option */
if (cliOptions.silent && cliOptions.verbose) throw new OptionsError(`Cannot specify both --silent and --verbose`);
if (cliOptions.silent) {
partialOptions.logLevel = LogLevel.system;
partialOptions.silent = true;
}
else if (cliOptions.verbose) partialOptions.logLevel = LogLevel.verbose;
/* Color option */
if (cliOptions.color) partialOptions.useColor = cliOptions.color;
return getInstallerOptions(partialOptions);
}
// endregion