core/validators/environment.validator.ts

core/validators/environment.validator.ts is a file in Secrets. 37 lines of code and 8 definitions.

import {
    BLANKS,
    DIGITS,
    ENVIRONMENT_KIND_RULES,
    SIXTEEN_BIT_CEILING,
} from "#configuration/constants/environment.constants";
import type { EnvironmentKind, EnvironmentKindRule } from "#types/environment.types";

const RULES: ReadonlyMap<EnvironmentKind, EnvironmentKindRule> = new Map(
    ENVIRONMENT_KIND_RULES.map((rule) => [rule.kind, rule]),
);

const everyCharacter = function everyCharacter(value: string, test: (character: string) => boolean): boolean {
    for (let at = 0; at < value.length; at += 1) {
        if (!test(value.charAt(at))) {
            return false;
        }
    }
    return true;
};

const isWhole = function isWhole(value: string): boolean {
    return value.length > 0 && everyCharacter(value, (character) => DIGITS.has(character));
};

const holdsBlank = function holdsBlank(value: string): boolean {
    return !everyCharacter(value, (character) => !BLANKS.has(character));
};

const fits = function fits(rule: EnvironmentKindRule, value: string): boolean {
    if (value.length === 0 || (!rule.blankAllowed && holdsBlank(value))) {
        return false;
    }
    if (rule.numeric && !(isWhole(value) && Number(value) <= SIXTEEN_BIT_CEILING)) {
        return false;
    }
    return !rule.locator || URL.canParse(value);
};

export const isValueOfKind = function isValueOfKind(kind: EnvironmentKind, value: string): boolean {
    const rule = RULES.get(kind);
    return rule !== undefined && fits(rule, value);
};