一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
50 行
1.5 KiB
TypeScript
50 行
1.5 KiB
TypeScript
import { _ } from '@joplin/lib/locale';
|
|
import BaseCommand from './base-command';
|
|
import { Store } from 'redux';
|
|
|
|
interface PromptOptions {
|
|
type?: string;
|
|
booleanAnswerDefault?: string;
|
|
answers?: string[];
|
|
secure?: boolean;
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- gui() returns AppGui, which is an untyped JS module (app-gui.js)
|
|
export default (cmd: BaseCommand, stdout: (text: string)=> void, store: ()=> Store, gui: ()=> any) => {
|
|
cmd.setStdout((text: string) => {
|
|
return stdout(text);
|
|
});
|
|
|
|
cmd.setDispatcher(action => {
|
|
if (store()) {
|
|
return store().dispatch(action);
|
|
} else {
|
|
return () => {};
|
|
}
|
|
});
|
|
|
|
cmd.setPrompt(async (message: string, options: PromptOptions) => {
|
|
if (!options) options = {};
|
|
if (!options.type) options.type = 'boolean';
|
|
if (!options.booleanAnswerDefault) options.booleanAnswerDefault = 'y';
|
|
if (!options.answers) options.answers = options.booleanAnswerDefault === 'y' ? [_('Y'), _('n')] : [_('N'), _('y')];
|
|
|
|
if (options.type === 'boolean') {
|
|
message += ` (${options.answers.join('/')})`;
|
|
}
|
|
|
|
let answer = await gui().prompt('', `${message} `, options);
|
|
|
|
if (options.type === 'boolean') {
|
|
if (answer === null) return false; // Pressed ESCAPE
|
|
if (!answer) answer = options.answers[0];
|
|
const positiveIndex = options.booleanAnswerDefault === 'y' ? 0 : 1;
|
|
return answer.toLowerCase() === options.answers[positiveIndex].toLowerCase();
|
|
} else {
|
|
return answer;
|
|
}
|
|
});
|
|
|
|
return cmd;
|
|
};
|