37 lines
1.7 KiB
TypeScript
37 lines
1.7 KiB
TypeScript
export const makePassword = (): string => {
|
||
// パスワードの文字数を決定
|
||
const passLength = 8;
|
||
|
||
// パスワードに使用可能な文字を決定(今回はアルファベットの大文字と小文字 + 数字 + symbolsの記号)
|
||
const lowerCase = 'abcdefghijklmnopqrstuvwxyz';
|
||
const upperCase = lowerCase.toLocaleUpperCase();
|
||
const numbers = '0123456789';
|
||
const symbols = '@#$%^&*\\-_+=[]{}|:\',.?/`~"();!';
|
||
const chars = lowerCase + upperCase + numbers + symbols;
|
||
|
||
// 英字の大文字、英字の小文字、アラビア数字、記号(@#$%^&*\-_+=[]{}|\:',.?/`~"();!)から2種類以上組み合わせ
|
||
const charaTypePattern =
|
||
/^((?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[a-z])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!])|(?=.*[A-Z])(?=.*[\d])|(?=.*[A-Z])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!])|(?=.*[\d])(?=.*[@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!]))[a-zA-Z\d@#$%^&*\\\-_+=\[\]{}|:',.?\/`~"();!]/;
|
||
|
||
// autoGeneratedPasswordが以上の条件を満たせばvalidがtrueになる
|
||
let valid = false;
|
||
let autoGeneratedPassword: string;
|
||
|
||
while (!valid) {
|
||
autoGeneratedPassword = '';
|
||
// パスワードをランダムに決定
|
||
while (autoGeneratedPassword.length < passLength) {
|
||
// 上で決定したcharsの中からランダムに1文字ずつ追加
|
||
const index = Math.floor(Math.random() * chars.length);
|
||
autoGeneratedPassword += chars[index];
|
||
}
|
||
|
||
// パスワードが上で決定した条件をすべて満たしているかチェック
|
||
// 条件を満たすまでループ
|
||
valid =
|
||
autoGeneratedPassword.length == passLength &&
|
||
charaTypePattern.test(autoGeneratedPassword);
|
||
}
|
||
return autoGeneratedPassword;
|
||
};
|