From 391970e9f7f09c9cae3b6cd332b052d47855bfe6 Mon Sep 17 00:00:00 2001 From: Kevin Scroggins Date: Mon, 16 Mar 2020 22:55:32 -0400 Subject: [PATCH] Update to change-case-bundled 1.0.3 / change-case 4.1.1 --- .npmignore | 1 + .travis.yml | 1 + dist/extra-utilities.js | 6 +++++- dist/extra-utilities.js.map | 1 + dist/extra-utilities.min.js | 3 ++- dist/extra-utilities.min.js.map | 1 + package-lock.json | 22 +++++++++++++++------- package.json | 11 +++++------ src/extra-utilities.js | 4 +++- test/test.js | 6 +++--- 10 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 dist/extra-utilities.js.map create mode 100644 dist/extra-utilities.min.js.map diff --git a/.npmignore b/.npmignore index 6e822ca..c1a164c 100644 --- a/.npmignore +++ b/.npmignore @@ -3,6 +3,7 @@ bower_components src test coverage +docs .sass-cache .coveralls.yml .travis.yml diff --git a/.travis.yml b/.travis.yml index 762f487..0aae86d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ sudo: false language: node_js node_js: + - "12" - "10" - "8" - "6" diff --git a/dist/extra-utilities.js b/dist/extra-utilities.js index 9872098..6ca84c9 100644 --- a/dist/extra-utilities.js +++ b/dist/extra-utilities.js @@ -30,6 +30,7 @@ var stringCaseFunctions = { camel: changeCase.camelCase, + capital: changeCase.capitalCase, constant: changeCase.constantCase, dot: changeCase.dotCase, header: changeCase.headerCase, @@ -41,6 +42,7 @@ path: changeCase.pathCase, sentence: changeCase.sentenceCase, snake: changeCase.snakeCase, + sponge: changeCase.spongeCase, swap: changeCase.swapCase, title: changeCase.titleCase, upper: changeCase.upperCase, @@ -715,7 +717,7 @@ else { var originalCase = format.case; - format.case = changeCase.camel(format.case.trim()); + format.case = changeCase.camelCase(format.case.trim()); if(!utilities.isFunction(stringCaseFunctions[format.case])) { errorMessage = "Invalid optional case format value - expected one of " + Object.keys(stringCaseFunctions).join(", ") + ", received \"" + utilities.toString(originalCase) + "\"."; @@ -2324,3 +2326,5 @@ return utilities; })); + +//# sourceMappingURL=extra-utilities.js.map diff --git a/dist/extra-utilities.js.map b/dist/extra-utilities.js.map new file mode 100644 index 0000000..006d4df --- /dev/null +++ b/dist/extra-utilities.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["extra-utilities.js"],"sourcesContent":["(function(global, factory) {\n\ttypeof exports === \"object\" && typeof module !== \"undefined\" ? module.exports = factory() :\n\ttypeof define === \"function\" && define.amd ? define(factory) :\n\t(global.utilities = factory());\n} (this, function() {\n\n\t\"use strict\";\n\n\tif(typeof require !== \"undefined\") {\n\t\tif(typeof validator === \"undefined\") {\n\t\t\tglobal.validator = require(\"validator\");\n\t\t}\n\n\t\tif(typeof changeCase === \"undefined\") {\n\t\t\tglobal.changeCase = require(\"change-case-bundled\");\n\t\t}\n\t}\n\n\tvar utilities = { };\n\n\tvar regExpFlags = {\n\t\tglobal: \"g\",\n\t\tmultiline: \"m\",\n\t\tignoreCase: \"i\",\n\t\tsticky: \"y\",\n\t\tunicode: \"u\"\n\t};\n\n\tvar formatTypes = [\"boolean\", \"bool\", \"integer\", \"int\", \"float\", \"number\", \"string\", \"object\", \"array\", \"date\", \"regex\", \"regexp\", \"regularexpression\", \"function\", \"func\"];\n\n\tvar stringCaseFunctions = {\n\t\tcamel: changeCase.camelCase,\n\t\tcapital: changeCase.capitalCase,\n\t\tconstant: changeCase.constantCase,\n\t\tdot: changeCase.dotCase,\n\t\theader: changeCase.headerCase,\n\t\tlower: changeCase.lowerCase,\n\t\tlowerFirst: changeCase.lowerCaseFirst,\n\t\tno: changeCase.noCase,\n\t\tparam: changeCase.paramCase,\n\t\tpascal: changeCase.pascalCase,\n\t\tpath: changeCase.pathCase,\n\t\tsentence: changeCase.sentenceCase,\n\t\tsnake: changeCase.snakeCase,\n\t\tsponge: changeCase.spongeCase,\n\t\tswap: changeCase.swapCase,\n\t\ttitle: changeCase.titleCase,\n\t\tupper: changeCase.upperCase,\n\t\tupperFirst: changeCase.upperCaseFirst\n\t};\n\n\tutilities.isValid = function isValid(value) {\n\t\treturn value !== undefined && value !== null;\n\t};\n\n\tutilities.isInvalid = function isInvalid(value) {\n\t\treturn value === undefined || value === null;\n\t};\n\n\tutilities.isBoolean = function isBoolean(value, allowObjects) {\n\t\treturn value === true || value === false || (!!allowObjects && value instanceof Boolean);\n\t};\n\n\tutilities.isValidNumber = function isValidNumber(value) {\n\t\treturn typeof value === \"number\" && !isNaN(value) && value !== -Infinity && value !== Infinity;\n\t};\n\n\tutilities.isInvalidNumber = function isInvalidNumber(value) {\n\t\treturn typeof value !== \"number\" || isNaN(value) || value === -Infinity || value === Infinity;\n\t};\n\n\tutilities.isEmptyString = function isEmptyString(value, trim) {\n\t\treturn typeof value !== \"string\" || (utilities.parseBoolean(trim, true) ? value.trim().length === 0 : value.length === 0);\n\t};\n\n\tutilities.isNonEmptyString = function isNonEmptyString(value, trim) {\n\t\treturn typeof value === \"string\" && (utilities.parseBoolean(trim, true) ? value.trim().length !== 0 : value.length !== 0);\n\t};\n\n\tutilities.isObject = function isObject(value, strict) {\n\t\treturn value !== undefined && (strict ? value !== null && value.constructor === Object : value instanceof Object && !(value instanceof Function));\n\t};\n\n\tutilities.isObjectStrict = function isObjectStrict(value) {\n\t\treturn value !== undefined && value !== null && value.constructor === Object;\n\t};\n\n\tutilities.isEmptyObject = function isEmptyObject(value) {\n\t\treturn value !== undefined && value !== null && value.constructor === Object && Object.keys(value).length === 0;\n\t};\n\n\tutilities.isNonEmptyObject = function isNonEmptyObject(value) {\n\t\treturn value !== undefined && value !== null && value.constructor === Object && Object.keys(value).length !== 0;\n\t};\n\n\tutilities.isEmptyArray = function isEmptyArray(value) {\n\t\treturn Array.isArray(value) ? value.length === 0 : true;\n\t};\n\n\tutilities.isNonEmptyArray = function isNonEmptyArray(value) {\n\t\treturn Array.isArray(value) && value.length !== 0;\n\t};\n\n\tutilities.isDate = function isDate(value) {\n\t\treturn value instanceof Date;\n\t};\n\n\tutilities.isError = function isError(value) {\n\t\treturn value instanceof Error;\n\t};\n\n\tutilities.isRegularExpression = function isRegularExpression(value) {\n\t\treturn value instanceof RegExp;\n\t};\n\n\tutilities.isFunction = function isFunction(value) {\n\t\treturn value instanceof Function;\n\t};\n\n\tutilities.isComment = function isComment(value, comment) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isEmptyString(comment)) {\n\t\t\tcomment = \"//\";\n\t\t}\n\n\t\tvar commentStartIndex = -1;\n\n\t\tfor(var i = 0; i < value.length; i++) {\n\t\t\tif(value[i] === \" \" || value[i] == \"\\t\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(value[i] == comment[0]) {\n\t\t\t\tcommentStartIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif(commentStartIndex < 0 || value.length - commentStartIndex < comment.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor(var i = commentStartIndex; i < value.length; i++) {\n\t\t\tif(i - commentStartIndex >= comment.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(value[i] != comment[i - commentStartIndex]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isVisible = function isVisible(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.visible)) {\n\t\t\treturn element.visible;\n\t\t}\n\t\telse if(utilities.isFunction(element.visible)) {\n\t\t\treturn element.visible();\n\t\t}\n\t\telse if(utilities.isBoolean(element.hidden)) {\n\t\t\treturn !element.hidden;\n\t\t}\n\t\telse if(utilities.isFunction(element.hidden)) {\n\t\t\treturn !element.hidden();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isHidden = function isHidden(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.visible)) {\n\t\t\treturn !element.visible;\n\t\t}\n\t\telse if(utilities.isFunction(element.visible)) {\n\t\t\treturn !element.visible();\n\t\t}\n\t\telse if(utilities.isBoolean(element.hidden)) {\n\t\t\treturn element.hidden;\n\t\t}\n\t\telse if(utilities.isFunction(element.hidden)) {\n\t\t\treturn element.hidden();\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tutilities.isEnabled = function isEnabled(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.enabled)) {\n\t\t\treturn element.enabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.enabled)) {\n\t\t\treturn element.enabled();\n\t\t}\n\t\telse if(utilities.isBoolean(element.disabled)) {\n\t\t\treturn !element.disabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.disabled)) {\n\t\t\treturn !element.disabled();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isDisabled = function isDisabled(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.enabled)) {\n\t\t\treturn !element.enabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.enabled)) {\n\t\t\treturn !element.enabled();\n\t\t}\n\t\telse if(utilities.isBoolean(element.disabled)) {\n\t\t\treturn element.disabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.disabled)) {\n\t\t\treturn element.disabled();\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tutilities.equalsIgnoreCase = function equalsIgnoreCase(stringA, stringB) {\n\t\tif(typeof stringA !== \"string\" || typeof stringB !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn stringA.localeCompare(stringB, undefined, { sensitivity: \"accent\" }) === 0;\n\t};\n\n\tutilities.parseBoolean = function parseBoolean(value, defaultValue) {\n\t\tif(utilities.isBoolean(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif(utilities.isBoolean(value, true)) {\n\t\t\treturn value.valueOf();\n\t\t}\n\n\t\tif(!utilities.isBoolean(defaultValue)) {\n\t\t\tdefaultValue = null;\n\t\t}\n\n\t\tif(utilities.isInvalid(value)) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(value === 0) {\n\t\t\treturn false;\n\t\t}\n\t\telse if(value === 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tvar formattedValue = value.trim().toLowerCase();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(formattedValue.length === 1) {\n\t\t\tvar character = formattedValue.charAt(0);\n\n\t\t\tif(character === \"t\" || character === \"y\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if(character === \"f\" || character === \"n\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if(character === \"0\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if(character === \"1\") {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(formattedValue === \"true\" || formattedValue === \"yes\" || formattedValue === \"on\") {\n\t\t\treturn true;\n\t\t}\n\t\telse if(formattedValue === \"false\" || formattedValue === \"no\" || formattedValue === \"off\") {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\tutilities.parseInteger = function parseInteger(value, defaultValue) {\n\t\tvar newValue = NaN;\n\n\t\tif(typeof value === \"number\") {\n\t\t\tnewValue = parseInt(value);\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tif(validator.isFloat(value)) {\n\t\t\t\tnewValue = parseInt(value);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(newValue)) {\n\t\t\tdefaultValue = parseInt(defaultValue);\n\n\t\t\treturn utilities.isValidNumber(defaultValue) ? defaultValue : NaN;\n\t\t}\n\n\t\treturn newValue;\n\t};\n\n\tutilities.parseFloatingPointNumber = function parseFloatingPointNumber(value, defaultValue) {\n\t\tvar newValue = NaN;\n\n\t\tif(typeof value === \"number\") {\n\t\t\tnewValue = value;\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tif(validator.isFloat(value)) {\n\t\t\t\tnewValue = parseFloat(value);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(newValue)) {\n\t\t\treturn utilities.isValidNumber(defaultValue) ? defaultValue : NaN;\n\t\t}\n\n\t\treturn newValue;\n\t};\n\n\tutilities.parseDate = function parseDate(value, defaultValue) {\n\t\tif(!utilities.isDate(defaultValue)) {\n\t\t\tdefaultValue = null;\n\t\t}\n\n\t\tif(typeof value === \"number\") {\n\t\t\tif(utilities.isInvalidNumber(value) || !Number.isInteger(value)) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\treturn new Date(parseInt(value));\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tvar formattedValue = value.trim();\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\tvar timestamp = null;\n\n\t\t\tif(validator.isInt(formattedValue)) {\n\t\t\t\ttimestamp = parseInt(formattedValue);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttimestamp = Date.parse(formattedValue);\n\t\t\t}\n\n\t\t\tif(utilities.isInvalidNumber(timestamp)) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\treturn new Date(timestamp);\n\t\t}\n\t\telse if(value instanceof Date) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\tutilities.parseTime = function parseTime(value, throwErrors) {\n\t\tthrowErrors = utilities.parseBoolean(throwErrors);\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Invalid or empty time value.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\t\tvar hour = null;\n\t\tvar minutes = null;\n\t\tvar regularTime = formattedValue.match(/^[ \\t]*(([2-9]|[1][0-2]?)(:([0-5][0-9]))?[ \\t]*([ap]m))[ \\t]*$/i);\n\n\t\tif(regularTime) {\n\t\t\tvar regularHour = utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[2]));\n\n\t\t\tif(utilities.isInvalidNumber(regularHour)) {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid regular hour: \\\"\" + regularTime[2] + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tminutes = utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[4]));\n\n\t\t\tif(utilities.isInvalidNumber(minutes)) {\n\t\t\t\tminutes = 0;\n\t\t\t}\n\n\t\t\tvar period = regularTime[5].toUpperCase();\n\t\t\tvar morning = period === \"AM\" ? true : (period === \"PM\" ? false : null);\n\n\t\t\tif(morning === null) {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid period: \\\"\" + regularTime[5] + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\thour = morning ? regularHour + (regularHour === 12 ? 12 : 0) : regularHour + (regularHour === 12 ? 0 : 12);\n\n\t\t\tif(hour === 24) {\n\t\t\t\thour = 0;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tvar militaryTime = formattedValue.match(/^[ \\t]*(((([0-1][0-9])|(2[0-3])):?([0-5][0-9]))|((24):?(00)))[ \\t]*$/i);\n\n\t\t\tif(militaryTime) {\n\t\t\t\tvar militaryHour = militaryTime[3];\n\t\t\t\tvar militaryMinutes = militaryTime[6];\n\n\t\t\t\tif(utilities.isInvalid(militaryHour) || utilities.isInvalid(militaryMinutes)) {\n\t\t\t\t\tmilitaryHour = militaryTime[8];\n\n\t\t\t\t\tif(utilities.isNonEmptyString(militaryTime[9])) {\n\t\t\t\t\t\tmilitaryMinutes = militaryTime[9];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(militaryHour) || utilities.isInvalid(militaryMinutes)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time: \\\"\" + formattedValue + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\thour = utilities.parseInteger(utilities.trimLeadingZeroes(militaryHour));\n\n\t\t\t\tif(utilities.isInvalidNumber(hour)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time hour: \\\"\" + militaryHour + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tminutes = utilities.parseInteger(utilities.trimLeadingZeroes(militaryMinutes));\n\n\t\t\t\tif(utilities.isInvalidNumber(minutes)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time minutes: \\\"\" + militaryMinutes + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif(hour === 24 && minutes === 0) {\n\t\t\t\t\thour = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid time: \\\"\" + formattedValue + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif(hour < 0 || hour > 23) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Time hour is out of range (0 - 23): \\\"\" + hour + \"\\\".\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\t\telse if(minutes < 0 || minutes > 59) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Time minutes is out of range (0 - 59): \\\"\" + minutes + \"\\\".\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar regularHour = hour === 0 ? 12 : (hour <= 12 ? hour : hour - 12);\n\t\tvar period = hour < 12 ? \"AM\" : \"PM\";\n\n\t\treturn {\n\t\t\tregular: {\n\t\t\t\traw: regularHour + \":\" + utilities.addLeadingZeroes(minutes, 2) + \" \" + period,\n\t\t\t\thour: regularHour,\n\t\t\t\tminutes: minutes,\n\t\t\t\tperiod: period,\n\t\t\t\tmorning: hour < 12\n\t\t\t},\n\t\t\tmilitary: {\n\t\t\t\traw: utilities.addLeadingZeroes(hour, 2) + utilities.addLeadingZeroes(minutes, 2),\n\t\t\t\thour: hour,\n\t\t\t\tminutes: minutes\n\t\t\t}\n\t\t};\n\t};\n\n\tutilities.parseEmail = function parseEmail(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar emailData = value.trim().toLowerCase().match(/([^+@]+)(\\+.*)?(@.+\\..+)/);\n\n\t\tif(utilities.isInvalid(emailData) || emailData.length < 4) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn emailData[1] + emailData[3];\n\t};\n\n\tutilities.parseEmailDomain = function parseEmailDomain(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar emailDomainData = value.trim().toLowerCase().match(/([^+@]+)(\\+.*)?@(.+\\..+)/);\n\n\t\tif(utilities.isInvalid(emailDomainData) || emailDomainData.length < 4) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn emailDomainData[3];\n\t};\n\n\tutilities.parseStringList = function parseStringList(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(value.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar data = value.split(/[;,]+/);\n\t\tvar formattedList = [];\n\t\tvar formattedValue = null;\n\n\t\tfor(var i = 0; i < data.length; i++) {\n\t\t\tformattedValue = data[i].trim();\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tformattedList.push(formattedValue);\n\t\t}\n\n\t\treturn formattedList;\n\t};\n\n\tutilities.parseRegularExpression = function parseRegularExpression(value, throwErrors) {\n\t\tthrowErrors = utilities.parseBoolean(throwErrors, false);\n\n\t\tif(utilities.isRegularExpression(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Regular expression cannot be empty.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar regExpData = value.match(/\\s*\\/(.*)\\/(.*)\\s*/);\n\n\t\tif(!regExpData) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Invalid regular expression value.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(throwErrors) {\n\t\t\treturn new RegExp(regExpData[1], regExpData[2]);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new RegExp(regExpData[1], regExpData[2]);\n\t\t}\n\t\tcatch(error) {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tutilities.parseYouTubeLink = function parseYouTubeLink(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\t\tvar linkData = formattedValue.match(/.*(?:youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=)([^#\\&\\?]*).*/i);\n\n\t\tif(linkData && linkData[1].length >= 11) {\n\t\t\treturn linkData[1];\n\t\t}\n\n\t\tif(formattedValue.match(/[A-Z0-9_-]{11,}/i)) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tutilities.formatValue = function formatValue(value, format, options) {\n\t\tif(utilities.isObjectStrict(options)) {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(options.throwErrors, false)\n\t\t\t};\n\n\t\t\toptions.verbose = utilities.parseBoolean(options.verbose, !options.throwErrors);\n\t\t}\n\t\telse {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: false,\n\t\t\t\tverbose: true\n\t\t\t};\n\t\t}\n\n\t\tif(!utilities.isObjectStrict(format)) {\n\t\t\treturn utilities.clone(value);\n\t\t}\n\n\t\tformat = utilities.clone(format);\n\n\t\tvar errorMessage = null;\n\n\t\tif(utilities.isEmptyString(format.type)) {\n\t\t\terrorMessage = \"Invalid required type format value - expected non-empty string.\";\n\t\t}\n\t\telse {\n\t\t\tvar originalType = format.type;\n\n\t\t\tformat.type = format.type.trim().toLowerCase();\n\n\t\t\tvar validFormatType = false;\n\n\t\t\tfor(var i = 0; i < formatTypes.length; i++) {\n\t\t\t\tif(format.type === formatTypes[i]) {\n\t\t\t\t\tvalidFormatType = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!validFormatType) {\n\t\t\t\terrorMessage = \"Invalid required type format value - expected one of \" + formatTypes.join(\", \") + \", received \\\"\" + utilities.toString(originalType) + \"\\\".\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(format.type === \"bool\") {\n\t\t\t\t\tformat.type = \"boolean\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"int\") {\n\t\t\t\t\tformat.type = \"integer\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"number\") {\n\t\t\t\t\tformat.type = \"float\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"string\") {\n\t\t\t\t\tif(format.trim !== undefined) {\n\t\t\t\t\t\tvar originalTrim = format.trim;\n\n\t\t\t\t\t\tformat.trim = utilities.parseBoolean(format.trim);\n\n\t\t\t\t\t\tif(format.trim === null) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional trim string format value - expected boolean, received \\\"\" + utilities.toString(originalTrim) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.case !== undefined) {\n\t\t\t\t\t\t\tif(utilities.isEmptyString(format.case)) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional string case format value - expected non-empty string.\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar originalCase = format.case;\n\n\t\t\t\t\t\t\t\tformat.case = changeCase.camelCase(format.case.trim());\n\n\t\t\t\t\t\t\t\tif(!utilities.isFunction(stringCaseFunctions[format.case])) {\n\t\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional case format value - expected one of \" + Object.keys(stringCaseFunctions).join(\", \") + \", received \\\"\" + utilities.toString(originalCase) + \"\\\".\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"object\") {\n\t\t\t\t\tif(format.strict !== undefined) {\n\t\t\t\t\t\tvar originalStrict = format.strict;\n\n\t\t\t\t\t\tformat.strict = utilities.parseBoolean(format.strict);\n\n\t\t\t\t\t\tif(format.strict === null) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional strict object format value - expected boolean, received \\\"\" + utilities.toString(originalStrict) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.autopopulate !== undefined) {\n\t\t\t\t\t\t\tvar originalAutopopulate = format.autopopulate;\n\n\t\t\t\t\t\t\tformat.autopopulate = utilities.parseBoolean(format.autopopulate);\n\n\t\t\t\t\t\t\tif(format.autopopulate === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional autopopulate object format value - expected boolean, received \\\"\" + utilities.toString(originalAutopopulate) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.order !== undefined) {\n\t\t\t\t\t\t\tvar originalOrder = format.order;\n\n\t\t\t\t\t\t\tformat.order = utilities.parseBoolean(format.order);\n\n\t\t\t\t\t\t\tif(format.order === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional order object format value - expected boolean, received \\\"\" + utilities.toString(originalOrder) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.removeExtra !== undefined) {\n\t\t\t\t\t\t\tvar originalRemoveExtra = format.removeExtra;\n\n\t\t\t\t\t\t\tformat.removeExtra = utilities.parseBoolean(format.removeExtra);\n\n\t\t\t\t\t\t\tif(format.removeExtra === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional removeExtra object format value - expected boolean, received \\\"\" + utilities.toString(originalRemoveExtra) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"regexp\" || format.type === \"regularexpression\") {\n\t\t\t\t\tformat.type = \"regex\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"func\") {\n\t\t\t\t\tformat.type = \"function\";\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(format.type === \"object\" || format.type === \"array\") {\n\t\t\t\t\t\tif(format.format !== undefined && !utilities.isObjectStrict(format.format)) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional format format value - expected object, received \\\"\" + utilities.toString(format.format) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(format.type === \"string\" || format.type === \"object\" || format.type === \"array\") {\n\t\t\t\t\t\tif(format.nonEmpty !== undefined) {\n\t\t\t\t\t\t\tvar originalNonEmpty = format.nonEmpty;\n\n\t\t\t\t\t\t\tformat.nonEmpty = utilities.parseBoolean(format.nonEmpty);\n\n\t\t\t\t\t\t\tif(format.nonEmpty === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional nonEmpty format value - expected boolean, received \\\"\" + utilities.toString(originalNonEmpty) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.nullable !== undefined) {\n\t\t\t\tvar originalNullable = format.nullable;\n\n\t\t\t\tformat.nullable = utilities.parseBoolean(format.nullable);\n\n\t\t\t\tif(format.nullable === null) {\n\t\t\t\t\terrorMessage = \"Invalid optional nullable format value - expected boolean, received \\\"\" + utilities.toString(originalNullable) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.required !== undefined) {\n\t\t\t\tvar originalRequired = format.required;\n\n\t\t\t\tformat.required = utilities.parseBoolean(format.required);\n\n\t\t\t\tif(format.required === null) {\n\t\t\t\t\terrorMessage = \"Invalid optional required format value - expected boolean, received \\\"\" + utilities.toString(originalRequired) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.parser !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.parser)) {\n\t\t\t\t\terrorMessage = \"Invalid optional parser format value - expected function, received \\\"\" + utilities.toString(format.parser) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.validator !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.validator)) {\n\t\t\t\t\terrorMessage = \"Invalid optional validator format value - expected function, received \\\"\" + utilities.toString(format.validator) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.formatter !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.formatter)) {\n\t\t\t\t\terrorMessage = \"Invalid optional formatter format value - expected function, received \\\"\" + utilities.toString(format.formatter) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isValid(errorMessage)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\t\t\telse if(options.verbose) {\n\t\t\t\tconsole.error(errorMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(utilities.isFunction(format.parser)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tvalue = format.parser(value, format, options);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tvalue = format.parser(value, format, options);\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar formattedValue = undefined;\n\n\t\tif(value === undefined) {\n\t\t\tformattedValue = utilities.clone(format.default);\n\t\t}\n\t\telse if(value === null) {\n\t\t\tif(format.nullable) {\n\t\t\t\tformattedValue = null;\n\t\t\t}\n\t\t\telse if(format.default !== undefined) {\n\t\t\t\tformattedValue = utilities.clone(format.default);\n\t\t\t}\n\t\t\telse {\n\t\t\t\terrorMessage = \"Value cannot be null!\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"boolean\") {\n\t\t\tformattedValue = utilities.parseBoolean(value);\n\n\t\t\tif(formattedValue === null) {\n\t\t\t\terrorMessage = \"Invalid boolean value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"integer\") {\n\t\t\tformattedValue = utilities.parseInteger(value);\n\n\t\t\tif(utilities.isInvalidNumber(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid integer value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"float\") {\n\t\t\tformattedValue = utilities.parseFloatingPointNumber(value);\n\n\t\t\tif(utilities.isInvalidNumber(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid float value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"string\") {\n\t\t\tformattedValue = typeof value === \"string\" ? value : utilities.toString(value);\n\n\t\t\tif(format.trim) {\n\t\t\t\tformattedValue = formattedValue.trim();\n\t\t\t}\n\n\t\t\tif(format.case !== undefined) {\n\t\t\t\tformattedValue = stringCaseFunctions[format.case](formattedValue);\n\t\t\t}\n\n\t\t\tif(format.nonEmpty && formattedValue.length === 0) {\n\t\t\t\tvar message = \"String value cannot be empty.\";\n\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t}\n\t\t\t\telse if(options.verbose) {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"array\") {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tformattedValue = JSON.parse(value);\n\n\t\t\t\t\tif(!Array.isArray(formattedValue)) {\n\t\t\t\t\t\terrorMessage = \"Invalid stringified array value type - expected array: \\\"\" + utilities.toString(value) + \"\\\".\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\terrorMessage = \"Invalid stringified array value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(Array.isArray(value)) {\n\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\terrorMessage = \"Invalid value type - expected array or stringified array: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\tif(Array.isArray(formattedValue)) {\n\t\t\t\t\tvar formattedArray = [];\n\n\t\t\t\t\tif(utilities.isObjectStrict(format.format)) {\n\t\t\t\t\t\tvar formattedElement = null;\n\n\t\t\t\t\t\tfor(var i = 0; i < formattedValue.length; i++) {\n\t\t\t\t\t\t\tif(formattedValue[i] === undefined) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\t\tformattedElement = utilities.formatValue(formattedValue[i], format.format, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\t\t\t\t\t\tsubOptions.throwErrors = true;\n\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tformattedElement = utilities.formatValue(formattedValue[i], format.format, subOptions);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedArray.push(formattedElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor(var i = 0; i < formattedValue.length; i++) {\n\t\t\t\t\t\t\tif(formattedValue[i] === undefined) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedArray.push(utilities.clone(formattedValue[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tformattedValue = formattedArray;\n\n\t\t\t\t\tif(format.nonEmpty && formattedValue.length === 0) {\n\t\t\t\t\t\tvar message = \"Array value cannot be empty.\";\n\n\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"date\") {\n\t\t\tformattedValue = utilities.parseDate(value);\n\n\t\t\tif(!utilities.isDate(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid date value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"regex\") {\n\t\t\tif(utilities.isRegularExpression(value)) {\n\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tformattedValue = utilities.parseRegularExpression(value, true);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tformattedValue = utilities.parseRegularExpression(value, true);\n\t\t\t\t\t}\n\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\terrorMessage = error.message;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid regular expression value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"function\") {\n\t\t\tformattedValue = value;\n\n\t\t\tif(!utilities.isFunction(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid function value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.type === \"object\") {\n\t\t\t\tif(utilities.isValid(value)) {\n\t\t\t\t\tif(typeof value === \"string\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tformattedValue = JSON.parse(value);\n\n\t\t\t\t\t\t\tif(!utilities.isObject(formattedValue, format.strict)) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid stringified object value type - expected \" + (format.strict ? \"strict \" : \"\") + \"object: \\\"\" + utilities.toString(value) + \"\\\".\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid stringified object value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(utilities.isObject(value, format.strict)) {\n\t\t\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\terrorMessage = \"Invalid value type - expected \" + (format.strict ? \"strict \" : \"\") + \"object or stringified object: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(utilities.isInvalid(formattedValue)) {\n\t\t\t\t\t\tif(format.autopopulate && !utilities.isObject(formattedValue, format.strict)) {\n\t\t\t\t\t\t\tformattedValue = { };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isObjectStrict(format.format) && utilities.isObject(formattedValue)) {\n\t\t\t\t\t\tvar attribute = null;\n\t\t\t\t\t\tvar attributes = Object.keys(format.format);\n\n\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\t\tvar formattedAttribute = utilities.formatValue(formattedValue[attribute], format.format[attribute], options);\n\n\t\t\t\t\t\t\t\tif(formattedAttribute !== undefined) {\n\t\t\t\t\t\t\t\t\tformattedValue[attribute] = formattedAttribute;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\t\t\t\t\t\tsubOptions.throwErrors = true;\n\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tvar formattedAttribute = utilities.formatValue(formattedValue[attribute], format.format[attribute], subOptions);\n\n\t\t\t\t\t\t\t\t\tif(formattedAttribute !== undefined) {\n\t\t\t\t\t\t\t\t\t\tformattedValue[attribute] = formattedAttribute;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(format.removeExtra) {\n\t\t\t\t\t\t\tvar newValue = { };\n\n\t\t\t\t\t\t\tattributes = Object.keys(formattedValue);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\t\tif(utilities.isValid(format.format[attribute])) {\n\t\t\t\t\t\t\t\t\tnewValue[attribute] = formattedValue[attribute];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedValue = newValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(format.order) {\n\t\t\t\t\t\t\tvar orderedObject = { };\n\n\t\t\t\t\t\t\tattributes = Object.keys(format.format);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\t\tif(formattedValue[attribute] !== undefined) {\n\t\t\t\t\t\t\t\t\torderedObject[attribute] = formattedValue[attribute];\n\n\t\t\t\t\t\t\t\t\tdelete formattedValue[attribute];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar extraAttributes = Object.keys(formattedValue);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < extraAttributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = extraAttributes[i];\n\n\t\t\t\t\t\t\t\torderedObject[attribute] = formattedValue[attribute];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedValue = orderedObject;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(format.nonEmpty && utilities.isEmptyObject(formattedValue)) {\n\t\t\t\t\t\tvar message = \"Object value must contain at least one attribute.\";\n\n\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isValid(errorMessage)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\t\t\telse if(options.verbose) {\n\t\t\t\tconsole.error(errorMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(formattedValue === undefined) {\n\t\t\tif(format.required) {\n\t\t\t\tvar message = \"Missing required value!\";\n\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t}\n\t\t\t\telse if(options.verbose) {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif(format.default !== undefined) {\n\t\t\t\tformattedValue = utilities.clone(format.default);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isFunction(format.validator)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tif(!format.validator(formattedValue, format, options)) {\n\t\t\t\t\tthrow new Error(\"Validation check failed!\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tif(!format.validator(formattedValue, format, options)) {\n\t\t\t\t\t\tvar message = \"Validation check failed!\";\n\n\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isFunction(format.formatter)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tformattedValue = format.formatter(formattedValue, format, options);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tformattedValue = format.formatter(formattedValue, format, options);\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.formatObject = function formatObject(object, format, removeExtra, throwErrors) {\n\t\tif(!utilities.isObjectStrict(object) && (!utilities.isObjectStrict(removeExtra) || !utilities.isFunction(removeExtra.parser))) {\n\t\t\treturn { };\n\t\t}\n\n\t\tvar options = null;\n\n\t\tif(utilities.isObjectStrict(removeExtra)) {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(removeExtra.throwErrors, utilities.parseBoolean(throwErrors, false)),\n\t\t\t\tverbose: utilities.parseBoolean(removeExtra.verbose, false)\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(throwErrors, false),\n\t\t\t\tverbose: false\n\t\t\t};\n\t\t}\n\n\t\tvar subFormat = {\n\t\t\ttype: \"object\",\n\t\t\tstrict: false,\n\t\t\tautopopulate: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.autopopulate, false) : false,\n\t\t\torder: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.order, false) : false,\n\t\t\tremoveExtra: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.removeExtra, utilities.parseBoolean(removeExtra, false)) : utilities.parseBoolean(removeExtra, false),\n\t\t\tnullable: true,\n\t\t\trequired: false,\n\t\t\tformat: format\n\t\t};\n\n\t\tif(utilities.isObjectStrict(removeExtra)) {\n\t\t\tif(utilities.isFunction(removeExtra.parser)) {\n\t\t\t\tsubFormat.parser = removeExtra.parser;\n\t\t\t}\n\n\t\t\tif(utilities.isFunction(removeExtra.validator)) {\n\t\t\t\tsubFormat.validator = removeExtra.validator;\n\t\t\t}\n\n\t\t\tif(utilities.isFunction(removeExtra.formatter)) {\n\t\t\t\tsubFormat.formatter = removeExtra.formatter;\n\t\t\t}\n\t\t}\n\n\t\tvar formattedObject = null;\n\n\t\tif(options.throwErrors) {\n\t\t\tformattedObject = utilities.formatValue(\n\t\t\t\tobject,\n\t\t\t\tsubFormat,\n\t\t\t\toptions\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\tsubOptions.throwErrors = true;\n\n\t\t\ttry {\n\t\t\t\tformattedObject = utilities.formatValue(\n\t\t\t\t\tobject,\n\t\t\t\t\tsubFormat,\n\t\t\t\t\tsubOptions\n\t\t\t\t);\n\t\t\t}\n\t\t\tcatch(error) {\n\t\t\t\tif(options.verbose) {\n\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn utilities.isObjectStrict(formattedObject) || (utilities.isObjectStrict(removeExtra) && utilities.isFunction(removeExtra.parser)) ? formattedObject : { };\n\t};\n\n\tutilities.formatStringList = function formatStringList(value, stringify) {\n\t\tvar data = null;\n\n\t\tif(utilities.isNonEmptyString(value)) {\n\t\t\tdata = utilities.parseStringList(value);\n\t\t}\n\t\telse if(utilities.isNonEmptyArray(value)) {\n\t\t\tdata = value;\n\t\t}\n\t\telse if(typeof value === \"string\" || Array.isArray(value)) {\n\t\t\treturn \"\";\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedList = \"\";\n\t\tvar formattedValue = null;\n\n\t\tstringify = utilities.parseBoolean(stringify);\n\n\t\tfor(var i = 0; i < data.length; i++) {\n\t\t\tif(typeof data[i] !== \"string\") {\n\t\t\t\tif(stringify === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse if(stringify) {\n\t\t\t\t\tformattedValue = utilities.toString(data[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tformattedValue = data[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tformattedValue = data[i].trim();\n\t\t\t}\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(formattedList.length > 0) {\n\t\t\t\tformattedList += \", \";\n\t\t\t}\n\n\t\t\tformattedList += formattedValue;\n\t\t}\n\n\t\treturn formattedList;\n\t};\n\n\tutilities.leftShift = function leftShift(number, bits) {\n\t\tif(!Number.isInteger(number) || !Number.isInteger(bits)) {\n\t\t\treturn NaN;\n\t\t}\n\n\t\treturn number * Math.pow(2, bits);\n\t};\n\n\tutilities.rightShift = function rightShift(number, bits) {\n\t\tif(!Number.isInteger(number) || !Number.isInteger(bits)) {\n\t\t\treturn NaN;\n\t\t}\n\n\t\treturn number / Math.pow(2, bits);\n\t};\n\n\tutilities.trimString = function trimString(value, defaultValue) {\n\t\treturn typeof value === \"string\" ? value.trim() : (defaultValue === undefined ? null : defaultValue);\n\t};\n\n\tutilities.trimNullTerminatedString = function trimNullTerminatedString(value, defaultValue) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn defaultValue === undefined ? null : defaultValue;\n\t\t}\n\n\t\tvar nullTerminatorIndex = value.indexOf(\"\\0\");\n\n\t\tif(nullTerminatorIndex >= 0) {\n\t\t\treturn value.substr(0, nullTerminatorIndex);\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.trimWhitespace = function trimWhitespace(value, trimNewlines) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar trimmedString = value.replace(/^[ \\t]+|[ \\t]+$/gm, \"\");\n\n\t\tif(utilities.parseBoolean(trimNewlines, false)) {\n\t\t\ttrimmedString = trimmedString.replace(/\\r\\n?|\\n/g, \"\");\n\t\t}\n\n\t\treturn trimmedString;\n\t};\n\n\tutilities.trimTrailingNewlines = function trimTrailingNewlines(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn value.replace(/[ \\t\\r\\n]+$/, \"\");\n\t};\n\n\tutilities.replaceNonBreakingSpaces = function replaceNonBreakingSpaces(value) {\n\t\treturn typeof value === \"string\" ? value.replace(/ /gi, \" \") : null;\n\t};\n\n\tutilities.indentText = function indentText(value, amount, indentation, clearEmptyLines) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tclearEmptyLines = utilities.parseBoolean(clearEmptyLines, true);\n\n\t\tamount = utilities.parseInteger(amount, 1);\n\n\t\tif(amount < 0) {\n\t\t\tamount = 0;\n\t\t}\n\n\t\tindentation = typeof indentation === \"string\" ? indentation : \"\\t\";\n\n\t\tvar totalIndentation = \"\";\n\n\t\tfor(var i = 0; i < amount; i++) {\n\t\t\ttotalIndentation += indentation;\n\t\t}\n\n\t\tvar line = null;\n\t\tvar lines = value.split(/\\r\\n?|\\n/g);\n\t\tvar indentedParagraph = \"\";\n\n\t\tfor(var i = 0; i < lines.length; i++) {\n\t\t\tline = lines[i];\n\n\t\t\tindentedParagraph += (utilities.isEmptyString(line) && clearEmptyLines ? \"\" : totalIndentation + line) + ((i < lines.length - 1) ? \"\\n\" : \"\");\n\t\t}\n\n\t\treturn indentedParagraph;\n\t};\n\n\tutilities.trimLeadingZeroes = function trimLeadingZeroes(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(value.length === 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\t\telse if(formattedValue.match(/^[0]+$/)) {\n\t\t\treturn \"0\";\n\t\t}\n\n\t\treturn formattedValue.replace(/^0+/, \"\");\n\t};\n\n\tutilities.addLeadingZeroes = function addLeadingZeroes(value, expectedLength) {\n\t\tif(utilities.isInvalid(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvalue = value.toString();\n\t\texpectedLength = utilities.parseInteger(expectedLength);\n\n\t\tif(utilities.isInvalidNumber(expectedLength) || expectedLength < 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\tvar numberOfZeroes = expectedLength - value.length;\n\n\t\tfor(var i = 0; i < numberOfZeroes; i++) {\n\t\t\tvalue = \"0\" + value;\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.toString = function toString(value) {\n\t\tif(value === undefined) {\n\t\t\treturn \"undefined\";\n\t\t}\n\t\telse if(value === null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t\telse if(value === Infinity) {\n\t\t\treturn \"Infinity\";\n\t\t}\n\t\telse if(value === -Infinity) {\n\t\t\treturn \"-Infinity\";\n\t\t}\n\t\telse if(typeof value === \"number\" && isNaN(value)) {\n\t\t\treturn \"NaN\";\n\t\t}\n\t\telse if(utilities.isDate(value)) {\n\t\t\treturn value.toString();\n\t\t}\n\t\telse if(utilities.isRegularExpression(value)) {\n\t\t\tvar flags = \"\";\n\n\t\t\tfor(var flag in regExpFlags) {\n\t\t\t\tif(value[flag]) {\n\t\t\t\t\tflags += regExpFlags[flag];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"/\" + value.source + \"/\" + flags;\n\t\t}\n\t\telse if(utilities.isFunction(value)) {\n\t\t\treturn value.toString();\n\t\t}\n\t\telse if(utilities.isError(value)) {\n\t\t\tvar error = { message: value.message };\n\n\t\t\tfor(var attribute in value) {\n\t\t\t\terror[attribute] = value[attribute];\n\t\t\t}\n\n\t\t\treturn JSON.stringify(error);\n\t\t}\n\n\t\treturn JSON.stringify(value);\n\t};\n\n\tutilities.compareDates = function compareDates(a, b) {\n\t\ta = utilities.parseDate(a);\n\t\tb = utilities.parseDate(b);\n\n\t\tif(a === null && b === null) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif(a === null) {\n\t\t\treturn -1;\n\t\t}\n\t\telse if(b === null) {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn a.getTime() - b.getTime();\n\t};\n\n\tutilities.compareCasePercentage = function compareCasePercentage(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar c = null;\n\t\tvar upper = 0;\n\t\tvar lower = 0;\n\t\tvar lowerA = \"a\".charCodeAt();\n\t\tvar lowerZ = \"z\".charCodeAt();\n\t\tvar upperA = \"A\".charCodeAt();\n\t\tvar upperZ = \"Z\".charCodeAt();\n\n\t\tfor(var i = 0; i < value.length; i++) {\n\t\t\tc = value.charCodeAt(i);\n\n\t\t\tif(c >= lowerA && c <= lowerZ) {\n\t\t\t\tlower++;\n\t\t\t}\n\t\t\telse if(c >= upperA && c <= upperZ) {\n\t\t\t\tupper++;\n\t\t\t}\n\t\t}\n\n\t\treturn upper - lower;\n\t};\n\n\tutilities.reverseString = function reverseString(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvalue = value.replace(\n\t\t\t/([\\0-\\u02FF\\u0370-\\u1AAF\\u1B00-\\u1DBF\\u1E00-\\u20CF\\u2100-\\uD7FF\\uE000-\\uFE1F\\uFE30-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])([\\u0300-\\u036F\\u1AB0-\\u1AFF\\u1DC0-\\u1DFF\\u20D0-\\u20FF\\uFE20-\\uFE2F]+)/g,\n\t\t\tfunction($0, $1, $2) {\n\t\t\t\treturn utilities.reverseString($2) + $1;\n\t\t\t}\n\t\t).replace(/([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])/g, \"$2$1\");\n\n\t\tvar reverse = \"\";\n\n\t\tfor(var i = value.length - 1; i >= 0; i--) {\n\t\t\treverse += value[i];\n\t\t}\n\n\t\treturn reverse;\n\t};\n\n\tutilities.createError = function createError(message, status) {\n\t\tvar error = new Error(message);\n\t\terror.status = utilities.parseInteger(status, 500);\n\t\treturn error;\n\t};\n\n\tutilities.clone = function clone(value) {\n\t\tif(!utilities.isObject(value)) {\n\t\t\treturn value;\n\t\t}\n\t\telse if(value instanceof Boolean) {\n\t\t\treturn new Boolean(value.valueOf());\n\t\t}\n\t\telse if(value instanceof Date) {\n\t\t\tvar copy = new Date();\n\t\t\tcopy.setTime(value.getTime());\n\n\t\t\treturn copy;\n\t\t}\n\t\telse if(value instanceof Array) {\n\t\t\tvar copy = [];\n\n\t\t\tfor(var i = 0, length = value.length; i < length; i++) {\n\t\t\t\tcopy[i] = utilities.clone(value[i]);\n\t\t\t}\n\n\t\t\treturn copy;\n\t\t}\n\t\telse if(value instanceof Set) {\n\t\t\treturn new Set(value);\n\t\t}\n\t\telse if(value instanceof Map) {\n\t\t\treturn new Map(value);\n\t\t}\n\t\telse if(value instanceof RegExp) {\n\t\t\tvar flags = \"\";\n\n\t\t\tfor(var flag in regExpFlags) {\n\t\t\t\tif(value[flag]) {\n\t\t\t\t\tflags += regExpFlags[flag]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new RegExp(value.source, flags);\n\t\t}\n\t\telse if(typeof Buffer !== \"undefined\" && value instanceof Buffer) {\n\t\t\treturn Buffer.from instanceof Function ? Buffer.from(value) : new Buffer(value);\n\t\t}\n\t\telse if(value instanceof Object) {\n\t\t\tvar copy = null;\n\n\t\t\tif(value instanceof Error) {\n\t\t\t\tcopy = new Error(value.message);\n\n\t\t\t\tcopy.stack = utilities.clone(value.stack);\n\n\t\t\t\tvar properties = Object.keys(value);\n\n\t\t\t\tfor(var i = 0; i < properties.length; i++) {\n\t\t\t\t\tcopy[properties[i]] = utilities.clone(value[properties[i]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcopy = { };\n\t\t\t}\n\n\t\t\tfor(var attribute in value) {\n\t\t\t\tif(Object.prototype.hasOwnProperty.call(value, attribute)) {\n\t\t\t\t\tcopy[attribute] = utilities.clone(value[attribute]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn copy;\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.merge = function merge(a, b, copy, deepMerge) {\n\t\tif(!utilities.isObject(a) || Array.isArray(a)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar newObject = null;\n\n\t\tcopy = utilities.parseBoolean(copy, true);\n\n\t\tif(copy) {\n\t\t\tnewObject = utilities.clone(a);\n\t\t}\n\t\telse {\n\t\t\tnewObject = a;\n\t\t}\n\n\t\tif(!utilities.isObject(a) || Array.isArray(a) || !utilities.isObject(b) || Array.isArray(b)) {\n\t\t\treturn newObject;\n\t\t}\n\n\t\tvar attribute = null;\n\t\tvar value = null;\n\t\tvar newValue = null;\n\t\tvar attributes = Object.keys(b);\n\n\t\tdeepMerge = utilities.parseBoolean(deepMerge, true);\n\n\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\tattribute = attributes[i];\n\t\t\tvalue = newObject[attribute];\n\n\t\t\tif(copy) {\n\t\t\t\tnewValue = utilities.clone(b[attribute]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnewValue = b[attribute];\n\t\t\t}\n\n\t\t\tif(deepMerge && utilities.isObject(value) && !Array.isArray(value) && utilities.isObject(newValue) && !Array.isArray(newValue)) {\n\t\t\t\tnewObject[attribute] = utilities.merge(value, newValue);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnewObject[attribute] = newValue;\n\t\t\t}\n\t\t}\n\n\t\treturn newObject;\n\t};\n\n\tutilities.getFileName = function getFileName(filePath) {\n\t\tif(typeof filePath !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfilePath = filePath.trim();\n\n\t\tfor(var i = filePath.length - 1; i >= 0; i--) {\n\t\t\tif(filePath[i] === \"/\" || filePath[i] === \"\\\\\") {\n\t\t\t\treturn filePath.substring(i + 1, filePath.length).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn filePath;\n\t};\n\n\tutilities.getFilePath = function getFilePath(filePath) {\n\t\tif(typeof filePath !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfilePath = filePath.trim();\n\n\t\tfor(var i = filePath.length - 1; i >= 0; i--) {\n\t\t\tif(filePath[i] === \"/\" || filePath[i] === \"\\\\\") {\n\t\t\t\treturn filePath.substring(0, i).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tutilities.getFileNameNoExtension = function getFileNameNoExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(0, i).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn fileName;\n\t};\n\n\tutilities.getFileExtension = function getFileExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(i + 1, fileName.length).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tutilities.fileHasExtension = function fileHasExtension(fileName, extension) {\n\t\tif(utilities.isEmptyString(fileName) || utilities.isEmptyString(extension)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar actualFileExtension = utilities.getFileExtension(fileName);\n\n\t\tif(utilities.isEmptyString(actualFileExtension)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn actualFileExtension.toLowerCase() === extension.trim().toLowerCase();\n\t};\n\n\tutilities.reverseFileExtension = function reverseFileExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = fileName.trim();\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(0, i) + \".\" + utilities.reverseString(fileName.substring(i + 1, fileName.length));\n\t\t\t}\n\t\t}\n\n\t\treturn fileName;\n\t};\n\n\tutilities.truncateFileName = function truncateFileName(fileName, maxLength) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tif(utilities.isEmptyString(fileName)) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tmaxLength = utilities.parseInteger(maxLength);\n\n\t\tif(utilities.isInvalidNumber(maxLength) || maxLength < 0) {\n\t\t\treturn fileName;\n\t\t}\n\n\t\tif(maxLength === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif(fileName.length <= maxLength) {\n\t\t\treturn fileName;\n\t\t}\n\n\t\tvar extension = \"\";\n\t\tvar originalFileName = fileName;\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\textension = fileName.substring(i + 1, fileName.length);\n\t\t\t\toriginalFileName = fileName.substring(0, i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(maxLength - (extension.length + (extension.length > 0 ? 1 : 0)) < 1) {\n\t\t\treturn originalFileName.substring(0, maxLength);\n\t\t}\n\n\t\treturn originalFileName.substring(0, maxLength - extension.length - (extension.length > 0 ? 1 : 0)) + (extension.length > 0 ? \".\" + extension : \"\");\n\t};\n\n\tutilities.prependSlash = function prependSlash(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\tif(formattedValue[0] !== \"/\" && formattedValue[0] !== \"\\\\\") {\n\t\t\tformattedValue = \"/\" + formattedValue;\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.appendSlash = function appendSlash(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\tif(formattedValue[formattedValue.length - 1] !== \"/\" && formattedValue[formattedValue.length - 1] !== \"\\\\\") {\n\t\t\tformattedValue += \"/\";\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.joinPaths = function joinPaths(base, path) {\n\t\tvar formattedBase = typeof base === \"string\" ? base.trim().replace(/[\\/\\\\]+$/, \"\") : null;\n\t\tvar formattedPath = typeof path === \"string\" ? path.trim().replace(/^[\\/\\\\]+/, \"\") : null;\n\t\tvar newPath = \"\";\n\n\t\tif(utilities.isNonEmptyString(formattedBase)) {\n\t\t\tnewPath += formattedBase;\n\n\t\t\tif(utilities.isNonEmptyString(formattedPath)) {\n\t\t\t\tnewPath += \"/\";\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isNonEmptyString(formattedPath)) {\n\t\t\tnewPath += formattedPath;\n\t\t}\n\n\t\treturn newPath;\n\t};\n\n\tutilities.createQueryString = function createQueryString(value, includeQuestionMark) {\n\t\tif(!utilities.isObjectStrict(value)) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar parameters = Object.keys(value).map(function(key) {\n\t\t\treturn encodeURIComponent(key) + \"=\" + encodeURIComponent(utilities.toString(value[key]));\n\t\t}).join(\"&\");\n\n\t\tif(parameters.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn (utilities.parseBoolean(includeQuestionMark, false) ? \"?\" : \"\") + parameters;\n\t};\n\n\tutilities.createRange = function createRange(start, end) {\n\t\tvar formattedStart = utilities.parseInteger(start);\n\t\tvar formattedEnd = utilities.parseInteger(end);\n\n\t\tif(arguments.length === 1) {\n\t\t\tformattedEnd = formattedStart;\n\t\t\tformattedStart = 0;\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(formattedStart) || utilities.isInvalidNumber(formattedEnd) || formattedStart > formattedEnd) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar range = [];\n\n\t\tfor(var i = formattedStart; i <= formattedEnd; i++) {\n\t\t\trange.push(i);\n\t\t}\n\n\t\treturn range;\n\t};\n\n\tutilities.futureMonths = function futureMonths(date, prependZero) {\n\t\tdate = utilities.parseDate(date);\n\n\t\tif(date === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar currentDate = new Date();\n\t\tvar month = 0;\n\n\t\tif(date.getFullYear() === currentDate.getFullYear()) {\n\t\t\tmonth = currentDate.getMonth();\n\t\t}\n\n\t\tvar months = [];\n\n\t\tprependZero = utilities.parseBoolean(prependZero, false);\n\n\t\tfor(var i = 0; i < 12; i++) {\n\t\t\tif(i >= month) {\n\t\t\t\tif(prependZero) {\n\t\t\t\t\tmonths.push((i <= 8 ? \"0\" : \"\") + (i + 1));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmonths.push(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn months;\n\t};\n\n\tutilities.visibleElements = function visibleElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar visibleElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isVisible(elements[i])) {\n\t\t\t\tvisibleElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn visibleElements;\n\t};\n\n\tutilities.hiddenElements = function hiddenElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar hiddenElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isHidden(elements[i])) {\n\t\t\t\thiddenElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn hiddenElements;\n\t};\n\n\tutilities.enabledElements = function enabledElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar enabledElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isEnabled(elements[i])) {\n\t\t\t\tenabledElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn enabledElements;\n\t};\n\n\tutilities.disabledElements = function disabledElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar disabledElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isDisabled(elements[i])) {\n\t\t\t\tdisabledElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn disabledElements;\n\t};\n\n\tutilities.elementsWithAttribute = function elementsWithAttribute(elements, attribute, hasAttribute) {\n\t\tif(!Array.isArray(elements) || utilities.isEmptyString(attribute)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar element = null;\n\t\tvar filteredElements = [];\n\n\t\tattribute = attribute.trim();\n\t\thasAttribute = utilities.parseBoolean(hasAttribute, true);\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\telement = elements[i];\n\n\t\t\tif(!utilities.isObject(element)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(elements[i][attribute])) {\n\t\t\t\tif(!hasAttribute) {\n\t\t\t\t\tfilteredElements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(hasAttribute) {\n\t\t\t\t\tfilteredElements.push(elements[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn filteredElements;\n\t};\n\n\tutilities.elementsWithoutAttribute = function elementsWithoutAttribute(elements, attribute) {\n\t\treturn utilities.elementsWithAttribute(elements, attribute, false);\n\t};\n\n\tutilities.matchAttribute = function matchAttribute(element, attribute, value) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isEmptyString(attribute)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn element[attribute.trim()] === value;\n\t};\n\n\tutilities.generateVersions = function generateVersions(version, prefix, suffix) {\n\t\tversion = utilities.parseVersion(version);\n\n\t\tif(version === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tprefix = utilities.trimString(prefix);\n\t\tsuffix = utilities.trimString(suffix);\n\n\t\tvar versions = [];\n\t\tvar value = null;\n\n\t\tfor(var i = 0; i < version.length; i++) {\n\t\t\tvalue = \"\";\n\n\t\t\tif(utilities.isNonEmptyString(prefix)) {\n\t\t\t\tvalue += prefix;\n\t\t\t}\n\n\t\t\tfor(var j = 0; j <= i; j++) {\n\t\t\t\tif(j > 0) {\n\t\t\t\t\tvalue += \"_\";\n\t\t\t\t}\n\n\t\t\t\tvalue += version[j];\n\t\t\t}\n\n\t\t\tif(utilities.isNonEmptyString(suffix)) {\n\t\t\t\tvalue += suffix;\n\t\t\t}\n\n\t\t\tversions.push(value);\n\t\t}\n\n\t\treturn versions;\n\t};\n\n\tutilities.parseVersion = function parseVersion(value, trimTrailingZeroes) {\n\t\tvar formattedValue = utilities.isValidNumber(value) ? value.toString() : value;\n\n\t\tif(typeof formattedValue !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar version = [];\n\t\tvar versionData = formattedValue.match(/[^. \\t]+/g);\n\n\t\tif(versionData === null || versionData.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar part = null;\n\n\t\tfor(var i = 0; i < versionData.length; i++) {\n\t\t\tif(validator.isInt(versionData[i])) {\n\t\t\t\tpart = utilities.parseInteger(versionData[i]);\n\n\t\t\t\tif(utilities.isInvalidNumber(part) || part < 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tversion.push(part.toString());\n\t\t\t}\n\t\t\telse {\n\t\t\t\tversion.push(versionData[i]);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.parseBoolean(trimTrailingZeroes, false)) {\n\t\t\twhile(true) {\n\t\t\t\tif(version.length <= 1) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(version[version.length - 1] === \"0\") {\n\t\t\t\t\tversion.pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn version.length === 0 ? null : version;\n\t};\n\n\tutilities.compareVersions = function compareVersions(v1, v2, caseSensitive, throwErrors) {\n\t\tcaseSensitive = utilities.parseBoolean(caseSensitive, false);\n\t\tthrowErrors = utilities.parseBoolean(throwErrors, false);\n\n\t\tv1 = utilities.parseVersion(v1);\n\n\t\tif(v1 === null) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Cannot compare invalid or empty first version.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tv2 = utilities.parseVersion(v2);\n\n\t\tif(v2 === null) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Cannot compare invalid or empty second version.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar index = 0;\n\n\t\twhile(true) {\n\t\t\tif(index >= v1.length) {\n\t\t\t\tif(v1.length === v2.length) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tfor(var i = index; i < v2.length; i++) {\n\t\t\t\t\tif(v2[i] !== \"0\") {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif(index >= v2.length) {\n\t\t\t\tfor(var i = index; i < v1.length; i++) {\n\t\t\t\t\tif(v1[i] !== \"0\") {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tvar formattedA = utilities.parseInteger(v1[index]);\n\t\t\tvar formattedB = utilities.parseInteger(v2[index]);\n\n\t\t\tif(utilities.isInvalidNumber(formattedA)) {\n\t\t\t\tformattedA = caseSensitive ? v1[index] : v1[index].toUpperCase();\n\t\t\t}\n\n\t\t\tif(utilities.isInvalidNumber(formattedB)) {\n\t\t\t\tformattedB = caseSensitive ? v2[index] : v2[index].toUpperCase();\n\t\t\t}\n\n\t\t\tif(Number.isInteger(formattedA)) {\n\t\t\t\tif(!Number.isInteger(formattedB)) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(Number.isInteger(formattedB)) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(formattedA > formattedB) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse if(formattedA < formattedB) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tindex++;\n\t\t}\n\t};\n\n\treturn utilities;\n\n}));\n"],"file":"extra-utilities.js"} \ No newline at end of file diff --git a/dist/extra-utilities.min.js b/dist/extra-utilities.min.js index 13b98ef..b27cb04 100644 --- a/dist/extra-utilities.min.js +++ b/dist/extra-utilities.min.js @@ -1 +1,2 @@ -!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):global.utilities=factory()}(this,function(){"use strict";"undefined"!=typeof require&&("undefined"==typeof validator&&(global.validator=require("validator")),"undefined"==typeof changeCase&&(global.changeCase=require("change-case-bundled")));var utilities={},regExpFlags={global:"g",multiline:"m",ignoreCase:"i",sticky:"y",unicode:"u"},formatTypes=["boolean","bool","integer","int","float","number","string","object","array","date","regex","regexp","regularexpression","function","func"],stringCaseFunctions={camel:changeCase.camelCase,constant:changeCase.constantCase,dot:changeCase.dotCase,header:changeCase.headerCase,lower:changeCase.lowerCase,lowerFirst:changeCase.lowerCaseFirst,no:changeCase.noCase,param:changeCase.paramCase,pascal:changeCase.pascalCase,path:changeCase.pathCase,sentence:changeCase.sentenceCase,snake:changeCase.snakeCase,swap:changeCase.swapCase,title:changeCase.titleCase,upper:changeCase.upperCase,upperFirst:changeCase.upperCaseFirst};return utilities.isValid=function(value){return null!=value},utilities.isInvalid=function(value){return null==value},utilities.isBoolean=function(value,allowObjects){return!0===value||!1===value||!!allowObjects&&value instanceof Boolean},utilities.isValidNumber=function(value){return"number"==typeof value&&!isNaN(value)&&value!==-1/0&&value!==1/0},utilities.isInvalidNumber=function(value){return"number"!=typeof value||isNaN(value)||value===-1/0||value===1/0},utilities.isEmptyString=function(value,trim){return"string"!=typeof value||(utilities.parseBoolean(trim,!0)?0===value.trim().length:0===value.length)},utilities.isNonEmptyString=function(value,trim){return"string"==typeof value&&(utilities.parseBoolean(trim,!0)?0!==value.trim().length:0!==value.length)},utilities.isObject=function(value,strict){return void 0!==value&&(strict?null!==value&&value.constructor===Object:value instanceof Object&&!(value instanceof Function))},utilities.isObjectStrict=function(value){return null!=value&&value.constructor===Object},utilities.isEmptyObject=function(value){return null!=value&&value.constructor===Object&&0===Object.keys(value).length},utilities.isNonEmptyObject=function(value){return null!=value&&value.constructor===Object&&0!==Object.keys(value).length},utilities.isEmptyArray=function(value){return!Array.isArray(value)||0===value.length},utilities.isNonEmptyArray=function(value){return Array.isArray(value)&&0!==value.length},utilities.isDate=function(value){return value instanceof Date},utilities.isError=function(value){return value instanceof Error},utilities.isRegularExpression=function(value){return value instanceof RegExp},utilities.isFunction=function(value){return value instanceof Function},utilities.isComment=function(value,comment){if(utilities.isEmptyString(value))return!1;utilities.isEmptyString(comment)&&(comment="//");for(var commentStartIndex=-1,i=0;i=comment.length);i++)if(value[i]!=comment[i-commentStartIndex])return!1;return!0},utilities.isVisible=function(element){return!!utilities.isObject(element)&&(utilities.isBoolean(element.visible)?element.visible:utilities.isFunction(element.visible)?element.visible():utilities.isBoolean(element.hidden)?!element.hidden:!utilities.isFunction(element.hidden)||!element.hidden())},utilities.isHidden=function(element){return!utilities.isObject(element)||(utilities.isBoolean(element.visible)?!element.visible:utilities.isFunction(element.visible)?!element.visible():utilities.isBoolean(element.hidden)?element.hidden:!!utilities.isFunction(element.hidden)&&element.hidden())},utilities.isEnabled=function(element){return!!utilities.isObject(element)&&(utilities.isBoolean(element.enabled)?element.enabled:utilities.isFunction(element.enabled)?element.enabled():utilities.isBoolean(element.disabled)?!element.disabled:!utilities.isFunction(element.disabled)||!element.disabled())},utilities.isDisabled=function(element){return!utilities.isObject(element)||(utilities.isBoolean(element.enabled)?!element.enabled:utilities.isFunction(element.enabled)?!element.enabled():utilities.isBoolean(element.disabled)?element.disabled:!!utilities.isFunction(element.disabled)&&element.disabled())},utilities.equalsIgnoreCase=function(stringA,stringB){return"string"==typeof stringA&&"string"==typeof stringB&&0===stringA.localeCompare(stringB,void 0,{sensitivity:"accent"})},utilities.parseBoolean=function(value,defaultValue){if(utilities.isBoolean(value))return value;if(utilities.isBoolean(value,!0))return value.valueOf();if(utilities.isBoolean(defaultValue)||(defaultValue=null),utilities.isInvalid(value))return defaultValue;if(0===value)return!1;if(1===value)return!0;if("string"!=typeof value)return defaultValue;var formattedValue=value.trim().toLowerCase();if(0===formattedValue.length)return defaultValue;if(1===formattedValue.length){var character=formattedValue.charAt(0);return"t"===character||"y"===character||"f"!==character&&"n"!==character&&("0"!==character&&("1"===character||defaultValue))}return"true"===formattedValue||"yes"===formattedValue||"on"===formattedValue||"false"!==formattedValue&&"no"!==formattedValue&&"off"!==formattedValue&&defaultValue},utilities.parseInteger=function(value,defaultValue){var newValue=NaN;return"number"==typeof value?newValue=parseInt(value):"string"==typeof value&&validator.isFloat(value)&&(newValue=parseInt(value)),utilities.isInvalidNumber(newValue)?(defaultValue=parseInt(defaultValue),utilities.isValidNumber(defaultValue)?defaultValue:NaN):newValue},utilities.parseFloatingPointNumber=function(value,defaultValue){var newValue=NaN;return"number"==typeof value?newValue=value:"string"==typeof value&&validator.isFloat(value)&&(newValue=parseFloat(value)),utilities.isInvalidNumber(newValue)?utilities.isValidNumber(defaultValue)?defaultValue:NaN:newValue},utilities.parseDate=function(value,defaultValue){if(utilities.isDate(defaultValue)||(defaultValue=null),"number"==typeof value)return utilities.isInvalidNumber(value)||!Number.isInteger(value)?defaultValue:new Date(parseInt(value));if("string"==typeof value){var formattedValue=value.trim();if(0===formattedValue.length)return defaultValue;var timestamp=null;return timestamp=validator.isInt(formattedValue)?parseInt(formattedValue):Date.parse(formattedValue),utilities.isInvalidNumber(timestamp)?defaultValue:new Date(timestamp)}return value instanceof Date?value:defaultValue},utilities.parseTime=function(value,throwErrors){if(throwErrors=utilities.parseBoolean(throwErrors),utilities.isEmptyString(value)){if(throwErrors)throw new Error("Invalid or empty time value.");return null}var formattedValue=value.trim(),hour=null,minutes=null,regularTime=formattedValue.match(/^[ \t]*(([2-9]|[1][0-2]?)(:([0-5][0-9]))?[ \t]*([ap]m))[ \t]*$/i);if(regularTime){var regularHour=utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[2]));if(utilities.isInvalidNumber(regularHour)){if(throwErrors)throw new Error('Invalid regular hour: "'+regularTime[2]+'".');return null}minutes=utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[4])),utilities.isInvalidNumber(minutes)&&(minutes=0);var morning="AM"===(period=regularTime[5].toUpperCase())||"PM"!==period&&null;if(null===morning){if(throwErrors)throw new Error('Invalid period: "'+regularTime[5]+'".');return null}24===(hour=morning?regularHour+(12===regularHour?12:0):regularHour+(12===regularHour?0:12))&&(hour=0)}else{var militaryTime=formattedValue.match(/^[ \t]*(((([0-1][0-9])|(2[0-3])):?([0-5][0-9]))|((24):?(00)))[ \t]*$/i);if(!militaryTime){if(throwErrors)throw new Error('Invalid time: "'+formattedValue+'".');return null}var militaryHour=militaryTime[3],militaryMinutes=militaryTime[6];if((utilities.isInvalid(militaryHour)||utilities.isInvalid(militaryMinutes))&&(militaryHour=militaryTime[8],utilities.isNonEmptyString(militaryTime[9])&&(militaryMinutes=militaryTime[9])),utilities.isInvalid(militaryHour)||utilities.isInvalid(militaryMinutes)){if(throwErrors)throw new Error('Invalid military time: "'+formattedValue+'".');return null}if(hour=utilities.parseInteger(utilities.trimLeadingZeroes(militaryHour)),utilities.isInvalidNumber(hour)){if(throwErrors)throw new Error('Invalid military time hour: "'+militaryHour+'".');return null}if(minutes=utilities.parseInteger(utilities.trimLeadingZeroes(militaryMinutes)),utilities.isInvalidNumber(minutes)){if(throwErrors)throw new Error('Invalid military time minutes: "'+militaryMinutes+'".');return null}24===hour&&0===minutes&&(hour=0)}if(hour<0||23=v1.length){if(v1.length===v2.length)return 0;for(var i=index;i=v2.length){for(i=index;i=comment.length);i++)if(value[i]!=comment[i-commentStartIndex])return!1;return!0},utilities.isVisible=function(element){return!!utilities.isObject(element)&&(utilities.isBoolean(element.visible)?element.visible:utilities.isFunction(element.visible)?element.visible():utilities.isBoolean(element.hidden)?!element.hidden:!utilities.isFunction(element.hidden)||!element.hidden())},utilities.isHidden=function(element){return!utilities.isObject(element)||(utilities.isBoolean(element.visible)?!element.visible:utilities.isFunction(element.visible)?!element.visible():utilities.isBoolean(element.hidden)?element.hidden:!!utilities.isFunction(element.hidden)&&element.hidden())},utilities.isEnabled=function(element){return!!utilities.isObject(element)&&(utilities.isBoolean(element.enabled)?element.enabled:utilities.isFunction(element.enabled)?element.enabled():utilities.isBoolean(element.disabled)?!element.disabled:!utilities.isFunction(element.disabled)||!element.disabled())},utilities.isDisabled=function(element){return!utilities.isObject(element)||(utilities.isBoolean(element.enabled)?!element.enabled:utilities.isFunction(element.enabled)?!element.enabled():utilities.isBoolean(element.disabled)?element.disabled:!!utilities.isFunction(element.disabled)&&element.disabled())},utilities.equalsIgnoreCase=function(stringA,stringB){return"string"==typeof stringA&&"string"==typeof stringB&&0===stringA.localeCompare(stringB,void 0,{sensitivity:"accent"})},utilities.parseBoolean=function(value,defaultValue){if(utilities.isBoolean(value))return value;if(utilities.isBoolean(value,!0))return value.valueOf();if(utilities.isBoolean(defaultValue)||(defaultValue=null),utilities.isInvalid(value))return defaultValue;if(0===value)return!1;if(1===value)return!0;if("string"!=typeof value)return defaultValue;var formattedValue=value.trim().toLowerCase();if(0===formattedValue.length)return defaultValue;if(1!==formattedValue.length)return"true"===formattedValue||"yes"===formattedValue||"on"===formattedValue||"false"!==formattedValue&&"no"!==formattedValue&&"off"!==formattedValue&&defaultValue;var character=formattedValue.charAt(0);return"t"===character||"y"===character||"f"!==character&&"n"!==character&&("0"!==character&&("1"===character||defaultValue))},utilities.parseInteger=function(value,defaultValue){var newValue=NaN;return("number"==typeof value||"string"==typeof value&&validator.isFloat(value))&&(newValue=parseInt(value)),utilities.isInvalidNumber(newValue)?(defaultValue=parseInt(defaultValue),utilities.isValidNumber(defaultValue)?defaultValue:NaN):newValue},utilities.parseFloatingPointNumber=function(value,defaultValue){var newValue=NaN;return"number"==typeof value?newValue=value:"string"==typeof value&&validator.isFloat(value)&&(newValue=parseFloat(value)),utilities.isInvalidNumber(newValue)?utilities.isValidNumber(defaultValue)?defaultValue:NaN:newValue},utilities.parseDate=function(value,defaultValue){if(utilities.isDate(defaultValue)||(defaultValue=null),"number"==typeof value)return utilities.isInvalidNumber(value)||!Number.isInteger(value)?defaultValue:new Date(parseInt(value));if("string"!=typeof value)return value instanceof Date?value:defaultValue;var formattedValue=value.trim();if(0===formattedValue.length)return defaultValue;var timestamp=null;return timestamp=validator.isInt(formattedValue)?parseInt(formattedValue):Date.parse(formattedValue),utilities.isInvalidNumber(timestamp)?defaultValue:new Date(timestamp)},utilities.parseTime=function(value,throwErrors){if(throwErrors=utilities.parseBoolean(throwErrors),utilities.isEmptyString(value)){if(throwErrors)throw new Error("Invalid or empty time value.");return null}var formattedValue=value.trim(),hour=null,minutes=null,regularTime=formattedValue.match(/^[ \t]*(([2-9]|[1][0-2]?)(:([0-5][0-9]))?[ \t]*([ap]m))[ \t]*$/i);if(regularTime){var regularHour=utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[2]));if(utilities.isInvalidNumber(regularHour)){if(throwErrors)throw new Error('Invalid regular hour: "'+regularTime[2]+'".');return null}minutes=utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[4])),utilities.isInvalidNumber(minutes)&&(minutes=0);var morning="AM"===(period=regularTime[5].toUpperCase())||"PM"!==period&&null;if(null===morning){if(throwErrors)throw new Error('Invalid period: "'+regularTime[5]+'".');return null}24===(hour=morning?regularHour+(12===regularHour?12:0):regularHour+(12===regularHour?0:12))&&(hour=0)}else{var militaryTime=formattedValue.match(/^[ \t]*(((([0-1][0-9])|(2[0-3])):?([0-5][0-9]))|((24):?(00)))[ \t]*$/i);if(!militaryTime){if(throwErrors)throw new Error('Invalid time: "'+formattedValue+'".');return null}var militaryHour=militaryTime[3],militaryMinutes=militaryTime[6];if((utilities.isInvalid(militaryHour)||utilities.isInvalid(militaryMinutes))&&(militaryHour=militaryTime[8],utilities.isNonEmptyString(militaryTime[9])&&(militaryMinutes=militaryTime[9])),utilities.isInvalid(militaryHour)||utilities.isInvalid(militaryMinutes)){if(throwErrors)throw new Error('Invalid military time: "'+formattedValue+'".');return null}if(hour=utilities.parseInteger(utilities.trimLeadingZeroes(militaryHour)),utilities.isInvalidNumber(hour)){if(throwErrors)throw new Error('Invalid military time hour: "'+militaryHour+'".');return null}if(minutes=utilities.parseInteger(utilities.trimLeadingZeroes(militaryMinutes)),utilities.isInvalidNumber(minutes)){if(throwErrors)throw new Error('Invalid military time minutes: "'+militaryMinutes+'".');return null}24===hour&&0===minutes&&(hour=0)}if(hour<0||23=v1.length){if(v1.length===v2.length)return 0;for(var i=index;i=v2.length){for(i=index;i= comment.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(value[i] != comment[i - commentStartIndex]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isVisible = function isVisible(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.visible)) {\n\t\t\treturn element.visible;\n\t\t}\n\t\telse if(utilities.isFunction(element.visible)) {\n\t\t\treturn element.visible();\n\t\t}\n\t\telse if(utilities.isBoolean(element.hidden)) {\n\t\t\treturn !element.hidden;\n\t\t}\n\t\telse if(utilities.isFunction(element.hidden)) {\n\t\t\treturn !element.hidden();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isHidden = function isHidden(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.visible)) {\n\t\t\treturn !element.visible;\n\t\t}\n\t\telse if(utilities.isFunction(element.visible)) {\n\t\t\treturn !element.visible();\n\t\t}\n\t\telse if(utilities.isBoolean(element.hidden)) {\n\t\t\treturn element.hidden;\n\t\t}\n\t\telse if(utilities.isFunction(element.hidden)) {\n\t\t\treturn element.hidden();\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tutilities.isEnabled = function isEnabled(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.enabled)) {\n\t\t\treturn element.enabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.enabled)) {\n\t\t\treturn element.enabled();\n\t\t}\n\t\telse if(utilities.isBoolean(element.disabled)) {\n\t\t\treturn !element.disabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.disabled)) {\n\t\t\treturn !element.disabled();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tutilities.isDisabled = function isDisabled(element) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(utilities.isBoolean(element.enabled)) {\n\t\t\treturn !element.enabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.enabled)) {\n\t\t\treturn !element.enabled();\n\t\t}\n\t\telse if(utilities.isBoolean(element.disabled)) {\n\t\t\treturn element.disabled;\n\t\t}\n\t\telse if(utilities.isFunction(element.disabled)) {\n\t\t\treturn element.disabled();\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tutilities.equalsIgnoreCase = function equalsIgnoreCase(stringA, stringB) {\n\t\tif(typeof stringA !== \"string\" || typeof stringB !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn stringA.localeCompare(stringB, undefined, { sensitivity: \"accent\" }) === 0;\n\t};\n\n\tutilities.parseBoolean = function parseBoolean(value, defaultValue) {\n\t\tif(utilities.isBoolean(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif(utilities.isBoolean(value, true)) {\n\t\t\treturn value.valueOf();\n\t\t}\n\n\t\tif(!utilities.isBoolean(defaultValue)) {\n\t\t\tdefaultValue = null;\n\t\t}\n\n\t\tif(utilities.isInvalid(value)) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(value === 0) {\n\t\t\treturn false;\n\t\t}\n\t\telse if(value === 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tvar formattedValue = value.trim().toLowerCase();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(formattedValue.length === 1) {\n\t\t\tvar character = formattedValue.charAt(0);\n\n\t\t\tif(character === \"t\" || character === \"y\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if(character === \"f\" || character === \"n\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if(character === \"0\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if(character === \"1\") {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif(formattedValue === \"true\" || formattedValue === \"yes\" || formattedValue === \"on\") {\n\t\t\treturn true;\n\t\t}\n\t\telse if(formattedValue === \"false\" || formattedValue === \"no\" || formattedValue === \"off\") {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\tutilities.parseInteger = function parseInteger(value, defaultValue) {\n\t\tvar newValue = NaN;\n\n\t\tif(typeof value === \"number\") {\n\t\t\tnewValue = parseInt(value);\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tif(validator.isFloat(value)) {\n\t\t\t\tnewValue = parseInt(value);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(newValue)) {\n\t\t\tdefaultValue = parseInt(defaultValue);\n\n\t\t\treturn utilities.isValidNumber(defaultValue) ? defaultValue : NaN;\n\t\t}\n\n\t\treturn newValue;\n\t};\n\n\tutilities.parseFloatingPointNumber = function parseFloatingPointNumber(value, defaultValue) {\n\t\tvar newValue = NaN;\n\n\t\tif(typeof value === \"number\") {\n\t\t\tnewValue = value;\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tif(validator.isFloat(value)) {\n\t\t\t\tnewValue = parseFloat(value);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(newValue)) {\n\t\t\treturn utilities.isValidNumber(defaultValue) ? defaultValue : NaN;\n\t\t}\n\n\t\treturn newValue;\n\t};\n\n\tutilities.parseDate = function parseDate(value, defaultValue) {\n\t\tif(!utilities.isDate(defaultValue)) {\n\t\t\tdefaultValue = null;\n\t\t}\n\n\t\tif(typeof value === \"number\") {\n\t\t\tif(utilities.isInvalidNumber(value) || !Number.isInteger(value)) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\treturn new Date(parseInt(value));\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\tvar formattedValue = value.trim();\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\tvar timestamp = null;\n\n\t\t\tif(validator.isInt(formattedValue)) {\n\t\t\t\ttimestamp = parseInt(formattedValue);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttimestamp = Date.parse(formattedValue);\n\t\t\t}\n\n\t\t\tif(utilities.isInvalidNumber(timestamp)) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\n\t\t\treturn new Date(timestamp);\n\t\t}\n\t\telse if(value instanceof Date) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\tutilities.parseTime = function parseTime(value, throwErrors) {\n\t\tthrowErrors = utilities.parseBoolean(throwErrors);\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Invalid or empty time value.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\t\tvar hour = null;\n\t\tvar minutes = null;\n\t\tvar regularTime = formattedValue.match(/^[ \\t]*(([2-9]|[1][0-2]?)(:([0-5][0-9]))?[ \\t]*([ap]m))[ \\t]*$/i);\n\n\t\tif(regularTime) {\n\t\t\tvar regularHour = utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[2]));\n\n\t\t\tif(utilities.isInvalidNumber(regularHour)) {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid regular hour: \\\"\" + regularTime[2] + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tminutes = utilities.parseInteger(utilities.trimLeadingZeroes(regularTime[4]));\n\n\t\t\tif(utilities.isInvalidNumber(minutes)) {\n\t\t\t\tminutes = 0;\n\t\t\t}\n\n\t\t\tvar period = regularTime[5].toUpperCase();\n\t\t\tvar morning = period === \"AM\" ? true : (period === \"PM\" ? false : null);\n\n\t\t\tif(morning === null) {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid period: \\\"\" + regularTime[5] + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\thour = morning ? regularHour + (regularHour === 12 ? 12 : 0) : regularHour + (regularHour === 12 ? 0 : 12);\n\n\t\t\tif(hour === 24) {\n\t\t\t\thour = 0;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tvar militaryTime = formattedValue.match(/^[ \\t]*(((([0-1][0-9])|(2[0-3])):?([0-5][0-9]))|((24):?(00)))[ \\t]*$/i);\n\n\t\t\tif(militaryTime) {\n\t\t\t\tvar militaryHour = militaryTime[3];\n\t\t\t\tvar militaryMinutes = militaryTime[6];\n\n\t\t\t\tif(utilities.isInvalid(militaryHour) || utilities.isInvalid(militaryMinutes)) {\n\t\t\t\t\tmilitaryHour = militaryTime[8];\n\n\t\t\t\t\tif(utilities.isNonEmptyString(militaryTime[9])) {\n\t\t\t\t\t\tmilitaryMinutes = militaryTime[9];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(militaryHour) || utilities.isInvalid(militaryMinutes)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time: \\\"\" + formattedValue + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\thour = utilities.parseInteger(utilities.trimLeadingZeroes(militaryHour));\n\n\t\t\t\tif(utilities.isInvalidNumber(hour)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time hour: \\\"\" + militaryHour + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tminutes = utilities.parseInteger(utilities.trimLeadingZeroes(militaryMinutes));\n\n\t\t\t\tif(utilities.isInvalidNumber(minutes)) {\n\t\t\t\t\tif(throwErrors) {\n\t\t\t\t\t\tthrow new Error(\"Invalid military time minutes: \\\"\" + militaryMinutes + \"\\\".\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif(hour === 24 && minutes === 0) {\n\t\t\t\t\thour = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(throwErrors) {\n\t\t\t\t\tthrow new Error(\"Invalid time: \\\"\" + formattedValue + \"\\\".\");\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif(hour < 0 || hour > 23) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Time hour is out of range (0 - 23): \\\"\" + hour + \"\\\".\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\t\telse if(minutes < 0 || minutes > 59) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Time minutes is out of range (0 - 59): \\\"\" + minutes + \"\\\".\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar regularHour = hour === 0 ? 12 : (hour <= 12 ? hour : hour - 12);\n\t\tvar period = hour < 12 ? \"AM\" : \"PM\";\n\n\t\treturn {\n\t\t\tregular: {\n\t\t\t\traw: regularHour + \":\" + utilities.addLeadingZeroes(minutes, 2) + \" \" + period,\n\t\t\t\thour: regularHour,\n\t\t\t\tminutes: minutes,\n\t\t\t\tperiod: period,\n\t\t\t\tmorning: hour < 12\n\t\t\t},\n\t\t\tmilitary: {\n\t\t\t\traw: utilities.addLeadingZeroes(hour, 2) + utilities.addLeadingZeroes(minutes, 2),\n\t\t\t\thour: hour,\n\t\t\t\tminutes: minutes\n\t\t\t}\n\t\t};\n\t};\n\n\tutilities.parseEmail = function parseEmail(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar emailData = value.trim().toLowerCase().match(/([^+@]+)(\\+.*)?(@.+\\..+)/);\n\n\t\tif(utilities.isInvalid(emailData) || emailData.length < 4) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn emailData[1] + emailData[3];\n\t};\n\n\tutilities.parseEmailDomain = function parseEmailDomain(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar emailDomainData = value.trim().toLowerCase().match(/([^+@]+)(\\+.*)?@(.+\\..+)/);\n\n\t\tif(utilities.isInvalid(emailDomainData) || emailDomainData.length < 4) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn emailDomainData[3];\n\t};\n\n\tutilities.parseStringList = function parseStringList(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(value.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar data = value.split(/[;,]+/);\n\t\tvar formattedList = [];\n\t\tvar formattedValue = null;\n\n\t\tfor(var i = 0; i < data.length; i++) {\n\t\t\tformattedValue = data[i].trim();\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tformattedList.push(formattedValue);\n\t\t}\n\n\t\treturn formattedList;\n\t};\n\n\tutilities.parseRegularExpression = function parseRegularExpression(value, throwErrors) {\n\t\tthrowErrors = utilities.parseBoolean(throwErrors, false);\n\n\t\tif(utilities.isRegularExpression(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Regular expression cannot be empty.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar regExpData = value.match(/\\s*\\/(.*)\\/(.*)\\s*/);\n\n\t\tif(!regExpData) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Invalid regular expression value.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(throwErrors) {\n\t\t\treturn new RegExp(regExpData[1], regExpData[2]);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new RegExp(regExpData[1], regExpData[2]);\n\t\t}\n\t\tcatch(error) {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tutilities.parseYouTubeLink = function parseYouTubeLink(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\t\tvar linkData = formattedValue.match(/.*(?:youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=)([^#\\&\\?]*).*/i);\n\n\t\tif(linkData && linkData[1].length >= 11) {\n\t\t\treturn linkData[1];\n\t\t}\n\n\t\tif(formattedValue.match(/[A-Z0-9_-]{11,}/i)) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tutilities.formatValue = function formatValue(value, format, options) {\n\t\tif(utilities.isObjectStrict(options)) {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(options.throwErrors, false)\n\t\t\t};\n\n\t\t\toptions.verbose = utilities.parseBoolean(options.verbose, !options.throwErrors);\n\t\t}\n\t\telse {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: false,\n\t\t\t\tverbose: true\n\t\t\t};\n\t\t}\n\n\t\tif(!utilities.isObjectStrict(format)) {\n\t\t\treturn utilities.clone(value);\n\t\t}\n\n\t\tformat = utilities.clone(format);\n\n\t\tvar errorMessage = null;\n\n\t\tif(utilities.isEmptyString(format.type)) {\n\t\t\terrorMessage = \"Invalid required type format value - expected non-empty string.\";\n\t\t}\n\t\telse {\n\t\t\tvar originalType = format.type;\n\n\t\t\tformat.type = format.type.trim().toLowerCase();\n\n\t\t\tvar validFormatType = false;\n\n\t\t\tfor(var i = 0; i < formatTypes.length; i++) {\n\t\t\t\tif(format.type === formatTypes[i]) {\n\t\t\t\t\tvalidFormatType = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!validFormatType) {\n\t\t\t\terrorMessage = \"Invalid required type format value - expected one of \" + formatTypes.join(\", \") + \", received \\\"\" + utilities.toString(originalType) + \"\\\".\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(format.type === \"bool\") {\n\t\t\t\t\tformat.type = \"boolean\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"int\") {\n\t\t\t\t\tformat.type = \"integer\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"number\") {\n\t\t\t\t\tformat.type = \"float\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"string\") {\n\t\t\t\t\tif(format.trim !== undefined) {\n\t\t\t\t\t\tvar originalTrim = format.trim;\n\n\t\t\t\t\t\tformat.trim = utilities.parseBoolean(format.trim);\n\n\t\t\t\t\t\tif(format.trim === null) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional trim string format value - expected boolean, received \\\"\" + utilities.toString(originalTrim) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.case !== undefined) {\n\t\t\t\t\t\t\tif(utilities.isEmptyString(format.case)) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional string case format value - expected non-empty string.\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar originalCase = format.case;\n\n\t\t\t\t\t\t\t\tformat.case = changeCase.camelCase(format.case.trim());\n\n\t\t\t\t\t\t\t\tif(!utilities.isFunction(stringCaseFunctions[format.case])) {\n\t\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional case format value - expected one of \" + Object.keys(stringCaseFunctions).join(\", \") + \", received \\\"\" + utilities.toString(originalCase) + \"\\\".\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"object\") {\n\t\t\t\t\tif(format.strict !== undefined) {\n\t\t\t\t\t\tvar originalStrict = format.strict;\n\n\t\t\t\t\t\tformat.strict = utilities.parseBoolean(format.strict);\n\n\t\t\t\t\t\tif(format.strict === null) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional strict object format value - expected boolean, received \\\"\" + utilities.toString(originalStrict) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.autopopulate !== undefined) {\n\t\t\t\t\t\t\tvar originalAutopopulate = format.autopopulate;\n\n\t\t\t\t\t\t\tformat.autopopulate = utilities.parseBoolean(format.autopopulate);\n\n\t\t\t\t\t\t\tif(format.autopopulate === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional autopopulate object format value - expected boolean, received \\\"\" + utilities.toString(originalAutopopulate) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.order !== undefined) {\n\t\t\t\t\t\t\tvar originalOrder = format.order;\n\n\t\t\t\t\t\t\tformat.order = utilities.parseBoolean(format.order);\n\n\t\t\t\t\t\t\tif(format.order === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional order object format value - expected boolean, received \\\"\" + utilities.toString(originalOrder) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\t\tif(format.removeExtra !== undefined) {\n\t\t\t\t\t\t\tvar originalRemoveExtra = format.removeExtra;\n\n\t\t\t\t\t\t\tformat.removeExtra = utilities.parseBoolean(format.removeExtra);\n\n\t\t\t\t\t\t\tif(format.removeExtra === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional removeExtra object format value - expected boolean, received \\\"\" + utilities.toString(originalRemoveExtra) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"regexp\" || format.type === \"regularexpression\") {\n\t\t\t\t\tformat.type = \"regex\";\n\t\t\t\t}\n\t\t\t\telse if(format.type === \"func\") {\n\t\t\t\t\tformat.type = \"function\";\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(format.type === \"object\" || format.type === \"array\") {\n\t\t\t\t\t\tif(format.format !== undefined && !utilities.isObjectStrict(format.format)) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid optional format format value - expected object, received \\\"\" + utilities.toString(format.format) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(format.type === \"string\" || format.type === \"object\" || format.type === \"array\") {\n\t\t\t\t\t\tif(format.nonEmpty !== undefined) {\n\t\t\t\t\t\t\tvar originalNonEmpty = format.nonEmpty;\n\n\t\t\t\t\t\t\tformat.nonEmpty = utilities.parseBoolean(format.nonEmpty);\n\n\t\t\t\t\t\t\tif(format.nonEmpty === null) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid optional nonEmpty format value - expected boolean, received \\\"\" + utilities.toString(originalNonEmpty) + \"\\\".\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.nullable !== undefined) {\n\t\t\t\tvar originalNullable = format.nullable;\n\n\t\t\t\tformat.nullable = utilities.parseBoolean(format.nullable);\n\n\t\t\t\tif(format.nullable === null) {\n\t\t\t\t\terrorMessage = \"Invalid optional nullable format value - expected boolean, received \\\"\" + utilities.toString(originalNullable) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.required !== undefined) {\n\t\t\t\tvar originalRequired = format.required;\n\n\t\t\t\tformat.required = utilities.parseBoolean(format.required);\n\n\t\t\t\tif(format.required === null) {\n\t\t\t\t\terrorMessage = \"Invalid optional required format value - expected boolean, received \\\"\" + utilities.toString(originalRequired) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.parser !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.parser)) {\n\t\t\t\t\terrorMessage = \"Invalid optional parser format value - expected function, received \\\"\" + utilities.toString(format.parser) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.validator !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.validator)) {\n\t\t\t\t\terrorMessage = \"Invalid optional validator format value - expected function, received \\\"\" + utilities.toString(format.validator) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.formatter !== undefined) {\n\t\t\t\tif(!utilities.isFunction(format.formatter)) {\n\t\t\t\t\terrorMessage = \"Invalid optional formatter format value - expected function, received \\\"\" + utilities.toString(format.formatter) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isValid(errorMessage)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\t\t\telse if(options.verbose) {\n\t\t\t\tconsole.error(errorMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(utilities.isFunction(format.parser)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tvalue = format.parser(value, format, options);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tvalue = format.parser(value, format, options);\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar formattedValue = undefined;\n\n\t\tif(value === undefined) {\n\t\t\tformattedValue = utilities.clone(format.default);\n\t\t}\n\t\telse if(value === null) {\n\t\t\tif(format.nullable) {\n\t\t\t\tformattedValue = null;\n\t\t\t}\n\t\t\telse if(format.default !== undefined) {\n\t\t\t\tformattedValue = utilities.clone(format.default);\n\t\t\t}\n\t\t\telse {\n\t\t\t\terrorMessage = \"Value cannot be null!\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"boolean\") {\n\t\t\tformattedValue = utilities.parseBoolean(value);\n\n\t\t\tif(formattedValue === null) {\n\t\t\t\terrorMessage = \"Invalid boolean value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"integer\") {\n\t\t\tformattedValue = utilities.parseInteger(value);\n\n\t\t\tif(utilities.isInvalidNumber(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid integer value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"float\") {\n\t\t\tformattedValue = utilities.parseFloatingPointNumber(value);\n\n\t\t\tif(utilities.isInvalidNumber(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid float value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"string\") {\n\t\t\tformattedValue = typeof value === \"string\" ? value : utilities.toString(value);\n\n\t\t\tif(format.trim) {\n\t\t\t\tformattedValue = formattedValue.trim();\n\t\t\t}\n\n\t\t\tif(format.case !== undefined) {\n\t\t\t\tformattedValue = stringCaseFunctions[format.case](formattedValue);\n\t\t\t}\n\n\t\t\tif(format.nonEmpty && formattedValue.length === 0) {\n\t\t\t\tvar message = \"String value cannot be empty.\";\n\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t}\n\t\t\t\telse if(options.verbose) {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"array\") {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tformattedValue = JSON.parse(value);\n\n\t\t\t\t\tif(!Array.isArray(formattedValue)) {\n\t\t\t\t\t\terrorMessage = \"Invalid stringified array value type - expected array: \\\"\" + utilities.toString(value) + \"\\\".\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\terrorMessage = \"Invalid stringified array value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(Array.isArray(value)) {\n\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\terrorMessage = \"Invalid value type - expected array or stringified array: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\tif(Array.isArray(formattedValue)) {\n\t\t\t\t\tvar formattedArray = [];\n\n\t\t\t\t\tif(utilities.isObjectStrict(format.format)) {\n\t\t\t\t\t\tvar formattedElement = null;\n\n\t\t\t\t\t\tfor(var i = 0; i < formattedValue.length; i++) {\n\t\t\t\t\t\t\tif(formattedValue[i] === undefined) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\t\tformattedElement = utilities.formatValue(formattedValue[i], format.format, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\t\t\t\t\t\tsubOptions.throwErrors = true;\n\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tformattedElement = utilities.formatValue(formattedValue[i], format.format, subOptions);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedArray.push(formattedElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor(var i = 0; i < formattedValue.length; i++) {\n\t\t\t\t\t\t\tif(formattedValue[i] === undefined) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedArray.push(utilities.clone(formattedValue[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tformattedValue = formattedArray;\n\n\t\t\t\t\tif(format.nonEmpty && formattedValue.length === 0) {\n\t\t\t\t\t\tvar message = \"Array value cannot be empty.\";\n\n\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"date\") {\n\t\t\tformattedValue = utilities.parseDate(value);\n\n\t\t\tif(!utilities.isDate(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid date value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"regex\") {\n\t\t\tif(utilities.isRegularExpression(value)) {\n\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tformattedValue = utilities.parseRegularExpression(value, true);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tformattedValue = utilities.parseRegularExpression(value, true);\n\t\t\t\t\t}\n\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\terrorMessage = error.message;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid regular expression value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\t\telse if(format.type === \"function\") {\n\t\t\tformattedValue = value;\n\n\t\t\tif(!utilities.isFunction(formattedValue)) {\n\t\t\t\terrorMessage = \"Invalid function value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\tif(format.type === \"object\") {\n\t\t\t\tif(utilities.isValid(value)) {\n\t\t\t\t\tif(typeof value === \"string\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tformattedValue = JSON.parse(value);\n\n\t\t\t\t\t\t\tif(!utilities.isObject(formattedValue, format.strict)) {\n\t\t\t\t\t\t\t\terrorMessage = \"Invalid stringified object value type - expected \" + (format.strict ? \"strict \" : \"\") + \"object: \\\"\" + utilities.toString(value) + \"\\\".\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\terrorMessage = \"Invalid stringified object value: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(utilities.isObject(value, format.strict)) {\n\t\t\t\t\t\tformattedValue = utilities.clone(value);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\terrorMessage = \"Invalid value type - expected \" + (format.strict ? \"strict \" : \"\") + \"object or stringified object: \\\"\" + utilities.toString(value) + \"\\\".\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(utilities.isInvalid(errorMessage)) {\n\t\t\t\t\tif(utilities.isInvalid(formattedValue)) {\n\t\t\t\t\t\tif(format.autopopulate && !utilities.isObject(formattedValue, format.strict)) {\n\t\t\t\t\t\t\tformattedValue = { };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(utilities.isObjectStrict(format.format) && utilities.isObject(formattedValue)) {\n\t\t\t\t\t\tvar attribute = null;\n\t\t\t\t\t\tvar attributes = Object.keys(format.format);\n\n\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\t\tvar formattedAttribute = utilities.formatValue(formattedValue[attribute], format.format[attribute], options);\n\n\t\t\t\t\t\t\t\tif(formattedAttribute !== undefined) {\n\t\t\t\t\t\t\t\t\tformattedValue[attribute] = formattedAttribute;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\t\t\t\t\t\tsubOptions.throwErrors = true;\n\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tvar formattedAttribute = utilities.formatValue(formattedValue[attribute], format.format[attribute], subOptions);\n\n\t\t\t\t\t\t\t\t\tif(formattedAttribute !== undefined) {\n\t\t\t\t\t\t\t\t\t\tformattedValue[attribute] = formattedAttribute;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcatch(error) {\n\t\t\t\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(format.removeExtra) {\n\t\t\t\t\t\t\tvar newValue = { };\n\n\t\t\t\t\t\t\tattributes = Object.keys(formattedValue);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\t\tif(utilities.isValid(format.format[attribute])) {\n\t\t\t\t\t\t\t\t\tnewValue[attribute] = formattedValue[attribute];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedValue = newValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(format.order) {\n\t\t\t\t\t\t\tvar orderedObject = { };\n\n\t\t\t\t\t\t\tattributes = Object.keys(format.format);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = attributes[i];\n\n\t\t\t\t\t\t\t\tif(formattedValue[attribute] !== undefined) {\n\t\t\t\t\t\t\t\t\torderedObject[attribute] = formattedValue[attribute];\n\n\t\t\t\t\t\t\t\t\tdelete formattedValue[attribute];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar extraAttributes = Object.keys(formattedValue);\n\n\t\t\t\t\t\t\tfor(var i = 0; i < extraAttributes.length; i++) {\n\t\t\t\t\t\t\t\tattribute = extraAttributes[i];\n\n\t\t\t\t\t\t\t\torderedObject[attribute] = formattedValue[attribute];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tformattedValue = orderedObject;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(format.nonEmpty && utilities.isEmptyObject(formattedValue)) {\n\t\t\t\t\t\tvar message = \"Object value must contain at least one attribute.\";\n\n\t\t\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isValid(errorMessage)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\t\t\telse if(options.verbose) {\n\t\t\t\tconsole.error(errorMessage);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tif(formattedValue === undefined) {\n\t\t\tif(format.required) {\n\t\t\t\tvar message = \"Missing required value!\";\n\n\t\t\t\tif(options.throwErrors) {\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t}\n\t\t\t\telse if(options.verbose) {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif(format.default !== undefined) {\n\t\t\t\tformattedValue = utilities.clone(format.default);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isFunction(format.validator)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tif(!format.validator(formattedValue, format, options)) {\n\t\t\t\t\tthrow new Error(\"Validation check failed!\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tif(!format.validator(formattedValue, format, options)) {\n\t\t\t\t\t\tvar message = \"Validation check failed!\";\n\n\t\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\t\tconsole.error(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isFunction(format.formatter)) {\n\t\t\tif(options.throwErrors) {\n\t\t\t\tformattedValue = format.formatter(formattedValue, format, options);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tformattedValue = format.formatter(formattedValue, format, options);\n\t\t\t\t}\n\t\t\t\tcatch(error) {\n\t\t\t\t\tif(options.verbose) {\n\t\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.formatObject = function formatObject(object, format, removeExtra, throwErrors) {\n\t\tif(!utilities.isObjectStrict(object) && (!utilities.isObjectStrict(removeExtra) || !utilities.isFunction(removeExtra.parser))) {\n\t\t\treturn { };\n\t\t}\n\n\t\tvar options = null;\n\n\t\tif(utilities.isObjectStrict(removeExtra)) {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(removeExtra.throwErrors, utilities.parseBoolean(throwErrors, false)),\n\t\t\t\tverbose: utilities.parseBoolean(removeExtra.verbose, false)\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\toptions = {\n\t\t\t\tthrowErrors: utilities.parseBoolean(throwErrors, false),\n\t\t\t\tverbose: false\n\t\t\t};\n\t\t}\n\n\t\tvar subFormat = {\n\t\t\ttype: \"object\",\n\t\t\tstrict: false,\n\t\t\tautopopulate: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.autopopulate, false) : false,\n\t\t\torder: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.order, false) : false,\n\t\t\tremoveExtra: utilities.isObjectStrict(removeExtra) ? utilities.parseBoolean(removeExtra.removeExtra, utilities.parseBoolean(removeExtra, false)) : utilities.parseBoolean(removeExtra, false),\n\t\t\tnullable: true,\n\t\t\trequired: false,\n\t\t\tformat: format\n\t\t};\n\n\t\tif(utilities.isObjectStrict(removeExtra)) {\n\t\t\tif(utilities.isFunction(removeExtra.parser)) {\n\t\t\t\tsubFormat.parser = removeExtra.parser;\n\t\t\t}\n\n\t\t\tif(utilities.isFunction(removeExtra.validator)) {\n\t\t\t\tsubFormat.validator = removeExtra.validator;\n\t\t\t}\n\n\t\t\tif(utilities.isFunction(removeExtra.formatter)) {\n\t\t\t\tsubFormat.formatter = removeExtra.formatter;\n\t\t\t}\n\t\t}\n\n\t\tvar formattedObject = null;\n\n\t\tif(options.throwErrors) {\n\t\t\tformattedObject = utilities.formatValue(\n\t\t\t\tobject,\n\t\t\t\tsubFormat,\n\t\t\t\toptions\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tvar subOptions = utilities.clone(options);\n\n\t\t\tsubOptions.throwErrors = true;\n\n\t\t\ttry {\n\t\t\t\tformattedObject = utilities.formatValue(\n\t\t\t\t\tobject,\n\t\t\t\t\tsubFormat,\n\t\t\t\t\tsubOptions\n\t\t\t\t);\n\t\t\t}\n\t\t\tcatch(error) {\n\t\t\t\tif(options.verbose) {\n\t\t\t\t\tconsole.error(error.message);\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn utilities.isObjectStrict(formattedObject) || (utilities.isObjectStrict(removeExtra) && utilities.isFunction(removeExtra.parser)) ? formattedObject : { };\n\t};\n\n\tutilities.formatStringList = function formatStringList(value, stringify) {\n\t\tvar data = null;\n\n\t\tif(utilities.isNonEmptyString(value)) {\n\t\t\tdata = utilities.parseStringList(value);\n\t\t}\n\t\telse if(utilities.isNonEmptyArray(value)) {\n\t\t\tdata = value;\n\t\t}\n\t\telse if(typeof value === \"string\" || Array.isArray(value)) {\n\t\t\treturn \"\";\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedList = \"\";\n\t\tvar formattedValue = null;\n\n\t\tstringify = utilities.parseBoolean(stringify);\n\n\t\tfor(var i = 0; i < data.length; i++) {\n\t\t\tif(typeof data[i] !== \"string\") {\n\t\t\t\tif(stringify === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse if(stringify) {\n\t\t\t\t\tformattedValue = utilities.toString(data[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tformattedValue = data[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tformattedValue = data[i].trim();\n\t\t\t}\n\n\t\t\tif(formattedValue.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(formattedList.length > 0) {\n\t\t\t\tformattedList += \", \";\n\t\t\t}\n\n\t\t\tformattedList += formattedValue;\n\t\t}\n\n\t\treturn formattedList;\n\t};\n\n\tutilities.leftShift = function leftShift(number, bits) {\n\t\tif(!Number.isInteger(number) || !Number.isInteger(bits)) {\n\t\t\treturn NaN;\n\t\t}\n\n\t\treturn number * Math.pow(2, bits);\n\t};\n\n\tutilities.rightShift = function rightShift(number, bits) {\n\t\tif(!Number.isInteger(number) || !Number.isInteger(bits)) {\n\t\t\treturn NaN;\n\t\t}\n\n\t\treturn number / Math.pow(2, bits);\n\t};\n\n\tutilities.trimString = function trimString(value, defaultValue) {\n\t\treturn typeof value === \"string\" ? value.trim() : (defaultValue === undefined ? null : defaultValue);\n\t};\n\n\tutilities.trimNullTerminatedString = function trimNullTerminatedString(value, defaultValue) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn defaultValue === undefined ? null : defaultValue;\n\t\t}\n\n\t\tvar nullTerminatorIndex = value.indexOf(\"\\0\");\n\n\t\tif(nullTerminatorIndex >= 0) {\n\t\t\treturn value.substr(0, nullTerminatorIndex);\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.trimWhitespace = function trimWhitespace(value, trimNewlines) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar trimmedString = value.replace(/^[ \\t]+|[ \\t]+$/gm, \"\");\n\n\t\tif(utilities.parseBoolean(trimNewlines, false)) {\n\t\t\ttrimmedString = trimmedString.replace(/\\r\\n?|\\n/g, \"\");\n\t\t}\n\n\t\treturn trimmedString;\n\t};\n\n\tutilities.trimTrailingNewlines = function trimTrailingNewlines(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn value.replace(/[ \\t\\r\\n]+$/, \"\");\n\t};\n\n\tutilities.replaceNonBreakingSpaces = function replaceNonBreakingSpaces(value) {\n\t\treturn typeof value === \"string\" ? value.replace(/ /gi, \" \") : null;\n\t};\n\n\tutilities.indentText = function indentText(value, amount, indentation, clearEmptyLines) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tclearEmptyLines = utilities.parseBoolean(clearEmptyLines, true);\n\n\t\tamount = utilities.parseInteger(amount, 1);\n\n\t\tif(amount < 0) {\n\t\t\tamount = 0;\n\t\t}\n\n\t\tindentation = typeof indentation === \"string\" ? indentation : \"\\t\";\n\n\t\tvar totalIndentation = \"\";\n\n\t\tfor(var i = 0; i < amount; i++) {\n\t\t\ttotalIndentation += indentation;\n\t\t}\n\n\t\tvar line = null;\n\t\tvar lines = value.split(/\\r\\n?|\\n/g);\n\t\tvar indentedParagraph = \"\";\n\n\t\tfor(var i = 0; i < lines.length; i++) {\n\t\t\tline = lines[i];\n\n\t\t\tindentedParagraph += (utilities.isEmptyString(line) && clearEmptyLines ? \"\" : totalIndentation + line) + ((i < lines.length - 1) ? \"\\n\" : \"\");\n\t\t}\n\n\t\treturn indentedParagraph;\n\t};\n\n\tutilities.trimLeadingZeroes = function trimLeadingZeroes(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tif(value.length === 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\t\telse if(formattedValue.match(/^[0]+$/)) {\n\t\t\treturn \"0\";\n\t\t}\n\n\t\treturn formattedValue.replace(/^0+/, \"\");\n\t};\n\n\tutilities.addLeadingZeroes = function addLeadingZeroes(value, expectedLength) {\n\t\tif(utilities.isInvalid(value)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvalue = value.toString();\n\t\texpectedLength = utilities.parseInteger(expectedLength);\n\n\t\tif(utilities.isInvalidNumber(expectedLength) || expectedLength < 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\tvar numberOfZeroes = expectedLength - value.length;\n\n\t\tfor(var i = 0; i < numberOfZeroes; i++) {\n\t\t\tvalue = \"0\" + value;\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.toString = function toString(value) {\n\t\tif(value === undefined) {\n\t\t\treturn \"undefined\";\n\t\t}\n\t\telse if(value === null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\telse if(typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t\telse if(value === Infinity) {\n\t\t\treturn \"Infinity\";\n\t\t}\n\t\telse if(value === -Infinity) {\n\t\t\treturn \"-Infinity\";\n\t\t}\n\t\telse if(typeof value === \"number\" && isNaN(value)) {\n\t\t\treturn \"NaN\";\n\t\t}\n\t\telse if(utilities.isDate(value)) {\n\t\t\treturn value.toString();\n\t\t}\n\t\telse if(utilities.isRegularExpression(value)) {\n\t\t\tvar flags = \"\";\n\n\t\t\tfor(var flag in regExpFlags) {\n\t\t\t\tif(value[flag]) {\n\t\t\t\t\tflags += regExpFlags[flag];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"/\" + value.source + \"/\" + flags;\n\t\t}\n\t\telse if(utilities.isFunction(value)) {\n\t\t\treturn value.toString();\n\t\t}\n\t\telse if(utilities.isError(value)) {\n\t\t\tvar error = { message: value.message };\n\n\t\t\tfor(var attribute in value) {\n\t\t\t\terror[attribute] = value[attribute];\n\t\t\t}\n\n\t\t\treturn JSON.stringify(error);\n\t\t}\n\n\t\treturn JSON.stringify(value);\n\t};\n\n\tutilities.compareDates = function compareDates(a, b) {\n\t\ta = utilities.parseDate(a);\n\t\tb = utilities.parseDate(b);\n\n\t\tif(a === null && b === null) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif(a === null) {\n\t\t\treturn -1;\n\t\t}\n\t\telse if(b === null) {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn a.getTime() - b.getTime();\n\t};\n\n\tutilities.compareCasePercentage = function compareCasePercentage(value) {\n\t\tif(utilities.isEmptyString(value)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar c = null;\n\t\tvar upper = 0;\n\t\tvar lower = 0;\n\t\tvar lowerA = \"a\".charCodeAt();\n\t\tvar lowerZ = \"z\".charCodeAt();\n\t\tvar upperA = \"A\".charCodeAt();\n\t\tvar upperZ = \"Z\".charCodeAt();\n\n\t\tfor(var i = 0; i < value.length; i++) {\n\t\t\tc = value.charCodeAt(i);\n\n\t\t\tif(c >= lowerA && c <= lowerZ) {\n\t\t\t\tlower++;\n\t\t\t}\n\t\t\telse if(c >= upperA && c <= upperZ) {\n\t\t\t\tupper++;\n\t\t\t}\n\t\t}\n\n\t\treturn upper - lower;\n\t};\n\n\tutilities.reverseString = function reverseString(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvalue = value.replace(\n\t\t\t/([\\0-\\u02FF\\u0370-\\u1AAF\\u1B00-\\u1DBF\\u1E00-\\u20CF\\u2100-\\uD7FF\\uE000-\\uFE1F\\uFE30-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])([\\u0300-\\u036F\\u1AB0-\\u1AFF\\u1DC0-\\u1DFF\\u20D0-\\u20FF\\uFE20-\\uFE2F]+)/g,\n\t\t\tfunction($0, $1, $2) {\n\t\t\t\treturn utilities.reverseString($2) + $1;\n\t\t\t}\n\t\t).replace(/([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])/g, \"$2$1\");\n\n\t\tvar reverse = \"\";\n\n\t\tfor(var i = value.length - 1; i >= 0; i--) {\n\t\t\treverse += value[i];\n\t\t}\n\n\t\treturn reverse;\n\t};\n\n\tutilities.createError = function createError(message, status) {\n\t\tvar error = new Error(message);\n\t\terror.status = utilities.parseInteger(status, 500);\n\t\treturn error;\n\t};\n\n\tutilities.clone = function clone(value) {\n\t\tif(!utilities.isObject(value)) {\n\t\t\treturn value;\n\t\t}\n\t\telse if(value instanceof Boolean) {\n\t\t\treturn new Boolean(value.valueOf());\n\t\t}\n\t\telse if(value instanceof Date) {\n\t\t\tvar copy = new Date();\n\t\t\tcopy.setTime(value.getTime());\n\n\t\t\treturn copy;\n\t\t}\n\t\telse if(value instanceof Array) {\n\t\t\tvar copy = [];\n\n\t\t\tfor(var i = 0, length = value.length; i < length; i++) {\n\t\t\t\tcopy[i] = utilities.clone(value[i]);\n\t\t\t}\n\n\t\t\treturn copy;\n\t\t}\n\t\telse if(value instanceof Set) {\n\t\t\treturn new Set(value);\n\t\t}\n\t\telse if(value instanceof Map) {\n\t\t\treturn new Map(value);\n\t\t}\n\t\telse if(value instanceof RegExp) {\n\t\t\tvar flags = \"\";\n\n\t\t\tfor(var flag in regExpFlags) {\n\t\t\t\tif(value[flag]) {\n\t\t\t\t\tflags += regExpFlags[flag]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new RegExp(value.source, flags);\n\t\t}\n\t\telse if(typeof Buffer !== \"undefined\" && value instanceof Buffer) {\n\t\t\treturn Buffer.from instanceof Function ? Buffer.from(value) : new Buffer(value);\n\t\t}\n\t\telse if(value instanceof Object) {\n\t\t\tvar copy = null;\n\n\t\t\tif(value instanceof Error) {\n\t\t\t\tcopy = new Error(value.message);\n\n\t\t\t\tcopy.stack = utilities.clone(value.stack);\n\n\t\t\t\tvar properties = Object.keys(value);\n\n\t\t\t\tfor(var i = 0; i < properties.length; i++) {\n\t\t\t\t\tcopy[properties[i]] = utilities.clone(value[properties[i]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcopy = { };\n\t\t\t}\n\n\t\t\tfor(var attribute in value) {\n\t\t\t\tif(Object.prototype.hasOwnProperty.call(value, attribute)) {\n\t\t\t\t\tcopy[attribute] = utilities.clone(value[attribute]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn copy;\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tutilities.merge = function merge(a, b, copy, deepMerge) {\n\t\tif(!utilities.isObject(a) || Array.isArray(a)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar newObject = null;\n\n\t\tcopy = utilities.parseBoolean(copy, true);\n\n\t\tif(copy) {\n\t\t\tnewObject = utilities.clone(a);\n\t\t}\n\t\telse {\n\t\t\tnewObject = a;\n\t\t}\n\n\t\tif(!utilities.isObject(a) || Array.isArray(a) || !utilities.isObject(b) || Array.isArray(b)) {\n\t\t\treturn newObject;\n\t\t}\n\n\t\tvar attribute = null;\n\t\tvar value = null;\n\t\tvar newValue = null;\n\t\tvar attributes = Object.keys(b);\n\n\t\tdeepMerge = utilities.parseBoolean(deepMerge, true);\n\n\t\tfor(var i = 0; i < attributes.length; i++) {\n\t\t\tattribute = attributes[i];\n\t\t\tvalue = newObject[attribute];\n\n\t\t\tif(copy) {\n\t\t\t\tnewValue = utilities.clone(b[attribute]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnewValue = b[attribute];\n\t\t\t}\n\n\t\t\tif(deepMerge && utilities.isObject(value) && !Array.isArray(value) && utilities.isObject(newValue) && !Array.isArray(newValue)) {\n\t\t\t\tnewObject[attribute] = utilities.merge(value, newValue);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnewObject[attribute] = newValue;\n\t\t\t}\n\t\t}\n\n\t\treturn newObject;\n\t};\n\n\tutilities.getFileName = function getFileName(filePath) {\n\t\tif(typeof filePath !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfilePath = filePath.trim();\n\n\t\tfor(var i = filePath.length - 1; i >= 0; i--) {\n\t\t\tif(filePath[i] === \"/\" || filePath[i] === \"\\\\\") {\n\t\t\t\treturn filePath.substring(i + 1, filePath.length).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn filePath;\n\t};\n\n\tutilities.getFilePath = function getFilePath(filePath) {\n\t\tif(typeof filePath !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfilePath = filePath.trim();\n\n\t\tfor(var i = filePath.length - 1; i >= 0; i--) {\n\t\t\tif(filePath[i] === \"/\" || filePath[i] === \"\\\\\") {\n\t\t\t\treturn filePath.substring(0, i).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tutilities.getFileNameNoExtension = function getFileNameNoExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(0, i).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn fileName;\n\t};\n\n\tutilities.getFileExtension = function getFileExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(i + 1, fileName.length).trim();\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tutilities.fileHasExtension = function fileHasExtension(fileName, extension) {\n\t\tif(utilities.isEmptyString(fileName) || utilities.isEmptyString(extension)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar actualFileExtension = utilities.getFileExtension(fileName);\n\n\t\tif(utilities.isEmptyString(actualFileExtension)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn actualFileExtension.toLowerCase() === extension.trim().toLowerCase();\n\t};\n\n\tutilities.reverseFileExtension = function reverseFileExtension(fileName) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = fileName.trim();\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\treturn fileName.substring(0, i) + \".\" + utilities.reverseString(fileName.substring(i + 1, fileName.length));\n\t\t\t}\n\t\t}\n\n\t\treturn fileName;\n\t};\n\n\tutilities.truncateFileName = function truncateFileName(fileName, maxLength) {\n\t\tif(typeof fileName !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tfileName = utilities.getFileName(fileName);\n\n\t\tif(utilities.isEmptyString(fileName)) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tmaxLength = utilities.parseInteger(maxLength);\n\n\t\tif(utilities.isInvalidNumber(maxLength) || maxLength < 0) {\n\t\t\treturn fileName;\n\t\t}\n\n\t\tif(maxLength === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif(fileName.length <= maxLength) {\n\t\t\treturn fileName;\n\t\t}\n\n\t\tvar extension = \"\";\n\t\tvar originalFileName = fileName;\n\n\t\tfor(var i = fileName.length - 1; i >= 0; i--) {\n\t\t\tif(fileName[i] === \".\") {\n\t\t\t\textension = fileName.substring(i + 1, fileName.length);\n\t\t\t\toriginalFileName = fileName.substring(0, i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(maxLength - (extension.length + (extension.length > 0 ? 1 : 0)) < 1) {\n\t\t\treturn originalFileName.substring(0, maxLength);\n\t\t}\n\n\t\treturn originalFileName.substring(0, maxLength - extension.length - (extension.length > 0 ? 1 : 0)) + (extension.length > 0 ? \".\" + extension : \"\");\n\t};\n\n\tutilities.prependSlash = function prependSlash(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\tif(formattedValue[0] !== \"/\" && formattedValue[0] !== \"\\\\\") {\n\t\t\tformattedValue = \"/\" + formattedValue;\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.appendSlash = function appendSlash(value) {\n\t\tif(typeof value !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar formattedValue = value.trim();\n\n\t\tif(formattedValue.length === 0) {\n\t\t\treturn formattedValue;\n\t\t}\n\n\t\tif(formattedValue[formattedValue.length - 1] !== \"/\" && formattedValue[formattedValue.length - 1] !== \"\\\\\") {\n\t\t\tformattedValue += \"/\";\n\t\t}\n\n\t\treturn formattedValue;\n\t};\n\n\tutilities.joinPaths = function joinPaths(base, path) {\n\t\tvar formattedBase = typeof base === \"string\" ? base.trim().replace(/[\\/\\\\]+$/, \"\") : null;\n\t\tvar formattedPath = typeof path === \"string\" ? path.trim().replace(/^[\\/\\\\]+/, \"\") : null;\n\t\tvar newPath = \"\";\n\n\t\tif(utilities.isNonEmptyString(formattedBase)) {\n\t\t\tnewPath += formattedBase;\n\n\t\t\tif(utilities.isNonEmptyString(formattedPath)) {\n\t\t\t\tnewPath += \"/\";\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.isNonEmptyString(formattedPath)) {\n\t\t\tnewPath += formattedPath;\n\t\t}\n\n\t\treturn newPath;\n\t};\n\n\tutilities.createQueryString = function createQueryString(value, includeQuestionMark) {\n\t\tif(!utilities.isObjectStrict(value)) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar parameters = Object.keys(value).map(function(key) {\n\t\t\treturn encodeURIComponent(key) + \"=\" + encodeURIComponent(utilities.toString(value[key]));\n\t\t}).join(\"&\");\n\n\t\tif(parameters.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn (utilities.parseBoolean(includeQuestionMark, false) ? \"?\" : \"\") + parameters;\n\t};\n\n\tutilities.createRange = function createRange(start, end) {\n\t\tvar formattedStart = utilities.parseInteger(start);\n\t\tvar formattedEnd = utilities.parseInteger(end);\n\n\t\tif(arguments.length === 1) {\n\t\t\tformattedEnd = formattedStart;\n\t\t\tformattedStart = 0;\n\t\t}\n\n\t\tif(utilities.isInvalidNumber(formattedStart) || utilities.isInvalidNumber(formattedEnd) || formattedStart > formattedEnd) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar range = [];\n\n\t\tfor(var i = formattedStart; i <= formattedEnd; i++) {\n\t\t\trange.push(i);\n\t\t}\n\n\t\treturn range;\n\t};\n\n\tutilities.futureMonths = function futureMonths(date, prependZero) {\n\t\tdate = utilities.parseDate(date);\n\n\t\tif(date === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar currentDate = new Date();\n\t\tvar month = 0;\n\n\t\tif(date.getFullYear() === currentDate.getFullYear()) {\n\t\t\tmonth = currentDate.getMonth();\n\t\t}\n\n\t\tvar months = [];\n\n\t\tprependZero = utilities.parseBoolean(prependZero, false);\n\n\t\tfor(var i = 0; i < 12; i++) {\n\t\t\tif(i >= month) {\n\t\t\t\tif(prependZero) {\n\t\t\t\t\tmonths.push((i <= 8 ? \"0\" : \"\") + (i + 1));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmonths.push(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn months;\n\t};\n\n\tutilities.visibleElements = function visibleElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar visibleElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isVisible(elements[i])) {\n\t\t\t\tvisibleElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn visibleElements;\n\t};\n\n\tutilities.hiddenElements = function hiddenElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar hiddenElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isHidden(elements[i])) {\n\t\t\t\thiddenElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn hiddenElements;\n\t};\n\n\tutilities.enabledElements = function enabledElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar enabledElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isEnabled(elements[i])) {\n\t\t\t\tenabledElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn enabledElements;\n\t};\n\n\tutilities.disabledElements = function disabledElements(elements) {\n\t\tif(!Array.isArray(elements)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar disabledElements = [];\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\tif(utilities.isDisabled(elements[i])) {\n\t\t\t\tdisabledElements.push(elements[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn disabledElements;\n\t};\n\n\tutilities.elementsWithAttribute = function elementsWithAttribute(elements, attribute, hasAttribute) {\n\t\tif(!Array.isArray(elements) || utilities.isEmptyString(attribute)) {\n\t\t\treturn [];\n\t\t}\n\n\t\tvar element = null;\n\t\tvar filteredElements = [];\n\n\t\tattribute = attribute.trim();\n\t\thasAttribute = utilities.parseBoolean(hasAttribute, true);\n\n\t\tfor(var i = 0; i < elements.length; i++) {\n\t\t\telement = elements[i];\n\n\t\t\tif(!utilities.isObject(element)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(utilities.isInvalid(elements[i][attribute])) {\n\t\t\t\tif(!hasAttribute) {\n\t\t\t\t\tfilteredElements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(hasAttribute) {\n\t\t\t\t\tfilteredElements.push(elements[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn filteredElements;\n\t};\n\n\tutilities.elementsWithoutAttribute = function elementsWithoutAttribute(elements, attribute) {\n\t\treturn utilities.elementsWithAttribute(elements, attribute, false);\n\t};\n\n\tutilities.matchAttribute = function matchAttribute(element, attribute, value) {\n\t\tif(!utilities.isObject(element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(utilities.isEmptyString(attribute)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn element[attribute.trim()] === value;\n\t};\n\n\tutilities.generateVersions = function generateVersions(version, prefix, suffix) {\n\t\tversion = utilities.parseVersion(version);\n\n\t\tif(version === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tprefix = utilities.trimString(prefix);\n\t\tsuffix = utilities.trimString(suffix);\n\n\t\tvar versions = [];\n\t\tvar value = null;\n\n\t\tfor(var i = 0; i < version.length; i++) {\n\t\t\tvalue = \"\";\n\n\t\t\tif(utilities.isNonEmptyString(prefix)) {\n\t\t\t\tvalue += prefix;\n\t\t\t}\n\n\t\t\tfor(var j = 0; j <= i; j++) {\n\t\t\t\tif(j > 0) {\n\t\t\t\t\tvalue += \"_\";\n\t\t\t\t}\n\n\t\t\t\tvalue += version[j];\n\t\t\t}\n\n\t\t\tif(utilities.isNonEmptyString(suffix)) {\n\t\t\t\tvalue += suffix;\n\t\t\t}\n\n\t\t\tversions.push(value);\n\t\t}\n\n\t\treturn versions;\n\t};\n\n\tutilities.parseVersion = function parseVersion(value, trimTrailingZeroes) {\n\t\tvar formattedValue = utilities.isValidNumber(value) ? value.toString() : value;\n\n\t\tif(typeof formattedValue !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar version = [];\n\t\tvar versionData = formattedValue.match(/[^. \\t]+/g);\n\n\t\tif(versionData === null || versionData.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar part = null;\n\n\t\tfor(var i = 0; i < versionData.length; i++) {\n\t\t\tif(validator.isInt(versionData[i])) {\n\t\t\t\tpart = utilities.parseInteger(versionData[i]);\n\n\t\t\t\tif(utilities.isInvalidNumber(part) || part < 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tversion.push(part.toString());\n\t\t\t}\n\t\t\telse {\n\t\t\t\tversion.push(versionData[i]);\n\t\t\t}\n\t\t}\n\n\t\tif(utilities.parseBoolean(trimTrailingZeroes, false)) {\n\t\t\twhile(true) {\n\t\t\t\tif(version.length <= 1) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(version[version.length - 1] === \"0\") {\n\t\t\t\t\tversion.pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn version.length === 0 ? null : version;\n\t};\n\n\tutilities.compareVersions = function compareVersions(v1, v2, caseSensitive, throwErrors) {\n\t\tcaseSensitive = utilities.parseBoolean(caseSensitive, false);\n\t\tthrowErrors = utilities.parseBoolean(throwErrors, false);\n\n\t\tv1 = utilities.parseVersion(v1);\n\n\t\tif(v1 === null) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Cannot compare invalid or empty first version.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tv2 = utilities.parseVersion(v2);\n\n\t\tif(v2 === null) {\n\t\t\tif(throwErrors) {\n\t\t\t\tthrow new Error(\"Cannot compare invalid or empty second version.\");\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tvar index = 0;\n\n\t\twhile(true) {\n\t\t\tif(index >= v1.length) {\n\t\t\t\tif(v1.length === v2.length) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tfor(var i = index; i < v2.length; i++) {\n\t\t\t\t\tif(v2[i] !== \"0\") {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif(index >= v2.length) {\n\t\t\t\tfor(var i = index; i < v1.length; i++) {\n\t\t\t\t\tif(v1[i] !== \"0\") {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tvar formattedA = utilities.parseInteger(v1[index]);\n\t\t\tvar formattedB = utilities.parseInteger(v2[index]);\n\n\t\t\tif(utilities.isInvalidNumber(formattedA)) {\n\t\t\t\tformattedA = caseSensitive ? v1[index] : v1[index].toUpperCase();\n\t\t\t}\n\n\t\t\tif(utilities.isInvalidNumber(formattedB)) {\n\t\t\t\tformattedB = caseSensitive ? v2[index] : v2[index].toUpperCase();\n\t\t\t}\n\n\t\t\tif(Number.isInteger(formattedA)) {\n\t\t\t\tif(!Number.isInteger(formattedB)) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(Number.isInteger(formattedB)) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(formattedA > formattedB) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse if(formattedA < formattedB) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tindex++;\n\t\t}\n\t};\n\n\treturn utilities;\n\n}));\n\n//# sourceMappingURL=extra-utilities.js.map\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3c694f2..05f6e9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "extra-utilities", - "version": "1.3.2", + "version": "1.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -760,9 +760,9 @@ } }, "change-case-bundled": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/change-case-bundled/-/change-case-bundled-1.0.1.tgz", - "integrity": "sha512-tNxZiULP6BhN67kMiaJcN9KiZKLViW0bEDmxeIISikvH5loQZcN6X3dX6zpEpTNMlTlA8BLQFFo15p2VHOEVaQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/change-case-bundled/-/change-case-bundled-1.0.3.tgz", + "integrity": "sha512-fzrMFhmI+UUONBLPM9zgG/skkijz+CTGponyRwMZKzyzyLQ6ga+WjK6NgIv1JYVpOFLnWM+eOtOURi6k54gFYA==" }, "chardet": { "version": "0.4.2", @@ -2307,6 +2307,14 @@ "requires": { "change-case-bundled": "^1.0.0", "validator": "^9.4.1" + }, + "dependencies": { + "validator": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", + "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==", + "dev": true + } } }, "extsprintf": { @@ -9066,9 +9074,9 @@ } }, "validator": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", - "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" }, "verror": { "version": "1.10.0", diff --git a/package.json b/package.json index 15a2864..61ca040 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,14 @@ { "name": "extra-utilities", - "version": "1.3.2", + "version": "1.3.3", "description": "A collection of useful helper functions.", "main": "dist/extra-utilities.js", "scripts": { "build": "gulp build", "lint": "gulp lint", "test": "mocha", - "coverage": "gulp coverage", - "coveralls": "npm run coverage -- --report lcovonly && cat ./coverage/lcov.info | coveralls", - "security": "gulp security" + "coverage": "istanbul cover node_modules/mocha/bin/_mocha --require test/*.js", + "coveralls": "npm run coverage -- --report lcovonly && cat ./coverage/lcov.info | coveralls" }, "repository": { "type": "git", @@ -31,8 +30,8 @@ }, "homepage": "https://github.com/nitro404/extra-utilities#readme", "dependencies": { - "change-case-bundled": "^1.0.1", - "validator": "^9.4.1" + "change-case-bundled": "^1.0.3", + "validator": "^12.2.0" }, "devDependencies": { "chai": "^4.1.2", diff --git a/src/extra-utilities.js b/src/extra-utilities.js index eed0c69..85ad5e1 100644 --- a/src/extra-utilities.js +++ b/src/extra-utilities.js @@ -22,6 +22,7 @@ var formatTypes = ["boolean", "bool", "integer", "int", "float", "number", "stri var stringCaseFunctions = { camel: changeCase.camelCase, + capital: changeCase.capitalCase, constant: changeCase.constantCase, dot: changeCase.dotCase, header: changeCase.headerCase, @@ -33,6 +34,7 @@ var stringCaseFunctions = { path: changeCase.pathCase, sentence: changeCase.sentenceCase, snake: changeCase.snakeCase, + sponge: changeCase.spongeCase, swap: changeCase.swapCase, title: changeCase.titleCase, upper: changeCase.upperCase, @@ -707,7 +709,7 @@ utilities.formatValue = function formatValue(value, format, options) { else { var originalCase = format.case; - format.case = changeCase.camel(format.case.trim()); + format.case = changeCase.camelCase(format.case.trim()); if(!utilities.isFunction(stringCaseFunctions[format.case])) { errorMessage = "Invalid optional case format value - expected one of " + Object.keys(stringCaseFunctions).join(", ") + ", received \"" + utilities.toString(originalCase) + "\"."; diff --git a/test/test.js b/test/test.js index 3b21e0c..5aae578 100644 --- a/test/test.js +++ b/test/test.js @@ -1331,7 +1331,7 @@ describe("Utilities", function() { it("should correctly transform the case of a string value using each of the available case functions", function() { var modifiedCaseFunctionNames = ["Camel", "CONSTANT", "Dot", "HEADER", "Lower", "LOWER_FIRST", "No", "PARAM", "Pascal", "PATH", "Sentence", "SNAKE", "Swap", "TITLE", "Upper", "upper-first"]; - var changeCaseData = ["CAMEL_CASE", "constantCase", "DotCase", "header-case", "LOWER CASE", "LOWER_FIRST", "No case", "param/case", "pascal_case", "Path-Case", "SENTENCE_CASE", "snakeCase", "SwapCase", "TITLE.CASE", "upper-case", "upper first"]; + var changeCaseData = ["CAMEL_CASE", "constantCase", "DotCase", "header-case", "LOWER CASE", "LOWER_FIRST", "No case", "param/case", "pascal_case", "Path-Case", "SENTENCE_CASE", "snakeCase", "SwapCase", "title case", "upper-case", "upper first"]; var changeCaseResults = ["camelCase", "CONSTANT_CASE", "dot.case", "Header-Case", "lower case", "lOWER_FIRST", "no case", "param-case", "PascalCase", "path/case", "Sentence case", "snake_case", "sWAPcASE", "Title Case", "UPPER-CASE", "Upper first"]; for(var i = 0; i < changeCaseData.length; i++) { @@ -2511,7 +2511,7 @@ describe("Utilities", function() { isAlive: "Yes", error: errorFunc, exception: null, - movies: ["Alien 3", " The boondock saints", "FIGHT CLUB\t", 9 ], + movies: ["Alien 3", " The boondock saints", "fight club\t", 9 ], albums: [ { artist: "IN FLAMES", @@ -2539,7 +2539,7 @@ describe("Utilities", function() { codeNames: { p: "how THE solar SYSTEM was WON", o: "rick sanchez", - n: "VICTOR CHARLIE", + n: "victor charlie", m: "mAX dAMAGE", l: "Operation Desert Storm", k: "FROG FOOT",