core/predicates/character.predicate.ts

core/predicates/character.predicate.ts is a file in Secrets. 25 lines of code and 5 definitions.

import { BASE64_URL_MARKS, DASH } from "#configuration/constants/detector.constants";
import { isAlpha, isDigit, isUpperAlpha } from "@govlab/constants";
import type { TokenAlphabet } from "#types/detector.types";

const isAlphanumeric = function isAlphanumeric(character: string): boolean {
    return isAlpha(character) || isDigit(character);
};

const ALPHABETS: Readonly<Record<TokenAlphabet, (character: string) => boolean>> = {
    alnum: isAlphanumeric,
    alnumDash: (character) => isAlphanumeric(character) || character === DASH,
    upperDigit: (character) => isUpperAlpha(character) || isDigit(character),
};

const everyCharacter = function everyCharacter(text: string, test: (character: string) => boolean): boolean {
    for (const character of text) {
        if (!test(character)) {
            return false;
        }
    }
    return true;
};

export const isInAlphabet = function isInAlphabet(text: string, alphabet: TokenAlphabet): boolean {
    return everyCharacter(text, ALPHABETS[alphabet]);
};

export const isBase64Url = function isBase64Url(text: string): boolean {
    return everyCharacter(text, (character) => isAlphanumeric(character) || BASE64_URL_MARKS.has(character));
};