From 4d134a613d069d97bfa517aede0868b54239e40d Mon Sep 17 00:00:00 2001 From: AnimeDL Date: Tue, 16 Apr 2024 08:35:20 -0700 Subject: [PATCH] Add unknown option suggestion and warning --- modules/module.app-args.ts | 38 ++++++++++++++++++++++++++++++++------ package.json | 1 + pnpm-lock.yaml | 8 ++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/modules/module.app-args.ts b/modules/module.app-args.ts index 513870f..afe94f8 100644 --- a/modules/module.app-args.ts +++ b/modules/module.app-args.ts @@ -3,6 +3,8 @@ import { args, AvailableMuxer, groups } from './module.args'; import { LanguageItem } from './module.langsData'; import { DownloadInfo } from '../@types/messageHandler'; import { HLSCallback } from './hls-download'; +import leven from 'leven'; +import { console } from './log'; let argvC: { [x: string]: unknown; @@ -113,15 +115,15 @@ const getArgv = (cfg: { [key:string]: unknown }, isGUI: boolean) => { return cfg[key] as T; } else return _default; - }; - + }; const argv = yargs.parserConfiguration({ 'duplicate-arguments-array': false, 'camel-case-expansion': false, }) .wrap(yargs.terminalWidth()) .usage('Usage: $0 [options]') - .help(true).version(false); + .help(true); + //.strictOptions() const data = args.map(a => { return { ...a, @@ -143,7 +145,31 @@ const getArgv = (cfg: { [key:string]: unknown }, isGUI: boolean) => { }, choices: item.name === 'service' && isGUI ? undefined : item.choices as unknown as Choices }); - return argv as unknown as yargs.Argv; -}; + + // Custom logic for suggesting corrections for misspelled options + argv.middleware((argv: Record) => { + // List of valid options + const validOptions = [ + ...args.map(a => a.name), + ...args.map(a => a.alias).filter(alias => alias !== undefined) as string[] + ]; + const unknownOptions = Object.keys(argv).filter(key => !validOptions.includes(key) && key !== '_' && key !== '$0'); // Filter out known options + + const suggestedOptions: Record = {}; + unknownOptions.forEach(actualOption => { + const closestOption = validOptions.find(option => { + const levenVal = leven(option, actualOption); + return levenVal <= 2 && levenVal > 0; + }); - \ No newline at end of file + if (closestOption && !suggestedOptions[closestOption]) { + suggestedOptions[closestOption] = true; + console.info(`Unknown option ${actualOption}, did you mean ${closestOption}?`); + } else if (!suggestedOptions[actualOption]) { + suggestedOptions[actualOption] = true; + console.info(`Unknown option ${actualOption}`); + } + }); + }); + return argv as unknown as yargs.Argv; +}; \ No newline at end of file diff --git a/package.json b/package.json index 3157e98..598d1d3 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "fs-extra": "^11.2.0", "got": "^11.8.6", "iso-639": "^0.2.2", + "leven": "^3.1.0", "log4js": "^6.9.1", "long": "^5.2.3", "lookpath": "^1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f622e0d..33829f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ dependencies: iso-639: specifier: ^0.2.2 version: 0.2.2 + leven: + specifier: ^3.1.0 + version: 3.1.0 log4js: specifier: ^6.9.1 version: 6.9.1 @@ -4635,6 +4638,11 @@ packages: language-subtag-registry: 0.3.22 dev: true + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: false + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'}