UNPKG

@sibevin/random-token

Version:

A simple way to generate a random token.

155 lines (154 loc) 5.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FRIENDLY_MASK = exports.DEFAULT_TOKEN_SIZE = exports.genf = exports.gen = void 0; const DEFAULT_TOKEN_SIZE = 16; exports.DEFAULT_TOKEN_SIZE = DEFAULT_TOKEN_SIZE; const FRIENDLY_MASK = "1Ili0OoQDCcG96UuVvEFMN8B"; exports.FRIENDLY_MASK = FRIENDLY_MASK; const NUM_SEEDS = "0123456789"; const HEX_SEEDS = `abcdef${NUM_SEEDS}`; const ALPHABET_SEEDS = "abcdefghijklmnopqrstuvwxyz"; function generateRandomSeedPickFunc(seeds) { const sampleIndex = Math.floor(Math.random() * Math.floor(seeds.length)); return seeds[sampleIndex]; } function generateMixedCasedAlphabetSeeds(casing) { let seeds; if (!casing || casing === "m" || casing === "mixed") { seeds = `${ALPHABET_SEEDS}${ALPHABET_SEEDS.toUpperCase()}`; } else { seeds = ALPHABET_SEEDS; } return seeds; } function removeMaskedSeeds(seeds, mask) { const maskRegex = new RegExp(`[${mask}]*`, "g"); return seeds.replace(maskRegex, ""); } function filterSeedsWithFriendlyAndMask(seeds, friendly, mask) { let filteredSeeds = seeds; if (friendly) { filteredSeeds = removeMaskedSeeds(filteredSeeds, FRIENDLY_MASK); } if (typeof mask === "string") { filteredSeeds = removeMaskedSeeds(filteredSeeds, mask); } return filteredSeeds; } function throwInvalidParameterError(params) { if (params.checkResult) { const errorMsg = `Invalid Parameters: ${params.params}. ${params.message}`; throw new Error(errorMsg); } } const genToken = (params) => { let givenSeedType; switch (params.seed) { case 10: case 1: case "n": case "number": givenSeedType = "number"; break; case 8: case "o": case "oct": case "octal": givenSeedType = "octal"; break; case 2: case "b": case "binary": givenSeedType = "binary"; break; case 16: case "h": case "hex": case "hexadecimal": givenSeedType = "hexadecimal"; break; case "a": case "alphabet": case "l": case "letter": givenSeedType = "alphabet"; break; default: { if (typeof params.seed === "string" && params.seed.length > 0) { givenSeedType = "customized"; } else { givenSeedType = "random"; } } } if (givenSeedType === "number" || givenSeedType === "octal" || givenSeedType === "binary") { throwInvalidParameterError({ checkResult: params.casing !== undefined, params: "casing", message: `The casing is not supported with ${givenSeedType} seeds`, }); } if (givenSeedType === "hexadecimal" || givenSeedType === "customized") { throwInvalidParameterError({ checkResult: params.casing === "m" || params.casing === "mixed", params: "casing", message: `The mixed casing is not supported with ${givenSeedType} seeds.`, }); } if (givenSeedType !== "alphabet" && givenSeedType !== "random") { throwInvalidParameterError({ checkResult: params.friendly !== undefined, params: "friendly", message: 'The friendly mask is supported with alphabet or random-generated seeds (no "seed" is given) only.', }); } let randomFunc; switch (givenSeedType) { case "number": randomFunc = () => Math.floor(Math.random() * Math.floor(10)).toString(); break; case "octal": randomFunc = () => Math.floor(Math.random() * Math.floor(8)).toString(); break; case "binary": randomFunc = () => Math.floor(Math.random() * Math.floor(2)).toString(); break; case "hexadecimal": randomFunc = () => generateRandomSeedPickFunc(HEX_SEEDS); break; case "alphabet": { let seeds = generateMixedCasedAlphabetSeeds(params.casing); seeds = filterSeedsWithFriendlyAndMask(seeds, params.friendly, params.mask); randomFunc = () => generateRandomSeedPickFunc(seeds); break; } default: { let seeds = params.seed; if (givenSeedType === "random") { seeds = `${generateMixedCasedAlphabetSeeds(params.casing)}${NUM_SEEDS}`; } seeds = filterSeedsWithFriendlyAndMask(seeds, params.friendly, params.mask); randomFunc = () => generateRandomSeedPickFunc(seeds); } } let generatedToken = Array.from({ length: params.length || DEFAULT_TOKEN_SIZE }, randomFunc).join(""); if (params.casing === "u" || params.casing === "upper") { generatedToken = generatedToken.toUpperCase(); } else if (params.casing === "l" || params.casing === "lower") { generatedToken = generatedToken.toLowerCase(); } return generatedToken; }; function gen(params = {}) { return genToken(params); } exports.gen = gen; function genf(params = {}) { return genToken(Object.assign({ friendly: true }, params)); } exports.genf = genf;