UNPKG

haystacks-tt

Version:

A simple Haystacks-async based command line typing tutor program for Windows, Mac & Linux.

1,157 lines 526 kB
{ "LessonCurriculumName": "TypingForProgrammers", "CurriculumNumber": 2, "CurriculumOrderRequirement": "Not Required", "ListOfCurriculumPrerequisites": "0,1", "LessonPlan": [{ "Lesson_0001": { "Name": "Lesson_0001", "Number": 1, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.0, "SpeedRequirement": 10 }], "Description": "Hello World in JavaScript", "Lines": [{ "Line_01": "console.log('Hello, World!');", "Line_02": "function greet() {", "Line_03": " return 'Hello, World!';", "Line_04": "}", "Line_05": "let message = greet();", "Line_06": "console.log(message);", "Line_07": "if (message === 'Hello, World!') {", "Line_08": " console.log('Greeting confirmed.');", "Line_09": "} else {", "Line_10": " console.log('Unexpected greeting.');", "Line_11": "}" }] }, "Lesson_0002": { "Name": "Lesson_0002", "Number": 2, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.066889, "SpeedRequirement": 10.100334 }], "Description": "Bubble Sort function in JavaScript", "Lines": [{ "Line_01": "function bubbleSort(arr) {", "Line_02": " let len = arr.length;", "Line_03": " for (let i = 0; i < len; i++) {", "Line_04": " for (let j = 0; j < len - i - 1; j++) {", "Line_05": " if (arr[j] > arr[j + 1]) {", "Line_06": " let temp = arr[j];", "Line_07": " arr[j] = arr[j + 1];", "Line_08": " arr[j + 1] = temp;", "Line_09": " }", "Line_10": " }", "Line_11": " }", "Line_12": " return arr;", "Line_13": "}" }] }, "Lesson_0003": { "Name": "Lesson_0003", "Number": 3, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.133778, "SpeedRequirement": 10.200669 }], "Description": "Recursive Factorial Function in JavaScript", "Lines": [{ "Line_01": "function factorial(n) {", "Line_02": " if (n === 0) {", "Line_03": " return 1;", "Line_04": " } else {", "Line_05": " return n * factorial(n - 1);", "Line_06": " }", "Line_07": "}", "Line_08": "let result = factorial(5);", "Line_09": "console.log(result);" }] }, "Lesson_0004": { "Name": "Lesson_0004", "Number": 4, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.200667, "SpeedRequirement": 10.301003 }], "Description": "Constants", "Lines": [{ "Line_01": "export const ccreateAccount = 'createAccount';", "Line_02": "export const cprintAccountsData = 'printAccountsData';", "Line_03": "export const cprintAccountData = 'printAccountData';", "Line_04": "export const cdeleteAccount = 'deleteAccount';", "Line_05": "export const clogin = 'login';", "Line_06": "export const clogout = 'logout';", "Line_07": "export const cstartLesson = 'startLesson';", "Line_08": "export const cgenerateUserReport = 'generateUserReport';", "Line_09": "export const cprintRecords = 'printRecords';", "Line_10": "export const cdestroyRecords = 'destroyRecords';" }] }, "Lesson_0005": { "Name": "Lesson_0005", "Number": 5, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.267556, "SpeedRequirement": 10.401338 }], "Description": "Basic Variables in JavaScript", "Lines": [{ "Line_01": "let name = 'John';", "Line_02": "const age = 30;", "Line_03": "var isStudent = true;", "Line_04": "let city = 'New York';", "Line_05": "const country = 'USA';", "Line_06": "var grade = 'A';", "Line_07": "let height = 5.9;", "Line_08": "const PI = 3.14;", "Line_09": "var score = 100;", "Line_10": "let isActive = false;" }] }, "Lesson_0006": { "Name": "Lesson_0006", "Number": 6, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.334445, "SpeedRequirement": 10.501672 }], "Description": "Math Operations in JavaScript", "Lines": [{ "Line_01": "let sum = 5 + 3;", "Line_02": "let difference = 10 - 6;", "Line_03": "let product = 4 * 7;", "Line_04": "let quotient = 20 \/ 5;", "Line_05": "let remainder = 10 % 3;", "Line_06": "let power = 2 ** 3;", "Line_07": "let increment = 5;", "Line_08": "++preIncrement;", "Line_09": "postIncrement++;", "Line_10": "let decrement = 5;", "Line_11": "--preDecrement;", "Line_12": "postDecrement--;" }] }, "Lesson_0007": { "Name": "Lesson_0007", "Number": 7, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.401334, "SpeedRequirement": 10.602007 }], "Description": "String Concatenation in JavaScript", "Lines": [{ "Line_01": "let firstName = 'John';", "Line_02": "let lastName = 'Doe';", "Line_03": "let fullName = firstName + ' ' + lastName;", "Line_04": "let greeting = 'Hello, ' + fullName + '!';", "Line_05": "let city = 'New York';", "Line_06": "let message = 'Welcome to ' + city + '.';", "Line_07": "let age = 30;", "Line_08": "let ageMessage = 'You are ' + age + ' years old.';", "Line_09": "let intro = 'My name is ' + firstName + '.';", "Line_10": "let hobby = 'I enjoy ' + 'coding' + '.';" }] }, "Lesson_0008": { "Name": "Lesson_0008", "Number": 8, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.468223, "SpeedRequirement": 10.702341 }], "Description": "Conditional Statements in JavaScript", "Lines": [{ "Line_01": "let age = 20;", "Line_02": "if (age >= 18) {", "Line_03": " console.log('Adult');", "Line_04": "} else {", "Line_05": " console.log('Minor');", "Line_06": "}", "Line_07": "let score = 85;", "Line_08": "if (score >= 90) {", "Line_09": " console.log('A');", "Line_10": "} else if (score >= 80) {", "Line_11": " console.log('B');", "Line_12": "} else {", "Line_13": " console.log('C');", "Line_14": "}", "Line_15": "let isMember = true;", "Line_16": "if (isMember) {", "Line_17": " console.log('Welcome member!');", "Line_18": "} else {", "Line_19": " console.log('Sign up for membership.');", "Line_20": "}" }] }, "Lesson_0009": { "Name": "Lesson_0009", "Number": 9, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.535112, "SpeedRequirement": 10.802676 }], "Description": "For Loops & Nested For Loops in JavaScript", "Lines": [{ "Line_01": "for (let i = 0; i < 5; i++) {", "Line_02": " console.log('Iteration ' + i);", "Line_03": "}", "Line_04": "for (let i = 1; i <= 3; i++) {", "Line_05": " for (let j = 1; j <= 3; j++) {", "Line_06": " console.log('i=' + i + ', j=' + j);", "Line_07": " }", "Line_08": "}", "Line_09": "let sum = 0;", "Line_10": "for (let k = 1; k <= 10; k++) {", "Line_11": " sum += k;", "Line_12": "}", "Line_13": "console.log('Total sum is ' + sum);", "Line_14": "for (let a = 0; a < 2; a++) {", "Line_15": " for (let b = 0; b < 2; b++) {", "Line_16": " console.log('Nested loop ' + a + ',' + b);", "Line_17": " }", "Line_18": "}" }] }, "Lesson_0010": { "Name": "Lesson_0010", "Number": 10, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.602001, "SpeedRequirement": 10.903010 }], "Description": "While Loops in JavaScript", "Lines": [{ "Line_01": "let count = 0;", "Line_02": "while (count < 5) {", "Line_03": " console.log('Count is ' + count);", "Line_04": " count++;", "Line_05": "}", "Line_06": "let sum = 0;", "Line_07": "let number = 1;", "Line_08": "while (number <= 10) {", "Line_09": " sum += number;", "Line_10": " number++;", "Line_11": "}", "Line_12": "console.log('Total sum is ' + sum);", "Line_13": "let n = 5;", "Line_14": "while (n > 0) {", "Line_15": " console.log('n is ' + n);", "Line_16": " n--;", "Line_17": "}", "Line_18": "let i = 0;", "Line_19": "while (i < 3) {", "Line_20": " console.log('Iteration ' + i);", "Line_21": " i++;", "Line_22": "}" }] }, "Lesson_0011": { "Name": "Lesson_0011", "Number": 11, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.668890, "SpeedRequirement": 11.003344 }], "Description": "Arrays Basics in JavaScript", "Lines": [{ "Line_01": "let fruits = ['apple', 'banana', 'cherry'];", "Line_02": "console.log(fruits[0]);", "Line_03": "console.log(fruits[1]);", "Line_04": "console.log(fruits[2]);", "Line_05": "fruits.push('date');", "Line_06": "console.log(fruits);", "Line_07": "fruits.pop();", "Line_08": "console.log(fruits);", "Line_09": "let numbers = [1, 2, 3, 4, 5];", "Line_10": "for (let i = 0; i < numbers.length; i++) {", "Line_11": " console.log(numbers[i]);", "Line_12": "}", "Line_13": "let mixed = ['text', 10, true];", "Line_14": "console.log(mixed[0]);", "Line_15": "console.log(mixed[1]);", "Line_16": "console.log(mixed[2]);" }] }, "Lesson_0012": { "Name": "Lesson_0012", "Number": 12, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.735779, "SpeedRequirement": 11.103679 }], "Description": "Array Methods in JavaScript", "Lines": [{ "Line_01": "let numbers = [1, 2, 3, 4, 5];", "Line_02": "let doubled = numbers.map(x => x * 2);", "Line_03": "console.log(doubled);", "Line_04": "let filtered = numbers.filter(x => x % 2 === 0);", "Line_05": "console.log(filtered);", "Line_06": "let sum = numbers.reduce((acc, curr) => acc + curr, 0);", "Line_07": "console.log(sum);", "Line_08": "let first = numbers.find(x => x > 3);", "Line_09": "console.log(first);", "Line_10": "numbers.forEach(x => console.log(x));", "Line_11": "let sorted = numbers.sort((a, b) => a - b);", "Line_12": "console.log(sorted);", "Line_13": "let joined = numbers.join(', ');", "Line_14": "console.log(joined);", "Line_15": "numbers.push(6);", "Line_16": "console.log(numbers);", "Line_17": "numbers.pop();", "Line_18": "console.log(numbers);" }] }, "Lesson_0013": { "Name": "Lesson_0013", "Number": 13, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.802668, "SpeedRequirement": 11.204013 }], "Description": "File Header 1", "Lines": [{ "Line_01": "\/\/ * @file haystacks-tt.js", "Line_02": "\/\/ * @module haystacks-tt", "Line_03": "\/\/ * @description This is the main init for the haystacks-tt application.", "Line_04": "\/\/ * It contains just enough of the main program loop", "Line_05": "\/\/ * and basic argument parsing to function as an", "Line_06": "\/\/ * interactive typing tutor application.", "Line_07": "\/\/ * @requires module:accountBroker", "Line_08": "\/\/ * @requires module:tutoringRules", "Line_09": "\/\/ * @requires module:tutoringCommands", "Line_10": "\/\/ * @requires module:application.command.constants", "Line_11": "\/\/ * @requires module:application.configuration.constants", "Line_12": "\/\/ * @requires module:application.constants", "Line_13": "\/\/ * @requires module:application.function.constants", "Line_14": "\/\/ * @requires module:application.message.constants", "Line_15": "\/\/ * @requires module:allApplicationConstantsValidationMetadata", "Line_16": "\/\/ * @requires {@link https:\/\/www.npmjs.com\/package\/@haystacks\/async|@haystacks\/async}", "Line_17": "\/\/ * @requires {@link https:\/\/www.npmjs.com\/package\/@haystacks\/constants|@haystacks\/constants}", "Line_18": "\/\/ * @requires {@link https:\/\/www.npmjs.com\/package\/url|url}", "Line_19": "\/\/ * @requires {@link https:\/\/www.npmjs.com\/package\/dotenv|dotenv}", "Line_20": "\/\/ * @requires {@link https:\/\/www.npmjs.com\/package\/path|path}", "Line_21": "\/\/ * @author Seth Hollingsead", "Line_22": "\/\/ * @date 2023\/02\/23" }] }, "Lesson_0014": { "Name": "Lesson_0014", "Number": 14, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.869557, "SpeedRequirement": 11.304348 }], "Description": "Import Statements", "Lines": [{ "Line_01": "\/\/ Internal imports", "Line_02": "import accountBroker from '.\/brokers\/accountBroker.js';", "Line_03": "import tutoringRules from '.\/businessRules\/tutoringRulesLibrary.js';", "Line_04": "import tutoringCommands from '.\/commands\/tutoringCommandsLibrary.js';", "Line_05": "import * as app_cmd from '.\/constants\/application.command.constants.js';", "Line_06": "import * as app_cfg from '.\/constants\/application.configuration.constants.js';", "Line_07": "import * as apc from '.\/constants\/application.constants.js';", "Line_08": "import * as app_msg from '.\/constants\/application.message.constants.js';", "Line_09": "import * as app_sys from '.\/constants\/application.system.constants.js';", "Line_10": "import allAppCV from '.\/resources\/constantsValidation\/allApplicationConstantsValidationMetadata.js';", "Line_11": "\/\/ External imports", "Line_12": "import haystacks from '@haystacks\/async';", "Line_13": "import hayConst from '@haystacks\/constants';", "Line_14": "import url from 'url';", "Line_15": "import dotenv from 'dotenv';", "Line_16": "import path from 'path';" }] }, "Lesson_0015": { "Name": "Lesson_0015", "Number": 15, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 50.936446, "SpeedRequirement": 11.404682 }], "Description": "Global Variables", "Lines": [{ "Line_01": "const {bas, msg, sys, wrd} = hayConst;", "Line_02": "let rootPath = '';", "Line_03": "let baseFileName = path.basename(import.meta.url, path.extname(import.meta.url));", "Line_04": "\/\/ application.haystacks-tt.", "Line_05": "let namespacePrefix = wrd.capplication + bas.cDot + baseFileName + bas.cDot;", "Line_06": "\/\/ eslint-disable-next-line no-undef", "Line_07": "global.appRoot = path.resolve(process.cwd());", "Line_08": "dotenv.config();", "Line_09": "\/\/ eslint-disable-next-line no-undef", "Line_10": "const {NODE_ENV} = process.env;", "Line_11": "let exitConditionArrayIndex = 0;" }] }, "Lesson_0016": { "Name": "Lesson_0016", "Number": 16, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.003335, "SpeedRequirement": 11.505017 }], "Description": "Function Header 1", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function bootstrapApplication", "Line_03": "* @description Setup all the run-time dependencies,", "Line_04": "* execution environment, data, and configuration settings.", "Line_05": "* @return {void}", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023/02/23", "Line_08": "*/" }] }, "Lesson_0017": { "Name": "Lesson_0017", "Number": 17, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.070224, "SpeedRequirement": 11.605351 }], "Description": "Function Header 2", "Lines": [{ "Line_01": "/**", "Line_02": "* @function application", "Line_03": "* @description This is the main program loop,", "Line_04": "* the init for the Haystacks-TT application.", "Line_05": "* @return {void}", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023/02/23", "Line_08": "*/" }] }, "Lesson_0018": { "Name": "Lesson_0018", "Number": 18, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.137113, "SpeedRequirement": 11.705686 }], "Description": "File Header 2", "Lines": [{ "Line_01": "\/* eslint-disable no-undef *\/", "Line_02": "\/**", "Line_03": " * @file accountBroker.js", "Line_04": " * @module accountBroker", "Line_05": " * @description Contains all code for managing accounts, and account data.", "Line_06": " * @requires module:application.configuration.constants", "Line_07": " * @requires module:application.constants", "Line_08": " * @requires module:application.message.constants", "Line_09": " * @requires module:application.system.constants", "Line_10": " * @requires {@link https:\/\/www.npmjs.com\/package\/@haystacks\/async|@haystacks\/async}", "Line_11": " * @requires {@link https:\/\/www.npmjs.com\/package\/@haystacks\/constants|@haystacks\/constants}", "Line_12": " * @requires {@link https:\/\/www.npmjs.com\/package\/chalk|chalk}", "Line_13": " * @requires {@link https:\/\/www.npmjs.com\/package\/speaker|speaker}", "Line_14": " * @requires {@link https:\/\/www.npmjs.com\/package\/pcm-util|pcm-util}", "Line_15": " * @requires {@link https:\/\/www.npmjs.com\/package\/path|path}", "Line_16": " * @author Seth Hollingsead", "Line_17": " * @date 2023\/02\/28", "Line_18": " * @copyright Copyright 2023 by Seth Hollingsead. All rights reserved", "Line_19": " *\/" }] }, "Lesson_0019": { "Name": "Lesson_0019", "Number": 19, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.204002, "SpeedRequirement": 11.806020 }], "Description": "Function Header 3", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getAccountData", "Line_03": "* @description Recovers the currently loaded account data from its storage location", "Line_04": "* on the Haystacks D-data structure data storage hive.", "Line_05": "* @return {object} A JSON object that contains all of the currently loaded account data.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/02\/28", "Line_08": "*\/" }] }, "Lesson_0020": { "Name": "Lesson_0020", "Number": 20, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.270891, "SpeedRequirement": 11.906355 }], "Description": "Function Header 4", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getUserAccountData", "Line_03": "* @description Recovers data for a specific user, if the username is found.", "Line_04": "* @param {string} accountName The name of the user for which data should be recovered.", "Line_05": "* @return {object|boolean} A JSON object that contains all of a users data,", "Line_06": "* or False if no user matches the input name.", "Line_07": "* @author Seth Hollingsead", "Line_08": "* @date 2023\/02\/28", "Line_09": "*\/" }] }, "Lesson_0021": { "Name": "Lesson_0021", "Number": 21, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.337780, "SpeedRequirement": 12.006689 }], "Description": "Function Header 5", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function storeAccountData", "Line_03": "* @description Stores account data to the Haystacks", "Line_04": "* D-data structure data storage hive.", "Line_05": "* @return {boolean} True or False to indicate if the", "Line_06": "* storage was completed successfully or not.", "Line_07": "* @author Seth Hollingsead", "Line_08": "* @date 2023\/02\/28", "Line_09": "*\/" }] }, "Lesson_0022": { "Name": "Lesson_0022", "Number": 22, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.404669, "SpeedRequirement": 12.107023 }], "Description": "Function Header 6", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function appendUsersLessonScoreData", "Line_03": "* @description Adds a users lesson score data to a", "Line_04": "* users account data according to the lesson number.", "Line_05": "* @param {object} dataToAppend A JSON object that contains lesson scores data.", "Line_06": "* @param {integer} lessonNumber The lesson number for which the data should apply.", "Line_07": "* @author Seth Hollingsead", "Line_08": "* @date 2023\/03\/06", "Line_09": "*\/" }] }, "Lesson_0023": { "Name": "Lesson_0023", "Number": 23, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.471558, "SpeedRequirement": 12.207358 }], "Description": "Function Header 7", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getUsersLessonScoreData", "Line_03": "* @description Finds the lesson score data for the current user and returns the", "Line_04": "* entire collection of data for the specified lesson.", "Line_05": "* @param {integer} lessonNumber The lesson number for which the data should be returned.", "Line_06": "* @return {object} The JSON object that contains all of the", "Line_07": "* lesson data for the specified lesson number.", "Line_08": "* @author Seth Hollingsead", "Line_09": "* @date 2023\/03\/08", "Line_10": "*\/" }] }, "Lesson_0024": { "Name": "Lesson_0024", "Number": 24, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.538447, "SpeedRequirement": 12.307692 }], "Description": "Function Header 8", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function saveAccountData", "Line_03": "* @description Iterates over all of the user accounts in the system and", "Line_04": "* saves each of them out to JSON files under the accounts resource folder.", "Line_05": "* @return {boolean} True or False to indicate if", "Line_06": "* all of the save operations were successful or not.", "Line_07": "* @author Seth Hollingsead", "Line_08": "* @date 2023\/03\/07", "Line_09": "*\/" }] }, "Lesson_0025": { "Name": "Lesson_0025", "Number": 25, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.605336, "SpeedRequirement": 12.408027 }], "Description": "Function Header 9", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getLessonData", "Line_03": "* @description Recovers the currently loaded lesson data from its storage", "Line_04": "* location on the Haystacks D-data structure data storage hive.", "Line_05": "* @return {object} A JSON object that contains all of the currently loaded lesson data.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/02\/28", "Line_08": "*\/" }] }, "Lesson_0026": { "Name": "Lesson_0026", "Number": 26, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.672225, "SpeedRequirement": 12.508361 }], "Description": "Function Header 10", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getLessonCount", "Line_03": "* @description Returns the number of lessons in the curriculum.", "Line_04": "* @return {integer} The number of lessons in the current curriculum.", "Line_05": "* @author Seth Hollingsead", "Line_06": "* @date 2023\/03\/08", "Line_07": "*\/" }] }, "Lesson_0027": { "Name": "Lesson_0027", "Number": 27, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.739114, "SpeedRequirement": 12.608696 }], "Description": "Function Header 11", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getIndividualLessonData", "Line_03": "* @description Recovers the data for a specific lesson, based on an input lesson number.", "Line_04": "* @param {integer} lessonNumber The number of the lesson for which we should get data.", "Line_05": "* @return {object} A JSON object that contains lesson data for a specific lesson number.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/03\/01", "Line_08": "*\/" }] }, "Lesson_0028": { "Name": "Lesson_0028", "Number": 28, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.806003, "SpeedRequirement": 12.709030 }], "Description": "Function Header 12", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getIndividualLessonName", "Line_03": "* @description Recovers the name of a lesson, based on the input lesson number.", "Line_04": "* @param {integer} lessonNumber The number of the lesson for which we should get a lesson name.", "Line_05": "* @return {string} The name of the specified lesson.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/03\/06", "Line_08": "*\/" }] }, "Lesson_0029": { "Name": "Lesson_0029", "Number": 29, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.872892, "SpeedRequirement": 12.809365 }], "Description": "Function Header 13", "Lines": [{ "Line_01": "/**", "Line_02": "* @function doesAccountExist", "Line_03": "* @description Searches account data and determines if the account exists or does not.", "Line_04": "* @param {string} accountName The name of the account we are checking to see if it exists or not.", "Line_05": "* @return {boolean} True or False to indicate if the account exists or not.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023/02/28", "Line_08": "*/" }] }, "Lesson_0030": { "Name": "Lesson_0030", "Number": 30, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 51.939781, "SpeedRequirement": 12.909699 }], "Description": "Function Header 14", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function createAccount", "Line_03": "* @description Does all the work of creating an account from scratch and", "Line_04": "* generating all the generic account data.", "Line_05": "* @param {string} accountName The name of the account that should be generated.", "Line_06": "* @return {object} The newly created user account data with", "Line_07": "* empty lesson records for every lesson in the typing tutor curriculum.", "Line_08": "* @author Seth Hollingsead", "Line_09": "* @date 2023\/02\/28", "Line_10": "*\/" }] }, "Lesson_0031": { "Name": "Lesson_0031", "Number": 31, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.006670, "SpeedRequirement": 13.010033 }], "Description": "Function Header 15", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function removeAccount", "Line_03": "* @description Removes the specified account from the data structure.", "Line_04": "* @param {string} accountName The name of the account to be removed.", "Line_05": "* @param {object} allAccountsData A JSON object that contains all account data.", "Line_06": "* @return {object} The cleaned data structure with the account name removed.", "Line_07": "* @author Seth Hollingsead", "Line_08": "* @date 2023\/02\/28", "Line_09": "*\/" }] }, "Lesson_0032": { "Name": "Lesson_0032", "Number": 32, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.073559, "SpeedRequirement": 13.110368 }], "Description": "Function Header 16", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function generateBlankLessonData", "Line_03": "* @description Generates an array of blank lessons data for every lesson in the typing tutor curriculum.", "Line_04": "* @return {array} An array of empty JSON objects for every lesson in the typing tutor curriculum.", "Line_05": "* @author Seth Hollingsead", "Line_06": "* @date 2023\/02\/28", "Line_07": "*\/" }] }, "Lesson_0033": { "Name": "Lesson_0033", "Number": 33, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.140448, "SpeedRequirement": 13.210702 }], "Description": "Function Header 17", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function currentUserAccount", "Line_03": "* @description Gets the currently logged in user account.", "Line_04": "* @return {string} The name of the currently logged in user account.", "Line_05": "* @author Seth Hollingsead", "Line_06": "* @date 2023\/02\/28", "Line_07": "*\/" }] }, "Lesson_0034": { "Name": "Lesson_0034", "Number": 34, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.207337, "SpeedRequirement": 13.311037 }], "Description": "Function Header 17", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function loginUser", "Line_03": "* @description Does the work to login the specified username.", "Line_04": "* @param {string} accountName The username that should be logged in.", "Line_05": "* @return {boolean} True or False to indicate if the login was completed successfully or not.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/02\/28", "Line_08": "*\/" }] }, "Lesson_0035": { "Name": "Lesson_0035", "Number": 35, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.274226, "SpeedRequirement": 13.411371 }], "Description": "Function Header 18", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function logoutUser", "Line_03": "* @description Logs the specified user out of the system,", "Line_04": "* sets the currently logged in user as an empty string.", "Line_05": "* @param {string} accountName The name of the user that should be logged out.", "Line_06": "* Actually we don't even need the name of the currently logged in user to logout.", "Line_07": "* @return {boolean} True or False to indicate if the user was logged out successfully or not.", "Line_08": "* @author Seth Hollingsead", "Line_09": "* @date 2023\/02\/28", "Line_10": "*\/" }] }, "Lesson_0036": { "Name": "Lesson_0036", "Number": 36, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.341115, "SpeedRequirement": 13.511706 }], "Description": "Function Header 19", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function executeLesson", "Line_03": "* @description Does the work of executing the lesson,", "Line_04": "* print out the line the user should type as part of the lesson.", "Line_05": "* Also capture the user input and compare each character with the", "Line_06": "* expected input and format color output accordingly.", "Line_07": "* Also play a sound on the system speaker if the user types in incorrect keystroke.", "Line_08": "* @param {integer} lessonNumber The number of the lesson that should be executed.", "Line_09": "* @return {object|boolean} A JSON object that contains statistic of the lesson when it is completed,", "Line_10": "* or false if the user presses the ESC key.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/02\/28", "Line_13": "*\/" }] }, "Lesson_0037": { "Name": "Lesson_0037", "Number": 37, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.408004, "SpeedRequirement": 13.612040 }], "Description": "Function Header 20", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function executeLessonLine", "Line_03": "* @description Prompts the user with the typing tutoring lesson line,", "Line_04": "* Captures the user input as the user types it,", "Line_05": "* Checks if the user typed the correct character or not,", "Line_06": "* Tracks the time when the user starts typing the line,", "Line_07": "* and when the user is done typing the line.", "Line_08": "* Alerts each time the user makes an error by typing a", "Line_09": "* character that doesn't match the expected input.", "Line_10": "* Tracks all the errors the user makes when typing the same line.", "Line_11": "* Escapes the lesson if the user presses the ESC key.", "Line_12": "* Generates some report data that can be used to aggregate statistics", "Line_13": "* across an entire lesson by the calling function.", "Line_14": "* @param {string} lessonLineString The string of characters the", "Line_15": "* user should type into their keyboard.", "Line_16": "* @return {object} A JSON object that contains the start time, end time,", "Line_17": "* and number of errors, and the length of the string.", "Line_18": "* @author Seth Hollingsead", "Line_19": "* @date 2023\/03\/02", "Line_20": "*\/" }] }, "Lesson_0038": { "Name": "Lesson_0038", "Number": 38, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.474893, "SpeedRequirement": 13.712375 }], "Description": "Function Header 21", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function computeAverageLessonScoreValues", "Line_03": "* @description Averages all of the values across all the lines for the lesson.", "Line_04": "* @param {array<object>} scoresDataArray An array of JSON objects that", "Line_05": "* contains all of lesson data for each line in the lesson.", "Line_06": "* @param {integer} lessonNumber The number of the lesson that was executed,", "Line_07": "* used to determine if the user passed the lesson or not.", "Line_08": "* We need to inform the user if they got a passing score or not.", "Line_09": "* @return {object} A single JSON object that contains an average", "Line_10": "* or sum of all the data from all of the lines of the entire lesson.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/03\/06", "Line_13": "*\/" }] }, "Lesson_0039": { "Name": "Lesson_0039", "Number": 39, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.541782, "SpeedRequirement": 13.812709 }], "Description": "Function Header 22", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getHighestLessonCount", "Line_03": "* @description Returns a number for the highest lesson number", "Line_04": "* for the lessons currently available in the curriculum.", "Line_05": "* @return {integer} The highest lesson number available in the curriculum.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/02\/28", "Line_08": "*\/" }] }, "Lesson_0040": { "Name": "Lesson_0040", "Number": 40, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.608671, "SpeedRequirement": 13.913043 }], "Description": "Function Header 23", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getLessonAdvancementScoreLimitAccuracy", "Line_03": "* @description Recovers the configuration setting for the", "Line_04": "* lesson advancement score limit accuracy.", "Line_05": "* The accuracy that a user must get on any given", "Line_06": "* lesson before advancing to the next lesson.", "Line_07": "* @param {integer} lessonNumber Optional parameter that is the lesson number.", "Line_08": "* Should be provided if the individualized lesson passing score is enabled.", "Line_09": "* @return {integer} The highest accuracy score the user must", "Line_10": "* get before advancing to the next lesson.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/03\/01", "Line_13": "*\/" }] }, "Lesson_0041": { "Name": "Lesson_0041", "Number": 41, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.675560, "SpeedRequirement": 14.013378 }], "Description": "Function Header 24", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getLessonAdvancementScoreLimitSpeed", "Line_03": "* @description Recovers the configuration setting for the lesson advancement score limit speed.", "Line_04": "* The speed that a user must get on any given lesson before advancing to the next lesson.", "Line_05": "* @param {integer} lessonNumber Optional parameter that is the lesson number.", "Line_06": "* Should be provided if the individualized lesson passing score is enabled.", "Line_07": "* @return {integer} The highest speed score the user must get before advancing to the next lesson.", "Line_08": "* @author Seth Hollingsead", "Line_09": "* @date 2023\/03\/07", "Line_10": "*\/" }] }, "Lesson_0042": { "Name": "Lesson_0042", "Number": 42, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.742449, "SpeedRequirement": 14.113712 }], "Description": "Function Header 25", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function isLessonAdvancementLimitEnabled", "Line_03": "* @description Recovers the configuration setting that determines", "Line_04": "* if the user has enabled or disabled the lesson advancement score limit.", "Line_05": "* @return {boolean} True or False to indicate the state of the configuration setting.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2023\/03\/01", "Line_08": "*\/" }] }, "Lesson_0043": { "Name": "Lesson_0043", "Number": 43, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.809338, "SpeedRequirement": 14.214047 }], "Description": "Function Header 26", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function isIndividualizedLessonPassingScoresEnabled", "Line_03": "* @description Recovers the configuration setting that determines", "Line_04": "* if the user has enabled of disabled the individualized lesson passing score settings.", "Line_05": "* @return {boolean} True or False to indicate the state of the configuration setting.", "Line_06": "* @author Seth Hollingsead", "Line_07": "* @date 2024\/07\/15", "Line_08": "*\/" }] }, "Lesson_0044": { "Name": "Lesson_0044", "Number": 44, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.876227, "SpeedRequirement": 14.314381 }], "Description": "Function Header 27", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getHighestScoringDataObjectForLesson", "Line_03": "* @description Uses the currently logged in user and a lesson number", "Line_04": "* to determine what was the highest score the user got for that lesson.", "Line_05": "* There could be many lesson data records for each lesson.", "Line_06": "* This will find the highest score for all of them.", "Line_07": "* @param {integer} lessonNumber The lesson number", "Line_08": "* that we should get the highest score for.", "Line_09": "* @param {string} inputUserName An optional parameter to allow", "Line_10": "* for the caller to specify the current user name,", "Line_11": "* rather than requiring a user to be logged in.", "Line_12": "* @return {object} A JSON object that contains the data from the highest", "Line_13": "* scoring lesson record the user has for the specified lesson number.", "Line_14": "* @NOTE The caller of this function can use this function", "Line_15": "* to interrogate the registered users lesson records and determine", "Line_16": "* if the user is qualified to execute a specific lesson or not based", "Line_17": "* on the minimum advancement specifications as established", "Line_18": "* in the configuration settings file.", "Line_19": "* @author Seth Hollingsead", "Line_20": "* @date 2023\/03\/01", "Line_21": "*\/" }] }, "Lesson_0045": { "Name": "Lesson_0045", "Number": 45, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 52.943116, "SpeedRequirement": 14.414716 }], "Description": "Function Header 28", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function getHighestLessonNumberAboveAdvancementScoringLimit", "Line_03": "* @description Uses the currently logged in user to", "Line_04": "* scan the users data and determine what is", "Line_05": "* the highest lesson number with a score above the lesson", "Line_06": "* advancement limit, if the advancement limit is enabled.", "Line_07": "* If the limit is not enabled, then the function returns the highest", "Line_08": "* number of lessons that are currently implemented and loaded in the system.", "Line_09": "* @param {integer} lessonNumber Optional parameter that is the lesson number.", "Line_10": "* Should be provided if the individualized lesson passing score is enabled.", "Line_11": "* @return {integer} Returns the lesson number with the highest passing score,", "Line_12": "* or the number of lessons in the system, if the passing score is disabled.", "Line_13": "* @author Seth Hollingsead", "Line_14": "* @date 2023\/03\/01", "Line_15": "*/" }] }, "Lesson_0046": { "Name": "Lesson_0046", "Number": 46, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.010005, "SpeedRequirement": 14.515050 }], "Description": "Function Header 29", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function generateUserReport", "Line_03": "* @description Generates a report for the currently logged in user that shows", "Line_04": "* which tests they have passed and which ones they have not yet passed.", "Line_05": "* @param {string} inputUserName An optional input parameter", "Line_06": "* that allows the caller to specify the user name.", "Line_07": "* Rather than requiring the user to be logged in.", "Line_08": "* @return {array<array<string>,array<object>>} An array of arrays that contain", "Line_09": "* a list of the tests for which there is data,", "Line_10": "* and an array of JSON objects that contain lesson data to display.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/03\/09", "Line_13": "*\/" }] }, "Lesson_0047": { "Name": "Lesson_0047", "Number": 47, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.076894, "SpeedRequirement": 14.615385 }], "Description": "Function Header 30", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function generateReportAllUsers", "Line_03": "* @description Generates a report that contains", "Line_04": "* the highest passing lesson number", "Line_05": "* for all users registered with the system.", "Line_06": "* @return {array<array<string>,array<object>>}", "Line_07": "* An array of arrays that contain", "Line_08": "* a list of the tests for which there is data,", "Line_09": "* and an array of JSON objects that contain lesson data to display.", "Line_10": "* @author Seth Hollingsead", "Line_11": "* @date 2023\/03\/09", "Line_12": "*\/" }] }, "Lesson_0048": { "Name": "Lesson_0048", "Number": 48, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.143783, "SpeedRequirement": 14.715719 }], "Description": "Function Header 31", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function instructions", "Line_03": "* @description Provides instructions to the end user on what", "Line_04": "* steps they need to perform to get up and running and interface with the system.", "Line_05": "* @param {string} inputData Not used for this command.", "Line_06": "* @param {string} inputMetaData Not used for this command.", "Line_07": "* @return {array<boolean,string>} An array with a boolean True or False", "Line_08": "* value to indicate if the application should exit or not exit,", "Line_09": "* followed by an empty string.", "Line_10": "* @author Seth Hollingsead", "Line_11": "* @date 2023\/02\/24", "Line_12": "*\/" }] }, "Lesson_0049": { "Name": "Lesson_0049", "Number": 49, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.210672, "SpeedRequirement": 14.816054 }], "Description": "Function Header 32", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function applicationHelp", "Line_03": "* @description A command to list the application commands.", "Line_04": "* (There are no plugins for this application.)", "Line_05": "* See the Haystacks testHarness code for how to do this with plugins.", "Line_06": "* @param {string} inputData Not used for this command.", "Line_07": "* @param {string} inputMetaData Not used for this command.", "Line_08": "* @return {array<boolean,string>} An array with a boolean True or False", "Line_09": "* value to indicate if the application should exit or not exit,", "Line_10": "* followed by an empty string.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/02\/24", "Line_13": "*\/" }] }, "Lesson_0050": { "Name": "Lesson_0050", "Number": 50, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.277561, "SpeedRequirement": 14.916388 }], "Description": "Function Header 33", "Lines": [{ "Line_01": "\/**", "Line_02": "* @function applicationWorkflowHelp", "Line_03": "* @description A command to list the application workflows.", "Line_04": "* (There are no plugins for this application.)", "Line_05": "* See the Haystacks testHarness code for how to do this with plugins.", "Line_06": "* @param {string} inputData Not used for this command.", "Line_07": "* @param {string} inputMetaData Not used for this command.", "Line_08": "* @return {array<boolean,string>} An array ith a boolean True or False", "Line_09": "* value to indicate if the application should exit or not exit,", "Line_10": "* followed by an empty string.", "Line_11": "* @author Seth Hollingsead", "Line_12": "* @date 2023\/02\/24", "Line_13": "*\/" }] }, "Lesson_0051": { "Name": "Lesson_0051", "Number": 51, "IndividualizedLessonPassingCriteria": [{ "AccuracyRequirement": 53.344450, "SpeedRequirement": 15.016722 }], "Description": "File Header 3", "Lines": [{ "Line_01": "\/**", "Line_02": "* @file applicationSystem.js", "