cross-log
Version:
A universal logging package that works in both browser and Node.js environments with environment variable configuration
196 lines • 6.35 kB
TypeScript
/**
* Advanced type definitions for the plugin system with full TypeScript support
*/
import { ILogger } from '../core/types';
import { Plugin, ApiPlugin, DatabasePlugin, AnalyticsPlugin, PerformancePlugin, SecurityPlugin, ApiPluginConfig, DatabasePluginConfig, AnalyticsPluginConfig, PerformancePluginConfig, SecurityPluginConfig } from './types';
/**
* Plugin registry mapping plugin names to their configurations and method types
*/
export interface PluginRegistry {
api: {
config: ApiPluginConfig;
methods: ApiPlugin;
};
database: {
config: DatabasePluginConfig;
methods: DatabasePlugin;
};
analytics: {
config: AnalyticsPluginConfig;
methods: AnalyticsPlugin;
};
performance: {
config: PerformancePluginConfig;
methods: PerformancePlugin;
};
security: {
config: SecurityPluginConfig;
methods: SecurityPlugin;
};
}
/**
* Extract plugin names from registry
*/
export type PluginName = keyof PluginRegistry;
/**
* Extract plugin methods for a specific plugin
*/
export type PluginMethods<T extends PluginName> = PluginRegistry[T]['methods'];
/**
* Extract plugin config for a specific plugin
*/
export type PluginConfigType<T extends PluginName> = PluginRegistry[T]['config'];
/**
* Type-safe plugin instance with methods
*/
export interface TypedPlugin<T extends PluginName> extends Plugin<PluginConfigType<T>> {
name: T;
methods?: PluginMethods<T>;
}
/**
* Logger with specific plugins loaded
*/
export type LoggerWithPlugins<P extends PluginName[] = []> = ILogger & {
[K in P[number]]: PluginMethods<K>;
} & {
use<T extends PluginName>(plugin: TypedPlugin<T>): LoggerWithPlugins<[...P, T]>;
getPlugin<T extends PluginName>(name: T): TypedPlugin<T> | undefined;
hasPlugin(name: PluginName): boolean;
removePlugin(name: PluginName): void;
};
/**
* Builder pattern for creating loggers with plugins
*/
export interface LoggerBuilder<P extends PluginName[] = []> {
withPlugin<T extends PluginName>(plugin: TypedPlugin<T>): LoggerBuilder<[...P, T]>;
build(): LoggerWithPlugins<P>;
}
/**
* Plugin factory function type
*/
export type PluginFactory<T extends PluginName> = (config?: Partial<PluginConfigType<T>>) => TypedPlugin<T>;
/**
* Registry of plugin factories
*/
export interface PluginFactories {
api: PluginFactory<'api'>;
database: PluginFactory<'database'>;
analytics: PluginFactory<'analytics'>;
performance: PluginFactory<'performance'>;
security: PluginFactory<'security'>;
}
/**
* Configuration for creating a logger with plugins
*/
export interface LoggerWithPluginsConfig {
api?: Partial<ApiPluginConfig>;
database?: Partial<DatabasePluginConfig>;
analytics?: Partial<AnalyticsPluginConfig>;
performance?: Partial<PerformancePluginConfig>;
security?: Partial<SecurityPluginConfig>;
}
/**
* Type helper to extract enabled plugins from config
*/
export type EnabledPlugins<T extends LoggerWithPluginsConfig> = {
[K in keyof T & PluginName]: T[K] extends object ? K : never;
}[keyof T & PluginName];
/**
* Logger with plugins based on configuration
*/
export type ConfiguredLogger<T extends LoggerWithPluginsConfig> = LoggerWithPlugins<Array<EnabledPlugins<T>>>;
/**
* Module augmentation support for custom plugins
*/
export interface CustomPluginRegistry {
}
/**
* Combined plugin registry including custom plugins
*/
export type FullPluginRegistry = PluginRegistry & CustomPluginRegistry;
/**
* Full plugin name including custom plugins
*/
export type FullPluginName = keyof FullPluginRegistry;
/**
* Conditional types for dynamic plugin loading
*/
/**
* Extract plugin names from a union of plugin configurations
*/
export type ExtractPluginNames<T> = T extends {
[K in PluginName]?: any;
} ? Extract<keyof T, PluginName> : never;
/**
* Conditional logger type based on loaded plugins
*/
export type ConditionalLogger<T extends PluginName | never = never> = ILogger & (T extends never ? {} : T extends PluginName ? Record<T, PluginMethods<T>> : {});
/**
* Dynamic plugin loader return type
*/
export type DynamicPluginLoader<T extends PluginName[]> = ILogger & {
[K in T[number]]: PluginMethods<K>;
} & {
loadPlugin<P extends PluginName>(name: P, config?: PluginConfigType<P>): DynamicPluginLoader<[...T, P]>;
unloadPlugin<P extends T[number]>(name: P): DynamicPluginLoader<Exclude<T[number], P>[]>;
};
/**
* Plugin-aware logger with runtime type checking
*/
export interface PluginAwareLogger<T extends PluginName[] = []> extends ILogger {
/**
* Load a new plugin dynamically
*/
withPlugin<P extends PluginName>(plugin: TypedPlugin<P>): PluginAwareLogger<[...T, P]>;
/**
* Check if specific plugins are loaded (type guard)
*/
hasPlugins<P extends PluginName[]>(plugins: P): this is PluginAwareLogger<[...T, ...P]>;
/**
* Get all loaded plugin names
*/
getLoadedPlugins(): T;
}
/**
* Utility type to check if a plugin is in a list
*/
export type HasPlugin<T extends PluginName[], P extends PluginName> = P extends T[number] ? true : false;
/**
* Utility type to require specific plugins
*/
export type RequirePlugins<T extends PluginName[]> = ILogger & {
[K in T[number]]: PluginMethods<K>;
};
/**
* Utility type for optional plugins
*/
export type OptionalPlugins<T extends PluginName[]> = ILogger & {
[K in T[number]]?: PluginMethods<K>;
};
/**
* Mixed plugin requirements (some required, some optional)
*/
export type MixedPlugins<R extends PluginName[], O extends PluginName[]> = ILogger & {
[K in R[number]]: PluginMethods<K>;
} & {
[K in O[number]]?: PluginMethods<K>;
};
/**
* Plugin combination validator
*/
export type ValidPluginCombination<T extends PluginName[]> = T extends readonly PluginName[] ? T : never;
/**
* Type-safe plugin configuration builder
*/
export type PluginConfigBuilder<T extends PluginName[]> = {
[K in T[number]]?: PluginConfigType<K>;
};
/**
* Infer plugin names from a logger instance
*/
export type InferPlugins<T> = T extends LoggerWithPlugins<infer P> ? P : never;
/**
* Check if a type is a valid plugin-enabled logger
*/
export type IsPluginLogger<T> = T extends LoggerWithPlugins<any> ? true : false;
//# sourceMappingURL=plugin-types.d.ts.map