CtrlK
BlogDocsLog inGet started
Tessl Logo

pantheon-ai/typescript-advanced

Comprehensive TypeScript guidance covering compiler configuration, advanced types, utility types, type guards, strict mode workflows, and documentation patterns; use when configuring tsconfig, designing complex generics, making illegal states unrepresentable, fixing type errors, or writing testable and maintainable type-safe APIs.

Overall
score

99%

Does it follow best practices?

Validation for skill structure

Overview
Skills
Evals
Files

patterns-plugin-system.mdreferences/

Plugin System Architecture

Build extensible applications with type-safe plugin systems.

Basic Plugin Interface

interface Plugin {
  readonly name: string;
  readonly version: string;
  
  init(): Promise<void>;
  cleanup(): Promise<void>;
}

interface PluginManager {
  register(plugin: Plugin): void;
  unregister(name: string): Promise<void>;
  get(name: string): Plugin | undefined;
  list(): Plugin[];
}

Typed Plugin with Configuration

interface PluginConfig<T = unknown> {
  name: string;
  version: string;
  config: T;
}

interface Plugin<TConfig = unknown> {
  readonly name: string;
  readonly version: string;
  
  init(config: TConfig): Promise<void>;
  cleanup(): Promise<void>;
}

// Example: Logger plugin
interface LoggerConfig {
  level: 'debug' | 'info' | 'warn' | 'error';
  output: 'console' | 'file';
  filePath?: string;
}

class LoggerPlugin implements Plugin<LoggerConfig> {
  readonly name = 'logger';
  readonly version = '1.0.0';
  
  private config?: LoggerConfig;
  
  async init(config: LoggerConfig) {
    this.config = config;
    console.log(`Logger initialized: ${config.level} -> ${config.output}`);
  }
  
  async cleanup() {
    console.log('Logger cleaned up');
  }
  
  log(level: LoggerConfig['level'], message: string) {
    if (!this.config) {
      throw new Error('Plugin not initialized');
    }
    // Logging logic
  }
}

Plugin with Hooks

type PluginHook<TData = unknown> = (data: TData) => TData | Promise<TData>;

interface HookablePlugin<THooks extends Record<string, PluginHook>> {
  readonly name: string;
  hooks: THooks;
}

// Example: Transform plugin
interface TransformHooks {
  beforeTransform: PluginHook<string>;
  afterTransform: PluginHook<string>;
}

class TransformPlugin implements HookablePlugin<TransformHooks> {
  readonly name = 'transform';
  
  hooks: TransformHooks = {
    beforeTransform: (data) => data.trim(),
    afterTransform: (data) => data.toUpperCase()
  };
  
  async transform(input: string): Promise<string> {
    let result = await this.hooks.beforeTransform(input);
    // Main transformation
    result = result.replace(/foo/g, 'bar');
    result = await this.hooks.afterTransform(result);
    return result;
  }
}

Plugin Registry with Type Safety

interface PluginRegistry {
  plugins: Map<string, Plugin>;
}

class TypedPluginRegistry implements PluginRegistry {
  plugins = new Map<string, Plugin>();
  
  register<T extends Plugin>(plugin: T): void {
    if (this.plugins.has(plugin.name)) {
      throw new Error(`Plugin ${plugin.name} already registered`);
    }
    this.plugins.set(plugin.name, plugin);
  }
  
  get<T extends Plugin>(name: string): T | undefined {
    return this.plugins.get(name) as T | undefined;
  }
  
  async unregister(name: string): Promise<void> {
    const plugin = this.plugins.get(name);
    if (plugin) {
      await plugin.cleanup();
      this.plugins.delete(name);
    }
  }
  
  list(): Plugin[] {
    return Array.from(this.plugins.values());
  }
}

Plugin Lifecycle Management

type PluginState = 'registered' | 'initializing' | 'active' | 'error' | 'disabled';

interface ManagedPlugin<TConfig = unknown> extends Plugin<TConfig> {
  state: PluginState;
  error?: Error;
}

class PluginManager {
  private plugins = new Map<string, ManagedPlugin>();
  
  async register<TConfig>(
    plugin: Plugin<TConfig>,
    config: TConfig
  ): Promise<void> {
    const managed: ManagedPlugin<TConfig> = {
      ...plugin,
      state: 'registered'
    };
    
    this.plugins.set(plugin.name, managed);
    
    try {
      managed.state = 'initializing';
      await plugin.init(config);
      managed.state = 'active';
    } catch (error) {
      managed.state = 'error';
      managed.error = error as Error;
      throw error;
    }
  }
  
  getState(name: string): PluginState | undefined {
    return this.plugins.get(name)?.state;
  }
}

Plugin Dependencies

interface PluginWithDeps<TConfig = unknown> extends Plugin<TConfig> {
  dependencies: string[];
}

class DependencyAwareManager {
  private plugins = new Map<string, PluginWithDeps>();
  
  async register<TConfig>(
    plugin: PluginWithDeps<TConfig>,
    config: TConfig
  ): Promise<void> {
    // Check dependencies
    for (const dep of plugin.dependencies) {
      if (!this.plugins.has(dep)) {
        throw new Error(
          `Missing dependency: ${dep} required by ${plugin.name}`
        );
      }
    }
    
    this.plugins.set(plugin.name, plugin);
    await plugin.init(config);
  }
  
  // Topological sort for initialization order
  private getInitOrder(): string[] {
    // Implementation of topological sort
    return [];
  }
}

Best Practices

  1. Define clear interfaces: Separate plugin contract from implementation
  2. Version plugins: Track compatibility
  3. Manage lifecycle: Init, active, cleanup states
  4. Handle dependencies: Ensure plugins load in correct order
  5. Type configurations: Each plugin type has specific config
  6. Error handling: Gracefully handle plugin failures
  7. Isolation: Plugins shouldn't access each other directly

Install with Tessl CLI

npx tessl i pantheon-ai/typescript-advanced

references

compiler-module-resolution.md

compiler-performance.md

compiler-strict-mode.md

compiler-tsconfig.md

docs-adr-templates.md

docs-framework-docs.md

docs-jsdoc-patterns.md

docs-typedoc-config.md

guards-assertion-functions.md

guards-basic.md

guards-branded-types.md

guards-discriminated-unions.md

guards-exhaustiveness.md

guards-generic.md

guards-inference-infer.md

guards-inference-return.md

patterns-advanced-generics.md

patterns-api-client.md

patterns-branded-types.md

patterns-builder.md

patterns-deep-readonly.md

patterns-dependency-injection.md

patterns-event-emitter.md

patterns-form-validation.md

patterns-plugin-system.md

patterns-recursive-types.md

patterns-state-machine.md

patterns-type-safe-module.md

practices-illegal-states.md

practices-module-patterns.md

practices-runtime-validation.md

practices-type-first.md

types-conditional.md

types-generics.md

types-index-signatures.md

types-mapped.md

types-narrowing.md

types-template-literals.md

types-type-assertions.md

types-unions-intersections.md

utilities-custom-mapped-types.md

utilities-extract-exclude.md

utilities-key-remapping.md

utilities-nonnullable-awaited.md

utilities-partial-required.md

utilities-pick-omit.md

utilities-readonly-record.md

utilities-returntype-parameters.md

SKILL.md

tile.json