mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-04-26 16:19:26 -07:00
fix(launcher): reject --candidates and --select when used together
- Validate mutually exclusive dictionary CLI flags; exit 1 with clear error - Add parseArgs test covering the conflicting-flags rejection path - Fix test helper to overwrite capture file (>) instead of appending (>>)
This commit is contained in:
@@ -219,12 +219,17 @@ export function parseCliPrograms(
|
|||||||
.option('--select <id>', 'Pin an AniList media ID for the target series')
|
.option('--select <id>', 'Pin an AniList media ID for the target series')
|
||||||
.option('--log-level <level>', 'Log level')
|
.option('--log-level <level>', 'Log level')
|
||||||
.action((target: string | undefined, options: Record<string, unknown>) => {
|
.action((target: string | undefined, options: Record<string, unknown>) => {
|
||||||
|
const selectValue = typeof options.select === 'string' ? options.select.trim() : '';
|
||||||
|
const hasSelect = selectValue.length > 0;
|
||||||
|
if (options.candidates === true && hasSelect) {
|
||||||
|
throw new Error('Dictionary --candidates and --select cannot be combined.');
|
||||||
|
}
|
||||||
dictionaryTriggered = true;
|
dictionaryTriggered = true;
|
||||||
dictionaryTarget = target ?? null;
|
dictionaryTarget = target ?? null;
|
||||||
dictionaryLogLevel = typeof options.logLevel === 'string' ? options.logLevel : null;
|
dictionaryLogLevel = typeof options.logLevel === 'string' ? options.logLevel : null;
|
||||||
dictionaryCandidates = options.candidates === true;
|
dictionaryCandidates = options.candidates === true;
|
||||||
dictionarySelect = typeof options.select === 'string';
|
dictionarySelect = hasSelect;
|
||||||
dictionaryAnilistId = typeof options.select === 'string' ? options.select : null;
|
dictionaryAnilistId = hasSelect ? selectValue : null;
|
||||||
});
|
});
|
||||||
|
|
||||||
commandProgram
|
commandProgram
|
||||||
|
|||||||
@@ -477,7 +477,7 @@ test('dictionary command forwards manual AniList selection modes to app command
|
|||||||
const capturePath = path.join(root, 'captured-args.txt');
|
const capturePath = path.join(root, 'captured-args.txt');
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
appPath,
|
appPath,
|
||||||
'#!/bin/sh\nif [ -n "$SUBMINER_TEST_CAPTURE" ]; then printf "%s\\n" "$@" >> "$SUBMINER_TEST_CAPTURE"; fi\nexit 0\n',
|
'#!/bin/sh\nif [ -n "$SUBMINER_TEST_CAPTURE" ]; then printf "%s\\n" "$@" > "$SUBMINER_TEST_CAPTURE"; fi\nexit 0\n',
|
||||||
);
|
);
|
||||||
fs.chmodSync(appPath, 0o755);
|
fs.chmodSync(appPath, 0o755);
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,14 @@ test('parseArgs maps dictionary candidate lookup and manual selection', () => {
|
|||||||
assert.equal(selectParsed.dictionaryTarget, process.cwd());
|
assert.equal(selectParsed.dictionaryTarget, process.cwd());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('parseArgs rejects conflicting dictionary candidate and selection modes', () => {
|
||||||
|
const exit = withProcessExitIntercept(() => {
|
||||||
|
parseArgs(['dictionary', '--candidates', '--select', '21355', '.'], 'subminer', {});
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(exit.code, 1);
|
||||||
|
});
|
||||||
|
|
||||||
test('parseArgs maps stats command and log-level override', () => {
|
test('parseArgs maps stats command and log-level override', () => {
|
||||||
const parsed = parseArgs(['stats', '--log-level', 'debug'], 'subminer', {});
|
const parsed = parseArgs(['stats', '--log-level', 'debug'], 'subminer', {});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user