custom_string_patterns
Version:
Generate random and incrementing string patterns using regex and custom functions
91 lines (90 loc) • 4.51 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ESCAPED_CLOSE_ANGLE_BRACKET = exports.ESCAPED_OPEN_ANGLE_BRACKET = exports.parseGeneratorOutput = exports.getArgs = exports.formatCounter = exports.processInputPattern = void 0;
var randexp_1 = __importDefault(require("randexp"));
// Turns input pattern into a randexp object with indexed substitions for
// replacers and counters
var processInputPattern = function (pattern, randexpOptions) {
var _a;
var patternRegex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
var source = patternRegex.source, flags = patternRegex.flags;
var substitionMap = {};
var randexpPattern = source
// Replace escaped "<" and ">" with "magic strings" to so they won't
// interfere with subsequent replacements
.replace(/\\</g, exports.ESCAPED_OPEN_ANGLE_BRACKET)
.replace(/\\>/g, exports.ESCAPED_CLOSE_ANGLE_BRACKET);
var matches = Array.from(randexpPattern.matchAll(/<(.+?)>/g)).entries();
for (var _i = 0, _b = Array.from(matches); _i < _b.length; _i++) {
var _c = _b[_i], index = _c[0], match = _c[1];
var fullMatchString = match[0];
var captureGroup = match[1];
var operator = captureGroup[0];
if (operator === '+') {
substitionMap[index] = { type: 'counter', length: ((_a = captureGroup.match(/d/g)) === null || _a === void 0 ? void 0 : _a.length) || 0 };
}
else if (operator === '?') {
var _d = captureGroup.match(/([A-z0-9]+)(\(.*\))?/), _ = _d[0], funcName = _d[1], argsString = _d[2];
substitionMap[index] = { type: 'function', funcName: funcName, args: splitArgs(argsString) };
}
else {
// Remaining will be object properties to extract
substitionMap[index] = { type: 'data', property: captureGroup };
}
randexpPattern = randexpPattern.replace(fullMatchString, "<".concat(index, ">"));
}
// Create RandExp object and apply options
var randexpObject = new randexp_1.default(randexpPattern, flags);
var defaultRangeAdd = randexpOptions.defaultRangeAdd, defaultRangeSubtract = randexpOptions.defaultRangeSubtract, regexMax = randexpOptions.regexMax;
if (defaultRangeAdd)
randexpObject.defaultRange.add(defaultRangeAdd[0], defaultRangeAdd[1]);
if (defaultRangeSubtract)
randexpObject.defaultRange.add(defaultRangeSubtract[0], defaultRangeSubtract[1]);
if (regexMax)
randexpObject.max = regexMax;
return { randexpObject: randexpObject, substitionMap: substitionMap, randexpPattern: randexpPattern };
};
exports.processInputPattern = processInputPattern;
// Remove brackets and split into array of separate args
var splitArgs = function (argsString) {
if (!argsString)
return [];
return argsString
.slice(1, -1)
.split(',')
.map(function (arg) { return Number(arg); });
};
var formatCounter = function (input) {
var value = input.value, numberFormat = input.numberFormat, length = input.length;
if (numberFormat)
return numberFormat.format(Number(value));
var numString = String(value);
return '0'.repeat(Math.max(0, length - numString.length)) + numString;
};
exports.formatCounter = formatCounter;
var getArgs = function (funcName, argIndexes, customArgs, captureGroups, data) {
// Prioritise custom arguments over capture group args
if (customArgs[funcName])
return [customArgs[funcName]];
var args = argIndexes.map(function (i) { return captureGroups[i - 1]; });
if (data)
args.push(data);
return args;
};
exports.getArgs = getArgs;
// Allows a generator to be used as a counter directly, rather than needing to
// be wrapped in another function
var parseGeneratorOutput = function (counterOutput) {
if (typeof counterOutput === 'number' || typeof counterOutput === 'string')
return counterOutput;
if (counterOutput === null || counterOutput === void 0 ? void 0 : counterOutput.value)
return counterOutput.value;
throw new Error('Invalid counter function, or Generator has reached limit');
};
exports.parseGeneratorOutput = parseGeneratorOutput;
// Magic strings
exports.ESCAPED_OPEN_ANGLE_BRACKET = 'L1TERAl_b@CKSL@SH_0pen';
exports.ESCAPED_CLOSE_ANGLE_BRACKET = 'L1TERAl_b@CKSL@SH_cl0se';