diff --git a/dist/scorm-again.js b/dist/scorm-again.js index 2f3ada7..38b7326 100644 --- a/dist/scorm-again.js +++ b/dist/scorm-again.js @@ -1,4 +1,4 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ScormAgain = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n }\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).\n substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n const CMIElementsMatch = listener.CMIElement === CMIElement;\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n this.loadFromJSON(unflatten(json), CMIElement);\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement || 'cmi';\n\n this.startingData = json;\n\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = CMIElement + '.' + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @return {object}\n */\n processHttpRequest(url: String, params) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, false);\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n try {\n if (params instanceof Array) {\n httpReq.send(params.join('&'));\n } else {\n httpReq.send(params);\n }\n } catch (e) {\n return {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': this.#error_codes.GENERAL,\n };\n }\n\n return JSON.parse(httpReq.responseText);\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n */\n scheduleCommit(when: number) {\n this.#timeout = new ScheduledCommit(this, when);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled: false;\n #timeout;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n */\n constructor(API: any, when: number) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper, when);\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit();\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm12_constants} from './constants/api_constants';\nimport {scorm12_error_codes} from './constants/error_codes';\n\nconst constants = scorm12_constants;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n return this.terminate('LMSFinish', false);\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean }detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >=\n parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' &&\n originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject);\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm2004_constants} from './constants/api_constants';\nimport {scorm2004_error_codes} from './constants/error_codes';\nimport {correct_responses} from './constants/response_constants';\nimport {valid_languages} from './constants/language_constants';\nimport {scorm2004_regex} from './constants/regex';\n\nconst constants = scorm2004_constants;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n return this.terminate('Terminate', true);\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (typeof interaction.type === 'undefined') {\n this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = correct_responses[interaction_type];\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = scorm2004_constants.correct_responses[interaction_type];\n if (typeof response_type.limit !== 'undefined' || interaction_count <\n response_type.limit) {\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response.delimiter2 !== undefined) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (valid_languages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = 'completed';\n } else {\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score !== null &&\n this.cmi.score.scaled !== '') {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = 'passed';\n } else {\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject);\n // check if this is a sequencing call, and then call the necessary JS\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n return result;\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, CMIArray, CMIScore} from './common';\nimport {aicc_constants} from '../constants/api_constants';\nimport {aicc_regex} from '../constants/regex';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {\n check12ValidFormat,\n throwReadOnlyError,\n throwWriteOnlyError,\n} from './scorm12_cmi';\n\nconst constants = aicc_constants;\nconst regex = aicc_regex;\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_data = new AICCCMIStudentData();\n this.evaluation = new CMIEvaluation();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_data?.initialize();\n this.evaluation?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super(constants.comments_children,\n scorm12_error_codes.INVALID_SET_VALUE);\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super(aicc_constants.tries_children);\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (check12ValidFormat(content, regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check12ValidFormat(location, regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {ValidationError} from '../exceptions';\nimport {scorm12_regex} from '../constants/regex';\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new ValidationError(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any, rangePattern: String, errorCode: number) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new ValidationError(errorCode);\n }\n } else {\n throw new ValidationError(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new ValidationError(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n */\n constructor({children, errorCode}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.childArray = [];\n }\n\n #errorCode;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {scorm12_regex} from '../constants/regex';\nimport {ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\n\nconst constants = scorm12_constants;\nconst regex = scorm12_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm12_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(value, rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE, allowEmptyString);\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #suspend_data = '';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ? cmi_children : constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, regex.CMIString4096)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, regex.CMIString4096)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime();\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, regex.CMIString256)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (check12ValidFormat(lesson_status, regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n this.#session_time,\n new RegExp(scorm12_regex.CMITimespan)\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * total_time: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'total_time': this.total_time,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nclass CMIStudentPreference extends BaseCMI {\n /**\n * Constructor for cmi.student_preference\n */\n constructor() {\n super();\n }\n\n #_children = constants.student_preference_children;\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, regex.CMISInteger) &&\n check12ValidRange(audio, regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, regex.CMISInteger) &&\n check12ValidRange(speed, regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, regex.CMISInteger) &&\n check12ValidRange(text, regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, regex.CMIDecimal) &&\n check12ValidRange(weighting, regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm2004_constants} from '../constants/api_constants';\nimport {scorm2004_regex} from '../constants/regex';\nimport {scorm2004_error_codes} from '../constants/error_codes';\nimport {learner_responses} from '../constants/response_constants';\nimport {ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst constants = scorm2004_constants;\nconst regex = scorm2004_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(value, rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE);\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '0';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, regex.CMIString64000)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n return Util.addTwoDurations(\n this.#total_time,\n this.#session_time,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string,\n * total_time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n 'total_time': this.total_time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, regex.CMIDecimal) &&\n check2004ValidRange(audio_level, regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check2004ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check2004ValidFormat(weighting, regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (typeof this.type === 'undefined') {\n throw new ValidationError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type.delimiter !== '') {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (typeof response_type.delimiter2 !== 'undefined') {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throw new ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check2004ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, regex.CMIDecimal) &&\n check2004ValidRange(scaled, regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, regex.CMILangString4000, true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nexport const global_constants = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nexport const scorm12_constants = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n },\n};\n\nexport const aicc_constants = {\n ...scorm12_constants, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n tries_children: 'time,status,score',\n },\n};\n\nexport const scorm2004_constants = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n","// @flow\nexport const error_codes = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_error_codes = {\n ...error_codes, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nexport const scorm2004_error_codes = {\n ...error_codes, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n","const common_values = {\n validResult: [\n 'correct',\n 'wrong',\n 'unanticipated',\n 'neutral',\n ],\n invalidResult: [\n '-10000',\n '10000',\n 'invalid',\n ],\n\n valid0To1Range: [\n '0.0',\n '0.25',\n '0.5',\n '1.0',\n ],\n invalid0To1Range: [\n '-1',\n '-0.1',\n '1.1',\n '.25',\n ],\n\n valid0To100Range: [\n '1',\n '50',\n '100',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-1',\n ],\n\n validScaledRange: [\n '1',\n '0.5',\n '0',\n '-0.5',\n '-1',\n ],\n invalidScaledRange: [\n '-101',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n\n validIntegerScaledRange: [\n '1',\n '0',\n '-1',\n ],\n invalidIntegerScaledRange: [\n '-101',\n '-0.5',\n '0.5',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n};\n\nexport const scorm12_values = {\n ...common_values, ...{\n validLessonStatus: [\n 'passed',\n 'completed',\n 'failed',\n 'incomplete',\n 'browsed',\n ],\n invalidLessonStatus: [\n 'Passed',\n 'P',\n 'F',\n 'p',\n 'true',\n 'false',\n 'complete',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validSpeedRange: [\n '1',\n '50',\n '100',\n '-1',\n '-50',\n '-100',\n ],\n invalidSpeedRange: [\n 'invalid',\n 'a100',\n '-101',\n '101',\n '-100000',\n '100000',\n ],\n\n validScoreRange: [\n '1',\n '50.25',\n '100',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-1',\n '101',\n '-100000',\n '100000',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-2',\n ],\n\n validTime: [\n '10:06:57',\n '23:59:59',\n '00:00:00',\n ],\n invalidTime: [\n '47:59:59',\n '00:00:01.56',\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n\n validTimespan: [\n '10:06:57',\n '00:00:01.56',\n '23:59:59',\n '47:59:59',\n ],\n invalidTimespan: [\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n },\n};\n\nexport const scorm2004_values = {\n ...common_values, ...{\n // valid field values\n validTimestamps: [\n '2019-06-25',\n '2019-06-25T23:59',\n '2019-06-25T23:59:59.99',\n '1970-01-01',\n ],\n invalidTimestamps: [\n '2019-06-25T',\n '2019-06-25T23:59:59.999',\n '2019-06-25T25:59:59.99',\n '2019-13-31',\n '1969-12-31',\n '-00:00:30',\n '0:50:30',\n '23:00:30.',\n ],\n\n validCStatus: [\n 'completed',\n 'incomplete',\n 'not attempted',\n 'unknown',\n ],\n invalidCStatus: [\n 'complete',\n 'passed',\n 'failed',\n ],\n\n validSStatus: [\n 'passed',\n 'failed',\n 'unknown',\n ],\n invalidSStatus: [\n 'complete',\n 'incomplete',\n 'P',\n 'f',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n 'normal',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'long-fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n 'other',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validScoreRange: [\n '1',\n '50',\n '100',\n '-10000',\n '-1',\n '10000',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-100000',\n '100000',\n ],\n\n validISO8601Durations: [\n 'P1Y34DT23H45M15S',\n 'PT1M45S',\n 'P0S',\n 'PT75M',\n ],\n invalidISO8601Durations: [\n '00:08:45',\n '-P1H',\n '1y45D',\n '0',\n ],\n\n validComment: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4000),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidComment: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4001),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(3999),\n ],\n\n validDescription: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(250),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidDescription: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(251),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(249),\n ],\n\n validNavRequest: [\n 'previous',\n 'continue',\n 'exit',\n 'exitAll',\n 'abandon',\n 'abandonAll',\n 'suspendAll',\n ],\n invalidNavRequest: [\n 'close',\n 'quit',\n 'next',\n 'before',\n ],\n },\n};\n","export const valid_languages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n","// @flow\n\nimport {scorm12_values, scorm2004_values} from './field_values';\n\nexport const scorm12_regex = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(' + scorm12_values.validLessonStatus.join('|') + ')$',\n CMIStatus2: '^(' + scorm12_values.validLessonStatus.join('|') + '|not attempted)$',\n CMIExit: '^(' + scorm12_values.validExit.join('|') + '|)$',\n CMIType: '^(' + scorm12_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm12_values.validResult.join('|') + '|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nexport const aicc_regex = {\n ...scorm12_regex, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nexport const scorm2004_regex = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\.]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000})$',\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(' + scorm2004_values.validCStatus.join('|') + ')$',\n CMISStatus: '^(' + scorm2004_values.validSStatus.join('|') + ')$',\n CMIExit: '^(' + scorm2004_values.validExit.join('|') + ')$',\n CMIType: '^(' + scorm2004_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm2004_values.validResult.join('|') + '|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(' + scorm2004_values.validNavRequest.join('|') + '|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n","// @flow\nimport {scorm2004_regex} from './regex';\n\nexport const learner_responses = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nexport const correct_responses = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n","// @flow\n\n/**\n * Data Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n super(errorCode);\n this.#errorCode = errorCode;\n }\n\n #errorCode;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Trying to override the default Error message\n * @return {string}\n */\n get message() {\n return this.#errorCode + '';\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds() + (totalSeconds % 1.0);\n\n return hours.toString().padStart(2, '0') + ':' +\n minutes.toString().padStart(2, '0') + ':' +\n seconds.toString().padStart(2, '0');\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n const now = new Date();\n const anchor = new Date(now);\n anchor.setFullYear(anchor.getFullYear() + Number(years || 0));\n anchor.setMonth(anchor.getMonth() + Number(months || 0));\n anchor.setDate(anchor.getDate() + Number(days || 0));\n anchor.setHours(anchor.getHours() + Number(hours || 0));\n anchor.setMinutes(anchor.getMinutes() + Number(minutes || 0));\n anchor.setSeconds(anchor.getSeconds() + Number(seconds || 0));\n if (seconds && String(seconds).indexOf('.') > 0) {\n const milliseconds = Number(Number(seconds) % 1).toFixed(6) * 1000.0;\n anchor.setMilliseconds(anchor.getMilliseconds() + milliseconds);\n }\n\n return ((anchor * 1.0) - now) / 1000.0;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n const firstSeconds = getDurationAsSeconds(first, durationRegex);\n const secondSeconds = getDurationAsSeconds(second, durationRegex);\n\n return getSecondsAsISODuration(firstSeconds + secondSeconds);\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n const firstSeconds = getTimeAsSeconds(first, timeRegex);\n const secondSeconds = getTimeAsSeconds(second, timeRegex);\n return getSecondsAsHHMMSS(firstSeconds + secondSeconds);\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/AICC.js","src/BaseAPI.js","src/Scorm12API.js","src/Scorm2004API.js","src/cmi/aicc_cmi.js","src/cmi/common.js","src/cmi/scorm12_cmi.js","src/cmi/scorm2004_cmi.js","src/constants/api_constants.js","src/constants/error_codes.js","src/constants/field_values.js","src/constants/language_constants.js","src/constants/regex.js","src/constants/response_constants.js","src/exceptions.js","src/utilities.js"],"names":["_Scorm12API2","_interopRequireDefault","require","_aicc_cmi","AICC","settings","_this","_classCallCheck","this","finalSettings","_objectSpread","mastery_override","_possibleConstructorReturn","_getPrototypeOf","call","cmi","CMI","nav","NAV","CMIElement","value","foundFirstIndex","newChild","_get","prototype","stringMatches","CMIEvaluationCommentsObject","CMITriesObject","newAPI","Scorm12API","window","_common","_exceptions","_error_codes2","_api_constants","_utilities","BaseAPI","error_codes","_timeout","set","writable","_error_codes","_settings","autocommit","autocommitSeconds","lmsCommitUrl","dataCommitFormat","_defineProperty","constructor","TypeError","currentState","global_constants","STATE_NOT_INITIALIZED","apiLogLevel","LOG_LEVEL_ERROR","lastErrorCode","listenerArray","_classPrivateFieldSet","callbackName","initializeMessage","terminationMessage","returnValue","SCORM_FALSE","isInitialized","throwSCORMError","_classPrivateFieldGet","INITIALIZED","isTerminated","TERMINATED","STATE_INITIALIZED","SCORM_TRUE","processListeners","apiLog","LOG_LEVEL_INFO","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","e","ValidationError","errorCode","GENERAL","undefined","String","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","result","storeData","LOG_LEVEL_DEBUG","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","logMessage","messageLevel","formatMessage","console","error","LOG_LEVEL_WARNING","warn","info","message","messageString","fillChars","length","i","j","str","tester","match","refObject","attribute","Object","hasOwnProperty","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","invalidErrorMessage","concat","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","validateCorrectResponse","CMIArray","index","parseInt","isNaN","item","childArray","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","scorm12_error_codes","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","replace","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","errorNumber","success","_calculateTotalTime","json","loadFromJSON","unflatten","startingData","key","currentCMIElement","JSON","stringify","parse","renderCMIToJSONString","_terminateCommit","url","params","httpReq","XMLHttpRequest","open","setRequestHeader","Array","send","join","responseText","when","ScheduledCommit","cancel","API","_API","_cancelled","_timeout2","setTimeout","wrapper","clearTimeout","commit","_BaseAPI2","_scorm12_cmi","Utilities","_interopRequireWildcard","constants","scorm12_constants","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","CMIObjectivesObject","CMIInteractionsCorrectResponsesObject","CMIInteractionsObjectivesObject","CMIInteractionsObject","detail","basicMessage","detailMessage","error_descriptions","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","_this$startingData","_this$startingData$cm","_this$startingData$cm2","commitObject","renderCommitCMI","debug","processHttpRequest","log","_scorm2004_cmi","_response_constants","_language_constants","_regex","scorm2004_constants","Scorm2004API","scorm2004_error_codes","_version","_assertThisInitialized","correct_response","current_index","found","count","_count","adl","ADL","Initialize","Terminate","lmsTerminate","GetValue","SetValue","Commit","GetLastError","GetErrorString","GetDiagnostic","parts","Number","interaction","interactions","type","DEPENDENCY_NOT_ESTABLISHED","interaction_type","interaction_count","correct_responses","response","pattern","GENERAL_SET_FAILURE","response_type","nodes","delimiter","max","checkCorrectResponseValue","CMICommentsObject","pattern_index","limit","duplicate","checkDuplicatedPattern","formatRegex","RegExp","format","removeCorrectResponsePrefixes","delimiter2","values","matches","format2","TYPE_MISMATCH","unique","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","scorm2004_regex","CMILangcr","lang","valid_languages","toLowerCase","_this$startingData$ad","_this$startingData$ad2","mode","completion_threshold","progress_measure","completion_status","scaled_passing_score","scaled","success_status","navRequest","request","encodeURIComponent","Function","Scorm12CMI","aicc_constants","regex","aicc_regex","cmi_children","AICCCMIStudentData","evaluation","CMIEvaluation","_this$student_data","_this$evaluation","jsonString","suspend_data","launch_data","comments","comments_from_lms","objectives","student_preference","_this2","CMIEvaluationComments","_this$comments","BaseCMI","comments_children","INVALID_SET_VALUE","_this3","student_data_children","_tries_during_lesson","tries","CMITries","_this$tries","max_time_allowed","time_limit_action","tries_during_lesson","throwReadOnlyError","CMIStudentData","tries_children","_this4","_status","_time","CMIScore","score_children","score_range","invalidTypeCode","invalidRangeCode","VALUE_OUT_OF_RANGE","_this$score","status","time","check12ValidFormat","CMIStatus2","CMITime","_this5","_content","_location","_time2","content","location","CMIString256","_this6","_event","event","throwWriteOnlyError","NAVEvent","checkValidFormat","regexPattern","allowEmptyString","checkValidRange","rangePattern","ranges","_initialized","_ref","decimalRegex","_children2","_score_range","_invalid_error_code","_invalid_type_code","_invalid_range_code","_decimal_regex","_raw","_min","_max","scorm12_regex","CMIDecimal","min","_children","_ref2","children","_errorCode","_children3","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidRange","_version2","_suspend_data","_launch_data","_comments","_comments_from_lms","CMICore","CMIObjectives","CMIStudentPreference","CMIInteractions","_this$core","_this$objectives","_this$student_prefere","_this$interactions","CMIString4096","core_children","_student_id","_student_name","_lesson_location","_credit","_lesson_status","_entry","_total_time","_lesson_mode","_exit","_session_time","addHHMMSSTimeStrings","CMITimespan","student_id","student_name","lesson_location","entry","exit","session_time","CMIStatus","CMIExit","objectives_children","_children4","_mastery_score","_max_time_allowed","_time_limit_action","_children5","student_preference_children","_audio","_language","_speed","_text","audio","language","speed","text","CMISInteger","audio_range","speed_range","text_range","interactions_children","_id","_type","_weighting","_student_response","_result","_latency","correct_responses_children","_this$objectives2","_this$correct_respons","id","weighting","student_response","latency","CMIIdentifier","CMIType","weighting_range","CMIFeedback","CMIResult","_id2","_this7","_id3","_this8","_pattern","throwTypeMismatchError","check2004ValidFormat","check2004ValidRange","Util","_completion_status","_completion_threshold","_learner_id","_learner_name","_mode","_progress_measure","_scaled_passing_score","_success_status","learner_preference","CMILearnerPreference","Scorm2004CMIScore","comments_from_learner","CMICommentsFromLearner","CMICommentsFromLMS","_this$learner_prefere","_this$comments_from_l","_this$comments_from_l2","addTwoDurations","learner_id","learner_name","CMICStatus","CMIString1000","progress_range","CMISStatus","CMIString64000","_audio_level","_delivery_speed","_audio_captioning","audio_level","delivery_speed","audio_captioning","CMILang","_timestamp","_learner_response","_description","timestamp","learner_response","description","CMILongIdentifier","learner_responses","CMILangString250","_success_status2","_completion_status2","_progress_measure2","_description2","_this$score2","_scaled","scaled_range","readOnlyAfterInit","arguments","_comment","_location2","_timestamp2","_readOnlyAfterInit","comment","CMILangString4000","CMIString250","_this9","ADLNav","_this$nav","_this10","_request","request_valid","ADLNavRequestValid","_this$request_valid","_this11","_continue","_previous","_temp","_target","_temp2","previous","continue","_","LOG_LEVEL_NONE","101","201","202","203","301","401","402","403","404","405","0","102","103","104","111","112","113","122","123","132","133","142","143","351","391","406","407","408","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","MULTIPLE_TERMINATIONS","common_values","validResult","invalidResult","valid0To1Range","invalid0To1Range","valid0To100Range","invalid0To100Range","validScaledRange","invalidScaledRange","validIntegerScaledRange","invalidIntegerScaledRange","scorm12_values","validLessonStatus","invalidLessonStatus","validExit","invalidExit","validType","invalidType","validSpeedRange","invalidSpeedRange","validScoreRange","invalidScoreRange","validTime","invalidTime","validTimespan","invalidTimespan","scorm2004_values","validTimestamps","invalidTimestamps","validCStatus","invalidCStatus","validSStatus","invalidSStatus","validISO8601Durations","invalidISO8601Durations","validComment","repeat","invalidComment","validDescription","invalidDescription","validNavRequest","invalidNavRequest","aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","ba","be","bg","bh","bi","bm","bn","bo","br","bs","ca","ce","ch","co","cr","cs","cu","cv","cy","da","de","dv","dz","ee","el","en","eo","es","et","eu","fa","ff","fi","fj","fo","fr","fy","ga","gd","gl","gn","gu","gv","ha","he","hi","ho","hr","ht","hu","hy","hz","ia","ie","ig","ii","ik","io","is","it","iu","ja","jv","ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","la","lb","lg","li","ln","lo","lt","lu","lv","mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","oc","oj","om","or","os","pa","pi","pl","ps","pt","qu","rm","rn","ro","ru","rw","sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","ug","uk","ur","uz","ve","vi","vo","wa","wo","xh","yi","yo","za","zh","zu","aar","abk","ave","afr","aka","amh","arg","ara","asm","ava","aym","aze","bak","bel","bul","bih","bis","bam","ben","tib","bod","bre","bos","cat","che","cha","cos","cre","cze","ces","chu","chv","wel","cym","dan","ger","deu","div","dzo","ewe","gre","ell","eng","epo","spa","est","baq","eus","per","fas","ful","fin","fij","fao","fre","fra","fry","gle","gla","glg","grn","guj","glv","hau","heb","hin","hmo","hrv","hat","hun","arm","hye","her","ina","ind","ile","ibo","iii","ipk","ido","ice","isl","ita","iku","jpn","jav","geo","kat","kon","kik","kua","kaz","kal","khm","kan","kor","kau","kas","kur","kom","cor","kir","lat","ltz","lug","lim","lin","lao","lit","lub","lav","mlg","mah","mao","mri","mac","mkd","mal","mon","mol","mar","may","msa","mlt","bur","mya","nau","nob","nde","nep","ndo","dut","nld","nno","nor","nbl","nya","oci","oji","orm","ori","oss","pan","pli","pol","pus","por","que","roh","run","rum","ron","rus","kin","san","srd","snd","sme","sag","slo","sin","slk","slv","smo","sna","som","alb","sqi","srp","ssw","sot","sun","swe","swa","tam","tel","tgk","tha","tir","tuk","tgl","tsn","ton","tur","tso","tat","twi","tah","uig","ukr","urd","uzb","ven","vie","vol","wln","wol","xho","yid","yor","zha","chi","zho","zul","_field_values","CMIInteger","CMIIndex","CMIString200","CMIString4000","CMILangString250cr","CMIShortIdentifier","CMIIndexStore","NAVBoolean","NAVTarget","true-false","choice","fill-in","long-fill-in","matching","performance","sequencing","likert","numeric","other","getSecondsAsHHMMSS","totalSeconds","hours","Math","floor","SECONDS_PER_HOUR","dateObj","Date","minutes","getUTCMinutes","seconds","getSeconds","toString","padStart","getSecondsAsISODuration","duration","remainder","designations","forEach","_slicedToArray","sign","current_seconds","indexOf","getTimeAsSeconds","timeString","timeRegex","getDurationAsSeconds","durationRegex","_ref3","exec","_ref4","years","months","days","now","anchor","setFullYear","getFullYear","setMonth","getMonth","setDate","getDate","setHours","getHours","setMinutes","getMinutes","setSeconds","milliseconds","toFixed","setMilliseconds","getMilliseconds","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","m","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_DAY"],"mappings":"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,2BAA4B;;q1BC7EhC,IAAM8U,gBACJC,aACE,UACA,QACA,gBACA,WAEFC,eACE,SACA,QACA,WAGFC,gBACE,MACA,OACA,MACA,OAEFC,kBACE,KACA,OACA,MACA,OAGFC,kBACE,IACA,KACA,OAEFC,oBACE,UACA,OACA,MAGFC,kBACE,IACA,MACA,IACA,OACA,MAEFC,oBACE,OACA,OACA,OACA,KACA,OAGFC,yBACE,IACA,IACA,MAEFC,2BACE,OACA,OACA,MACA,OACA,OACA,KACA,QAISC,eAAc3nB,iBACtBgnB,kBACDY,mBACE,SACA,YACA,SACA,aACA,WAEFC,qBACE,SACA,IACA,IACA,IACA,OACA,QACA,YAGFC,WACE,WACA,UACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,WACA,cACA,aACA,SACA,WAEFC,aACE,UACA,QACA,UAGFC,iBACE,IACA,KACA,MACA,KACA,MACA,QAEFC,mBACE,UACA,OACA,OACA,MACA,UACA,UAGFC,iBACE,IACA,QACA,OAEFC,mBACE,UACA,OACA,KACA,MACA,UACA,UAEFf,oBACE,UACA,OACA,MAGFgB,WACE,WACA,WACA,YAEFC,aACE,WACA,cACA,UACA,eACA,iBAGFC,eACE,WACA,cACA,WACA,YAEFC,iBACE,UACA,eACA,wDAKC,IAAMC,kBAAgB1oB,iBACxBgnB,kBAED2B,iBACE,aACA,mBACA,yBACA,cAEFC,mBACE,cACA,0BACA,yBACA,aACA,aACA,YACA,UACA,aAGFC,cACE,YACA,aACA,gBACA,WAEFC,gBACE,WACA,SACA,UAGFC,cACE,SACA,SACA,WAEFC,gBACE,WACA,aACA,IACA,KAGFlB,WACE,WACA,UACA,SACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,eACA,WACA,cACA,aACA,SACA,UACA,SAEFC,aACE,UACA,QACA,UAGFG,iBACE,IACA,KACA,MACA,SACA,KACA,SAEFC,mBACE,UACA,OACA,UACA,UAGFY,uBACE,mBACA,UACA,MACA,SAEFC,yBACE,WACA,OACA,QACA,KAGFC,cACE,+BACA,kCACA,sBAAwB,IAAIC,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFC,gBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAID,OAAO,MACnC,uBAAyB,IAAIA,OAAO,OAGtCE,kBACE,+BACA,kCACA,sBAAwB,IAAIF,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFG,oBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAIH,OAAO,KACnC,uBAAyB,IAAIA,OAAO,MAGtCI,iBACE,WACA,WACA,OACA,UACA,UACA,aACA,cAEFC,mBACE,QACA,OACA,OACA;;kGC1UC,IAAMnV,kBACXoV,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAM1O,GAAM,KAClE2O,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOn9B,IAAO,MAAOo9B,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO;;s2BCtEjE,IAAAC,eAAAviC,Q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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n }\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).\n substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n const CMIElementsMatch = listener.CMIElement === CMIElement;\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n this.loadFromJSON(unflatten(json), CMIElement);\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement || 'cmi';\n\n this.startingData = json;\n\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = CMIElement + '.' + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @return {object}\n */\n processHttpRequest(url: String, params) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, false);\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n try {\n if (params instanceof Array) {\n httpReq.send(params.join('&'));\n } else {\n httpReq.send(params);\n }\n } catch (e) {\n return {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': this.#error_codes.GENERAL,\n };\n }\n\n return JSON.parse(httpReq.responseText);\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n */\n scheduleCommit(when: number) {\n this.#timeout = new ScheduledCommit(this, when);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled: false;\n #timeout;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n */\n constructor(API: any, when: number) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper, when);\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit();\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm12_constants} from './constants/api_constants';\nimport {scorm12_error_codes} from './constants/error_codes';\n\nconst constants = scorm12_constants;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n return this.terminate('LMSFinish', false);\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean }detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >=\n parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' &&\n originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject);\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n\nwindow.Scorm12API = Scorm12API;\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm2004_constants} from './constants/api_constants';\nimport {scorm2004_error_codes} from './constants/error_codes';\nimport {correct_responses} from './constants/response_constants';\nimport {valid_languages} from './constants/language_constants';\nimport {scorm2004_regex} from './constants/regex';\n\nconst constants = scorm2004_constants;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n return this.terminate('Terminate', true);\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (typeof interaction.type === 'undefined') {\n this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = correct_responses[interaction_type];\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = scorm2004_constants.correct_responses[interaction_type];\n if (typeof response_type.limit !== 'undefined' || interaction_count <\n response_type.limit) {\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response.delimiter2 !== undefined) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (valid_languages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = 'completed';\n } else {\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score !== null &&\n this.cmi.score.scaled !== '') {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = 'passed';\n } else {\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject);\n // check if this is a sequencing call, and then call the necessary JS\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n return result;\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n\nwindow.Scorm2004API = Scorm2004API;\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, CMIArray, CMIScore} from './common';\nimport {aicc_constants} from '../constants/api_constants';\nimport {aicc_regex} from '../constants/regex';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {\n check12ValidFormat,\n throwReadOnlyError,\n throwWriteOnlyError,\n} from './scorm12_cmi';\n\nconst constants = aicc_constants;\nconst regex = aicc_regex;\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_data = new AICCCMIStudentData();\n this.evaluation = new CMIEvaluation();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_data?.initialize();\n this.evaluation?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super(constants.comments_children,\n scorm12_error_codes.INVALID_SET_VALUE);\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super(aicc_constants.tries_children);\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (check12ValidFormat(content, regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check12ValidFormat(location, regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {ValidationError} from '../exceptions';\nimport {scorm12_regex} from '../constants/regex';\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new ValidationError(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any, rangePattern: String, errorCode: number) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new ValidationError(errorCode);\n }\n } else {\n throw new ValidationError(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new ValidationError(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n */\n constructor({children, errorCode}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.childArray = [];\n }\n\n #errorCode;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {scorm12_regex} from '../constants/regex';\nimport {ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\n\nconst constants = scorm12_constants;\nconst regex = scorm12_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm12_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(value, rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE, allowEmptyString);\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #suspend_data = '';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ? cmi_children : constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, regex.CMIString4096)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, regex.CMIString4096)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime();\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, regex.CMIString256)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (check12ValidFormat(lesson_status, regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n this.#session_time,\n new RegExp(scorm12_regex.CMITimespan)\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * total_time: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'total_time': this.total_time,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nclass CMIStudentPreference extends BaseCMI {\n /**\n * Constructor for cmi.student_preference\n */\n constructor() {\n super();\n }\n\n #_children = constants.student_preference_children;\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, regex.CMISInteger) &&\n check12ValidRange(audio, regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, regex.CMISInteger) &&\n check12ValidRange(speed, regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, regex.CMISInteger) &&\n check12ValidRange(text, regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, regex.CMIDecimal) &&\n check12ValidRange(weighting, regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm2004_constants} from '../constants/api_constants';\nimport {scorm2004_regex} from '../constants/regex';\nimport {scorm2004_error_codes} from '../constants/error_codes';\nimport {learner_responses} from '../constants/response_constants';\nimport {ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst constants = scorm2004_constants;\nconst regex = scorm2004_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(value, rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE);\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '0';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, regex.CMIString64000)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n return Util.addTwoDurations(\n this.#total_time,\n this.#session_time,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string,\n * total_time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n 'total_time': this.total_time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, regex.CMIDecimal) &&\n check2004ValidRange(audio_level, regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check2004ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check2004ValidFormat(weighting, regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (typeof this.type === 'undefined') {\n throw new ValidationError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type.delimiter !== '') {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (typeof response_type.delimiter2 !== 'undefined') {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throw new ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check2004ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, regex.CMIDecimal) &&\n check2004ValidRange(scaled, regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, regex.CMILangString4000, true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nexport const global_constants = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nexport const scorm12_constants = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n },\n};\n\nexport const aicc_constants = {\n ...scorm12_constants, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n tries_children: 'time,status,score',\n },\n};\n\nexport const scorm2004_constants = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n","// @flow\nexport const error_codes = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_error_codes = {\n ...error_codes, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nexport const scorm2004_error_codes = {\n ...error_codes, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n","const common_values = {\n validResult: [\n 'correct',\n 'wrong',\n 'unanticipated',\n 'neutral',\n ],\n invalidResult: [\n '-10000',\n '10000',\n 'invalid',\n ],\n\n valid0To1Range: [\n '0.0',\n '0.25',\n '0.5',\n '1.0',\n ],\n invalid0To1Range: [\n '-1',\n '-0.1',\n '1.1',\n '.25',\n ],\n\n valid0To100Range: [\n '1',\n '50',\n '100',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-1',\n ],\n\n validScaledRange: [\n '1',\n '0.5',\n '0',\n '-0.5',\n '-1',\n ],\n invalidScaledRange: [\n '-101',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n\n validIntegerScaledRange: [\n '1',\n '0',\n '-1',\n ],\n invalidIntegerScaledRange: [\n '-101',\n '-0.5',\n '0.5',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n};\n\nexport const scorm12_values = {\n ...common_values, ...{\n validLessonStatus: [\n 'passed',\n 'completed',\n 'failed',\n 'incomplete',\n 'browsed',\n ],\n invalidLessonStatus: [\n 'Passed',\n 'P',\n 'F',\n 'p',\n 'true',\n 'false',\n 'complete',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validSpeedRange: [\n '1',\n '50',\n '100',\n '-1',\n '-50',\n '-100',\n ],\n invalidSpeedRange: [\n 'invalid',\n 'a100',\n '-101',\n '101',\n '-100000',\n '100000',\n ],\n\n validScoreRange: [\n '1',\n '50.25',\n '100',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-1',\n '101',\n '-100000',\n '100000',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-2',\n ],\n\n validTime: [\n '10:06:57',\n '23:59:59',\n '00:00:00',\n ],\n invalidTime: [\n '47:59:59',\n '00:00:01.56',\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n\n validTimespan: [\n '10:06:57',\n '00:00:01.56',\n '23:59:59',\n '47:59:59',\n ],\n invalidTimespan: [\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n },\n};\n\nexport const scorm2004_values = {\n ...common_values, ...{\n // valid field values\n validTimestamps: [\n '2019-06-25',\n '2019-06-25T23:59',\n '2019-06-25T23:59:59.99',\n '1970-01-01',\n ],\n invalidTimestamps: [\n '2019-06-25T',\n '2019-06-25T23:59:59.999',\n '2019-06-25T25:59:59.99',\n '2019-13-31',\n '1969-12-31',\n '-00:00:30',\n '0:50:30',\n '23:00:30.',\n ],\n\n validCStatus: [\n 'completed',\n 'incomplete',\n 'not attempted',\n 'unknown',\n ],\n invalidCStatus: [\n 'complete',\n 'passed',\n 'failed',\n ],\n\n validSStatus: [\n 'passed',\n 'failed',\n 'unknown',\n ],\n invalidSStatus: [\n 'complete',\n 'incomplete',\n 'P',\n 'f',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n 'normal',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'long-fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n 'other',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validScoreRange: [\n '1',\n '50',\n '100',\n '-10000',\n '-1',\n '10000',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-100000',\n '100000',\n ],\n\n validISO8601Durations: [\n 'P1Y34DT23H45M15S',\n 'PT1M45S',\n 'P0S',\n 'PT75M',\n ],\n invalidISO8601Durations: [\n '00:08:45',\n '-P1H',\n '1y45D',\n '0',\n ],\n\n validComment: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4000),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidComment: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4001),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(3999),\n ],\n\n validDescription: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(250),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidDescription: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(251),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(249),\n ],\n\n validNavRequest: [\n 'previous',\n 'continue',\n 'exit',\n 'exitAll',\n 'abandon',\n 'abandonAll',\n 'suspendAll',\n ],\n invalidNavRequest: [\n 'close',\n 'quit',\n 'next',\n 'before',\n ],\n },\n};\n","export const valid_languages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n","// @flow\n\nimport {scorm12_values, scorm2004_values} from './field_values';\n\nexport const scorm12_regex = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(' + scorm12_values.validLessonStatus.join('|') + ')$',\n CMIStatus2: '^(' + scorm12_values.validLessonStatus.join('|') + '|not attempted)$',\n CMIExit: '^(' + scorm12_values.validExit.join('|') + '|)$',\n CMIType: '^(' + scorm12_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm12_values.validResult.join('|') + '|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nexport const aicc_regex = {\n ...scorm12_regex, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nexport const scorm2004_regex = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\.]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000})$',\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(' + scorm2004_values.validCStatus.join('|') + ')$',\n CMISStatus: '^(' + scorm2004_values.validSStatus.join('|') + ')$',\n CMIExit: '^(' + scorm2004_values.validExit.join('|') + ')$',\n CMIType: '^(' + scorm2004_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm2004_values.validResult.join('|') + '|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(' + scorm2004_values.validNavRequest.join('|') + '|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n","// @flow\nimport {scorm2004_regex} from './regex';\n\nexport const learner_responses = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nexport const correct_responses = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n","// @flow\n\n/**\n * Data Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n super(errorCode);\n this.#errorCode = errorCode;\n }\n\n #errorCode;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Trying to override the default Error message\n * @return {string}\n */\n get message() {\n return this.#errorCode + '';\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds() + (totalSeconds % 1.0);\n\n return hours.toString().padStart(2, '0') + ':' +\n minutes.toString().padStart(2, '0') + ':' +\n seconds.toString().padStart(2, '0');\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n const now = new Date();\n const anchor = new Date(now);\n anchor.setFullYear(anchor.getFullYear() + Number(years || 0));\n anchor.setMonth(anchor.getMonth() + Number(months || 0));\n anchor.setDate(anchor.getDate() + Number(days || 0));\n anchor.setHours(anchor.getHours() + Number(hours || 0));\n anchor.setMinutes(anchor.getMinutes() + Number(minutes || 0));\n anchor.setSeconds(anchor.getSeconds() + Number(seconds || 0));\n if (seconds && String(seconds).indexOf('.') > 0) {\n const milliseconds = Number(Number(seconds) % 1).toFixed(6) * 1000.0;\n anchor.setMilliseconds(anchor.getMilliseconds() + milliseconds);\n }\n\n return ((anchor * 1.0) - now) / 1000.0;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n const firstSeconds = getDurationAsSeconds(first, durationRegex);\n const secondSeconds = getDurationAsSeconds(second, durationRegex);\n\n return getSecondsAsISODuration(firstSeconds + secondSeconds);\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n const firstSeconds = getTimeAsSeconds(first, timeRegex);\n const secondSeconds = getTimeAsSeconds(second, timeRegex);\n return getSecondsAsHHMMSS(firstSeconds + secondSeconds);\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n"]} \ No newline at end of file diff --git a/dist/scorm-again.min.js b/dist/scorm-again.min.js index 5aff1ac..8e1b0fe 100644 --- a/dist/scorm-again.min.js +++ b/dist/scorm-again.min.js @@ -1,11 +1,11 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ScormAgain = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i0&&this.throwSCORMError(s.errorCode),r=s.result?s.result:_api_constants.global_constants.SCORM_FALSE,this.apiLog(t,"HttpRequest"," Result: "+r,_api_constants.global_constants.LOG_LEVEL_DEBUG),e&&(this.lastErrorCode=0),this.processListeners(t)}return this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(r),r}},{key:"getLastError",value:function(t){var e=String(this.lastErrorCode);return this.processListeners(t),this.apiLog(t,null,"returned: "+e,_api_constants.global_constants.LOG_LEVEL_INFO),e}},{key:"getErrorString",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"getDiagnostic",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e,!0),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"checkState",value:function(t,e,r){return this.isNotInitialized()?(this.throwSCORMError(e),!1):!t||!this.isTerminated()||(this.throwSCORMError(r),!1)}},{key:"apiLog",value:function(t,e,r,s){if(r=this.formatMessage(t,e,r),s>=this.apiLogLevel)switch(s){case _api_constants.global_constants.LOG_LEVEL_ERROR:console.error(r);break;case _api_constants.global_constants.LOG_LEVEL_WARNING:console.warn(r);break;case _api_constants.global_constants.LOG_LEVEL_INFO:console.info(r)}}},{key:"formatMessage",value:function(t,e,r){var s="";s+=t;for(var i=20-s.length,a=0;a1&&(o=t.replace(a+".","")),this.listenerArray.push({functionName:a,CMIElement:o,callback:e})}}},{key:"processListeners",value:function(t,e,r){for(var s=0;s=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed");else if("browse"===this.cmi.core.lesson_mode){var r,i,o;""===((null===(r=this.startingData)||void 0===r?void 0:null===(i=r.cmi)||void 0===i?void 0:null===(o=i.core)||void 0===o?void 0:o.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed")}}var n=this.renderCommitCMI(e);return this.settings.lmsCommitUrl?(this.apiLogLevel===_api_constants.global_constants.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(n)),this.processHttpRequest(this.settings.lmsCommitUrl,n)):(console.log("Commit (terminated: "+(e?"yes":"no")+"): "),console.log(n),_api_constants.global_constants.SCORM_TRUE)}}]),t}(_BaseAPI2.default);exports.default=Scorm12API; +"use strict";function _getRequireWildcardCache(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return _getRequireWildcardCache=function(){return e},e}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;if(null===e||"object"!==_typeof(e)&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache();if(t&&t.has(e))return t.get(e);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=i?Object.getOwnPropertyDescriptor(e,o):null;n&&(n.get||n.set)?Object.defineProperty(r,o,n):r[o]=e[o]}return r.default=e,t&&t.set(e,r),r}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,i)}return r}function _objectSpread(e){for(var t=1;t=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed");else if("browse"===this.cmi.core.lesson_mode){var r,i,o;""===((null===(r=this.startingData)||void 0===r?void 0:null===(i=r.cmi)||void 0===i?void 0:null===(o=i.core)||void 0===o?void 0:o.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed")}}var n=this.renderCommitCMI(e);return this.settings.lmsCommitUrl?(this.apiLogLevel===_api_constants.global_constants.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(n)),this.processHttpRequest(this.settings.lmsCommitUrl,n)):(console.log("Commit (terminated: "+(e?"yes":"no")+"): "),console.log(n),_api_constants.global_constants.SCORM_TRUE)}}]),t}(_BaseAPI2.default);exports.default=Scorm12API,window.Scorm12API=Scorm12API; },{"./BaseAPI":2,"./cmi/scorm12_cmi":7,"./constants/api_constants":9,"./constants/error_codes":10,"./utilities":16}],4:[function(require,module,exports){ -"use strict";function _getRequireWildcardCache(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return _getRequireWildcardCache=function(){return e},e}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;if(null===e||"object"!==_typeof(e)&&"function"!=typeof e)return{default:e};var r=_getRequireWildcardCache();if(r&&r.has(e))return r.get(e);var t={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s)){var i=o?Object.getOwnPropertyDescriptor(e,s):null;i&&(i.get||i.set)?Object.defineProperty(t,s,i):t[s]=e[s]}return t.default=e,r&&r.set(e,t),t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r0&&m.length<=u.max?this.checkCorrectResponseValue(c,m,r):m.length>u.max&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long")}0===this.lastErrorCode&&(o=new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject)}else t&&this.stringMatches(e,"cmi\\.interactions\\.\\d\\.objectives\\.\\d")?o=new _scorm2004_cmi.CMIInteractionsObjectivesObject:this.stringMatches(e,"cmi\\.interactions\\.\\d")?o=new _scorm2004_cmi.CMIInteractionsObject:this.stringMatches(e,"cmi\\.comments_from_learner\\.\\d")?o=new _scorm2004_cmi.CMICommentsObject:this.stringMatches(e,"cmi\\.comments_from_lms\\.\\d")&&(o=new _scorm2004_cmi.CMICommentsObject(!0));return o}},{key:"validateCorrectResponse",value:function(e,r){var t=e.split("."),o=Number(t[2]),s=Number(t[4]),i=this.cmi.interactions.childArray[o],n=i.type,c=i.correct_responses._count;if("choice"===n)for(var a=0;a0&&u.length<=_.max?this.checkCorrectResponseValue(n,u,r):u.length>_.max&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long"),0===this.lastErrorCode&&(!_.duplicate||!this.checkDuplicatedPattern(i.correct_responses,s,r))||0===this.lastErrorCode&&""===r||0===this.lastErrorCode&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Already Exists")}else this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Collection Limit Reached")}},{key:"getCMIValue",value:function(e){return this._commonGetCMIValue("GetValue",!0,e)}},{key:"getLmsErrorMessageDetails",value:function(e,r){var t="",o="";return e=String(e),constants.error_descriptions[e]&&(t=constants.error_descriptions[e].basicMessage,o=constants.error_descriptions[e].detailMessage),r?o:t}},{key:"checkCorrectResponseValue",value:function(e,r,t){for(var o=_response_constants.correct_responses[e],s=new RegExp(o.format),i=0;i1)Number(r[0])>Number(r[1])&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH);else if(""!==r[i]&&o.unique)for(var l=0;l0&&void 0===_language_constants.valid_languages[c.toLowerCase()]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH)}o=!0;break;case"case_matters":o||r||t||"true"!==i[3]&&"false"!==i[3]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH),t=!0;break;case"order_matters":t||o||r||"true"!==i[3]&&"false"!==i[3]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH),r=!0}e=e.substr(i[1].length),i=e.match(s)}return e}},{key:"replaceWithAnotherScormAPI",value:function(e){this.cmi=e.cmi,this.adl=e.adl}},{key:"renderCommitCMI",value:function(e){var r=this.renderCMIToJSONObject();e&&(r.cmi.total_time=this.cmi.getCurrentTotalTime());var t=[],o=Utilities.flatten(r);switch(this.settings.dataCommitFormat){case"flattened":return Utilities.flatten(r);case"params":for(var s in o)({}).hasOwnProperty.call(o,s)&&t.push("".concat(s,"=").concat(o[s]));return t;case"json":default:return r}}},{key:"storeData",value:function(e){var r,t,o;e&&"normal"===this.cmi.mode&&"credit"===this.cmi.credit&&(this.cmi.completion_threshold&&this.cmi.progress_measure&&(this.cmi.progress_measure>=this.cmi.completion_threshold?this.cmi.completion_status="completed":this.cmi.completion_status="incomplete"),null!==this.cmi.scaled_passing_score&&""!==this.cmi.score.scaled&&(this.cmi.score.scaled>=this.cmi.scaled_passing_score?this.cmi.success_status="passed":this.cmi.success_status="failed"));var s=!1;this.adl.nav.request!==(null===(r=this.startingData)||void 0===r?void 0:null===(t=r.adl)||void 0===t?void 0:null===(o=t.nav)||void 0===o?void 0:o.request)&&"_none_"!==this.adl.nav.request&&(this.adl.nav.request=encodeURIComponent(this.adl.nav.request),s=!0);var i=this.renderCommitCMI(e);if(this.settings.lmsCommitUrl){this.apiLogLevel===_api_constants.global_constants.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i));var n=this.processHttpRequest(this.settings.lmsCommitUrl,i);return s&&void 0!==n.navRequest&&""!==n.navRequest&&Function('"use strict";(() => { '.concat(n.navRequest," })()"))(),n}return console.log("Commit (terminated: "+(e?"yes":"no")+"): "),console.log(i),_api_constants.global_constants.SCORM_TRUE}},{key:"version",get:function(){return _classPrivateFieldGet(this,_version)}}]),r}(_BaseAPI2.default);exports.default=Scorm2004API;var _version=new WeakMap; +"use strict";function _getRequireWildcardCache(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return _getRequireWildcardCache=function(){return e},e}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;if(null===e||"object"!==_typeof(e)&&"function"!=typeof e)return{default:e};var r=_getRequireWildcardCache();if(r&&r.has(e))return r.get(e);var t={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s)){var i=o?Object.getOwnPropertyDescriptor(e,s):null;i&&(i.get||i.set)?Object.defineProperty(t,s,i):t[s]=e[s]}return t.default=e,r&&r.set(e,t),t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r0&&m.length<=u.max?this.checkCorrectResponseValue(c,m,r):m.length>u.max&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long")}0===this.lastErrorCode&&(o=new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject)}else t&&this.stringMatches(e,"cmi\\.interactions\\.\\d\\.objectives\\.\\d")?o=new _scorm2004_cmi.CMIInteractionsObjectivesObject:this.stringMatches(e,"cmi\\.interactions\\.\\d")?o=new _scorm2004_cmi.CMIInteractionsObject:this.stringMatches(e,"cmi\\.comments_from_learner\\.\\d")?o=new _scorm2004_cmi.CMICommentsObject:this.stringMatches(e,"cmi\\.comments_from_lms\\.\\d")&&(o=new _scorm2004_cmi.CMICommentsObject(!0));return o}},{key:"validateCorrectResponse",value:function(e,r){var t=e.split("."),o=Number(t[2]),s=Number(t[4]),i=this.cmi.interactions.childArray[o],n=i.type,c=i.correct_responses._count;if("choice"===n)for(var a=0;a0&&u.length<=_.max?this.checkCorrectResponseValue(n,u,r):u.length>_.max&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long"),0===this.lastErrorCode&&(!_.duplicate||!this.checkDuplicatedPattern(i.correct_responses,s,r))||0===this.lastErrorCode&&""===r||0===this.lastErrorCode&&this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Pattern Already Exists")}else this.throwSCORMError(_error_codes.scorm2004_error_codes.GENERAL_SET_FAILURE,"Data Model Element Collection Limit Reached")}},{key:"getCMIValue",value:function(e){return this._commonGetCMIValue("GetValue",!0,e)}},{key:"getLmsErrorMessageDetails",value:function(e,r){var t="",o="";return e=String(e),constants.error_descriptions[e]&&(t=constants.error_descriptions[e].basicMessage,o=constants.error_descriptions[e].detailMessage),r?o:t}},{key:"checkCorrectResponseValue",value:function(e,r,t){for(var o=_response_constants.correct_responses[e],s=new RegExp(o.format),i=0;i1)Number(r[0])>Number(r[1])&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH);else if(""!==r[i]&&o.unique)for(var l=0;l0&&void 0===_language_constants.valid_languages[c.toLowerCase()]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH)}o=!0;break;case"case_matters":o||r||t||"true"!==i[3]&&"false"!==i[3]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH),t=!0;break;case"order_matters":t||o||r||"true"!==i[3]&&"false"!==i[3]&&this.throwSCORMError(_error_codes.scorm2004_error_codes.TYPE_MISMATCH),r=!0}e=e.substr(i[1].length),i=e.match(s)}return e}},{key:"replaceWithAnotherScormAPI",value:function(e){this.cmi=e.cmi,this.adl=e.adl}},{key:"renderCommitCMI",value:function(e){var r=this.renderCMIToJSONObject();e&&(r.cmi.total_time=this.cmi.getCurrentTotalTime());var t=[],o=Utilities.flatten(r);switch(this.settings.dataCommitFormat){case"flattened":return Utilities.flatten(r);case"params":for(var s in o)({}).hasOwnProperty.call(o,s)&&t.push("".concat(s,"=").concat(o[s]));return t;case"json":default:return r}}},{key:"storeData",value:function(e){var r,t,o;e&&"normal"===this.cmi.mode&&"credit"===this.cmi.credit&&(this.cmi.completion_threshold&&this.cmi.progress_measure&&(this.cmi.progress_measure>=this.cmi.completion_threshold?this.cmi.completion_status="completed":this.cmi.completion_status="incomplete"),null!==this.cmi.scaled_passing_score&&""!==this.cmi.score.scaled&&(this.cmi.score.scaled>=this.cmi.scaled_passing_score?this.cmi.success_status="passed":this.cmi.success_status="failed"));var s=!1;this.adl.nav.request!==(null===(r=this.startingData)||void 0===r?void 0:null===(t=r.adl)||void 0===t?void 0:null===(o=t.nav)||void 0===o?void 0:o.request)&&"_none_"!==this.adl.nav.request&&(this.adl.nav.request=encodeURIComponent(this.adl.nav.request),s=!0);var i=this.renderCommitCMI(e);if(this.settings.lmsCommitUrl){this.apiLogLevel===_api_constants.global_constants.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i));var n=this.processHttpRequest(this.settings.lmsCommitUrl,i);return s&&void 0!==n.navRequest&&""!==n.navRequest&&Function('"use strict";(() => { '.concat(n.navRequest," })()"))(),n}return console.log("Commit (terminated: "+(e?"yes":"no")+"): "),console.log(i),_api_constants.global_constants.SCORM_TRUE}},{key:"version",get:function(){return _classPrivateFieldGet(this,_version)}}]),r}(_BaseAPI2.default);exports.default=Scorm2004API;var _version=new WeakMap;window.Scorm2004API=Scorm2004API; },{"./BaseAPI":2,"./cmi/scorm2004_cmi":8,"./constants/api_constants":9,"./constants/error_codes":10,"./constants/language_constants":12,"./constants/regex":13,"./constants/response_constants":14,"./utilities":16}],5:[function(require,module,exports){ "use strict";function _getRequireWildcardCache(){if("function"!=typeof WeakMap)return null;var t=new WeakMap;return _getRequireWildcardCache=function(){return t},t}function _interopRequireWildcard(t){if(t&&t.__esModule)return t;if(null===t||"object"!==_typeof(t)&&"function"!=typeof t)return{default:t};var e=_getRequireWildcardCache();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var o=i?Object.getOwnPropertyDescriptor(t,n):null;o&&(o.get||o.set)?Object.defineProperty(r,n,o):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function _classPrivateFieldSet(t,e,r){var i=e.get(t);if(!i)throw new TypeError("attempted to set private field on non-instance");if(i.set)i.set.call(t,r);else{if(!i.writable)throw new TypeError("attempted to set read only private field");i.value=r}return r}function _classPrivateFieldGet(t,e){var r=e.get(t);if(!r)throw new TypeError("attempted to get private field on non-instance");return r.get?r.get.call(t):r.value}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var r=0;r0&&(s+=r),s&&((t.indexOf("D")>0||"H"===o||"M"===o||"S"===o)&&-1===t.indexOf("T")&&(t+="T"),t+="".concat(s).concat(o))}),t}function getTimeAsSeconds(e,t){if(!e||"string"!=typeof e||!e.match(t))return 0;var r=e.split(":");return 3600*Number(r[0])+60*Number(r[1])+Number(r[2])}function getDurationAsSeconds(e,t){if(!e||!e.match(t))return 0;var r=new RegExp(t).exec(e)||[],n=_slicedToArray(r,8),o=n[1],S=n[2],s=n[4],a=n[5],i=n[6],u=n[7],c=new Date,E=new Date(c);if(E.setFullYear(E.getFullYear()+Number(o||0)),E.setMonth(E.getMonth()+Number(S||0)),E.setDate(E.getDate()+Number(s||0)),E.setHours(E.getHours()+Number(a||0)),E.setMinutes(E.getMinutes()+Number(i||0)),E.setSeconds(E.getSeconds()+Number(u||0)),u&&String(u).indexOf(".")>0){var _=1e3*Number(Number(u)%1).toFixed(6);E.setMilliseconds(E.getMilliseconds()+_)}return(1*E-c)/1e3}function addTwoDurations(e,t,r){return getSecondsAsISODuration(getDurationAsSeconds(e,r)+getDurationAsSeconds(t,r))}function addHHMMSSTimeStrings(e,t,r){return getSecondsAsHHMMSS(getTimeAsSeconds(e,r)+getTimeAsSeconds(t,r))}function flatten(e){function t(e,n){if(Object(e)!==e)r[n]=e;else if(Array.isArray(e))for(var o=0,S=e.length;o