Удобный онлайн генератор паролей

Генератор паролей на javascript

Я часто использую генераторы паролей и мне надоело, что даже если укажешь спецсимволы, то не факт что они будут.
Они могут быть, но нет проверки, на их наличие в сгенерированном пароле.

Написала свой генератор паролей
js подключаю в хэдере
использую также jquery-3.4.1.min.js

html блок
<div>
      <label>
         <input type="checkbox" name="numbers" id="numbers" checked="checked">
         Цифры
      </label><br>
      <label>
         <input type="checkbox" name="upper" id="upper" checked="checked">
         Прописные (заглавные) буквы 
      </label><br>
      <label>
         <input type="checkbox" name="lower" id="lower" checked="checked">
         Строчные (маленькие) буквы
      </label><br>
      <label>
         <input type="checkbox" name="symbols" id="symbols">
          Специальные символы ~!@-#$
      </label>
      <br>
      <label>
         Длина пароля (1-100 символов): <input type="number" name="length" id="length" value="6" min="1" max="100">
      </label>
      <br>
      <div class="mt-4"><button id="generatePassword" class="btn btn-primary">cоздать пароль</button></div>
   </div>   
   <div><ul id="result" class="d-none"></ul></div>
   <div id="error" class="text-danger"></div>

скрипт js
function generatePassword(length,numbers,upper,lower,symbols){
   let charset = "";

   if(numbers){
      charset += "0123456789";
   }
   if(upper){
      charset += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   }
   if(lower){
      charset += "abcdefghijklmnopqrstuvwxyz";
   }
   if(symbols){
      charset += "~!@-#$";
   }
   
   if(charset.length > 0){
      if(window.crypto && window.crypto.getRandomValues) {            
         return Array(length)
            .fill(charset)
            .map(x => x[Math.floor(crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1) * (x.length + 1))])
            .join('');    
      } 
      else {            
         res = '';
         for (var i = 0, n = charset.length; i < length; ++i) {
            res += charset.charAt(Math.floor(Math.random() * n));
         }
         return res;
      }
   }
   else{
      return false;
   }   
}

function checkResult(input,length,numbers,upper,lower,symbols){
   let charset,find;
   let result = true;
   if(length > 3){

      if(numbers){
         charset = "0123456789";
         find = false;
         for (var i = 0; i < charset.length; i++){            
            if(input.includes(charset[i])){
               find = true;
            }
         }         
         result = find;            
      }
      if(result && upper){
         charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         find = false;
         for (var i = 0; i < charset.length; i++){            
            if(input.includes(charset[i])){
               find = true;
            }
         }         
         result = find;
      }
      if(result &&lower){
         charset = "abcdefghijklmnopqrstuvwxyz";
         find = false;
         for (var i = 0; i < charset.length; i++){            
            if(input.includes(charset[i])){
               find = true;
            }
         }         
         result = find;
      }
      if(result && symbols){
         charset = "~!@-#$";
         find = false;
         for (var i = 0; i < charset.length; i++){            
            if(input.includes(charset[i])){
               find = true;
            }
         }         
         result = find;
      }
   }
      
   return result;
}   

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

$(document).ready(function(){
   console.log('test');
   $('#generatePassword').on('click',function(){
      $('#error').html("");
      $('#result').html("");

      let length,numbers,upper,lower,symbols,result;
      
      
      length =  "";
      strLength = String($('#length').val());

      for (var i = 0; i < strLength.length; i++){            
         let s = strLength[i];
         if(inArray(s,[0,1,2,3,4,5,6,7,8,9])){
            length += s;
         } 
      }
      length = Number(length);
      if(length < 1){
         length = 1;
         $('#length').val(1);
      }         
      if(length > 100){
         length = 100;            
      }
      $('#length').val(length);

      numbers = $('#numbers').prop('checked');
      upper = $('#upper').prop('checked');
      lower = $('#lower').prop('checked');
      symbols = $('#symbols').prop('checked');
      
         
      if(!numbers && !upper && !lower && !symbols){
         $('#error').html("Укажите хотя бы 1 параметр");
      }
      else{
         let check;
         for (let i = 0; i < 9; i++) {               
            check = false;
              while(!check){                 
                 result = generatePassword(length,numbers,upper,lower,symbols);
                 check = checkResult(result,length,numbers,upper,lower,symbols);                    
            }                 
              $('#result').append("<li>"+result+"</li>");
         }   
      }

   });
});
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!