{"version":3,"file":"js/passwords-760d2d630a677cc62417.js","mappings":"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","sources":["webpack://outage_buddy/./app/javascript/packs/passwords/password_confirmations.js","webpack://outage_buddy/./app/javascript/packs/passwords/strong_passwords.js"],"sourcesContent":["const messageElClass = \"password-equality\";\nconst inequalityMessage = \"Your passwords do not match\";\n\nfunction setupEvents() {\n document.querySelectorAll('input[type=\"password\"]').forEach(function(el) {\n const id = el.id;\n const confEl = document.querySelector(`#${id}_confirmation`);\n\n if (!confEl) return;\n\n function compareValues(e) {\n if (confEl.value.trim().length === 0 || el.value === confEl.value) {\n equal(confEl);\n } else {\n if (e.type === 'blur') {\n notEqual(confEl);\n }\n }\n }\n\n el.addEventListener(\"input\", compareValues);\n confEl.addEventListener(\"blur\", compareValues);\n confEl.addEventListener(\"input\", compareValues);\n });\n}\n\nfunction notEqual(el) {\n const nextSibling = el.nextSibling;\n if (\n nextSibling &&\n nextSibling.classList &&\n nextSibling.classList.contains(messageElClass)\n )\n return;\n\n const messageEl = document.createElement(\"p\");\n messageEl.classList.add(messageElClass);\n messageEl.innerText = inequalityMessage;\n insertAfter(messageEl, el);\n}\n\nfunction equal(el) {\n const nextSibling = el.nextSibling;\n if (\n nextSibling &&\n nextSibling.classList &&\n nextSibling.classList.contains(messageElClass)\n )\n nextSibling.parentNode.removeChild(nextSibling);\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n setupEvents();\n});\n\n// create function, it expects 2 values.\nfunction insertAfter(newElement, targetElement) {\n // target is what you want it to go after. Look for this elements parent.\n var parent = targetElement.parentNode;\n\n // if the parents lastchild is the targetElement...\n if (parent.lastChild == targetElement) {\n // add the newElement after the target element.\n parent.appendChild(newElement);\n } else {\n // else the target has siblings, insert the new element between the target and it's next sibling.\n parent.insertBefore(newElement, targetElement.nextSibling);\n }\n}\n","import zxcvbn from \"zxcvbn\";\n\nwindow.zxcvbn = zxcvbn;\n\nwindow.StrongPasswordField = (function() {\n var StrongPasswordField = function() {\n this.min_length = 6;\n this.strongPasswordFields = [];\n this.passwordMetaData = {\n score: 0,\n text: \"\",\n strengthLevels: 5\n };\n this.strengthMeterSelector = \".password-strength-meter\";\n this.minimumStrength = 2;\n this.inputIsBlank = true;\n };\n\n StrongPasswordField.prototype.validate = function() {\n this.strongPasswordFields = this.getStrongPasswordFields();\n for (var i = 0; i < this.strongPasswordFields.length; i++) {\n this.strongPasswordFields[i].addEventListener(\n \"input\",\n this.onValidate.bind(this)\n );\n }\n };\n\n StrongPasswordField.prototype.onValidate = function(e) {\n var password = e.target.value;\n if (window.zxcvbn === undefined) {\n this.basicAdapter(password);\n } else {\n this.inputIsBlank = password.trim() === \"\";\n\n this.zxcvbnAdapter(password);\n this.loadTheme();\n }\n };\n\n StrongPasswordField.prototype.zxcvbnAdapter = function(password) {\n var adapter = new ZxcvbnAdapter();\n this.passwordMetaData = Utils.mergeObjects(\n this.passwordMetaData,\n adapter.evaluatePassword(password)\n );\n };\n\n StrongPasswordField.prototype.basicAdapter = function(password) {\n if (password.length < this.min_length) {\n alert(\"password length must be at least\" + this.min_length);\n }\n };\n\n StrongPasswordField.prototype.getStrongPasswordFields = function() {\n return document.querySelectorAll(\n 'input[type=\"password\"][data-strong-password=true]'\n );\n };\n\n StrongPasswordField.prototype.loadTheme = function() {\n // use default theme, will be configurable in the future\n var theme = new DefaultTheme(this);\n theme.attachTheme();\n };\n\n StrongPasswordField.prototype.getStrengthMeterElement = function() {\n return document.querySelector(this.strengthMeterSelector);\n };\n\n var DefaultTheme = (function() {\n var DefaultTheme = function(spf) {\n this.spf = spf;\n this.passwordMetaData = spf.passwordMetaData;\n this.minimumStrength = spf.minimumStrength;\n this.inputIsBlank = spf.inputIsBlank;\n this.colors = {\n 0: \"red\",\n 1: \"red\",\n 2: \"orange\",\n 3: \"blue\",\n 4: \"green\"\n };\n };\n\n DefaultTheme.prototype.meter = function() {\n if (this.inputIsBlank) return 0;\n\n return (\n (this.passwordMetaData.score / this.passwordMetaData.strengthLevels) *\n 100 +\n 20\n );\n };\n\n DefaultTheme.prototype.color = function() {\n return this.colors[this.passwordMetaData.score];\n };\n\n DefaultTheme.prototype.attachTheme = function() {\n var strengthMeterElement = this.spf.getStrengthMeterElement();\n if (strengthMeterElement.innerHTML.trim() === \"\") {\n this.initialLoad(strengthMeterElement);\n } else {\n this.update(strengthMeterElement);\n }\n };\n\n DefaultTheme.prototype.update = function(elem) {\n var meterElem = this.getMeterElement(elem);\n\n meterElem.style.backgroundColor = this.color();\n meterElem.style.width = this.meter().toString() + \"%\";\n meterElem.style.height = \"5px\";\n\n this.setUserGuidelinesText(elem);\n };\n\n DefaultTheme.prototype.initialLoad = function(elem) {\n elem.innerHTML = '

';\n var meterElem = this.getMeterElement(elem);\n\n meterElem.style.backgroundColor = this.color();\n meterElem.style.width = this.meter().toString() + \"%\";\n meterElem.style.height = \"5px\";\n\n this.setUserGuidelinesText(elem);\n };\n\n DefaultTheme.prototype.setUserGuidelinesText = function(elem) {\n var textElem = this.getTextElement(elem);\n\n if (\n !this.inputIsBlank &&\n this.passwordMetaData.score < this.minimumStrength\n ) {\n textElem.innerText =\n \"Your password is not strong enough. Try adding a combination of numbers, letters (lowercase and capital), and special characters like $ or &. You may also try adding words to improve the strength.\";\n } else {\n textElem.innerText = \"\";\n }\n };\n\n DefaultTheme.prototype.getMeterElement = function(elem) {\n return elem.querySelector(\".spf-meter\");\n };\n\n DefaultTheme.prototype.getTextElement = function(elem) {\n return elem.querySelector(\".spf-text\");\n };\n\n return DefaultTheme;\n })();\n\n var Utils = function() {};\n Utils.mergeObjects = function(target, obj) {\n for (var keyInObj in obj) {\n if (!obj.hasOwnProperty(keyInObj) || !target.hasOwnProperty(keyInObj))\n continue;\n target[keyInObj] = obj[keyInObj];\n }\n return target;\n };\n\n var ZxcvbnAdapter = (function() {\n var ZxcvbnAdapter = function() {\n this.strengthLevels = 5;\n this.strength = {\n 0: \"worst\",\n 1: \"bad\",\n 2: \"weak\",\n 3: \"good\",\n 4: \"strong\"\n };\n this.score = 0;\n this.strengthText = \"\";\n };\n\n ZxcvbnAdapter.prototype.evaluatePassword = function(password) {\n var result = zxcvbn(password);\n this.score = result.score;\n this.strengthText = this.strength[result.score];\n return {\n score: this.score,\n text: this.strengthText,\n strengthLevels: this.strengthLevels\n };\n };\n\n return ZxcvbnAdapter;\n })();\n\n return StrongPasswordField;\n})();\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n var strongPasswordField = new StrongPasswordField({\n strengthMeterSelector: \".password-strength-meter\"\n });\n strongPasswordField.validate();\n});\n"],"names":["messageElClass","inequalityMessage","setupEvents","document","querySelectorAll","forEach","el","id","confEl","querySelector","compareValues","e","value","trim","length","nextSibling","classList","contains","parentNode","removeChild","equal","type","messageEl","createElement","add","innerText","newElement","targetElement","parent","lastChild","appendChild","insertBefore","notEqual","addEventListener","window","zxcvbn","StrongPasswordField","this","min_length","strongPasswordFields","passwordMetaData","score","text","strengthLevels","strengthMeterSelector","minimumStrength","inputIsBlank","prototype","validate","getStrongPasswordFields","i","onValidate","bind","password","target","undefined","basicAdapter","zxcvbnAdapter","loadTheme","adapter","ZxcvbnAdapter","Utils","mergeObjects","evaluatePassword","alert","DefaultTheme","attachTheme","getStrengthMeterElement","spf","colors","meter","color","strengthMeterElement","innerHTML","initialLoad","update","elem","meterElem","getMeterElement","style","backgroundColor","width","toString","height","setUserGuidelinesText","textElem","getTextElement","obj","keyInObj","hasOwnProperty","strength","strengthText","result"],"sourceRoot":""}