@illavv/run_typer - v3.2.3
    Preparing search index...

    @illavv/run_typer - v3.2.3

    Typer - Advanced TypeScript Type Validation Library

    Coverage Badge Build Status TypeScript License Version

    Typer is a comprehensive TypeScript validation library that provides robust type checking, schema validation, and runtime type safety. Built with modern TypeScript features including generics, type guards, and advanced type inference.

    • 🔍 Comprehensive Type System: Support for all JavaScript types including advanced types (BigInt, TypedArrays, etc.)
    • 🎯 Generic Type Safety: Full TypeScript generic support with type inference; Infer<typeof schema> derives the static type from the runtime schema (3.2+)
    • 📋 Schema Validation: Complex nested object structure validation with strict mode
    • 🔧 Extensible Architecture: Register custom types and validators
    • ⚡ High Performance: Closure-compiled schema cache (3–10× faster than walking the schema each call) and a predicate fast-path for is/isType — ~70M is() ops/sec and ~74M isType() ops/sec on hot literals (3.2.2+)
    • 🛡️ Runtime Safety: Catch type errors at runtime with detailed error messages
    • 📱 Phone Number Validation: International phone number validation (ITU-T E.164 standard)
    • 📧 Advanced Validations: Email, URL, and other common format validations
    npm install @illavv/run_typer
    
    import { Typer } from '@illavv/run_typer';

    const typer = new Typer();

    // 3.1+: pass a literal alias and the return type is inferred — no <generic> needed
    const message = typer.isType('string', 'Hello World'); // message: string
    const count = typer.isType('number', 42); // count: number

    // Type guards narrow automatically from the literal alias
    if (typer.is(userInput, 'string')) {
    // userInput is now typed as string
    console.log(userInput.toUpperCase());
    }

    // Non-throwing variant
    const result = typer.safeParse('number', userInput);
    if (result.success) {
    // result.data: number
    }
    import { Typer, type Infer } from '@illavv/run_typer';

    const typer = new Typer();

    // One literal drives both runtime validation and the static type
    const user = typer.parse(
    { id: 'number', name: 'string', email: 'string?' },
    payload,
    );
    // user is typed: { id: number; name: string; email?: string | null }

    // Reusable schemas with derived types — no `as const` needed
    const userSchema = typer.schema({
    id: 'number',
    name: 'string',
    email: 'string?',
    tags: ['string'],
    address: { city: 'string', zip: 'string?' },
    });
    type User = Infer<typeof userSchema>;

    const u = typer.parse(userSchema, payload); // throws + typed as User
    const r = typer.safeParse(userSchema, payload); // { success, data: User } | { error }

    Mix-and-match validator functions inside a schema (any slot accepts a Validator<T> from a built-in helper or your own):

    const strict = typer.schema({
    id: typer.isPositiveInteger,
    name: typer.isNonEmptyString,
    color: (v) => typer.isHexColor(v),
    role: 'admin|user|guest',
    });
    import { Typer } from '@illavv/run_typer';

    const typer = new Typer();

    // Type guards (return boolean)
    console.log(typer.is<string>("Hello", "string")); // true
    console.log(typer.is<number>(123, "number")); // true
    console.log(typer.is<boolean>(true, "boolean")); // true
    console.log(typer.is<unknown[]>([], "array")); // true
    console.log(typer.is<object>({}, "object")); // true

    // Type validation (throws on error)
    const str = typer.isType<string>('string', 'Hello'); // Returns 'Hello' typed as string
    const num = typer.isType<number>('number', 42); // Returns 42 typed as number
    const typer = new Typer();

    // Multiple type validation
    const value = typer.isType<string | number>(['string', 'number'], 'Hello');

    // Specific validations
    const email = typer.isEmail('user@example.com');
    const phone = typer.isPhoneNumber('+1234567890');
    const url = typer.isURL('https://example.com');

    // Array validations
    const numbers = typer.isArrayOf<number>('number', [1, 2, 3]);
    const nonEmpty = typer.isNonEmptyArray<string>(['a', 'b']);

    // Range and constraints
    const age = typer.isInRange(18, 65, 25);
    const positiveInt = typer.isPositiveInteger(42);
    const typer = new Typer();

    // Modern JavaScript types
    const bigIntVal = typer.isType<bigint>('bigint', BigInt(123));
    const buffer = typer.isType<ArrayBuffer>('arraybuffer', new ArrayBuffer(8));
    const typedArray = typer.isType<Int32Array>('typedarray', new Int32Array(4));
    const dataView = typer.isType<DataView>('dataview', new DataView(buffer));

    // Collections
    const map = typer.isType<Map<string, number>>('map', new Map());
    const set = typer.isType<Set<string>>('set', new Set());

    // Special validations
    const jsonStr = typer.isType<string>('json', '{"valid": "json"}');
    const validDate = typer.isType<Date>('date', new Date());
    const regex = typer.isType<RegExp>('regexp', /pattern/);
    const typer = new Typer();

    const userSchema = {
    name: "string",
    age: "number",
    email: "string?", // Optional field
    address: {
    street: "string",
    city: "string",
    zip: "number|string" // Union types
    },
    hobbies: ["string"], // Array of strings
    isActive: "boolean"
    };

    const userData = {
    name: "John Doe",
    age: 30,
    address: {
    street: "123 Main St",
    city: "New York",
    zip: 10001
    },
    hobbies: ["reading", "coding"],
    isActive: true
    };

    const result = typer.checkStructure(userSchema, userData);
    if (result.isValid) {
    console.log("✅ Valid user data");
    } else {
    console.log("❌ Validation errors:", result.errors);
    }

    // Strict mode (rejects extra properties)
    const strictResult = typer.checkStructure(userSchema, userData, '', true);
    const typer = new Typer();

    // Register a custom validator
    typer.registerType("positive", (value) => {
    if (typeof value !== "number" || value <= 0) {
    throw new TypeError("Value must be a positive number");
    }
    return value;
    });

    // Register email validator with override
    typer.registerType("email", (value) => {
    const email = typer.isType<string>('string', value);
    if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    throw new TypeError('Invalid email format');
    }
    return email;
    }, true); // Override existing if present

    // Use custom type
    console.log(typer.is(10, "positive")); // true
    console.log(typer.is(-5, "positive")); // false

    // List all types
    console.log(typer.listTypes());

    // Export/Import types
    const typesJson = typer.exportTypes();
    typer.importTypes(typesJson);

    // Remove custom type
    typer.unregisterType("positive");
    const typer = new Typer();

    // Single parameter function
    const safeMultiply = typer.expect(
    (x: number) => x * 2,
    {
    paramTypes: ['number'],
    returnType: ['number']
    }
    );

    console.log(safeMultiply(4)); // 8
    // safeMultiply("hello"); // Throws TypeError

    // Multiple parameters
    const safeAdd = typer.expect(
    (x: number, y: number) => x + y,
    {
    paramTypes: ['number', 'number'],
    returnType: ['number']
    }
    );

    // Async function support
    const asyncFunc = typer.expect(
    async (x: number): Promise<string> => x.toString(),
    {
    paramTypes: ['number'],
    returnType: ['string']
    }
    );

    // Multiple return types
    const flexibleFunc = typer.expect(
    (x: boolean) => x ? 42 : "string",
    {
    paramTypes: ['boolean'],
    returnType: ['number', 'string']
    }
    );

    Type guard that returns boolean. Safe for TypeScript type narrowing.

    Validates type and returns the value cast to T. Throws TypeError on failure.

    Validates and returns a string. Alias for isType<string>('string', value).

    Validates and returns a number.

    Validates and returns a boolean.

    Validates and returns an array.

    Validates and returns an object.

    Validates email format.

    Validates URL format.

    Validates international phone numbers (7-15 digits, ITU-T E.164 standard).

    Validates array with specific element type.

    Validates non-empty strings.

    Validates non-empty arrays.

    Validates value is one of specified options.

    Validates number within range.

    Validates integer values.

    Validates positive numbers.

    Validates positive integers.

    Validates negative numbers.

    Validates negative integers.

    Stricter than isType('number', x): rejects NaN and Infinity. (3.1+)

    Validates integers within Number.MIN/MAX_SAFE_INTEGER. (3.1+)

    Validates UUID strings (RFC 4122, versions 1–5). (3.1+)

    Validates IPv4 / IPv6 addresses. (3.1+)

    Validates CSS hex colors (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). (3.1+)

    Validates an ISO 8601 string and returns the parsed Date. (3.1+)

    Validates Base64 strings. (3.1+)

    Validates a plain object literal (rejects class instances, arrays, Map, Set). (3.1+)

    Validates a Promise / thenable. (3.1+)

    Type-safe instanceof check. (3.1+)

    Validates a string matches the given regex. (3.1+)

    Validates the length of a string or array. (3.1+)

    Polymorphic emptiness check across string, array, Map, Set, object. (3.1+)

    Wraps a validator so null is also accepted.

    Wraps a validator so undefined is also accepted.

    Tries each validator in order; succeeds on the first match.

    Same input as isType, returns a discriminated union { success: true, data } | { success: false, error: TypeError } instead of throwing.

    Universal entry point. Accepts a type alias, an array of aliases, a Validator<T> function, or a Schema object. Throws TypeError on failure; on success returns the value typed via Infer<S> (for schemas) or TypeMap[K] (for type aliases).

    Non-throwing variant. Returns { success: true, data } | { success: false, error: TypeError }.

    Identity helper that preserves literal types of a schema declared in a variable. Use it to derive Infer<typeof schema> without as const.

    Derives a TypeScript type from a runtime schema literal — handles ?-suffix optionals, |-unions, array elements, nested objects, and embedded Validator<T> functions.

    Validates object structure against schema. Returns {isValid: boolean, errors: string[]}. Lower-level than parse — kept for backward compatibility and for the strict-mode entry point.

    Registers custom type validator.

    Removes registered type.

    Returns all registered type names.

    Exports types as JSON string.

    Imports types from JSON string.

    Wraps function with type checking for parameters and return value.

    Validates object against simple schema, returns error array.

    Logs warning if type assertion fails.

    Primitives: string, number, boolean, bigint, symbol, undefined, null

    Objects: object, array, function, date, regexp, map, set

    Advanced: arraybuffer, dataview, typedarray, json, domelement

    Aliases: Short forms like s/str for string, n/num for number, etc.

    Typer has 100% line / 100% function / 99.3% statement / 95.7% branch coverage with 290 comprehensive tests covering:

    • All type validators and edge cases
    • Schema validation scenarios
    • Custom type registration
    • Function wrapping and validation
    • Error handling and edge cases
    • TypeScript generic integration
    npm test                # Run tests
    npm run test:watch # Watch mode
    npm run test:coverage # Coverage report
    npm run build          # Build all formats
    npm run build:docs # Build with documentation

    Outputs:

    • dist/Typer.min.js - UMD format
    • dist/Typer.esm.min.js - ES modules
    • dist/Typer.cjs.min.js - CommonJS
    • dist/Typer.d.ts - TypeScript definitions

    MIT License - see LICENSE file for details.

    Contributions are welcome! Please:

    1. Fork the repository
    2. Create a feature branch
    3. Add tests for new functionality
    4. Ensure all tests pass
    5. Submit a pull request

    Michael Lavigna


    Built with ❤️ and TypeScript