2023-04-24 10:18:46 +12:00

83 lines
1.9 KiB
TypeScript

import { showHUD, Clipboard } from "@raycast/api";
import { randomInt } from "crypto";
export default async function Command() {
const pass = generate();
await Clipboard.copy(pass);
await showHUD("Password copied to clipboard");
}
function generate() {
const lowerConsonants = "bcdfghjkmnpqrstvwxz".split("");
const upperConsonants = "BCDFGHJKLMNPQRSTVWXZ".split("");
const lowerVowels = "aeiouy".split("");
const upperVowels = "AEUY".split("");
const numberPositions: {[index: number]: number} = {
1: 1,
2: 7,
3: 13,
4: 6,
5: 12,
6: 18
};
// choose position of number and upper case letter
const numPosKey = randomInt(2, 7);
const NumberPosition = numberPositions[numPosKey];
let uppercasePos = randomInt(1, 19);
if (uppercasePos === numPosKey) {
const rnd = randomInt(1, 10);
if (uppercasePos > 9) {
uppercasePos -= rnd;
} else {
uppercasePos += rnd;
}
}
// pick characters
let count = 1;
let passwordSection = "";
for (let i = 1; i < 18; i++) {
count += 1;
if (NumberPosition === i) {
if (NumberPosition < 4) {
count -= 1;
}
passwordSection += randomInt(1, 10);
} else {
if (count % 3 === 0) {
// vowel
if (uppercasePos === i) {
passwordSection += randomFromArray(upperVowels);
} else {
passwordSection += randomFromArray(lowerVowels);
}
} else {
// consonant
if (uppercasePos === i) {
passwordSection += randomFromArray(upperConsonants);
} else {
passwordSection += randomFromArray(lowerConsonants);
}
}
}
// separate characters into sections
if (i % 6 === 0) {
passwordSection += "-";
}
}
return passwordSection;
}
function randomFromArray(array: any[]) {
return array[randomInt(1, array.length)];
}