2026-01-26 20:27:38 +03:00
|
|
|
|
import { ParsedArgs } from './types';
|
|
|
|
|
|
|
|
|
|
|
|
export function printHelp() {
|
|
|
|
|
|
const lines = [
|
|
|
|
|
|
'Использование:',
|
2026-01-27 12:33:11 +03:00
|
|
|
|
' npx @gromlab/create <шаблон> <имя> [путь] [опции]',
|
|
|
|
|
|
'',
|
|
|
|
|
|
'Аргументы:',
|
|
|
|
|
|
' <шаблон> Имя шаблона',
|
|
|
|
|
|
' <имя> Значение переменной name (обязательный аргумент)',
|
|
|
|
|
|
' [путь] Папка вывода (по умолчанию: текущая директория)',
|
2026-01-26 20:27:38 +03:00
|
|
|
|
'',
|
|
|
|
|
|
'Опции:',
|
|
|
|
|
|
' --<var> <value> Переменная шаблона (поддерживается любой --key <value>)',
|
|
|
|
|
|
' --overwrite Перезаписывать существующие файлы',
|
2026-01-27 12:33:11 +03:00
|
|
|
|
' --skip-update Не проверять обновления CLI',
|
2026-01-26 20:27:38 +03:00
|
|
|
|
' -h, --help Показать эту справку',
|
|
|
|
|
|
'',
|
|
|
|
|
|
'Примеры:',
|
2026-01-27 12:33:11 +03:00
|
|
|
|
' npx @gromlab/create component Button',
|
|
|
|
|
|
' npx @gromlab/create component Button src/components'
|
2026-01-26 20:27:38 +03:00
|
|
|
|
];
|
|
|
|
|
|
console.log(lines.join('\n'));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function consumeValue(args: string[], index: number, key: string): string {
|
|
|
|
|
|
const next = args[index + 1];
|
|
|
|
|
|
if (!next || next.startsWith('-')) {
|
|
|
|
|
|
throw new Error(`Missing value for --${key}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
return next;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function parseArgs(argv: string[]): ParsedArgs {
|
|
|
|
|
|
const parsed: ParsedArgs = {
|
|
|
|
|
|
vars: {},
|
|
|
|
|
|
overwrite: false,
|
2026-01-27 12:33:11 +03:00
|
|
|
|
skipUpdate: false,
|
2026-01-26 20:27:38 +03:00
|
|
|
|
help: false,
|
|
|
|
|
|
extra: []
|
|
|
|
|
|
};
|
|
|
|
|
|
const args = argv.slice(2);
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < args.length; i++) {
|
|
|
|
|
|
const arg = args[i];
|
|
|
|
|
|
|
|
|
|
|
|
if (arg === '-h' || arg === '--help') {
|
|
|
|
|
|
parsed.help = true;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (arg === '--overwrite') {
|
|
|
|
|
|
parsed.overwrite = true;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2026-01-27 12:33:11 +03:00
|
|
|
|
if (arg === '--skip-update') {
|
|
|
|
|
|
parsed.skipUpdate = true;
|
2026-01-26 20:27:38 +03:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (arg.startsWith('--')) {
|
|
|
|
|
|
const eqIndex = arg.indexOf('=');
|
|
|
|
|
|
const key = eqIndex === -1 ? arg.slice(2) : arg.slice(2, eqIndex);
|
|
|
|
|
|
const inlineValue = eqIndex === -1 ? undefined : arg.slice(eqIndex + 1);
|
|
|
|
|
|
|
|
|
|
|
|
if (!key) continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (key === 'templates' || key === 'templatesPath' || key === 'templates-path') {
|
2026-01-27 12:33:11 +03:00
|
|
|
|
throw new Error('Опция --templates не поддерживается');
|
2026-01-26 20:27:38 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (key === 'out' || key === 'output') {
|
2026-01-27 12:33:11 +03:00
|
|
|
|
throw new Error('Опция --out не поддерживается');
|
2026-01-26 20:27:38 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const value = inlineValue ?? consumeValue(args, i, key);
|
|
|
|
|
|
if (inlineValue === undefined) i++;
|
|
|
|
|
|
parsed.vars[key] = value;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!parsed.templateName) {
|
|
|
|
|
|
parsed.templateName = arg;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!parsed.positionalName) {
|
|
|
|
|
|
parsed.positionalName = arg;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-27 12:33:11 +03:00
|
|
|
|
if (!parsed.positionalOutDir) {
|
|
|
|
|
|
parsed.positionalOutDir = arg;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-26 20:27:38 +03:00
|
|
|
|
parsed.extra.push(arg);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return parsed;
|
|
|
|
|
|
}
|