stochator
Version:
A tiny library providing for creating a variety of random value generators.
244 lines (184 loc) • 10.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _expanders, _generators;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _boolean = require("./boolean");
var _boolean2 = _interopRequireDefault(_boolean);
var _integer = require("./integer");
var _integer2 = _interopRequireDefault(_integer);
var _set = require("./set");
var _set2 = _interopRequireDefault(_set);
var _ret = require("ret");
var _ret2 = _interopRequireDefault(_ret);
var _discontinuousRange = require("discontinuous-range");
var _discontinuousRange2 = _interopRequireDefault(_discontinuousRange);
var _lodashRange = require("lodash.range");
var _lodashRange2 = _interopRequireDefault(_lodashRange);
var LOWERCASE_RANGE = [97, 122];
var UPPERCASE_RANGE = [65, 90];
var ASCII_RANGE = [32, 126];
var UNICODE_RANGE = [0, 65535];
var AsciiDRange = _discontinuousRange2["default"].apply(undefined, ASCII_RANGE);
var UnicodeDRange = _discontinuousRange2["default"].apply(undefined, UNICODE_RANGE);
var inRange = function inRange(_ref, n) {
var _ref2 = _slicedToArray(_ref, 2);
var min = _ref2[0];
var max = _ref2[1];
return n >= min && n <= max;
};
var changeCase = function changeCase(code) {
var lowercase = inRange(LOWERCASE_RANGE, code);
var uppercase = inRange(UPPERCASE_RANGE, code);
return lowercase || uppercase ? code + (lowercase ? -32 : 32) : code;
};
var createChar = function createChar(code, ignoreCase, prng) {
return code === null ? '' : String.fromCharCode(ignoreCase && _boolean2["default"].random(prng) ? changeCase(code) : code);
};
var expandCharacter = function expandCharacter(_ref3) {
var value = _ref3.value;
return (0, _discontinuousRange2["default"])(value);
};
var expandRange = function expandRange(_ref4) {
var from = _ref4.from;
var to = _ref4.to;
return (0, _discontinuousRange2["default"])(from, to);
};
var expandSet = function expandSet(token, range) {
var drange = (0, _discontinuousRange2["default"])();
var setRanges = token.set.map(function (code) {
return expand(code, range);
});
setRanges.forEach(function (setRange) {
return drange.add(setRange);
});
return token.not ? range.clone().subtract(drange) : drange;
};
var expanders = (_expanders = {}, _defineProperty(_expanders, _ret2["default"].types.SET, expandSet), _defineProperty(_expanders, _ret2["default"].types.RANGE, expandRange), _defineProperty(_expanders, _ret2["default"].types.CHAR, expandCharacter), _expanders);
var expand = function expand(token) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return expanders[token.type].apply(expanders, [token].concat(args));
};
// These generators accept a token and the options object and return a character
// code.
var generateCharFromSet = function generateCharFromSet(token, _ref5) {
var range = _ref5.range;
var prng = _ref5.prng;
var set = expand(token, range);
return set.index(_integer2["default"].boundedRandom(0, set.length - 1, prng));
};
var generateCharFromRange = function generateCharFromRange(_ref6, _ref7) {
var from = _ref6.from;
var to = _ref6.to;
var prng = _ref7.prng;
return _integer2["default"].boundedRandom(from, to, prng);
};
var generateChar = function generateChar(_ref8) {
var value = _ref8.value;
return value;
};
var createCharGenerator = function createCharGenerator(func) {
return function (token, _, _ref9) {
var range = _ref9.range;
var ignoreCase = _ref9.ignoreCase;
var prng = _ref9.prng;
return createChar(func(token, { range: range, ignoreCase: ignoreCase, prng: prng }), ignoreCase, prng);
};
};
// These generators accept a token, the groups and the options and return a
// sequence of tokens, which are then in turn passed to generator functions.
var generateFromGroup = function generateFromGroup(_ref10, _, _ref11) {
var notFollowedBy = _ref10.notFollowedBy;
var options = _ref10.options;
var stack = _ref10.stack;
var prng = _ref11.prng;
return notFollowedBy ? [] : options ? _set2["default"].randomMember(options, prng) : stack;
};
var generateRepeat = function generateRepeat(token, _, options) {
var max = token.max === Infinity ? token.min + options.max : token.max;
return (0, _lodashRange2["default"])(_integer2["default"].boundedRandom(token.min, max, options.prng)).map(function () {
return token.value;
});
};
var createSequenceGenerator = function createSequenceGenerator(func) {
return function (token, groups, options) {
return func(token, groups, options).map(function (value) {
return generateFromToken(value, groups, options);
}).join('');
};
};
// Generator dispatch table based upon the token type.
var generators = (_generators = {}, _defineProperty(_generators, _ret2["default"].types.ROOT, createSequenceGenerator(generateFromGroup)), _defineProperty(_generators, _ret2["default"].types.GROUP, createSequenceGenerator(generateFromGroup)), _defineProperty(_generators, _ret2["default"].types.POSITION, function () {
return '';
}), _defineProperty(_generators, _ret2["default"].types.REPETITION, createSequenceGenerator(generateRepeat)), _defineProperty(_generators, _ret2["default"].types.REFERENCE, function (_ref12, groups) {
var value = _ref12.value;
return groups[value - 1];
}), _defineProperty(_generators, _ret2["default"].types.CHAR, createCharGenerator(generateChar)), _defineProperty(_generators, _ret2["default"].types.SET, createCharGenerator(generateCharFromSet)), _defineProperty(_generators, _ret2["default"].types.RANGE, createCharGenerator(generateCharFromRange)), _generators);
var generateFromToken = function generateFromToken(token, groups, options) {
var result = generators[token.type](token, groups, options);
if (token.type === _ret2["default"].types.GROUP && token.remember) {
groups.push(result);
}
return result;
};
var generateStringFromRange = function generateStringFromRange(range, expression, options) {
return function () {
return generateFromToken((0, _ret2["default"])(expression), [], _extends({ range: range }, options));
};
};
// Exported public functions.
var generateCharacterFromRange = function generateCharacterFromRange(_ref13, _ref14) {
var _ref132 = _slicedToArray(_ref13, 2);
var min = _ref132[0];
var max = _ref132[1];
var prng = _ref14.prng;
return generateStringFromRange((0, _discontinuousRange2["default"])(min, max), '.', { prng: prng });
};
var generateString = function generateString(unicode, expression, options) {
return generateStringFromRange(unicode ? UnicodeDRange : AsciiDRange, expression, options);
};
var randomCharacterFromRange = function randomCharacterFromRange(range) {
var prng = arguments.length <= 1 || arguments[1] === undefined ? Math.random : arguments[1];
return generateCharacterFromRange(range, { prng: prng })();
};
var randomAsciiString = function randomAsciiString(expression, ignoreCase) {
var prng = arguments.length <= 2 || arguments[2] === undefined ? Math.random : arguments[2];
return generateStringFromRange(AsciiDRange, expression, { ignoreCase: ignoreCase, prng: prng });
};
var randomUnicodeString = function randomUnicodeString(expression, ignoreCase) {
var prng = arguments.length <= 2 || arguments[2] === undefined ? Math.random : arguments[2];
return generateStringFromRange(UnicodeDRange, expression, { ignoreCase: ignoreCase, prng: prng });
};
var randomAsciiCharacter = function randomAsciiCharacter() {
var prng = arguments.length <= 0 || arguments[0] === undefined ? Math.random : arguments[0];
return generateCharacterFromRange(ASCII_RANGE, { prng: prng })();
};
var randomLowercaseCharacter = function randomLowercaseCharacter() {
var prng = arguments.length <= 0 || arguments[0] === undefined ? Math.random : arguments[0];
return generateCharacterFromRange(LOWERCASE_RANGE, { prng: prng })();
};
var randomUnicodeCharacter = function randomUnicodeCharacter() {
var prng = arguments.length <= 0 || arguments[0] === undefined ? Math.random : arguments[0];
return generateCharacterFromRange(UNICODE_RANGE, { prng: prng })();
};
var randomUppercaseCharacter = function randomUppercaseCharacter() {
var prng = arguments.length <= 0 || arguments[0] === undefined ? Math.random : arguments[0];
return generateCharacterFromRange(UPPERCASE_RANGE, { prng: prng })();
};
exports["default"] = {
generateString: generateString,
randomCharacterFromRange: randomCharacterFromRange,
randomAsciiString: randomAsciiString,
randomUnicodeString: randomUnicodeString,
randomAsciiCharacter: randomAsciiCharacter,
randomLowercaseCharacter: randomLowercaseCharacter,
randomUnicodeCharacter: randomUnicodeCharacter,
randomUppercaseCharacter: randomUppercaseCharacter
};
module.exports = exports["default"];