Skip to content

API Overview

The TypeScript Project Template provides a clean, well-documented API that demonstrates modern TypeScript patterns and best practices. This section covers all the exported functions, types, and utilities.

Auto-Generated API Documentation

For complete, up-to-date API documentation generated directly from the TypeScript source code, see:

📚 Generated API Documentation - Complete API reference with all functions, types, and examples

The generated documentation is automatically created from TSDoc comments in the source code and includes:

  • Function signatures with parameter types
  • Return type information
  • Usage examples
  • Type definitions
  • Interface documentation

Main Entry Point

main()

The primary application function that demonstrates validation, logging, and configuration management.

typescript
export async function main(): Promise<void>

Description: Main application function that showcases the template's validation and logging capabilities.

Returns: Promise<void> - Resolves when the application completes

Example:

typescript
import { main } from './index.js';

// Run the main application
await main();

Features Demonstrated:

  • Input validation with Zod schemas
  • Structured logging with Winston
  • Configuration management
  • Error handling patterns
  • Professional logging practices

Validation Functions

validateUserInput()

Validates user input data using Zod schema with detailed error reporting.

typescript
export function validateUserInput(data: unknown): ValidationResult<UserInput>

Parameters:

  • data (unknown): Raw user input data to validate

Returns: ValidationResult<UserInput> - Success with typed data or error with details

Example:

typescript
import { validateUserInput } from './validation.js';

const result = validateUserInput({
  name: 'John Doe',
  email: 'john@example.com',
  age: 30
});

if (result.success) {
  // TypeScript knows result.data is UserInput
  console.log(`Welcome, ${result.data.name}!`);
} else {
  console.error('Validation failed:', result.error);
}

validateAppConfig()

Validates application configuration with comprehensive schema checking.

typescript
export function validateAppConfig(data: unknown): ValidationResult<AppConfig>

Parameters:

  • data (unknown): Raw configuration data to validate

Returns: ValidationResult<AppConfig> - Success with typed config or error details

Example:

typescript
import { validateAppConfig } from './validation.js';

const configData = JSON.parse(fs.readFileSync('config.json', 'utf-8'));
const result = validateAppConfig(configData);

if (result.success) {
  const config = result.data;
  console.log(`Starting ${config.app.name} v${config.app.version}`);
}

ValidationError

Custom error class for validation failures with structured error information.

typescript
export class ValidationError extends Error {
  public readonly issues: z.ZodIssue[];

  constructor(message: string, issues: z.ZodIssue[]);
  public getFormattedMessage(): string;
}

Properties:

  • issues - Array of validation issues from Zod
  • name - Always 'ValidationError'

Methods:

  • getFormattedMessage() - Returns formatted error with field details

Logging Functions

createLogger()

Creates a configured Winston logger instance with specified options.

typescript
export function createLogger(config: LoggerConfig): winston.Logger

Parameters:

  • config (LoggerConfig): Logger configuration options

Returns: winston.Logger - Configured Winston logger instance

Example:

typescript
import { createLogger } from './logger.js';

const logger = createLogger({
  level: 'info',
  outputFile: 'app.log',
  includeTimestamp: true,
  useColors: false
});

logger.info('Application started', { port: 3000 });

createLoggerFromConfig()

Creates a logger from application configuration.

typescript
export function createLoggerFromConfig(config: LoggingConfig): winston.Logger

Parameters:

  • config (LoggingConfig): Logging section from app configuration

Returns: winston.Logger - Configured logger instance

Logger Utilities

The loggerUtils object provides common logging patterns:

typescript
export const loggerUtils: {
  logValidationSuccess(logger: ILogger, message: string, data?: object): void;
  logValidationFailure(logger: ILogger, message: string, error: string): void;
  logSectionHeader(logger: ILogger, title: string): void;
  logStartup(logger: ILogger, appName: string, version?: string): void;
  logCompletion(logger: ILogger, message: string): void;
}

Example:

typescript
import { logger, loggerUtils } from './logger.js';

