Add unknown option suggestion and warning

This commit is contained in:
AnimeDL 2024-04-16 08:35:20 -07:00
parent 0927e8287c
commit 4d134a613d
3 changed files with 41 additions and 6 deletions

View file

@ -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<typeof argvC>;
};
// Custom logic for suggesting corrections for misspelled options
argv.middleware((argv: Record<string, any>) => {
// 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<string, boolean> = {};
unknownOptions.forEach(actualOption => {
const closestOption = validOptions.find(option => {
const levenVal = leven(option, actualOption);
return levenVal <= 2 && levenVal > 0;
});
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<typeof argvC>;
};

View file

@ -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",

View file

@ -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'}