96 lines
2.4 KiB
JavaScript
96 lines
2.4 KiB
JavaScript
|
/*!
|
||
|
* 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;
|
||
|
};
|