loggerUtils.logStartup(logger, 'MyApp', '1.0.0');
loggerUtils.logValidationSuccess(logger, 'Input validated', userData);
loggerUtils.logSectionHeader(logger, 'Processing Phase');
loggerUtils.logCompletion(logger, 'Process completed successfully');

Configuration Management

ConfigManager

Type-safe configuration loading and validation class.

typescript
export class ConfigManager {
  constructor(configPath?: string);

  loadConfig(): ValidationResult<AppConfig>;
  getConfig(): AppConfig | null;
  getServerConfig(): ServerConfig;
  getLoggingConfig(): LoggingConfig;
  getAppConfig(): AppConfigSection;
  isFeatureEnabled(featureName: string): boolean;

  static validateConfigFile(configPath?: string): ValidationResult<AppConfig>;
}

Example:

typescript
import { ConfigManager } from './config.js';

const configManager = new ConfigManager();
const result = configManager.loadConfig();

if (result.success) {
  const serverConfig = configManager.getServerConfig();
  const logger = createLoggerFromConfig(configManager.getLoggingConfig());

  if (configManager.isFeatureEnabled('enableMetrics')) {
    setupMetrics();
  }
}

Utility Functions

delay()

Delays execution for a specified number of milliseconds.

typescript
export async function delay(ms: number): Promise<void>

Parameters:

  • ms (number): Number of milliseconds to delay

Returns: Promise<void> - Resolves after the delay

Example:

typescript
import { delay } from './utils.js';

// Wait for 1 second
await delay(1000);

// Use in async functions
async function processWithDelay() {
  console.log('Starting...');
  await delay(500);
  console.log('Continuing after delay...');
}

safeJsonParse()

Safely parses JSON with comprehensive error handling.

typescript
export function safeJsonParse(jsonString: string): AsyncResult<unknown>

Parameters:

  • jsonString (string): JSON string to parse

Returns: AsyncResult<unknown> - Success or error result

Example:

typescript
import { safeJsonParse } from './utils.js';

// Parse valid JSON
const result1 = safeJsonParse('{"key": "value"}');
if (result1.success) {
  console.log(result1.data); // { key: "value" }
}

// Handle invalid JSON
const result2 = safeJsonParse('invalid json');
if (!result2.success) {
  console.error(result2.error); // "Unexpected token i in JSON at position 0"
}

formatTimestamp()

Formats a Unix timestamp into a human-readable string.

typescript
export function formatTimestamp(
  timestamp: number, 
  config: UtilConfig = {}
): string

Parameters:

  • timestamp (number): Unix timestamp in milliseconds
  • config (UtilConfig, optional): Configuration options

Returns: string - Formatted date string in "YYYY-MM-DD HH:mm:ss" format

Example:

typescript
import { formatTimestamp } from './utils.js';

// Basic usage
const formatted = formatTimestamp(Date.now());
console.log(formatted); // "2024-01-15 14:30:00"

// With debug logging
const debugFormatted = formatTimestamp(Date.now(), { debug: true });
// Logs: "Formatted timestamp 1705327800000 to 2024-01-15 14:30:00"

Type Definitions

UtilConfig

Configuration interface for utility functions.

typescript
export interface UtilConfig {
  /** Enable debug logging */
  debug?: boolean;
  /** Maximum retry attempts */
  maxRetries?: number;
  /** Timeout in milliseconds */
  timeout?: number;
}

Properties:

  • debug (boolean, optional): Enable debug logging for operations
  • maxRetries (number, optional): Maximum number of retry attempts
  • timeout (number, optional): Timeout in milliseconds for operations

AsyncResult<T>

Result type for operations that can succeed or fail.

typescript
export type AsyncResult<T> = {
  success: true;
  data: T;
} | {
  success: false;
  error: string;
};

Type Parameters:

  • T: The type of data returned on success

Usage Pattern:

typescript
function processResult<T>(result: AsyncResult<T>): void {
  if (result.success) {
    // TypeScript knows result.data is type T
    console.log('Success:', result.data);
  } else {
    // TypeScript knows result.error is string
    console.error('Error:', result.error);
  }
}

Error Handling Patterns

The API demonstrates several error handling approaches:

1. Validation Result Pattern

