src/lib/generators/pattern.ts

Total Symbols
2
Lines of Code
85
Avg Complexity
5.0
Avg Coverage
100.0%

File Relationships

graph LR generateFromPattern["generateFromPattern"] randomChar["randomChar"] generateFromPattern -->|calls| randomChar click generateFromPattern "../symbols/edf57aaf68187e60.html" click randomChar "../symbols/885075e1d5cfc7c9.html"

Symbols by Kind

function 2

All Symbols

Name Kind Visibility Status Lines Signature
randomChar function - 27-29 randomChar(charset: string): : string
generateFromPattern function exported- 46-84 generateFromPattern(pattern = "########"): : string

Full Source

/**
 * Pattern-based generator — generates strings from a custom mask pattern.
 *
 * Pattern syntax:
 *   `#`  → random digit (0–9)
 *   `A`  → random uppercase letter (A–Z)
 *   `a`  → random lowercase letter (a–z)
 *   `?`  → random letter, mixed case (a–z or A–Z)
 *   `*`  → random alphanumeric character (a–z, A–Z, 0–9)
 *   `\X` → literal character X (escape any token with backslash)
 *   Any other character → literal
 *
 * Examples:
 *   `"###-###-####"` → `"412-873-0291"`
 *   `"AAA-###"` → `"XKP-047"`
 *   `"aaa_###"` → `"btz_519"`
 *   `"****-****"` → `"3aB2-Xz9K"`
 *   `"PREFIX-###"` → `"PREFIX-724"`
 */

const DIGITS = "0123456789";
const UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const LOWER = "abcdefghijklmnopqrstuvwxyz";
const ALPHA = UPPER + LOWER;
const ALNUM = UPPER + LOWER + DIGITS;

function randomChar(charset: string): string {
  return charset[Math.floor(Math.random() * charset.length)];
}

/**
 * Generates a string following the given pattern mask.
 *
 * | Token | Replacement             |
 * |-------|-------------------------|
 * | `#`   | random digit (0–9)      |
 * | `A`   | random uppercase letter |
 * | `a`   | random lowercase letter |
 * | `?`   | random letter (any case)|
 * | `*`   | random alphanumeric     |
 * | `\X`  | literal `X`             |
 *
 * @param pattern - Mask pattern string (default: `"########"`)
 * @returns Generated string matching the pattern
 */
export function generateFromPattern(pattern = "########"): string {
  let result = "";
  let i = 0;

  while (i < pattern.length) {
    const ch = pattern[i];

    // Escape: next character is literal
    if (ch === "\\" && i + 1 < pattern.length) {
      result += pattern[i + 1];
      i += 2;
      continue;
    }

    switch (ch) {
      case "#":
        result += randomChar(DIGITS);
        break;
      case "A":
        result += randomChar(UPPER);
        break;
      case "a":
        result += randomChar(LOWER);
        break;
      case "?":
        result += randomChar(ALPHA);
        break;
      case "*":
        result += randomChar(ALNUM);
        break;
      default:
        result += ch;
    }

    i++;
  }

  return result;
}