# core/predicates/character.predicate.ts

> 25 lines of code and 5 definitions.

Tree: Secrets
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/secrets#file-secrets-core-predicates-character-predicate-ts
Source text: https://banes-lab.com/source/secrets/core/predicates/character.predicate.ts.txt

Listed in [core/predicates](https://banes-lab.com/api/source/secrets/core/predicates.md), after [core/predicates/bearer.predicate.ts](https://banes-lab.com/source/secrets/core/predicates/bearer.predicate.ts.md) and before [core/predicates/credential.predicate.ts](https://banes-lab.com/source/secrets/core/predicates/credential.predicate.ts.md).

## Definitions

- `everyCharacter` (lexical_declaration, line 15)
- `isAlphanumeric` (lexical_declaration, line 5)
- `isBase64Url` (lexical_declaration, line 28, exported)
- `isInAlphabet` (lexical_declaration, line 24, exported)
- `ALPHABETS` (lexical_declaration, line 9)

## Contained in

- [core/predicates](https://banes-lab.com/anatomy/secrets/folder-secrets-core-predicates.md)

## Linked from

- [core/predicates](https://banes-lab.com/anatomy/secrets/folder-secrets-core-predicates.md)

## Source

```typescript
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));
};
```
