UNPKG

@okwesil/type-test

Version:

Simple typing test program for the command line

91 lines (82 loc) 3.12 kB
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; } }