sospedra/semantic-password-generator

View on GitHub
packages/spg/dist/index.umd.js.map

Summary

Maintainability
Test Coverage
{"version":3,"file":"index.umd.js","sources":["../src/request.ts","../src/transform/length.ts","../src/shall.ts","../src/transform/leet.ts","../src/transform/random.ts","../src/transform/symbols.ts","../src/generator.ts","../src/index.ts","../src/password.ts","../src/transform/case.ts","../src/semantic.ts"],"sourcesContent":["import unfetch from 'unfetch'\n\nconst WIKI_ROOT = 'https://en.wikipedia.org/w/api.php?action=query'\nconst WIKI_RANDOM_PATH = [\n  'generator=random',\n  'grnnamespace=0',\n  'prop=extracts',\n  'exchars=500',\n  'format=json',\n  'origin=*',\n].join('&')\n\ntype WikipediaQuery = {\n  query: {\n    pages: {\n      [id: string]: {\n        extract: string\n      }\n    }\n  }\n}\n\nexport default async function request() {\n  const response = await unfetch(`${WIKI_ROOT}&${WIKI_RANDOM_PATH}`)\n\n  if (response.status >= 400) {\n    new Error(\n      `Request failed. Code: ${response.status}. Text: ${response.statusText}`,\n    )\n  }\n\n  const {\n    query: { pages },\n  }: WikipediaQuery = await response.json()\n\n  return pages[Object.keys(pages)[0]].extract\n}\n","const DEFAULT_WORD_MAP = [0, 0]\n\n/**\n * Given a desired length break the sentence with the minimum required words.\n */\nexport default (length: number) => {\n  return function transformLength(base: string) {\n    const words = base.split(' ')\n    const breakingWord = words\n      .map<[string, number]>((word) => [word, word.length])\n      .reduce((memo, [word, wordLength]) => {\n        const lastWordMap = memo[memo.length - 1] || DEFAULT_WORD_MAP\n        return memo.concat([[word, wordLength + lastWordMap[1]]])\n      }, [])\n      .filter(([_, stack]) => stack < length).length\n\n    return words.slice(0, breakingWord + 1).join(' ')\n  }\n}\n","const MAX = 100\nconst DEFAULT_RATIO = MAX / 2\n\n/**\n * Given a probabilistic ratio match against a random number to get a true/false.\n * Default value is half the max (50); simulating a flipping coin.\n */\nconst shall = (ratio = DEFAULT_RATIO) => {\n  return Math.random() * MAX < Math.min(ratio, MAX)\n}\n\n/**\n * Expose 4 common probabilistic types. For 10%, 25%, 50%, 75% and 90%\n */\nexport const weird = () => shall(10)\nexport const low = () => shall(25)\nexport const regular = () => shall()\nexport const high = () => shall(75)\nexport const common = () => shall(90)\n","import * as shall from '../shall'\n\nconst LEET_DICT = {\n  a: 4,\n  b: 8,\n  e: 3,\n  g: 9,\n  l: 1,\n  o: 0,\n  s: 5,\n  t: 7,\n  z: 2,\n}\n\n/**\n * Randomly replace some char by the leet equivalent if any.\n */\nexport default () => {\n  return function transformLeet(base: string) {\n    return base\n      .split('')\n      .map((char) => [char, LEET_DICT[char.toLowerCase()]])\n      .map(([char, leet]) => (leet && shall.weird() ? leet : char))\n      .join('')\n  }\n}\n","import random from 'lodash.random'\nimport * as shall from '../shall'\n\nconst ASCII_LOWER = 37\nconst ASCII_HIGHER = 126\nconst EMPTY_CHAR = ''\n\nconst addRandomChar = () => {\n  if (shall.common()) return EMPTY_CHAR\n  return String.fromCharCode(random(ASCII_LOWER, ASCII_HIGHER))\n}\n\n/**\n * Randomly add some ASCII safe chars either at the beginning, the end or both\n * sides of each word.\n */\nexport default () => {\n  return function transformRandom(base: string) {\n    return base\n      .split(' ')\n      .map((word) => `${addRandomChar()}${word}${addRandomChar()}`)\n      .join(' ')\n  }\n}\n","import random from 'lodash.random'\nimport * as shall from '../shall'\n\nconst DEFAULT_SYMBOL = '.'\nconst SYMBOLS = `@#$%{}[]()/~,;:><${DEFAULT_SYMBOL}`.split('')\nconst EMPTY_CHAR = ''\nconst RX_WHITE_SPACE = / /g\n\n/**\n * Replace white spaces either by a random symbol or an empty char (remove).\n * Note that this transformer gets rid of the white spaces. Hence has to be\n * the last one always.\n * If it's disabled always return the DEFAULT_SYMBOL\n */\nexport default (isEnabled: boolean) => {\n  return function transformSymbols(base: string) {\n    return base.replace(RX_WHITE_SPACE, () => {\n      if (!isEnabled) return DEFAULT_SYMBOL\n\n      return shall.regular() ? SYMBOLS[random(SYMBOLS.length - 1)] : EMPTY_CHAR\n    })\n  }\n}\n","import random from 'lodash.random'\nimport isNumber from 'lodash.isnumber'\nimport identity from 'lodash.identity'\nimport * as password from './password'\nimport transformLength from './transform/length'\nimport transformLeet from './transform/leet'\nimport transformCase from './transform/case'\nimport transformRandom from './transform/random'\nimport transformSymbols from './transform/symbols'\n\nconst DEFAULT_SENTENCES = [''] // allows init of all methods\nconst DEFAULT_ARGS = {\n  case: false,\n  length: 24,\n  leet: false,\n  random: false,\n  symbols: false,\n}\ntype Args = number | typeof DEFAULT_ARGS\n\nconst sanitizeOptions = (args: Args = {} as Args): typeof DEFAULT_ARGS => {\n  return {\n    ...DEFAULT_ARGS,\n    ...(isNumber(args) ? { length: args } : args),\n  }\n}\n\nexport default function createGenerator(sentences = DEFAULT_SENTENCES) {\n  const maxLength = password.getMaxLength(sentences)\n\n  return function generator(args?: Args) {\n    const options = sanitizeOptions(args)\n    const length = password.getLength(options.length, maxLength)\n    const data = sentences.filter((x) => x.length >= length)\n    const base = data[random(data.length - 1)]\n\n    if (!base) return null\n\n    return [\n      transformLength(length),\n      options.leet && transformLeet(),\n      options.case && transformCase(),\n      options.random && transformRandom(),\n      transformSymbols(options.symbols),\n    ]\n      .map((fn) => fn || identity)\n      .reduce((memo, fn) => fn(memo), base)\n  }\n}\n","import request from './request'\nimport semantic from './semantic'\nimport generator from './generator'\n\nexport default async function spg() {\n  const article = await request()\n  const sentences = semantic(article)\n\n  return generator(sentences)\n}\n","const MIN_PASSWORD_LENGTH = 8\n\nexport const getMaxLength = (sentences: string[]) => {\n  return sentences.reduce((memo, { length }) => {\n    return length > memo ? length : memo\n  }, Number.MIN_SAFE_INTEGER)\n}\n\nexport const getMinLength = (inputLength: number) => {\n  return Math.max(inputLength, MIN_PASSWORD_LENGTH)\n}\n\nexport const getLength = (inputLength: number, maxLength: number) => {\n  return Math.min(getMinLength(inputLength), maxLength)\n}\n","import * as shall from '../shall'\n\n/**\n * Randomly transform to upper case some chars. It assumes that most\n * of the base chars are lower case.\n */\nexport default () => {\n  return function transformCase(base: string) {\n    return base\n      .split('')\n      .map((char) => (shall.low() ? char.toUpperCase() : char))\n      .join('')\n  }\n}\n","import nlp from 'wink-nlp-utils'\nimport deburr from 'lodash.deburr'\n\nexport default function semantic(extract: string): string[] {\n  return [\n    nlp.string.removeHTMLTags,\n    nlp.string.removeExtraSpaces,\n    deburr,\n    nlp.string.sentences,\n  ]\n    .reduce((memo, fn) => fn(memo), extract)\n    .map(nlp.string.removePunctuations)\n}\n"],"names":["WIKI_RANDOM_PATH","join","DEFAULT_WORD_MAP","length","base","words","split","breakingWord","map","word","reduce","memo","wordLength","concat","filter","_","stack","slice","shall","ratio","MAX","Math","random","min","LEET_DICT","a","b","e","g","l","o","s","t","z","addRandomChar","String","fromCharCode","SYMBOLS","RX_WHITE_SPACE","DEFAULT_SENTENCES","DEFAULT_ARGS","case","leet","symbols","unfetch","response","status","Error","statusText","json","query","pages","Object","keys","extract","request","article","sentences","maxLength","Number","MIN_SAFE_INTEGER","password","args","options","isNumber","sanitizeOptions","inputLength","max","getMinLength","data","x","transformLength","char","toLowerCase","toUpperCase","isEnabled","replace","fn","identity","generator","nlp","string","removeHTMLTags","removeExtraSpaces","deburr","removePunctuations"],"mappings":"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"}