haystacks-tt
Version:
A simple Haystacks-async based command line typing tutor program for Windows, Mac & Linux.
1,157 lines • 526 kB
JSON
{
"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",
"