@okwesil/type-test
Version:
Simple typing test program for the command line
91 lines (82 loc) • 3.12 kB
JavaScript
import { existsSync, readFileSync, writeFileSync } from "fs";
import { dirname, join } from "path";
import { fileURLToPath } from "url";
import PromptSync from "prompt-sync";
import chalk from "chalk";
import { toggleDebugMode, debugMode } from "./index.js";
export const PROGRAM_DIRECTORY = dirname(dirname(fileURLToPath(import.meta.url)));
export const SAVE_FILE = join(PROGRAM_DIRECTORY, "save.json");
export const VERSION = JSON.parse(readFileSync(join(PROGRAM_DIRECTORY, "package.json"))).version;
/**
* @typedef SaveData
* @type {Object}
* @property {number} textLength
* @property {number} personalBest
* @property {number} correctCharactersTyped
* @property {number} testsCompleted
*/
/**
*
* @returns {SaveData}
*/
export function loadSave() {
if (!existsSync(SAVE_FILE)) {
defaultSave();
}
/**
* @type {SaveData}
*/
const save = JSON.parse(readFileSync(SAVE_FILE));
save.personalBest = parseInt(save.personalBest) || 0
save.textLength = parseInt(save.textLength) || 0
save.correctCharactersTyped = parseInt(save.correctCharactersTyped) || 0
return save
}
export const defaultSave = () => save(0, 12, 0, 0);
/**
*
* @param {...SaveData}
*/
export function save(
personalBest = loadSave().personalBest,
textLength = loadSave().textLength,
correctCharactersTyped = loadSave().correctCharactersTyped,
testsCompleted = loadSave().testsCompleted
) {
writeFileSync(SAVE_FILE, JSON.stringify({ personalBest, textLength, correctCharactersTyped, testsCompleted }, undefined, 4), { encoding: "utf8" }, () => null);
}
export function settingsMenu() {
console.log(`1 -> Text Length: ${chalk.bold.green(loadSave().textLength)}`);
console.log(`2 -> ${chalk.bold.red("Wipe save")}`);
console.log(`3 -> Debug Mode: ${chalk.bold.blue(debugMode.toString())}`);
console.log(`4 -> ${chalk.bold.green("Stats")}`);
switch (PromptSync()()) {
case "1":
let response;
do {
response = parseInt(PromptSync()("Input a number: "));
} while (isNaN(response))
if (response < 5) {
console.log(chalk.bold.red("5 is the minimum word count; text length has been set to 5"));
}
if (response > 65) {
console.log(chalk.bold.red("65 is the maximum word count; text length has been set to 65"));
}
// 5 is the minimum, 65 is maximum
response = Math.max(Math.min(response, 65), 5);
save(null, response);
console.log(chalk.bold.green("Saved"));
break;
case "2":
defaultSave();
console.log(chalk.bold.red("Save has been reset"))
break;
case "3":
toggleDebugMode();
console.log(`Debug Mode: ${chalk.bold.green(debugMode.toString())}`);
break;
case "4":
console.dir(loadSave(), { depth: 0, colors: true });
break;
}
}