typescript
// Validation functions return Result types
const result = validateUserInput(userData);
if (result.success) {
  // TypeScript knows result.data is UserInput
  const user = result.data;
  logger.info('User validated', { userId: user.name });
} else {
  // TypeScript knows result.error is string
  logger.error('Validation failed', { error: result.error });
}

2. ValidationError with Details

typescript
// Custom ValidationError for detailed error information
try {
  const data = UserInputSchema.parse(input);
} catch (error) {
  if (error instanceof ValidationError) {
    logger.error('Validation failed', {
      message: error.getFormattedMessage(),
      issues: error.issues.map(issue => ({
        field: issue.path.join('.'),
        message: issue.message
      }))
    });
  }
}

3. Promise-Based Errors

typescript
// Functions that can reject
async function riskyOperation(): Promise<string> {
  if (Math.random() > 0.5) {
    throw new Error('Random failure');
  }
  return 'Success';
}

// Proper error handling with logging
try {
  const result = await riskyOperation();
  logger.info('Operation succeeded', { result });
} catch (error) {
  logger.error('Operation failed', {
    error: { message: error.message, stack: error.stack }
  });
}

4. Result-Based Errors

typescript
// Functions that return success/error objects
const result = safeJsonParse(jsonString);
if (result.success) {
  // Handle success case
  processData(result.data);
} else {
  // Handle error case with structured logging
  logger.error('JSON parse failed', { error: result.error, input: jsonString });
}

Best Practices Demonstrated

1. Type Safety

  • All functions have explicit return types
  • Zod schemas provide runtime type validation
  • Interfaces define clear contracts
  • Union types for result handling

2. Input Validation

  • Validate all external data with Zod schemas
  • Use Result types for consistent error handling
  • Provide detailed validation error messages
  • Type inference from validation schemas

3. Professional Logging

  • Structured logging with metadata
  • Appropriate log levels for different scenarios
  • Environment-aware configuration
  • Logger utility functions for common patterns

4. Configuration Management

  • Type-safe configuration loading
  • Validation of configuration files
  • Feature flags for conditional functionality
  • Environment-specific configurations

5. Documentation

  • TSDoc comments for all exported functions
  • Parameter descriptions and examples
  • Return type documentation
  • Usage examples with error handling

6. Error Handling

  • Multiple error handling patterns
  • Graceful degradation
  • Informative error messages
  • Structured error reporting

7. Async Patterns

  • Proper Promise usage
  • Async/await best practices
  • Timeout handling
  • Error propagation

8. Testing Support

  • Functions designed for easy testing
  • Predictable behavior
  • Mockable dependencies
  • Comprehensive test coverage

Usage Examples

Complete Application Example

typescript
import { main, delay, safeJsonParse, formatTimestamp } from './index.js';
import { logger, loggerUtils } from './logger.js';
import { validateAppConfig } from './validation.js';
import { ConfigManager } from './config.js';

async function myApplication() {
  loggerUtils.logStartup(logger, 'MyApplication', '1.0.0');

  // Load and validate configuration
  const configManager = new ConfigManager();
  const configResult = configManager.loadConfig();

  if (!configResult.success) {
    logger.error('Configuration validation failed', { error: configResult.error });
    return;
  }

  loggerUtils.logValidationSuccess(logger, 'Configuration loaded', {
    environment: configResult.data.app.environment
  });

  // Parse additional configuration
  const extraConfigResult = safeJsonParse('{"timeout": 5000}');
  if (!extraConfigResult.success) {
    logger.error('Invalid extra configuration', { error: extraConfigResult.error });
    return;
  }

  // Wait before processing
  logger.info('Starting processing delay', { duration: '1000ms' });
  await delay(1000);

  // Run the main application logic
  loggerUtils.logSectionHeader(logger, 'Main Application Logic');
  await main();

  loggerUtils.logCompletion(logger, 'Application completed successfully');
}

// Run with comprehensive error handling
myApplication().catch(error => {
  logger.error('Application failed', {
    error: {
      message: error.message,
      stack: error.stack
    }
  });
  process.exit(1);
});

Next Steps

Released under the MIT License.