1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /*!
- * randomatic <https://github.com/jonschlinkert/randomatic>
- *
- * Copyright (c) 2014-2017, Jon Schlinkert.
- * Released under the MIT License.
- */
- 'use strict';
- var isNumber = require('is-number');
- var typeOf = require('kind-of');
- var mathRandom = require('math-random');
- /**
- * Expose `randomatic`
- */
- module.exports = randomatic;
- module.exports.isCrypto = !!mathRandom.cryptographic;
- /**
- * Available mask characters
- */
- var type = {
- lower: 'abcdefghijklmnopqrstuvwxyz',
- upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
- number: '0123456789',
- special: '~!@#$%^&()_+-={}[];\',.'
- };
- type.all = type.lower + type.upper + type.number + type.special;
- /**
- * Generate random character sequences of a specified `length`,
- * based on the given `pattern`.
- *
- * @param {String} `pattern` The pattern to use for generating the random string.
- * @param {String} `length` The length of the string to generate.
- * @param {String} `options`
- * @return {String}
- * @api public
- */
- function randomatic(pattern, length, options) {
- if (typeof pattern === 'undefined') {
- throw new Error('randomatic expects a string or number.');
- }
- var custom = false;
- if (arguments.length === 1) {
- if (typeof pattern === 'string') {
- length = pattern.length;
- } else if (isNumber(pattern)) {
- options = {};
- length = pattern;
- pattern = '*';
- }
- }
- if (typeOf(length) === 'object' && length.hasOwnProperty('chars')) {
- options = length;
- pattern = options.chars;
- length = pattern.length;
- custom = true;
- }
- var opts = options || {};
- var mask = '';
- var res = '';
- // Characters to be used
- if (pattern.indexOf('?') !== -1) mask += opts.chars;
- if (pattern.indexOf('a') !== -1) mask += type.lower;
- if (pattern.indexOf('A') !== -1) mask += type.upper;
- if (pattern.indexOf('0') !== -1) mask += type.number;
- if (pattern.indexOf('!') !== -1) mask += type.special;
- if (pattern.indexOf('*') !== -1) mask += type.all;
- if (custom) mask += pattern;
- // Characters to exclude
- if (opts.exclude) {
- var exclude = typeOf(opts.exclude) === 'string' ? opts.exclude : opts.exclude.join('');
- exclude = exclude.replace(new RegExp('[\\]]+', 'g'), '');
- mask = mask.replace(new RegExp('[' + exclude + ']+', 'g'), '');
-
- if(opts.exclude.indexOf(']') !== -1) mask = mask.replace(new RegExp('[\\]]+', 'g'), '');
- }
- while (length--) {
- res += mask.charAt(parseInt(mathRandom() * mask.length, 10));
- }
- return res;
- };
|