i18n CLI options
This commit is contained in:
parent
3239a7c611
commit
c97472f6f5
7 changed files with 67 additions and 18 deletions
11
src/i18n.ts
11
src/i18n.ts
|
@ -1,7 +1,8 @@
|
||||||
import Language from './types/Language';
|
import Language from './types/Language';
|
||||||
|
|
||||||
|
|
||||||
export enum MessageKey {
|
export enum MessageKey {
|
||||||
|
cliHelp,
|
||||||
|
cliVersion,
|
||||||
promptWorkDayDuration,
|
promptWorkDayDuration,
|
||||||
excludingLunch,
|
excludingLunch,
|
||||||
promptStartTime,
|
promptStartTime,
|
||||||
|
@ -27,6 +28,14 @@ export enum MessageKey {
|
||||||
}
|
}
|
||||||
|
|
||||||
const messages: Record<MessageKey, Record<Language, string>> = {
|
const messages: Record<MessageKey, Record<Language, string>> = {
|
||||||
|
[MessageKey.cliHelp]: {
|
||||||
|
[Language.en]: 'Show this help',
|
||||||
|
[Language.fi]: 'Näytä tämä ohje',
|
||||||
|
},
|
||||||
|
[MessageKey.cliVersion]: {
|
||||||
|
[Language.en]: 'Show program version',
|
||||||
|
[Language.fi]: 'Näytä ohjelman versio',
|
||||||
|
},
|
||||||
[MessageKey.promptWorkDayDuration]: {
|
[MessageKey.promptWorkDayDuration]: {
|
||||||
[Language.en]: 'How long is your work day today{0}? [{1}]: ',
|
[Language.en]: 'How long is your work day today{0}? [{1}]: ',
|
||||||
[Language.fi]: 'Kuinka pitkä työpäiväsi on tänään{0}? [{1}]: ',
|
[Language.fi]: 'Kuinka pitkä työpäiväsi on tänään{0}? [{1}]: ',
|
||||||
|
|
|
@ -4,14 +4,14 @@ import * as readline from 'readline/promises';
|
||||||
import { formatDuration, formatTime } from './format';
|
import { formatDuration, formatTime } from './format';
|
||||||
import { Dayjs } from 'dayjs';
|
import { Dayjs } from 'dayjs';
|
||||||
import { WtcPromptResult } from './types/WtcPromptResult';
|
import { WtcPromptResult } from './types/WtcPromptResult';
|
||||||
import WtcConfig from './types/WtcConfig';
|
import { WtcRuntimeConfig } from './types/WtcConfig';
|
||||||
import { MessageKey, message } from './i18n';
|
import { MessageKey } from './i18n';
|
||||||
import dayjs, { Duration } from './dayjs';
|
import dayjs, { Duration } from './dayjs';
|
||||||
|
|
||||||
const { error } = console;
|
const { error } = console;
|
||||||
|
|
||||||
const input = async (config: WtcConfig): Promise<WtcPromptResult> => {
|
const input = async (runtimeCfg: WtcRuntimeConfig): Promise<WtcPromptResult> => {
|
||||||
const msg = message(config.language);
|
const { config, msg } = runtimeCfg;
|
||||||
const fmtDuration = formatDuration(config.language);
|
const fmtDuration = formatDuration(config.language);
|
||||||
const { defaults, askInput, unpaidLunchBreakDuration: lunchBreakDuration } = config;
|
const { defaults, askInput, unpaidLunchBreakDuration: lunchBreakDuration } = config;
|
||||||
const rl = readline.createInterface({
|
const rl = readline.createInterface({
|
||||||
|
|
35
src/main.ts
35
src/main.ts
|
@ -1,9 +1,38 @@
|
||||||
import yargs from 'yargs';
|
import yargs from 'yargs';
|
||||||
import { hideBin } from 'yargs/helpers';
|
import { hideBin } from 'yargs/helpers';
|
||||||
import ui from './ui.js';
|
import ui from './ui.js';
|
||||||
|
import update from './update.js';
|
||||||
|
import getConfig from './config.js';
|
||||||
|
import { MessageKey, message } from './i18n.js';
|
||||||
|
import { WtcRuntimeConfig } from './types/WtcConfig.js';
|
||||||
|
|
||||||
|
// Build runtime config
|
||||||
|
const config = getConfig();
|
||||||
|
const msg = message(config.language);
|
||||||
|
const runtimeConfig: WtcRuntimeConfig = {
|
||||||
|
config,
|
||||||
|
msg,
|
||||||
|
};
|
||||||
|
|
||||||
// Process args. Yargs will exit if it detects help or version
|
// Process args. Yargs will exit if it detects help or version
|
||||||
yargs(hideBin(process.argv)).usage('Work time calculator').alias('help', 'h').alias('version', 'v').argv;
|
const args = await yargs(hideBin(process.argv))
|
||||||
|
.usage('Work time calculator')
|
||||||
|
.alias('help', 'h')
|
||||||
|
.alias('version', 'v')
|
||||||
|
.options({
|
||||||
|
help: {
|
||||||
|
description: msg(MessageKey.cliHelp),
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
description: msg(MessageKey.cliVersion),
|
||||||
|
},
|
||||||
|
}).argv;
|
||||||
|
|
||||||
// Run UI if help or version is not prompted
|
// Run updater if requested
|
||||||
ui();
|
if (args.update) {
|
||||||
|
update();
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run UI if no arguments
|
||||||
|
ui(runtimeConfig);
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { formatDuration, getHoursRoundedStr } from './format';
|
import { formatDuration, getHoursRoundedStr } from './format';
|
||||||
import { WtcPromptResult } from './types/WtcPromptResult';
|
import { WtcPromptResult } from './types/WtcPromptResult';
|
||||||
import { MessageKey, message } from './i18n.js';
|
import { MessageKey } from './i18n.js';
|
||||||
import WtcConfig from './types/WtcConfig';
|
import { WtcRuntimeConfig } from './types/WtcConfig';
|
||||||
import dayjs from './dayjs';
|
import dayjs from './dayjs';
|
||||||
|
|
||||||
const { log } = console;
|
const { log } = console;
|
||||||
|
|
||||||
const output = (result: WtcPromptResult, config: WtcConfig) => {
|
const output = (result: WtcPromptResult, runtimeCfg: WtcRuntimeConfig) => {
|
||||||
|
const {config, msg} = runtimeCfg;
|
||||||
const { language, timestampFormat } = config;
|
const { language, timestampFormat } = config;
|
||||||
const msg = message(language);
|
|
||||||
const fmtDuration = formatDuration(language);
|
const fmtDuration = formatDuration(language);
|
||||||
const hoursRounded = getHoursRoundedStr(language);
|
const hoursRounded = getHoursRoundedStr(language);
|
||||||
const { startedAt, stoppedAt, stoppedWorking, worked, unLogged, workLeft, workedOvertime, hadLunch } = result;
|
const { startedAt, stoppedAt, stoppedWorking, worked, unLogged, workLeft, workedOvertime, hadLunch } = result;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Dayjs } from 'dayjs';
|
import { Dayjs } from 'dayjs';
|
||||||
import { Duration } from 'dayjs/plugin/duration.js';
|
import { Duration } from 'dayjs/plugin/duration.js';
|
||||||
import Language from './Language.js';
|
import Language from './Language.js';
|
||||||
|
import { message } from '../i18n.js';
|
||||||
|
|
||||||
export default interface WtcConfig {
|
export default interface WtcConfig {
|
||||||
language: Language,
|
language: Language,
|
||||||
|
@ -19,3 +20,10 @@ export default interface WtcConfig {
|
||||||
logged: boolean;
|
logged: boolean;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Config and current language msg function together */
|
||||||
|
export interface WtcRuntimeConfig {
|
||||||
|
config: WtcConfig;
|
||||||
|
msg: ReturnType<typeof message>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
import getConfig from './config.js';
|
|
||||||
import input from './input.js';
|
import input from './input.js';
|
||||||
import output from './output.js';
|
import output from './output.js';
|
||||||
|
import { WtcRuntimeConfig } from './types/WtcConfig.js';
|
||||||
|
|
||||||
const ui = async () => {
|
const ui = async (config: WtcRuntimeConfig) => output(await input(config), config);
|
||||||
const config = getConfig();
|
|
||||||
const result = await input(config);
|
|
||||||
output(result, config);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default ui;
|
export default ui;
|
||||||
|
|
7
src/update.ts
Normal file
7
src/update.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
const { log } = console;
|
||||||
|
|
||||||
|
const update = () => {
|
||||||
|
log('update');
|
||||||
|
};
|
||||||
|
|
||||||
|
export default update;
|
Loading…
Add table
Add a link
Reference in a new issue