function parsePasswordRules()

in tools/PasswordRulesParser.js [538:601]


function parsePasswordRules(input, formatRulesForMinifiedVersion)
{
    let passwordRules = _parsePasswordRulesInternal(input) || [];

    // When formatting rules for minified version, we should keep the formatted rules
    // as similar to the input as possible. Avoid copying required rules to allowed rules.
    let suppressCopyingRequiredToAllowed = formatRulesForMinifiedVersion;

    let newPasswordRules = [];
    let newAllowedValues = [];
    let minimumMaximumConsecutiveCharacters = null;
    let maximumMinLength = 0;
    let minimumMaxLength = null;

    for (let rule of passwordRules) {
        switch (rule.name) {
            case RuleName.MAX_CONSECUTIVE:
                minimumMaximumConsecutiveCharacters = minimumMaximumConsecutiveCharacters ? Math.min(rule.value, minimumMaximumConsecutiveCharacters) : rule.value;
                break;

            case RuleName.MIN_LENGTH:
                maximumMinLength = Math.max(rule.value, maximumMinLength);
                break;

            case RuleName.MAX_LENGTH:
                minimumMaxLength = minimumMaxLength ? Math.min(rule.value, minimumMaxLength) : rule.value;
                break;

            case RuleName.REQUIRED:
                rule.value = _canonicalizedPropertyValues(rule.value, formatRulesForMinifiedVersion);
                newPasswordRules.push(rule);
                if (!suppressCopyingRequiredToAllowed) {
                    newAllowedValues = newAllowedValues.concat(rule.value);
                }
                break;

            case RuleName.ALLOWED:
                newAllowedValues = newAllowedValues.concat(rule.value);
                break;
        }
    }

    newAllowedValues = _canonicalizedPropertyValues(newAllowedValues, suppressCopyingRequiredToAllowed);
    if (!suppressCopyingRequiredToAllowed && !newAllowedValues.length) {
        newAllowedValues = [new NamedCharacterClass(Identifier.ASCII_PRINTABLE)];
    }
    if (newAllowedValues.length) {
        newPasswordRules.push(new Rule(RuleName.ALLOWED, newAllowedValues));
    }

    if (minimumMaximumConsecutiveCharacters !== null) {
        newPasswordRules.push(new Rule(RuleName.MAX_CONSECUTIVE, minimumMaximumConsecutiveCharacters));
    }

    if (maximumMinLength > 0) {
        newPasswordRules.push(new Rule(RuleName.MIN_LENGTH, maximumMinLength));
    }

    if (minimumMaxLength !== null) {
        newPasswordRules.push(new Rule(RuleName.MAX_LENGTH, minimumMaxLength));
    }

    return newPasswordRules;
}